pythoy开发--函数

python函数是带名字的代码块,用于完成具体的工作。
要执行函数定义的特定任务,可调用该函数。需要在程序中多次执行同一项任务时,你无需反复编写完成该任务的代码,而只需调用执行该任务的函数,让Python运行 其中的代码。通过使用函数,程序的编写、阅读、测试和修复都将更容易。

#! /usr/bin/env python
# -*- coding:utf-8 -*-

'''
@Author:gcan
@Email:1528667112@qq.com
@Site:http://www.gcan.top
@File:function.py
@Software:PyCharm
@Date:2018-04-22 13:32:08
@Version:1.0.0
'''

# 定义函数
# 下面是一个打印问候语的简单函数
# def greet_user():
#     """显示简单的问候语"""
#     print("Hello!")
# greet_user()

# 这个是最简单的函数结构。使用关键字def 来告诉Python你要定义一个函数。这是函数定义 ,向Python指出了函数名,还可以在括号内指出函数为完成其任务需要什么样的信息。
# 在这里,函数名为greet_user() ,它不需要任何信息就能完成其工作,因此括号是空的(即便如此,括号也必不可少)。最后,定义以冒号结尾。
# 紧跟在def greet_user(): 后面的所有缩进行构成了函数体。三引号处的文本是被称为文档字符串 (docstring)的注释,描述了函数是做什么的。文档字符串用三引号括起,Python使用它们来生成有关程序中函数的文档。
# 代码行print("Hello!") 是函数体内的唯一的一行代码,greet_user() 只做一项工作,打印Hello! 。
# 要使用这个函数,可调用它。函数调用让Python执行函数的代码。要调用函数,可依次指定函数名以及用括号括起的必要信息。由于这个函数不需要任何信息,因此调用它时只需输入greet_user() 即可。


# 向函数传递信息
# 只需稍作修改,就可以让函数greet_user()不仅向用户显示Hello!,还将用户的名字用作抬头。为此,可在函数定义def greet_user()的括号内添加username。通 过在这里添加username ,就可让函数接受你给username 指定的任何值。现在,这个函数要求你调用它时给username 指定一个值。调用greet_user() 时,可将一个名字 传递给它

def greet_user(username='gcan'):
    """显示简单的问候语"""
    print("Hello, " + username.title() + "!")
# greet_user('gcan')

# greet_user('gcan')
# greet_user()
# 不传值,打印默认值


# 传递实参
# 鉴于函数定义中可能包含多个形参,因此函数调用中也可能包含多个实参。向函数传递实参的方式很多,可使用位置实参 ,这要求实参的顺序与形参的顺序相同;也可使用关键
# 字实参 ,其中每个实参都由变量名和值组成;还可使用列表和字典

# 位置实参
# 你调用函数时,Python必须将函数调用中的每个实参都关联到函数定义中的一个形参。为此,最简单的关联方式是基于实参的顺序。这种关联方式被称为位置实参
def describe_pet(animal_type, pet_name):
    """显示宠物的信息"""
    print("\nI have a " + animal_type + ".")
    print("My " + animal_type + "'s name is " + pet_name.title() + ".")
# describe_pet('hamster', 'harry')
# describe_pet('pig', 'bill')

# 这个函数的定义表明,它需要一种动物类型和一个名字。调用describe_pet() 时,需要按顺序提供一种动物类型和一个名字。例如,在前面的函数调用中,
# 实参'hamster' 存储在形参animal_type 中,而实参'harry' 存储在形参pet_name 中。在函数体内,使用了这两个形参来显示宠物的信息

# 关键字实参
# 关键字实参 是传递给函数的名称—值对。你直接在实参中将名称和值关联起来了,因此向函数传递实参时不会混淆(不会得到名为Hamster的harry这样的结果)。关键字实参让 你无需考虑函数调用中的实参顺序,还清楚地指出了函数调用中各个值的用途

def describe_pet(animal_type, pet_name):
    """显示宠物的信息"""
    print("\nI have a " + animal_type + ".")
    print("My " + animal_type + "'s name is " + pet_name.title() + ".")
# describe_pet(animal_type='hamster', pet_name='harry')
# describe_pet(pet_name='harry',animal_type='hamster',)

# 这两种调用方式是等效的


