第二天:Python函数
2020-01-03 本文已影响0人
VolleyZ
函数
isinstance(x, int)
:检查参数类型
callable(object)
:检查一个对象是否是可调用的。函数、方法、lambda 函式、 类以及实现了 call 方法的类实例, 它都返回 True
>>> callable(0)
false
def func():
pass
>>> callable(func)
true
1.可变参数:numbers
`在参数前加个*号表示把numbers的所有元素作为可变参数传进函数内部。
在函数内部,参数numbers接收到的是一个`tuple``
def function(*numbers):
pass
2.关键字参数:kw
`关键字参数允许你传入0个或任意个含参数名的参数,
关键字参数在函数内部自动组装为一个`dict``
def person(name, age, **kw):
print('name:', name, 'age:', age, 'other:', kw)
>> person('Bob', 35, city='Beijing')
name: Bob age: 35 other: {'city': 'Beijing'}
>>> extra = {'city': 'Beijing', 'job': 'Engineer'}
>>> person('Jack', 24, **extra)
name: Jack age: 24 other: {'city': 'Beijing', 'job': 'Engineer'}
3.命名关键字参数:
`命名关键字参数需要一个特殊分隔符*,`*`后面的参数被视为命名关键字参数.
命名关键字参数必须传入参数名,可以理解为是参数前加了个描述`
def person(name, age, *, city, job):
print(name, age, city, job)
>>> person('Jack', 24, city='Beijing', job='Engineer')
Jack 24 Beijing Engineer
参数定义的顺序必须是:
必选参数、默认参数、可变参数、命名关键字参数和关键字参数
递归:如果一个函数在内部调用自身本身,这个函数就是递归函数。
举例:fact(n) = n! = 1 x 2 x 3 x ... x (n-1) x n = (n-1)! x n = fact(n-1) x n
fact(n)用递归的方式写出来就是:
`这里需要注意的是`:递归函数需要注意防止栈溢出。在计算机中,函数调用是通过栈(stack)这种数据结构实现的,
每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。
由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出。fact(1000):就会栈溢出。所以这种方法不太好。
def fact(n):
if n==1:
return 1
return n * fact(n - 1)
`解决递归调用栈溢出的方法是通过尾递归优化`:尾递归是指,在函数返回的时候,调用自身本身,并且,return语句不能包含表达式。
这样,编译器或者解释器就可以把尾递归做优化,使递归本身无论调用多少次,都只占用一个栈帧,不会出现栈溢出的情况。
def fact(n):
return fact_iter(n, 1)
def fact_iter(num, product):
if num == 1:
return product
return fact_iter(num - 1, num * product)