Python函数基础

函数定义及调用

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)
 
posted @ 2017-12-20 14:45  枫叶布  阅读(243)  评论(0)    收藏  举报