# 默认值
# 编写函数时,可给每个形参指定默认值 。在调用函数中给形参提供了实参时,Python将使用指定的实参值;否则,将使用形参的默认值。因此,给形参指定默认值后,可在函数 调用中省略相应的实参。使用默认值可简化函数调用,还可清楚地指出函数的典型用法。
# 例如,如果你发现调用describe_pet() 时,描述的大都是小狗,就可将形参animal_type 的默认值设置为'dog' 。这样,调用describe_pet() 来描述小狗时,就可不 提供这种信息:

def describe_pet(pet_name, animal_type='dog'):
    """显示宠物的信息"""
    print("\nI have a " + animal_type + ".")
    print("My " + animal_type + "'s name is " + pet_name.title() + ".")
# describe_pet(pet_name='willie')


# 避免实参错误
# 开始使用函数后,如果遇到实参不匹配错误,不要大惊小怪。你提供的实参多于或少于函数完成其工作所需的信息时,将出现实参不匹配错误。
# 例如,如果调用函数describe_pet() 时没有指定任何实参,结果将如何呢?
def describe_pet(animal_type, pet_name):
    """显示宠物的信息"""
    print("\nI have a " + animal_type + ".")
    print("My " + animal_type + "'s name is " + pet_name.title() + ".")
# describe_pet()
# 会报如下错误提示
# TypeError: describe_pet() missing 2 required positional arguments: 'animal_type' and 'pet_name'

# 返回值
# 函数并非总是直接显示输出,相反,它可以处理一些数据,并返回一个或一组值。函数返回的值被称为返回值 。在函数中,可使用return 语句将值返回到调用函数的代码行。
# 返回值让你能够将程序的大部分繁重工作移到函数中去完成,从而简化主程序。

# 返回简单值
# 下面来看一个函数,它接受名和姓并返回整洁的姓名:
def get_formatted_name(first_name, last_name):
    """返回整洁的姓名"""
    full_name = first_name + ' ' + last_name
    return full_name.title()
musician = get_formatted_name('jimi', 'hendrix')
# print(musician)

# 函数get_formatted_name() 的定义通过形参接受名和姓。它将姓和名合而为一,在它们之间加上一个空格,并将结果存储在变量full_name 中。
# 然后, 将full_name 的值转换为首字母大写格式,并将结果返回。
# 调用返回值的函数时,需要提供一个变量,用于存储返回的值。在这里,将返回值存储在了变量musician 中,输出为整洁的姓名。

# 让实参变成可选的
# 有时候,需要让实参变成可选的,这样使用函数的人就只需在必要时才提供额外的信息。可使用默认值来让实参变成可选的。


def get_formatted_name(first_name, last_name, middle_name=''):
    """返回整洁的姓名"""
    if middle_name:
        full_name = first_name + ' ' + middle_name + ' ' + last_name
    else:
        full_name = first_name + ' ' + last_name
    return full_name.title()
musician = get_formatted_name('jimi', 'hendrix')
# print(musician)
musician = get_formatted_name('john', 'hooker', 'lee')
# print(musician)

# 返回字典
# 函数可返回任何类型的值,包括列表和字典等较复杂的数据结构。例如,下面的函数接受姓名的组成部分,并返回一个表示人的字典:
def build_person(first_name, last_name):
    """返回一个字典,其中包含有关一个人的信息"""
    person = {'first': first_name, 'last': last_name}
    return person
musician = build_person('jimi', 'hendrix')
# print(musician)


# 结合使用函数和while 循环
# 下面将结合使用函数get_formatted_name() 和while 循环,以更正规的方式问候用户。下面尝试使用名
# 和姓跟用户打招呼
#
# def get_formatted_name(first_name, last_name):
#     """返回整洁的姓名"""
#     full_name = first_name + ' ' + last_name
#     return full_name.title()
# # 这是一个无限循环!
# while True:
#     print("\nPlease tell me your name:")
#     f_name = input("First name: ")
#     l_name = input("Last name: ")
#     formatted_name = get_formatted_name(f_name, l_name)
#     print("\nHello, " + formatted_name + "!")


# 下面是可以中断循环的
# def get_formatted_name(first_name, last_name):
#     """返回整洁的姓名"""
#     full_name = first_name + ' ' + last_name
#     return full_name.title()
# while True:
#         print("\nPlease tell me your name:")
#         print("(enter 'q' at any time to quit)")
#         f_name = input("First name: ")
#         if f_name == 'q':
#             break
#         l_name = input("Last name: ")
#         if l_name == 'q':
#             break
#         formatted_name = get_formatted_name(f_name, l_name)
#         print("\nHello, " + formatted_name + "!")


