重用代码是构建一个可维护的系统的关键
要在 Python中重用代码,以函数为始,也以函数为终。
为取几行代码指定一个名字,你就得到了一个(可以重用的)函数;
取一组函数,把它们打包成一个文件,你就得到了一个(可以重用的)模块
Python函数的参数/返回值无需指定类型
Python解释器不要求指定函数的参数/返回值的类型。
Python允许将任何对象作为参数/返回值。解释器不关心也不检查这些对象的类型是什么(它只检查是否提供了参数和返回值)
在 Python3中,可以指示期望的参数/返回值的类型。不过,指示期望类型并不会“魔法般地”打开类型检查,因为 Python从来不会检查参数或返回值的类型。
创建函数
一般格式:def 函数名(参数):
代码组…
return 返回值
关于参数/返回值
- 参数/返回值无需指定类型
- 可以有任意多个参数
- 只能有一个返回值(返回一个对象)
若要返回多个值,则需要把它们打包在一个对象中(如列表、集合)
传入一个单词,返回单词中含有的元音字母集合
def search4vowels(word):
"""Return any vowels found in a word"""
vowels = set('aeiou')
return vowels.intersection(set(word))
================== RESTART: C:\Users\13272\Desktop\vowel.py ==================
>>> search4vowels('Hello')
{'e', 'o'}
为函数添加注解和docstring
注解和docstring都不是必需的,注解的目的仅仅是为了让函数的使用者更轻松。注解是一个文档标准,而不是一个类型强制机制。
注解和docstring的意义:让使用者无需读数代码,就能知道这个函数需要接收什么类型的参数、会从返回什么类型、这个函数的功能
-
docstring
就是三个引号包围的注释
形如"""功能说明"""
用于说明函数功能,放在def
的下一行 - 注解标明了“期待的”参数/返回值类型
形如def search4vowels
(word:str) -> set:
注解并不改变解释器的行为。解释器永远不关心参数/返回值的类型,也不会进行类型检查
由于解释器完全无视注解,我们不必局限于用“基本类型”作为注解,甚至可以用字符串作为注解(只要这样有意义、能帮助理解函数功能)
例如def search4vowels
(word:'string') -> 'answer':
- 添加注解和docstring后,我们就建立了函数文档
def search4vowels(word:str) -> set:
"""Return any vowels found in a word"""
...
- 在
>>>
窗口使用help()
BIF查看注解和docstring
#查看注解和docstring
>>> help(search4vowels)
Help on function search4vowels in module __main__:
search4vowels(word:str) -> set
Return any vowels found in a word
为参数设置默认值
在函数的def
行,可以为任何参数赋一个默认值。
如果为个参数设置了默认值,调用函数时,[为这个参数指定值]就是可选的
例如,下面的函数search4letters
有两个参数:返回在word
中找到的letters
的集合
def search4letters(word:str='Hello',letters:str='aeiou') -> set:
"""Return any letters found in a word"""
return set(letters).intersection(set(word))
这里为两个参数都设置了默认值word='Hello'
和letters='aeiou'
若没有传入某参数,则将其赋为默认值
传入参数的两种方式:位置赋值与关键字赋值
位置赋值:根据
def
语句中的参数的顺序来赋值
在这里就是:第一个参数赋给word,第二个参数赋给 letters。
- 两个参数都使用默认值
>>> search4letters()
{'o', 'e'}
- 仅第二个参数
letters
使用默认值'aeiou'
>>> search4letters('world')
{'o'}
还可以按参数名来指定参数,即关键字赋值。
如果是这样,就不再按照位置顺序来赋值。此时,可以按任意顺序传入各个参数
- 注意,若仅第一个参数
word
使用默认值'Hello'
此时存在二义性(不知道传入的值要赋给哪一个参数)必须使用关键字赋值:
>>> search4letters(letters='e')
{'e'}