目录
7、函数
1)定义函数
# def函数定义,定义以冒号结尾
def greet_user(username):
# 自定义函数需自己来添加说明文档,必须是缩进后的第一行;使用help(函数名)可以查看函数的说明文档
"""显示简单的问候语"""
print("Hello, "+username.title()+"!" )
greet_user('mary')
greet_user('eric')
# 在定义greet_username()中,username是一个形参
# greet_user('mary')中,'mary'是一个实参;
# 形参:函数完成其工作所需的一项信息
# 实参:调用函数时传递给函数的信息
1)向函数传递信息
传递的是参数,分别为形参和实参。实参是等待外部传入的,形参是接受外部实参,并且保证代码完整性来实现格式化输出。
2)传递实参
传递的三种方法:位置传递、关键字传递、默认传递
1)位置实参
调用函数时,Python必须将函数调用中的每个实参都关联到函数定义中的一个形参,最简单的关联方式就是基于实参顺序,称为位 置实参。位置实参的顺序特别重要,如果实参和形参顺序不一样,程序不会报错,但是结果会出乎意料。这就意味着,实参传递的顺 序和形参顺序一样。
这个函数指出一款笔记本属于游戏本还是轻薄本以及它叫什么名字,如下所示:
def describe_book(book_type, book_name):
"""显示笔记本的信息"""
print("\nI have a"+book_type+".")
print("My "+book_type+"'s name is "+book_name.title()+".")
describe_book('geme book', 'lenovo r7000')
这个函数的定义表明,它需要一种笔记本类型和一个名字。调用describe_book()时,需要按顺序提供一种笔记本类型和一个名字。
实参存在形参里,就好比考试不能直接写名字,考卷按顺序上交。
1)调用函数多次
你可以根据需要调用函数任意次。要再描述一款笔记本,只需再次调用describe_book()即可:
def describe_book(book_name, book_type):
"""显示笔记本的信息"""
print("\nI have a"+book_type+".")
print("My "+book_type+"'s name is "+book_name.title()+".")
describe_book('lenovo r7000p', 'game book')
describe_book('mac book', 'thin book')
第二次调用describe_book()函数时,我们向它传递了实参'mac book',和'thin'。与第一次调用时一样,Python将实参'mac book'关联到形参book_name,并将实参'thin'关联到形参book_type。输出出来的结果大家可以自己试一下,这里不水字数。
位置实参的顺序很重要
使用位置实参来调用函数时,如果实参的顺序不正确,结果会出乎意料,忘记检查代码,emmm。
2)关键字实参
这么说吧,使用位置实参,是一种取巧、省事的方式,因此必须注意为止一一对应;使用关键字实参,略微费事,但是更加精准,无需一一对应,先苦后甜。
关键字实参时传递给函数的 名称-值对。
下面来重新用一遍先前的例子:
def describe_book(book_name, book_type):
"""显示笔记本的信息"""
print("\nI have a"+book_type+".")
print("My "+book_type+"'s name is "+book_name.title()+".")
describe_book(book_type='game book', book_name='lenovo r7000p')
函数describe_book()还是那样,但是调用起来时,我们向Python明确的指出了各个实参对应的形参。看到这个函数调用时,Python知道应该将实参'game book'和'lenovo r7000p'分别储存在形参book_type和book_name中。
3)默认值
在编写函数的时候,可以给形参指定默认值。在调用函数中,给形参提供了实参,Python将使用知道你过的实参值;否则,将使用形参的默认值。
例如,如果你发现调用describe_book()时,描述的大都是game book,就可以将形参describe_book的默认值设置为‘game book’。这样,调用describe_book()来描述笔记本时,就可以不提供这种信息。
4)等效的函数调用
可以混合是同位置实参、关键字实参和默认值,通常有多种等效的函数调用方式。下面这个函数describe_book()的定义里,给一个形参提供了默认值:
def describe_book(book_name, book_type='game book')
那么基于这种定义,在任何情况下,都必须给book_name提供实参;想要指定该实参时,可以使用位置方式,也可以使用关键字方式。如果要描述的book不是game book,还必须在函数调用中给book_type提供实参;指定该实参方法同上。
2)返回值
函数返回的值称为返回值。函数就像你聘请的雇员,你给他一些材料,告知他如何组装、加工材料,他负责将成品给你。材料就是函数的参数,成品就是函数的输出,怎么加工就是这个函数的代码块。
1)返回简单值
例如:
def get_book_name(first_name, last_name):
full_book_name = first_name+' 'last_name
return full_book_name.title()
my_book = get_book_name('lenovo', 'r7000p')
print(my_book)
函数get_book_name()的定义通过形参接收笔记本的品牌和型号。顺便在中间加了一个空格,它俩不是粘在一起的,并将结果存储在变量full_book_name中。然后,将full_book_name的值转换为首字母大写格式,并将结果返回到函数调用中。
调用返回值的函数时,需要提供一个变量,用于存储返回的值。在需要分别存储大量品牌和型号的大型程序中,这种函数非常有用。
2)让实参可选
有时,需要让实参可选,这样使用函数时,就只需在必要时提供额外的信息。可使用默认值让实参变得可选。
3)返回字典
函数可以返回任何类型的值,包括列表和字典等比较复杂的数据结构。具体就不做演示,只需要在函数中间加上一串代码,定义一个字典即可,最后在函数结尾使用return返回这个字典(被定义了的,不是空的)。
postscript:函数里还可以夹杂什么if函数、while语句等等,你想怎么定义怎么来。
3)将函数存储在模块(module)中
函数的优点之一,就是使用它们可以将代码块与主程序分离。通过给函数指定描述性名称,可让主程序容易理解得多。还可以更进一步,将函数存储在被称为模块的独立文件中,再将模块导入到主程序中。import语句允许在当前运行的程序文件中使用模块中的代码。
举个例子:
import wx
# 意为导入模块wx中的所有函数,而from wx.core import Center则是从模块wx中导入Center这个函数
导入模块的方法有以下这些种类。
1)导入整个模块
要使函数是可导入的,先要创建模块。模块是扩展名为.py的文件,其中包含要导入到程序中的代码。你创建的这个模块,你可以定义任意函数在其中,再在另一个程序中,导入这个模块,就是直接:
import 你定义的模块
或者用另一种形式:
import 你定义的模块
随意.模块里的函数()
2)导入特定的函数
导入模块中的特定函数,这种方法的语法如下:
from module_name import function_name
通过都好分割函数名,可根据需要从模块中导入任意数量的函数:
from module_name import function_0,function_1,function_2
3)使用as函数指定别名
如果要导入的函数名称可能与程序中现有的名称冲突,或者函数的名称太长,可指定简短而独一无二的别名,你就把它当作你给函数取的外号吧。例如:
from module_name import function_name
postscript:甚至还可以给模块指定别名。例如:
from module_name import function_name as fn
4)导入模块中的所有函数
使用星号(*)运算符可让Python导入模块中的所有函数:
from module_name import *