# 传递列表
# 你经常会发现,向函数传递列表很有用,这种列表包含的可能是名字、数字或更复杂的对象(如字典)。将列表传递给函数后,函数就能直接访问其内容。下面使用函数来提高
# 处理列表的效率。
# 假设有一个用户列表,我们要问候其中的每位用户。下面的示例将一个名字列表传递给一个名为greet_users() 的函数,这个函数问候列表中的每个人: gree
def greet_users(names):
    """向列表中的每位用户都发出简单的问候"""
    for name in names:
        msg = "Hello, " + name.title() + "!"
        print(msg)
usernames = ['hannah', 'ty', 'margot']
# greet_users(usernames)


# 在函数中修改列表
# 将列表传递给函数后,函数就可对其进行修改。在函数中对这个列表所做的任何修改都是永久性的,这让你能够高效地处理大量的数据。 来看一家为用户提交的设计制作3D打印模型的公司。需要打印的设计存储在一个列表中,打印后移到另一个列表中

def print_models(unprinted_designs, completed_models):
    """
    模拟打印每个设计,直到没有未打印的设计为止 打印每个设计后,都将其移到列表completed_models中
    """
    while unprinted_designs:
        current_design = unprinted_designs.pop()
        # 模拟根据设计制作3D打印模型的过程
        print("Printing model: " + current_design)
        completed_models.append(current_design)
def show_completed_models(completed_models):
    """显示打印好的所有模型"""
    print("\nThe following models have been printed:")
    for completed_model in completed_models:
        print(completed_model)
unprinted_designs = ['iphone case', 'robot pendant', 'dodecahedron']
completed_models = []
# print_models(unprinted_designs, completed_models)
# show_completed_models(completed_models)

# 定义函数print_models() ,它包含两个形参:一个需要打印的设计列表和一个打印好的模型列表。给定这两个列表,这个函数模拟打印每个设计的过程:将 设计逐个地从未打印的设计列表中取出,并加入到打印好的模型列表中。
# 定义函数show_completed_models() ,它包含一个形参:打印好的模型列表。给定 这个列表,函数show_completed_models() 显示打印出来的每个模型的名称。



# 禁止函数修改列表
# 有时候,需要禁止函数修改列表。例如,假设像前一个示例那样,你有一个未打印的设计列表,并编写了一个将这些设计移到打印好的模型列表中的函数。你可能会做出这样的 决定:即便打印所有设计后,也要保留原来的未打印的设计列表,以供备案。但由于你将所有的设计都移出了unprinted_designs ,这个列表变成了空的,原来的列表没有 了。为解决这个问题,可向函数传递列表的副本而不是原件;这样函数所做的任何修改都只影响副本,而丝毫不影响原件。
# 要将列表的副本传递给函数,可以像下面这样做:
# function_name(list_name[:])
# 切片表示法[:] 创建列表的副本。在print_models.py中,如果不想清空未打印的设计列表,可像下面这样调用print_models() :
# print_models(unprinted_designs[:], completed_models)
# 这样函数print_models() 依然能够完成其工作,因为它获得了所有未打印的设计的名称,但它使用的是列表unprinted_designs 的副本,而不是列 表unprinted_designs 本身。像以前一样,列表completed_models 也将包含打印好的模型的名称,但函数所做的修改不会影响到列表unprinted_designs 。
# 虽然向函数传递列表的副本可保留原始列表的内容,但除非有充分的理由需要传递副本,否则还是应该将原始列表传递给函数,因为让函数使用现成列表可避免花时间和内存创 建副本,从而提高效率,在处理大型列表时尤其如此。


# 传递任意数量的实参
# 有时候,你预先不知道函数需要接受多少个实参,好在Python允许函数从调用语句中收集任意数量的实参。
# 例如,来看一个制作比萨的函数,它需要接受很多配料,但你无法预先确定顾客要多少种配料。
# 下面的函数只有一个形参*toppings ,但不管调用语句提供了多少实参,这个 形参都将它们统统收入囊中:
def make_pizza(*toppings):
    """打印顾客点的所有配料"""
    print(toppings)
# make_pizza('pepperoni')
# make_pizza('mushrooms', 'green peppers', 'extra cheese')


