廖雪峰Python笔记[2] - 函数

目录

 

1.函数定义

2.函数参数

3.递归函数


1.函数定义

       定义函数用def,函数可以有返回或者没有返回,也可以返回多个值,这时返回的实际是一个tuple,可以用多个变量接收一个tuple。在暂时不想写函数内容时可以用pass占位。

def guess():
    guess = input("今天发生了一件事,你猜是好事还是坏事。(G/B):")
    if(guess == 'G'):
        print("撒花,你猜对了~")
    elif(guess == 'B'):
        print("不对哦")
    else:
        print("只能输入G/B")
    return

guess()

def empty():
    pass #定义一个空函数占位置,以后再写

def hungry():
    today = '汤圆'
    tomorrow = '菠萝鸡丁'
    return today, tomorrow #可以返回多个值

a,b = hungry()
print(a,b)

2.函数参数

       按照位置赋值的叫位置参数,也就是我们一般传入函数的参数。默认参数就是已经预先赋值好的参数,使用时可以不传参。要注意的是默认参数必须指向不可变对象,避免函数调用后参数发生变化。

def add(L=None):
    if L is None:
        L = []
    L.append('end')
    return L
print(add())
print(add())

def add(L = []): #比较与上面的区别
    L.append('end')
    return L
print(add())
print(add()) #因为默认参数指向的list发生了变化

      可变参数指可以将任意个数的参数传递到函数中,在定义时用*声明。当要传入的参数是list里面的所有元素时可以用*表示取list的内容。

def outing(*places): #可变参数
    for i in places:
        print("go %s" % i)
    print("go everywhere you want")
        
outing('hiking','climbing','fishing')

togo = ['swimming','hiking']
outing(*togo) #*表示取togo的内容传进去

      关键字参数可以将零个或者多个键值对传入函数,在函数内组成一个dict,用**定义,和可变参数相同,当要传入的内容已经是dict中的元素时可以用**表示取出dict内容传入。

def cv(name,**others):
    print(name)
    print(others)
    
cv('Li',age=18,gender='F')
o = {'age':22,'gender':'M'}
cv('Liu',**o)

       要限制关键字参数的名字可以使用命名关键字参数,它需要在位置参数和自己之间插入*作为分隔,或者前面有可变参数作为分割也可以。目前我们已经知道了五种函数可以传入的参数,在参数组合时注意顺序一定是位置参数、默认参数、可变参数、命名关键字参数、关键字参数。

def watch(nickname,*,video,serial):
    print(nickname)
    print(video,serial)
    
watch('Lisa',video='Pokemon',serial='HarryPoter')
watch('Lili','simon','ok') #这样会报错,因为传入了三个位置参数

3.递归函数

       递归函数是指一个函数在内部调用自己。使用递归的优点是便于理解,缺点在于可能会引发栈溢出,这时可以用尾递归优化,它指在函数返回值中不包含表达式,只调用自身,每次始终只占据一个栈帧。然而Python并没有针对栈溢出优化,即使使用了尾递归也可能会溢出。

# 汉诺塔问题递归写法
# n:第一个柱子上盘面数量;三个盘面名字
def move(n,a,b,c):
    if n == 1:
        print(a,'-->',c)
        return
    else:
        move(n-1,a,c,b) #把n-1个挪到b
        move(1,a,b,c) #把最后一个挪到c
        move(n-1,b,a,c) #把n-1个从b挪到c
        
move(2,'A','B','C')

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值