目录
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')