# 形参名*toppings 中的星号让Python创建一个名为toppings 的空元组,并将收到的所有值都封装到这个元组中。
# 函数体内的print 语句通过生成输出来证明Python能够处理 使用一个值调用函数的情形,也能处理使用三个值来调用函数的情形。
# 它以类似的方式处理不同的调用,注意,Python将实参封装到一个元组中,即便函数只收到一个值也如此

# 现在,我们可以将这条print 语句替换为一个循环,对配料列表进行遍历,并对顾客点的比萨进行描述
def make_pizza(*toppings):
    """概述要制作的比萨"""
    print("\nMaking a pizza with the following toppings:")
    for topping in toppings:
        print("- " + topping)
# make_pizza('pepperoni')
# make_pizza('mushrooms', 'green peppers', 'extra cheese')

# 不管函数收到的实参是多少个,这种语法都管用


# 结合使用位置实参和任意数量实参
# 如果要让函数接受不同类型的实参,必须在函数定义中将接纳任意数量实参的形参放在最后。Python先匹配位置实参和关键字实参,再将余下的实参都收集到最后一个形参中。 例如,如果前面的函数还需要一个表示比萨尺寸的实参,必须将该形参放在形参*toppings 的前面:
def make_pizza(size, *toppings):
    """概述要制作的比萨"""
    print("\nMaking a " + str(size) + "-inch pizza with the following toppings:")
    for topping in toppings:
        print("- " + topping)
# make_pizza(16, 'pepperoni')
# make_pizza(12, 'mushrooms', 'green peppers', 'extra cheese')
# 基于上述函数定义,Python将收到的第一个值存储在形参size 中,并将其他的所有值都存储在元组toppings 中。在函数调用中,首先指定表示比萨尺寸的实参,然后根据需要 指定任意数量的配料。
# 现在,每个比萨都有了尺寸和一系列配料,这些信息按正确的顺序打印出来了——首先是尺寸,然后是配料:

# 使用任意数量的关键字实参
# 有时候,需要接受任意数量的实参,但预先不知道传递给函数的会是什么样的信息。
# 在这种情况下,可将函数编写成能够接受任意数量的键—值对——调用语句提供了多少就接受多少。
# 一个这样的示例是创建用户简介:你知道你将收到有关用户的信息,但不确定会是什么样的信息。
# 在下面的示例中,函数build_profile() 接受名和姓,同时还接受任意数量的关键字实参


def build_profile(first, last, **user_info):
    """创建一个字典,其中包含我们知道的有关用户的一切"""
    profile = {}
    profile['first_name'] = first
    profile['last_name'] = last
    for key, value in user_info.items():
        profile[key] = value
    return profile
user_profile = build_profile('albert', 'einstein', location='princeton',field='physics')
# print(user_profile)


# 函数build_profile() 的定义要求提供名和姓,同时允许用户根据需要提供任意数量的名称—值对。
# 形参**user_info 中的两个星号让Python创建一个名为user_info 的 空字典,并将收到的所有名称—值对都封装到这个字典中。
# 在这个函数中,可以像访问其他字典那样访问user_info 中的名称—值对。
# 在build_profile() 的函数体内,我们创建了一个名为profile 的空字典,用于存储用户简介。我们将名和姓加入到这个字典中,因为我们总是会从用户那里收到这两项信息。
# 我们遍历字典user_info 中的键—值对,并将每个键—值对都加入到字典profile 中。最后,我们将字典profile 返回。
# 我们调用build_profile() ,向它传递名('albert' )、姓('einstein' )和两个键—值对(location='princeton' 和field='physics' ),并将返回 的profile 存储在变量user_profile 中,再打印这个变量
#
# 在这里,返回的字典包含用户的名和姓,还有求学的地方和所学专业。调用这个函数时,不管额外提供了多少个键—值对,它都能正确地处理。

# 函数存储在模块中 函数的优点之一是,使用它们可将代码块与主程序分离。通过给函数指定描述性名称,可让主程序容易理解得多。你还可以更进一步,将函数存储在被称为模块 的独立文件中,
# 再将模块导入 到主程序中。import 语句允许在当前运行的程序文件中使用模块中的代码。 通过将函数存储在独立的文件中,可隐藏程序代码的细节,将重点放在程序的高层逻辑上。这还能让你在众多不同的程序中重用函数。将函数存储在独立文件中后,可与其他程
# 序员共享这些文件而不是整个程序。知道如何导入函数还能让你使用其他程序员编写的函数库。
# 导入模块的方法有多种,下面对每种都作简要的介绍。

