函数
- 定义
def functionname(parameters):
"函数_文档字符串"
function_suite
return [expression]
定义空函数:
def ept_func():
pass
- 函数调用
e.g.def my_abs(x): if x >= 0 : return x else: return -x print(my_abs(10)) # 10
函数的参数
-
位置参数
这些参数在调用函数 (call function) 时位置要固定。
e.g.def funcname(x): return x
在调用funcname时,必须传入有切仅有一个的参数x。
-
默认参数
- 默认参数 = 默认值,调用函数时,默认参数的值如果没有传入,则被认为是默认值。
e.g.
def example(x, n = 1): i=1 while n > 0: n = n - 1 i = i * x return i
注: 默认参数一定要放在位置参数后面,不然程序会报错。
- Python 允许函数调用时参数的顺序与声明时不一致,因为 Python 解释器能够用参数名匹配参数值。
e.g.
def printinfo(name, age): print('Name:{0},Age:{1}'.format(name, age)) printinfo(age=8, name='小马') # Name:小马,Age:8
- 默认参数 = 默认值,调用函数时,默认参数的值如果没有传入,则被认为是默认值。
-
可变参数
可变参数传入的参数个数是可变的,是不定长的参数。
e.g.def cal(numbers): sum = 0 for n in numbers : sum = sum + n return sum cal([1,2,3]) # 6
e.g.
def printinfo(arg1, *args): print(arg1) for var in args: print(var) printinfo(10) # 10 printinfo(70, 60, 50) # 70 # 60 # 50
-
关键字参数
关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict。def functionname(arg1, arg2=v, *args, **kw): "函数_文档字符串" function_suite return [expression]
e.g.
def printinfo(arg1, *args, **kwargs): print(arg1) print(args) print(kwargs) printinfo(60,70,50) # 60 # (70, 50) # {} printinfo(60,70,a=1,b=2) # 60 # (70,) # {'a': 1, 'b': 2}
- 可变参数允许传入零个到任意个参数,它们在函数调用时自动组装为一个元组 (tuple)。
- 关键字参数允许传入零个到任意个参数,它们在函数内部自动组装为一个字典 (dict)。
-
命名关键字参数
对于关键字参数,函数的调用者可以传入任意不受限制的关键字参数。至于到底传入了哪些,就需要在函数内部通过kw
检查。
如果要限制关键字参数的名字,就可以用命名关键字参数。def functionname(arg1, arg2=v, *args, *, nkw, **kw): "函数_文档字符串" function_suite return [expression]
- *, nkw - 命名关键字参数,用户想要输入的关键字参数,定义方式是在nkw 前面加个分隔符 *。
- 如果要限制关键字参数的名字,就可以用「命名关键字参数」
- 使用命名关键字参数时,要特别注意不能缺少参数名。
def person(name, age, *, city, job): print(name, age, city,job) person('Jack', 12, city = 'beijing', job = 'student') # Jack 12 beijing student
-
参数组合
在 Python 中定义函数,可以用位置参数、默认参数、可变参数、命名关键字参数和关键字参数,这 5 种参数中的 4 个都可以一起使用,但是注意,参数定义的顺序必须是:
位置参数、默认参数、可变参数和关键字参数。
位置参数、默认参数、命名关键字参数和关键字参数。要注意定义可变参数和关键字参数的语法:
- *args 是可变参数,args 接收的是一个 tuple
- **kw 是关键字参数,kw 接收的是一个 dict
-
递归
e.g. 解决汉诺塔问题有a、b、c三根柱子,在a柱子上从下往上按照大小顺序摞着64片圆盘,把圆盘从下面开始按大小顺序重新摆放在c柱子上,尝试用函数来模拟解决的过程。(提示:将问题简化为已经成功地将a柱上面的63个盘子移到了b柱)
def move(n, a, b, c): if n == 1: print('move', a, '-->',c) else: move(n-1, a, c, b) move(1, a, b, c) move(n-1, b, a, c) move(64, 'A', 'B', 'C')
Lambda表达式
当我们在传入函数时,有些时候,不需要显式地定义函数,直接传入匿名函数更方便。
lambda argument_list: expression
其中,lambda是定义匿名函数的关键字,argument_list是函数参数,类型和正规函数的参数类型一样。
冒号:
在函数函数参数和表达式中间要加冒号。
expression,是表达式,输入函数参数,输出值。
注
:expression中没有return语句,是因为lambda表达式本身的结果就是返回值。
匿名函数拥有自己的命名空间,且不能访问自己参数列表意外或全名空间里的参数。
e.g.
def sq(x):
return x*x
map(sq,[y for y in range(10)])
# lambda
map(lambda x: x*x, [y for y in range(10)])
lambda可以像正常函数一样调用,也可以作为参数传递给其他的函数,也可以嵌套在普通函数中,它使得代码更加的简洁。