Python基础教程笔记——第6章:抽象(函数)
(1)计算裴波那契数列:
1 fbis=[0,1] 2 num=int(input("please input the number")) 3 for i in range(num-2): 4 fbis.append(fbis[-2]+fbis[-1]) 5 print(fbis)
6.3 创建函数
callable():函数可以确定函数是否可以被调用
最简单的例子:
1 def hello(name): 2 return "hello"+name+"are you OK?"
输入个数,输出裴波那契数列的函数
1 def fbis(num): 2 if num<=0: 3 return "input error" 4 if num==1: 5 return [0] 6 if num==2: 7 return [0,1] 8 f=[0,1] 9 for i in range(num-2): 10 f.append(f[-1]+f[-2]) 11 return f
记录函数:给函数写说明文档和查看函数的说明文档
1 def hello(name): 2 'this is a print function'#函数说明文档作为字符串 3 print("hello "+name) 4 5 #查看函数文档 7 >>> hello.__doc__ 8 'this is a print function'
6.4 函数参数
函数的参数和C,C++一样也是值传递
下面两种情况下参数的改变对实参的影响不同
1 def change(name): 2 name[0]='yanliang' 3 4 #这里直接将列表a传入,实参和形参变量引用同一个列表 5 >>> a=['fun','a'] 6 >>> change(a) 7 >>> a 8 ['yanliang', 'a'] 9 10 #这里行参为实参的一个拷贝,两个是独立的 11 >>> a=['fun','s'] 12 >>> change(a[:]) 13 >>> a 14 ['fun', 's']
split 拆分函数,针对的是字符串
1 >>> b='yang liang' 2 >>> b 3 'yang liang' 4 >>> a=b.split() 5 >>> a 6 ['yang', 'liang']
下面是一个初始化函数
1 #初始化的函数 2 def init(name): 3 name['first']={} 4 name['last']={} 5 name['all']={} 6 ##>>> stroge={} 7 ##>>> init(stroge) 8 ##>>> stroge 9 ##{'all': {}, 'first': {}, 'last': {}}
关键字参数和默认值
本来一般函数在调用时,各个参数的名字要和函数体是一一对应的。
在这里只要在函数调用时,把形参名也给出来,那么就算顺序不对也没有关系。
1 def hello1(name,greet): 2 print(name+"###"+greet) 3 4 >>> hello1(greet='func',name='yanliang') 5 yanliang###func
函数可以提供默认参数
1 def hello1(name='yan',greet='hello'): 2 print(name+"###"+greet) 3 4 >>> hello1(name='yanliang') 5 yanliang###hello
用户提供任意多个参数,采用*来收集参数
1 def hell0(*name): 2 print(name) 3 4 >>> hell0('yan','liang') 5 ('yan', 'liang')#这里的输出作为一个元组
还有一种**的方法
1 def hello1(x,y,z=3,*name1,**name2): 2 print(x,y,z) 3 print(name1) 4 print(name2) 5 6 >>> hello1(1,2,4,5,6,7,89,ho=2,ju=3) 7 1 2 4 8 (5, 6, 7, 89) 9 {'ho': 2, 'ju': 3}#将加了关键字的变成了一个字典
反转过程:这里不是将参数收集起来,而是将参数分配出去
第一种:* 将元组分配出去
1 def add1(x,y): 2 return x+y 3 4 >>> parms=(1,2) 5 >>> add1(*parms) 6 3
第二种:**将字典解析出来
1 def hello1(name,greet): 2 print(name+' ### '+greet) 3 4 >>> zidian={'name':'yanliang','greet':'hello'} 5 >>> hello1(**zidian) 6 yanliang ### hello
6.5 作用域
除了全局作用域外每一个函数的调用都会创建一个新的作用域。
6.6 递归
(1)阶乘:
1 def jiechen(n): 2 if n==1: 3 return 1 4 else: 5 return jiechen(n-1)*n
(2)求幂:
1 def powerd(x,n): 2 if n==1: 3 return x 4 else: 5 return powerd(x,n-1)*x