# 导入整个模块
# 要让函数是可导入的,得先创建模块。模块 是扩展名为.py的文件,包含要导入到程序中的代码。下面来创建一个包含函数make_pizza() 的模块。
# File:pizza.py 内容如下:
# def make_pizza(size, *toppings):
#     """概述要制作的比萨"""
#     print("\nMaking a " + str(size) + "-inch pizza with the following toppings:")
#     for topping in toppings:
#         print("- " + topping)


# import pizza
# pizza.make_pizza(16, 'pepperoni')
# pizza.make_pizza(12, 'mushrooms', 'green peppers', 'extra cheese')


# Python读取这个文件时,代码行import pizza让Python打开文件pizza.py,并将其中的所有函数都复制到这个程序中。
# 你看不到复制的代码,因为这个程序运行时,Python在幕 后复制这些代码。你只需知道,在making_pizzas.py中,可以使用pizza.py中定义的所有函数。
# 要调用被导入的模块中的函数,可指定导入的模块的名称pizza 和函数名make_pizza() ,并用句点分隔它们


# 这就是一种导入方法:只需编写一条import 语句并在其中指定模块名,就可在程序中使用该模块中的所有函数。
# 如果你使用这种import 语句导入了名为module_name.py 的整个模块,就可使用下面的语法来使用其中任何一个函数:
# module_name.function_name()

# 导入特定的函数
# 你还可以导入模块中的特定函数,这种导入方法的语法如下:
# from module_name import function_name
# 通过用逗号分隔函数名,可根据需要从模块中导入任意数量的函数:
# from module_name import function_0, function_1, function_2

# 如果只想导入要使用的函数,代码将类似于下面这样:
# from pizza import make_pizza
# make_pizza(16, 'pepperoni')
# make_pizza(12, 'mushrooms', 'green peppers', 'extra cheese')
# 若使用这种语法,调用函数时就无需使用句点。由于我们在import 语句中显式地导入了函数make_pizza() ,因此调用它时只需指定其名称。

# 使用as 给函数指定别名
# 如果要导入的函数的名称可能与程序中现有的名称冲突,或者函数的名称太长,可指定简短而独一无二的别名 ——函数的另一个名称,类似于外号。要给函数指定这种特殊外 号,需要在导入它时这样做。
# 下面给函数make_pizza()指定了别名mp()。这是在import语句中使用make_pizza as mp实现的,关键字as将函数重命名为你提供的别名:
# from pizza import make_pizza as mp
# mp(16, 'pepperoni')
# mp(12, 'mushrooms', 'green peppers', 'extra cheese')
# 上面的import 语句将函数make_pizza() 重命名为mp() ;
# 在这个程序中,每当需要调用make_pizza() 时,都可简写成mp() ,而Python将运行make_pizza() 中的代 码,这可避免与这个程序可能包含的函数make_pizza() 混淆。
# 指定别名的通用语法如下:
# from module_name import function_name as fn

# 使用as 给模块指定别名
# 你还可以给模块指定别名。通过给模块指定简短的别名(如给模块pizza 指定别名p ),让你能够更轻松地调用模块中的函数。相比于pizza.make_pizza()
# ,p.make_pizza() 更为简洁

# import pizza as p
# p.make_pizza(16, 'pepperoni')
# p.make_pizza(12, 'mushrooms', 'green peppers', 'extra cheese')
# 上述import 语句给模块pizza 指定了别名p ,但该模块中所有函数的名称都没变。
# 调用函数make_pizza() 时,可编写代码p.make_pizza() 而不 是pizza.make_pizza() ,这样不仅能使代码更简洁,还可以让你不再关注模块名,而专注于描述性的函数名。
# 这些函数名明确地指出了函数的功能,对理解代码而言,它们 比模块名更重要。
# 给模块指定别名的通用语法如下:
# import module_name as mn


# 导入模块中的所有函数
# 使用星号(* )运算符可让Python导入模块中的所有函数:

# from pizza import *
# make_pizza(16, 'pepperoni')
# make_pizza(12, 'mushrooms', 'green peppers', 'extra cheese')
# import 语句中的星号让Python将模块pizza 中的每个函数都复制到这个程序文件中。由于导入了每个函数,可通过名称来调用每个函数,而无需使用句点表示法。
# 然而,使用 并非自己编写的大型模块时,最好不要采用这种导入方法:如果模块中有函数的名称与你的项目中使用的名称相同,可能导致意想不到的结果:Python可能遇到多个名称相同的函数或变量,进而覆盖函数,而不是分别导入所有的函数。
# 最佳的做法是,要么只导入你需要使用的函数,要么导入整个模块并使用句点表示法。这能让代码更清晰,更容易阅读和理解。
# 在阅读别人编写的代码时,如果遇到类似于下面的import 语句,希望能够理解:
# from module_name import *



