My python day3
函数
一、为何使用函数:
1.代码重用
2.保持一致性、易维护
3.可扩展性
二、函数分为内置函数和自定义函数
内置函数:python解释器已经为我们定义好了的函数即内置函数
自定义函数:根据自己的需求实现某种功能
1 #自定义函数 2 def 函数名(参数1,参数2,参数3,...): 3 '''注释''' 4 函数体 5 return 返回值
函数需要先定义才能调用
三、调用函数:
函数名 + 括号
四、函数的返回值:
调用函数,需要得到结果,必须要有返回值
调用函数,不需要得到结果,不需要返回值
无return 则返回None
1个return 则返回object
多个return 则返回tuple
碰到return 则代表函数运行结束
五、函数的参数
函数可以没有参数也可以有参数,分为位置参数、关键字参数、默认参数、可变长参数.
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 def t(): 2 '''无参数''' 3 print("in the t") 4 t() 5 def t2(name): 6 print("my name is %s"%name) 7 t2("Ezhizen")
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 def t(x,y): 2 z = x+y 3 return z 4 z = t(1,2) #位置参数,实参和行参一一对应 5 def t2(x,y): 6 z = x+y 7 return z 8 z = t2(y=1,x=2) #关键字参数,位置可以不固定 9 def t3(x,y,z): 10 q = x+y+z 11 return q 12 q = t3(1,2,z=3) #位置参数和关键字参数混合时,位置参数必须在关键字参数的左边 13 def t4(x,y,z=3): 14 q =x+y+z 15 return q 16 q = t4(1,2) #当有默认参数时,如果不传参数就使用默认值,如果传就使用传的值 17 def t5(x,*args,**kwargs): 18 print(x) 19 print(args) #args=(2,3) 返回一个元组 20 print(kwargs) #kwargs={'a': 5, 'b': 6} #返回一个字典 21 t5(1,2,3,a=5,b=6) #和可变长参数连用时,*args接受位置参数,**kwargs接受关键字参数 22 t5(1,*[2,3],**{'a': 5, 'b': 6}) 23 #如果args传递一个列表,则列表前要加*,如果不加,列表就会被当作一个元素,kwargs传递一个字典,字典前需要加**
六、全局变量和局部变量
在定格定义的是全局变量,在子程序中定义的为局部变量
局部变量会从局部开始找,找不到再到外一层中找,当局部变量与全局变量重名时,在定义局部变量的子程序中,局部变量起作用,在其他地方全局变量起作用。
局部变量子程序无global关键字,先读取局部变量,再读取全局变量,无法重新赋值,可变类型内部可以进行元素操作
如果函数中有global,可以读取赋值全局变量。
nonlocal 操作上一级变量
一般情况下,为例区分全局变量和局部变量,全局变量用大写,局部变量用小写。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 name ="Ezhizen" #全局变量 2 def f1(): 3 name="a" #局部变量 4 def f2(): 5 print(name) #name="a" 局部变量从局部开始找,无法对全局变量重新赋值 6 f2() 7 f1() 8 9 l=[1,32,2] 10 def f3(): 11 def f4(): 12 l.append(54) #对于全局可变类型可以进行内部元素操作 13 f4() 14 f3() 15 print(l) 16 17 name ="Ezhizen" 18 def f5(): 19 # name="a" 20 def f6(): 21 print(name) #局部变量不存在时,就会到全局变量中找 22 f6() 23 f5() 24 def f7(): 25 name="a" 26 def f8(): 27 global name 28 name="Echizen" #当存在global 关键字时,可以读取赋值全局变量 29 print(name) 30 f8() 31 f7() 32 print(name) 33 def f9(): 34 name="a" 35 def f10(): 36 nonlocal name #nonlocal 关键字,可以对上一级变量进行赋值 37 name="b" 38 print(name) 39 f10() 40 print(name) 41 f9()
七、函数递归
一个函数自己调用自己
递归的条件:1.明确的终止条件2.每进入更深一层递归,规模减小
九、高阶函数
1.一个函数接受另一个函数作为参数
2.返回值中有函数
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 def g1(func): #参数中有函数 2 print(func) 3 def g2(): 4 print("in the g2") 5 g1(g2) 6 def g3(): 7 print("in the g3") 8 def g4(): 9 return g3 #返回值中有函数名 10 g3 = g4() 11 print(g3)
十、map、filter、reduce的使用
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 print(list(map(lambda x:x+1,[1,2,3]))) # 2 print(list(filter(lambda x:x<5,[1,2,6]))) #过滤 3 from functools import reduce 4 print(reduce(lambda x,y:x+y,[1,2,3,4],3)) #累加,起始值为3
十一、内置函数
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 ord("a") #ascill码中a对应的数字 2 chr(97) #97对应的字母 3 bytes(name,encoding="utf-8")#转为二进制 4 bytes(name,encoding="utf-8").decode("utf-8") #二进制解码 5 dir(all) #查看all下的所有方法 6 divmod(10,3) #得到(3,1) 7 for i,v in enumerate([1,2,3]): #生成序号 8 print(i,v) 9 10 eval("{'name':'a'}") #从字符串中得到字典 11 eval("1+2*3") #计算字符串中的值 12 globals() #全局变量 13 locals() #局部变量 14 hash() #进行hash运算 不可变类型是可hash,可变类型是不可hash的 15 hex(20) #10进制转为16进制 16 int("011",base=2) #2进制转10进制 17 oct(20) #10进制转8进制 18 bin(10) #10进制转2进制 19 id() #查看内存地址 20 isinstance([1,2,3],list) #判断【1,2,3】是不是list的实例 21 max([1,2,3]) #最大值 22 23 dic=[{"name":"a","age":18}, 24 {"name2":"ab","age":180}, 25 {"name3":"ac","age":1800}, 26 ] 27 28 print(max(dic,key=lambda x:x["age"]) ) #max的本质遍历dic,根据dic的age求最大值 29 print(list(zip([1,2,3],[4,5,6]))) #拉链函数,对应元素以元组相连接,不对称时,取短的 30 print(pow(2,3)) #2**3 31 print(pow(2,3,5)) #2**3%5 32 l=[1,2,3] 33 print(reversed(l)) #反转 34 print(round(1.5)) #四舍五入 35 sorted([1,3,6,4]) #排序 ,默认升序 36 sorted([1,3,6,4],reverse=True) #降序 37 print(sorted(dic,key=lambda x:x["age"])) #升序 38 sum([1,5,6]) #求和 39 __import__("test") #导入字符串模块