重用代码是构建一个可维护的系统的关键

要在 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的意义:让使用者无需读数代码,就能知道这个函数需要接收什么类型的参数、会从返回什么类型、这个函数的功能

  1. docstring就是三个引号包围的注释
    形如"""功能说明""" 用于说明函数功能,放在def的下一行
  2. 注解标明了“期待的”参数/返回值类型
    形如def search4vowels(word:str) -> set:
    注解并不改变解释器的行为。解释器永远不关心参数/返回值的类型,也不会进行类型检查

由于解释器完全无视注解,我们不必局限于用“基本类型”作为注解,甚至可以用字符串作为注解(只要这样有意义、能帮助理解函数功能)
例如
def search4vowels(word:'string') -> 'answer':

  1. 添加注解和docstring后,我们就建立了函数文档
def search4vowels(word:str) -> set:
    """Return any vowels found in a word"""
	...
  1. >>>窗口使用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。

  1. 两个参数都使用默认值
>>> search4letters()
{'o', 'e'}
  1. 仅第二个参数letters使用默认值'aeiou'
>>> search4letters('world')
{'o'}

还可以按参数名来指定参数,即关键字赋值
如果是这样,就不再按照位置顺序来赋值。此时,可以按任意顺序传入各个参数

  1. 注意,若仅第一个参数word使用默认值'Hello' 此时存在二义性(不知道传入的值要赋给哪一个参数)必须使用关键字赋值
>>> search4letters(letters='e')
{'e'}