# 函数编写指南
# 编写函数时,需要牢记几个细节。应给函数指定描述性名称,且只在其中使用小写字母和下划线。描述性名称可帮助你和别人明白代码想要做什么。给模块命名时也应遵循上述约定。
# 每个函数都应包含简要地阐述其功能的注释,该注释应紧跟在函数定义后面,并采用文档字符串格式。文档良好的函数让其他程序员只需阅读文档字符串中的描述就能够使用它:他们完全可以相信代码如描述的那样运行;
# 只要知道函数的名称、需要的实参以及返回值的类型,就能在自己的程序中使用它。

# 给形参指定默认值时,等号两边不要有空格:
# def function_name(parameter_0, parameter_1='default value')

# 对于函数调用中的关键字实参,也应遵循这种约定:
# function_name(value_0, parameter_1='value')


# PEP 8(https://www.python.org/dev/peps/pep-0008/ )建议代码行的长度不要超过79字符,这样只要编辑器窗口适中,就能看到整行代码。
# 如果形参很多,导致函数定义的长度超过了 79字符,可在函数定义中输入左括号后按回车键,并在下一行按两次Tab键,从而将形参列表和只缩进一层的函数体区分开来。
# 大多数编辑器都会自动对齐后续参数列表行,使其缩进程度与你给第一个参数列表行指定的缩进程度相同:

# 大多数编辑器都会自动对齐后续参数列表行,使其缩进程度与你给第一个参数列表行指定的缩进程度相同:
# def function_name(
#         parameter_0, parameter_1, parameter_2,
#         parameter_3, parameter_4, parameter_5):
#     function body...

# 如果程序或模块包含多个函数,可使用两个空行将相邻的函数分开,这样将更容易知道前一个函数在什么地方结束,下一个函数从什么地方开始。
# 所有的import 语句都应放在文件开头,唯一例外的情形是,在文件开头使用了注释来描述整个程序。



# 程序员的目标之一是,编写简单的代码来完成任务,而函数有助于你实现这样的目标。它们让你编写好代码块并确定其能够正确运行后,就可置之不理。
# 确定函数能够正确地完 成其工作后,你就可以接着投身于下一个编码任务。
# 函数让你编写代码一次后,想重用它们多少次就重用多少次。需要运行函数中的代码时,只需编写一行函数调用代码,就可让函数完成其工作。
# 需要修改函数的行为时,只需修 改一个代码块,而所做的修改将影响调用这个函数的每个地方。
# 使用函数让程序更容易阅读,而良好的函数名概述了程序各个部分的作用。相对于阅读一系列的代码块,阅读一系列函数调用让你能够更快地明白程序的作用。
# 函数还让代码更容易测试和调试。如果程序使用一系列的函数来完成其任务,而其中的每个函数都完成一项具体的工作,测试和维护起来将容易得多:
# 你可编写分别调用每个函数的程序,并测试每个函数是否在它可能遇到的各种情形下都能正确地运行。
# 经过这样的测试后你就能信心满满,深信你每次调用这些函数时,它们都将正确地运行。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,425评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,058评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,186评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,848评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,249评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,554评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,830评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,536评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,239评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,505评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,004评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,346评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,999评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,060评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,821评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,574评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,480评论 2 267

推荐阅读更多精彩内容

  • 〇、前言 本文共108张图,流量党请慎重! 历时1个半月,我把自己学习Python基础知识的框架详细梳理了一遍。 ...
    Raxxie阅读 18,782评论 17 410
  • Python 面向对象Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对...
    顺毛阅读 4,165评论 4 16
  • 仪式感。在我看来是生活中的主观方面掀起小波澜。一声问候、一份礼物、一句告白、一个拥抱,都能充分表达情感,使...
    是黄小丫啦阅读 236评论 2 1
  • 一.犯难 列车进站了,轮毂和铁道的摩擦溅起一串火花,划入车厢前部正在下水的下水孔,立马就又消失不见。整辆车都在卯足...
    急教科书阅读 203评论 0 2
  • CocoaTouchLayer Implement a graphical, event-driven appli...
    莫_名阅读 557评论 0 0