函数定义及调用
def my_abs(x): if x>=0: return x return -x my_abs(-2)
函数参数:
- 位置参数:函数调用时的必传参数
def power(x): #x:位置参数 return x * x
- 默认参数:默认参数必须指向不变对象(调用带默认参数的函数时,可以不按顺序提供默认参数,但必须把参数名写上)
def student(name, gender, age=6, city='Beijing'): print('name:', name,"gender:",gender,"age:",age,"city:",city) student("fred","f") student("fred","f",city="chengdu")
- 可变参数:参数个数不确定(可变参数在调用时,自动组装为一个tuple)
def calc(*numbers): sum = 0 for n in numbers: sum = sum + n*n return sum calc() calc(1,2) num=[1,2,3] print(calc(*num))
- 关键字参数:关键字参数在调用时自动组装为一个dict
def person(name,age,**kw): print("name:",name,"age:",age,"other:",kw) #调用时可只传入位置参数,也可传入任意个数的关键字参数 person("fred",26) #name: fred age: 26 other: {} person("fred",26,city="chengdu") #name: fred age: 26 other: {'city': 'chengdu'} extra = {"city":"chengdu","job":"engineer"} person("fred",26,**extra) #name: fred age: 26 other: {'city': 'chengdu', 'job': 'engineer'}
- 命名关键字参数:限制关键字参数的名字
def person(name,age,*,city,job): print(name,age,city,job) #上面的*号后面的为命名关键字参数 person("fred",26,job="engineer",city="chengdu") #如果已定义了可变参数,则命名关键字参数前不在需要* def person(name,age,*extra,city,job): print("...") person("fred",26,(175,75),city="chengdu",job="engineer")
- 函数参数组合-参数定义顺序:位置参数,默认参数,可变参数,明明关键字参数,关键字参数
def f(a, b, c=0, *, d, **kw): print('a =', a, 'b =', b, 'c =', c, 'd =', d, 'kw =', kw)
递归:以下两种递归方式都会存在栈溢出(因为Python没有对尾递归做优化)
- 递归函数:函数内部调用自身
def fact(n): if n == 1: return 1 return n*fact(n-1) fact(10)
- 尾递归(函数结尾返回自身,且只返回自身)
def fact(n): return fact_iter(n,1) def fact_iter(num,profuct): if num==1: return profuct return fact_iter(num-1,num*profuct) fact(10)