一、函数基础
- 函数代码块以
def
关键词开头,后接函数标识符名称和圆括号()
。 - 任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数。
- 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
- 函数内容以冒号起始,并且缩进。
return [表达式]
结束函数,选择性地返回一个值给调用方。不带表达式的return
相当于返回None
二、定义函数
2.1 函数结构
在Python中,定义一个函数要使用def
语句,依次写出函数名、括号、括号中的参数和冒号:
,然后,在缩进块中编写函数体,函数的返回值用return
语句返回。
def 函数名(参数列表):
函数体
return 结果
2.2 函数调用
采用import模块,使用方式为import fun
,无.py
2.3 返回值
return [表达式]
语句用于退出函数,选择性地向调用方返回一个表达式,不带参数值的return语句返回None。
注意 当使用return
返回多个值时,实际上返回的是tuple
2.4 匿名函数
python 使用 lambda 来创建匿名函数,所谓匿名,意即不再使用 def 语句这样标准的形式定义一个函数。
- lambda 只是一个表达式,函数体比 def 简单很多。
- lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。
- lambda 函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数。
- 虽然lambda函数看起来只能写一行,却不等同于C或C++的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率。
lambda [arg1 [,arg2,.....argn]]:expression
# 例子
sum = lambda arg1, arg2: arg1 + arg2
# 调用sum函数
print ("相加后的值为 : ", sum( 10, 20 ))
三、函数参数
在Python中定义函数,可以用必选参数、默认参数、可变参数、关键字参数和命名关键字参数,这5种参数都可以组合使用。但是请注意,参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数。
3.1 默认参数
多个默认参数下,可以不按顺序赋值,只需parmas = val
即可。
注意:默认参数必须指向不变对象,不然会导致在重复调用函数后,默认参数的值不断变化。
3.2 可变参数
可变参数就是传入的参数个数是可变的,实现方式有一下两种。
- 以
list
或者tuple
方式传入。
- 函数
def calc(numbers):
sum = 0
for n in numbers:
sum = sum + n * n
return sum
- 调用
calc([1, 2, 3])
calc((1, 3, 5, 7))
- 将函数参数改为可变参数,方式为在参数前加
*
即可,此时函数内部接收到是tuple
。
- 函数
def calc(*numbers):
sum = 0
for n in numbers:
sum = sum + n * n
return sum
- 调用
calc(1, 2, 3)
nums = [1, 2, 3]
calc(*nums)
3.3 关键字参数
关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict。
- 函数
def person(name, age, **kw):
print('name:', name, 'age:', age, 'other:', kw)
- 调用
>>> person('Michael', 30)
name: Michael age: 30 other: {}
>>> person('Bob', 35, city='Beijing')
name: Bob age: 35 other: {'city': 'Beijing'}
>>> person('Adam', 45, gender='M', job='Engineer')
name: Adam age: 45 other: {'gender': 'M', 'job': 'Engineer'}
>>> extra = {'city': 'Beijing', 'job': 'Engineer'}
>>> person('Jack', 24, **extra)
name: Jack age: 24 other: {'city': 'Beijing', 'job': 'Engineer'}
注意:最后一种方式是把dict
的所有key-value
用关键字参数传入到函数的**kw
参数,kw
将获得一个dict
,kw
获得的dict
是extra
的一份拷贝,对kw
的改动不会影响到函数外的extra
。
3.4 命名关键字参数
命名关键字参数用于传入有限制的关键字参数,命名关键字参数必须传入参数名,
- 函数
def person(name, age, *, city, job):
print(name, age, city, job)
命名关键字参数需要一个特殊分隔符*
,*
后面的参数被视为命名关键字参数。
- 调用
>>> person('Jack', 24, city='Beijing', job='Engineer')
Jack 24 Beijing Engineer
如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不再需要一个特殊分隔符*
了。
- 函数
def person(name, age, *args, city, job):
print(name, age, args, city, job)