函数
由函数名、参数列表以及语句块构成的能实现某种功能的代码段。函数可以按照功能组织代码,减少代码冗余。是结构化编程的核心
函数的定义
使用def语句定义函数
def 函数名(参数列表): 函数体( 代码块 ) [return 返回值] 函数定义时,参数列表称为形式参数 语句块以4个空格缩进,如果没有return语句,会隐式返回None
函数的定义只是声明了一个函数,如果要执行,需要对其调用。调用函数时,使用函数名后加小括号的方式,传入的参数称为实参
定义一个函数
def fibs(num): fib = [0, 1] for i in range(num): fib.append(fib[i] + fib[i + 1]) return fib
f5=fibs(5)
print(f5)
上面定义了一个函数 fibs,计算的结果通过return返回。调用时传入了一个参数,返回值使用变量 f5接收
函数调用应该在定义之后,否则会报错NameError
通过callable()判断对象是否可调用
In [28]: callable(fibs) Out[28]: True In [29]: a=1 In [30]: callable(a) Out[30]: False
函数的参数
函数调用时传入的参数必须和定义时的个数相匹配(除可变参数)
位置参数
按照参数定义的顺序传入实参
def fx(x, y): result = x + y return result fx(1,2)
关键字参数
def fx(x, y): result = x + y return result fx(y=1, x=2) ## 传入参数的顺序可以和定义时参数的顺序不同
注意:位置参数和关键字参数是在调用时才有的概念。位置参数必须在关键字参数之前传入,否则报错
def fx(x, y): result = x + y return result fx(y=1, 2)
运行结果
fx(y=1, 2) ^ SyntaxError: positional argument follows keyword argument
参数默认值
定义参数时,在形参后面给定一个值,当为传入足够的实参时,将使用此值为默认值
def fx(x=1, y=3): result = x + y return result num=fx(y=1) print(num)
运行结果:
2
可变参数
有如下代码,需要求可迭代对象的和:
def fx(lst): sum = 0 for x in lst: sum += x return sum x = fx([1, 2, 3]) print(x)
位置参数可变参数
将多个多个实参收集为一个tuple,使用*表示该形参是可变参数
def fx(*lst): sum = 0 for x in lst: sum += x return sum x = fx(1, 2, 3) print(x)
关键字参数的可变参数
形参前使用**,可以接受多个关键字参数,收集后的实参名和值组成字典
def fx(**lst): sum = 0 for _,x in lst.items(): sum += x return sum x = fx(a=1, b=2, c=3) print(x)
keyword-only参数
Python3中新引入的。在一个星号参数或者位置可变参数后,出现的普通参数为keyword-only参数
def fx(*args,x,y): print(x,y) print(args) fx(3,5,x=1,y=2)
可以理解为*args获取了所有位置参数,所以x,y必须给定值,否则无法取到值
*之后的普通参数变为必须给定的keyword-only参数
def fx(*,x,y): print(x,y) fx(x=1,y=2)
错误的定义方式
def fx(**kwargs,x,y):
print(x,y)
print(kwargs)
可以理解为kwargs已经获取了所有的关键字参数,x,y就无法获取值了
注意:形参的顺序(位置参数,缺省值,可变位置参数,keyword-only参数(可以带有缺省值),可变关键字参数)
def fx(x,y,z=5,*args,**kwargs):
print(x,y,z)
print(args)
print(kwargs)
x = fx(1,4,3,1,2,a=1, b=2, c=3)
运行结果
1 4 3
(1, 2)
{'b': 2, 'a': 1, 'c': 3}
错误的定义方式
def fx(*args,x,y,**kwargs):
print(x,y)
print(args)
print(kwargs)
x = fx(1,4,3,1,2,a=1, b=2, c=3)
运行结果
File "C:/Users/ASUS-PC/PycharmProjects/zhanghao/复习/生成器.py", line 36, in <module>
x = fx(1,4,3,1,2,a=1, b=2, c=3)
TypeError: fx() missing 2 required keyword-only arguments: 'x' and 'y'
Python函数的嵌套
在一个函数内层定义了另外一个函数
def outer(): def inner(): print('inner') print('outer') outer()
运行结果
outer
当直接调用内层函数inner时会报错
def outer(): def inner(): print('inner') print('outer') outer() inner()
运行结果
outer File "C:/Users/ASUS-PC/PycharmProjects/生成器.py", line 67, in <module> inner() NameError: name 'inner' is not defined
内层函数需要在定义的时候调用
def outer(): def inner(): print('inner') print('outer') inner() outer()
运行结果
outer
inner