本文最后更新于 320 天前,其中的信息可能已经过时,如有错误请发送邮件到wuxianglongblog@163.com
函数
定义函数
函数,通常接受输入参数,并有返回值。它负责完成某项特定任务,而且相较于其他代码,具备相对的独立性。
def add(x, y):
"""Add two numbers"""
a = x + y
return a
函数通常有一下几个特征:
- 使用 def 关键词来定义一个函数。
- def 后面是函数的名称,括号中是函数的参数,不同的参数用 , 隔开, def foo(): 的形式是必须要有的,参数可以为空;
- 使用缩进来划分函数的内容;
- docstring 用 """ 包含的字符串,用来解释函数的用途,可省略;
- return 返回特定的值,如果省略,返回
None
。
使用函数
使用函数时,只需要将参数换成特定的值传给函数。
Python并没有限定参数的类型,因此可以使用不同的参数类型:
add(2, 3)
5
add('foo', 'bar')
'foobar'
传入的两个参数不可以相加,Python会将报错:
add(2, "foo")
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
Input In [4], in ()
----> 1 add(2, "foo")
Input In [1], in add(x, y)
1 def add(x, y):
2 """Add two numbers"""
----> 3 a = x + y
4 return a
TypeError: unsupported operand type(s) for +: 'int' and 'str' |
传入的参数数目与实际不符合,也会报错:
add(1, 2, 3)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
Input In [5], in ()
----> 1 add(1, 2, 3)
TypeError: add() takes 2 positional arguments but 3 were given |
add(1)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
Input In [6], in ()
----> 1 add(1)
TypeError: add() missing 1 required positional argument: 'y' |
传入参数时,Python提供了两种选项,第一种是上面使用的按照位置传入参数,另一种则是使用关键词模式,显式地指定参数的值:
add(x=2, y=3)
5
add(y="foo", x="bar")
'barfoo'
可以混合这两种模式:
add(2, y=3)
5
设定参数默认值
可以在函数定义的时候给参数设定默认值,例如:
def quad(x, a=1, b=0, c=0):
return a*x**2 + b*x + c
quad(2.0)
4.0
可以修改参数的默认值:
quad(2.0, b=3)
10.0
quad(2.0, 2, c=4)
12.0
这里混合了位置和指定两种参数传入方式,第二个2是传给 a 的。
注意,在使用混合语法时,要注意不能给同一个值赋值多次,否则会报错,例如:
quad(2.0, 2, a=2)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
Input In [14], in ()
----> 1 quad(2.0, 2, a=2)
TypeError: quad() got multiple values for argument 'a' |
接收不定参数
使用如下方法,可以使函数接受不定数目的参数:
def add(x, *args):
total = x
for arg in args:
total += arg
return total
*args
表示参数数目不定,可以看成一个元组,把第一个参数后面的参数当作元组中的元素:
add(1, 2, 3, 4)
10
add(1, 2)
3
这样定义的函数不能使用关键词传入参数,要使用关键词,可以这样:
def add(x, **kwargs):
total = x
for arg, value in kwargs.items():
print("adding ", arg)
total += value
return total
**kwargs
表示参数数目不定,相当于一个字典,关键词和值对应于键值对:
add(10, y=11, z=12, w=13)
adding y
adding z
adding w
46
可以接收任意数目的位置参数和键值对参数的函数:
def foo(*args, **kwargs):
print(f'{args=}, {kwargs=}')
foo(2, 3, x='bar', z=10)
args=(2, 3), kwargs={'x': 'bar', 'z': 10}
返回多个值
函数可以返回多个值:
from math import atan2
def to_polar(x, y):
r = (x**2 + y**2) ** 0.5
theta = atan2(y, x)
return r, theta
r, theta = to_polar(3, 4)
r, theta
(5.0, 0.9272952180016122)
Python将返回的两个值变成了元组:
to_polar(3, 4)
(5.0, 0.9272952180016122)
函数类型注释
Python 3支持对函数的类型进行注释,但是不会真正检验对象的类型:
def add(a : int, b : int) -> int:
return a + b
add(1, 2)
3
类型不是int也不会报错:
add("a", "b")
'ab'