在 Python 中,你也可以定义包含若干参数的函数。这里有三种可用的形式,也可以混合使用。
默认参数值
最常用的一种形式是为一个或多个参数指定默认值。这会创建一个可以使用比定义时允许的参数更少的参数调用的函数,例如
这个函数可以通过几种不同的方式调用:
只给出必要的参数:
ask_ok('Do you really want to quit?')
给出一个可选的参数:
ask_ok('OK to overwrite the file?', 2)
或者给出所有的参数:
ask_ok('OK to overwrite the file?', 2, 'Come on, only yes or no!')
这个例子还介绍了 in 关键字。它测定序列中是否包含某个确定的值。
默认值在函数 定义 作用域被解析,如下所示
将会输出 5 。
重要警告: 默认值只被赋值一次。这使得当默认值是可变对象时会有所不同,比如列表、字典或者大多数类的实例。例如,下面的函数在后续调用过程中会累积(前面)传给它的参数。小编为大家推荐一个学习交流群:308754087,群里有好多人了~大家遇到啥问题都可以在里面交流!是一个非常好的学习交流地方~欲进从速欧~各种PDF等你来下载,全部免费,只为帮助大家快速入门。
输出:
如果你不想让默认值在后续调用中累积,你可以像下面一样定义函数:
关键字参数
函数可以通过 关键字参数 的形式来调用,形如 keyword = value 。例如,以下的函 数:
接受一个必选参数 ( voltage ) 以及三个可选参数 ( state , action , 和 type )。可以用 以下的任一方法调用
不过以下几种调用是无效的:
在函数调用中,关键字的参数必须跟随在位置参数的后面。传递的所有关键字参数必须与函数接受的某个参数相匹配 (例如 actor 不是 parrot 函数的有效参数),它们的顺序并不重要。这也包括非可选参数(例如 parrot(voltage=1000) 也是有效 的)。任何参数都不可以多次赋值。下面的示例由于这种限制将失败
引入一个形如 **name 的参数时,它接收一个字典(参见 Mapping Types — dict ),该字典包含了所有未出现在形式参数列表中的关键字参数。这里可能还会组合使用一个形如 *name (下一小节详细介绍) 的形式参数,它接收一个元组(下一 节中会详细介绍),包含了所有没有出现在形式参数列表中的参数值( *name 必须 在 **name 之前出现)。 例如,我们这样定义一个函数:
它可以像这样调用
当然它会按如下内容打印:
注意在打印关键字参数之前,通过对关键字字典 keys() 方法的结果进行排序,生 成了关键字参数名的列表;如果不这样做,打印出来的参数的顺序是未定义的。
可变参数列表
最后,一个最不常用的选择是可以让函数调用可变个数的参数。这些参数被包装进一个元组(参见 元组和序列 )。在这些可变个数的参数之前,可以有零到多个普通的参数:
通常,这些 可变 参数是参数列表中的最后一个,因为它们将把所有的剩余输入参 数传递给函数。任何出现在 *args 后的参数是关键字参数,这意味着,他们只能被 用作关键字,而不是位置参数
参数列表的分拆
另有一种相反的情况: 当你要传递的参数已经是一个列表,但要调用的函数却接受分开一个个的参数值。这时候你要把已有的列表拆开来。例如内建函数 range() 需要要独立的 start,stop 参数。你可以在调用函数时加一个 * 操作符来自动把参数 列表拆开:
以同样的方式,可以使用 ** 操作符分拆关键字参数为字典:
Lambda 形式
出于实际需要,有几种通常在函数式编程语言例如 Lisp 中出现的功能加入到了Python。通过 lambda 关键字,可以创建短小的匿名函数。这里有一个函数返回它的两个参数的和: lambda a, b: a+b。 Lambda 形式可以用于任何需要的函数对象。出于语法限制,它们只能有一个单独的表达式。语义上讲,它们只是普通函数定义中的一个语法技巧。类似于嵌套函数定义,lambda 形式可以从外部作用域引用变量:
上面的示例使用 lambda 表达式返回一个函数。另一个用途是将一个小函数作为参数传递:
文档字符串
这里介绍的文档字符串的概念和格式。
第一行应该是关于对象用途的简介。简短起见,不用明确的陈述对象名或类型,因为它们可以从别的途径了解到(除非这个名字碰巧就是描述这个函数操作的动词)。这一行应该以大写字母开头,以句号结尾。
如果文档字符串有多行,第二行应该空出来,与接下来的详细描述明确分隔。接下来的文档应该有一或多段描述对象的调用约定、边界效应等。
Python 的解释器不会从多行的文档字符串中去除缩进,所以必要的时候应当自己清除缩进。这符合通常的习惯。第一行之后的第一个非空行决定了整个文档的缩进格式。(我们不用第一行是因为它通常紧靠着起始的引号,缩进格式显示的不清楚。)留白“相当于”是字符串的起始缩进。每一行都不应该有缩进,如果有缩进的话,所有的留白都应该清除掉。留白的长度应当等于扩展制表符的宽度(通常是8个空格)。
以下是一个多行文档字符串的示例
函数注解
函数注解 是关于用户自定义的函数的完全可选的、随意的元数据信息。无论 Python 本身或者标准库中都没有使用函数注解;本节只是描述了语法。第三方的项目是自由地为文档,类型检查,以及其它用途选择函数注解。
注解是以字典形式存储在函数的 __annotations__ 属性中,对函数的其它部分没有 任何影响。参数注解(Parameter annotations)是定义在参数名称的冒号后面,紧随着一个用来表示注解的值得表达式。返回注释(Return annotations)是定义在一个 ‐> 后面,紧随着一个表达式,在冒号与 ‐> 之间。下面的示例包含一个位置参数,一个关键字参数,和没有意义的返回值注释
领取专属 10元无门槛券
私享最新 技术干货