Python培训(4)

来源:互联网 发布:好玩的rpg游戏 知乎 编辑:程序博客网 时间:2024/05/17 08:57

明天要与大家共同学习的主要内容是Python的函数,今天做个小结备忘。


明天讲解的内容主要有以下几点,

函数的参数(实参、形参
函数的返回值
函数以及模块的导入
函数编写指南

下面看看第一部分---参数部分,分为下面的几个小点,

函数的参数(实参、形参)
定义函数
位置实参
关键字实参
给形参指定默认值
传递修改列表
传递任意数量的实参

首先看看函数的定义,

函数是带名字的代码块,用于完成具体的工作
使用关键字def来告诉Python定义一个函数
def greet_user():    """显示简单的问候语"""    print("Hello!")greet_user()

上面仅仅是定义了一个函数,没有参数(Input),也没有返回值(Output),以后我们会陆续谈到参数和返回值。


使用参数先函数传递信息,

可在函数定义defgreet_user()的括号内添加username
通过在这里添加username,就可让函数接受你给username指定的任何值
在函数greet_user()的定义中,变量username是一个形参——函数完成其工作所需的一项信息
代码greet_user('jesse')中,值'jesse'是一个实参。实参调用函数时传递给函数的信息。
def greet_user(username):    """显示简单的问候语"""    print("Hello, " + username.title() + "!")greet_user('jesse')


参数也有不同类别,如按照位置先后顺序分,有位置参数;也可以给函数传递名称-值对,称为关键字参数。


先看看位置参数的使用和定义,

调用函数时,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('dog', 'willie')

下面看看关键字参数,

关键字实参是传递给函数的名称值对。直接在实参中将名称和值关联起来了,因此向函数传递实参时不会混淆
关键字实参无需考虑函数调用中的实参顺序,还清楚地指出了函数调用中各个值的用途。
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’)   # 与上一句等效


我们也可以为形参指定默认值,实参可以根据情况决定是否需要再给它赋值。这个功能有点类似高级语言的override相同函数名不同数量参数,但使用上却十分简单方便。
编写函数时,可给每个形参指定默认值
调用函数中给形参提供了实参时,Python将使用指定的实参值;否则,将使用形参的默认值。因此,给形参指定默认值后,可在函数调用中省略相应的实参
使用默认值可简化函数调用,还可清楚地指出函数的典型用法。
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('willie') # 等效describe_pet(pet_name=‘willie’)  


下面,再看看更多的例子,

鉴于可混合使用位置实参、关键字实参和默认值,通常有多种等效的函数调用方式。

下面示例中,在任何情况下都必须给pet_name提供实参;指定该实参时可以使用位置方式,也可以使用关键字方式。

如果要描述的动物不是小狗,还必须在函数调用中给animal_type提供实参;同样,指定该实参时可以使用位置方式,也可以使用关键字方式。

def describe_pet(pet_name, animal_type='dog'):    """显示宠物的信息"""    print("\nI have a " + animal_type + ".")    print("My " + animal_type + "'s name is " + pet_name.title() + ".")# 一条名为Willie的小狗describe_pet('willie')describe_pet(pet_name='willie')# 一只名为Harry的仓鼠describe_pet('harry', 'hamster')describe_pet(pet_name='harry', animal_type='hamster')describe_pet(animal_type='hamster', pet_name='harry')

我们不仅可以通过参数传递简单的数字和字符串,也可以传递列表,下面的例子就是传递列表,并且在函数中修改了列表,

将列表传递给函数后,函数就可对其进行修改。

示例在函数中对这个列表所做的任何修改都是永久性的。

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(unprinted_designs[:], completed_models)show_completed_models(completed_models)

有时候,可能要传递的参数很多,就连神也不知道有多少个参数需要传递,该怎么办呢?

有办法的,可以使用星号符号“*”后面加上参数名,且看下面的例子来感悟,(是不是和C语言的*argv十分类似?)

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')

上面的例子本质上传递的是列表,如果要传递任意数量的字典呢?

用两个星号"**"就可以了,

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 profileuser_profile = build_profile('albert', 'einstein',location='princeton',field='physics')print(user_profile)



下面看看函数的返回值,

函数返回的值被称为返回值。

在函数中,可使用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)


下面是更复杂的应用,返回字典,
def build_person(first_name, last_name):    """返回一个字典,其中包含有关一个人的信息"""    person = {'first': first_name, 'last': last_name}    return personmusician = build_person('jimi', 'hendrix')print(musician)



接下来看看模块和函数的导入。

如何导入一个模块呢?

要让函数是可导入的,得先创建模块。模块是扩展名为.py的文件,包含要导入到程序中的代码。

下面来创建一个包含函数make_pizza()的模块pizza.py

接下来,我们在pizza.py所在的目录中创建另一个名为making_pizzas.py的文件,这个文件导入刚创建的模块,再调用make_pizza() 

 

下面是pizzy.py

def make_pizza(size, *toppings):    """概述要制作的比萨"""    print("\nMaking a " + str(size) +            "-inch pizza with the following toppings:")    for topping in toppings:        print("- " + topping)

下面是making_pizzas.py
import pizzapizza.make_pizza(16, 'pepperoni')pizza.make_pizza(12, 'mushrooms', 'green peppers', 'extra cheese')

如何导入特点的某个函数呢?
from pizza import make_pizzamake_pizza(16, 'pepperoni')make_pizza(12, 'mushrooms', 'green peppers', 'extra cheese')

可以使用as给函数指定别名,
from pizza import make_pizza as mpmp(16, 'pepperoni')mp(12, 'mushrooms', 'green peppers', 'extra cheese')

也可以使用as给模块指定别名,
import pizza as pp.make_pizza(16, 'pepperoni')p.make_pizza(12, 'mushrooms', 'green peppers', 'extra cheese')

导入所有的函数可以使用 “from module_nameimport *,但是不建议使用。

 

最后,再看看函数的编写指南,

应给函数指定描述性名称,且只在其中使用小写字母和下划线。

描述性名称可帮助你和别人明白代码想要做什么。给模块命名时也应遵循上述约定。

每个函数都应包含简要地阐述其功能的注释,该注释应紧跟在函数定义后面,并采用文档字符串格式。

文档良好的函数让其他程序员只需阅读文档字符串中的描述就能够使用它:他们完全可以相信代码如描述的那样运行;

只要知道函数的名称、需要的实参以及返回值的类型,就能在自己的程序中使用它。

给形参指定默认值时,等号两边不要有空格:

   •deffunction_name(parameter_0,parameter_1='defaultvalue')

对于函数调用中的关键字实参,也应遵循这种约定:

   •function_name(value_0,parameter_1='value')

建议代码行的长度不要超过79字符

如果程序或模块包含多个函数,可使用两个空行将相邻的函数分开

所有的import语句都应放在文件开头,唯一例外的情形是,在文件开头使用了注释来描述整个程序。



原创粉丝点击