ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

函数 装饰器 迭代器 生成器 匿名函数(lambda表达式) 7

函数 装饰器 迭代器 生成器 匿名函数(lambda表达式) 7 函数对某一个特定的功能或者代码块进行封装在需要使用该功能的时候直接调用即可定义def 函数的名字被封装的功能或者代码块——函数体调用函数的名字好处让程序更加简洁代码更加合理只定义没调用是没有输出的参数可以在函数调用的时候给函数传递一些信息分类形参在函数定义的时候需要准备一些变量来接受信息1.位置参数按照位置一个一个的去声明变量def chi(a,b): print(a,b) chi(汤,粥)#汤 粥2.默认值参数在函数声明的时候给变量一个默认值如果实参不传递信息 此时默认值生效否则就不生效def chi(a,b,c米饭): print(a,b,c) chi(汤,粥)#汤 粥 米饭3.动态参数* 表示位置参数的动态传参* 接收得到的值会被同意放在一 个元组def chi(*args): print(args) chi(主食大米饭,hfhksdf,fhiyf)**kwargs表示接受所有的关键字的动态传参放在字典中def chi(**kwargs): print(kwargs) chi(zhushi大米饭,tang西红柿鸡蛋汤,cai茄子)顺序位置——*args——默认值——**kwargs这样就会保留默认值def chi(a,b,*args,chh,**kwargs): print(a,b,c,args,kwargs) chi(2,3,4,6,42,12,tang1,mif666)#2 3 hh (4, 6, 42, 12) {tang: 1, mif: 666}实参实际在调用的时候传递的信息位置参数按照位置进行传递参数关键字参数按照参数的名字进行传递参数混合参数顺序位置参数放前面关键字参数放后面——否则会报错实参在执行的时候必须要保障形参有数据例子利用函数来写一个计算机def jisuanqi(a,opt,b):#形参 if(opt): print(ab) elif(opt-): print(a-b) elif (opt *): print(a *b) elif (opt /): print(a / b) else: print(输入错误) jisuanqi(12,,11)#23实参 jisuanqi(1,*,12)#12实参 jisuanqi(2,/,1)#2.0实参 jisuanqi(7,-,1)#6实参 jisuanqi(1,ugfi,9)#输入错误当将一个列表写入到函数中# *在实参位置是把列表打散成位置参数进行传递** 在实参位置可以把字典自动转化成关键字参数进行传递list[sgfj,hkfs,fhkshfk] def func(*args): print(args) func(*list)#(sgfj, hkfs, fhkshfk)返回值函数执行之后会给调用方一个结果这个结果就是返回值关于return函数只要执行到了return函数就会立即停止并返回内容函数内的return的后续的代码不会执行如果函数内没有return此时外界收到的是Nnoe如果写了return1.只写了return后面不跟数据此时接收到的依然是None2.return值此时表示函数有一个返回值外界能够收到一个数据3.return值1值2值3.......此时函数有多个返回值外界收到的是元组该元组内 存放所有的返回值def func(a,b): return ab sumfunc(2,4) print(sum)#6作用域可以从里面访问外面外面访问里面不能直接访问如果想要在函数外面访问函数内部的东西就必须要return全局变量局部变量函数嵌套把一个函数当成一个变量进行返回的def func1(): print(12) def func2(): print(456) return func2#返回的是一个函数此时我们把一个函数当成一个变量进行返回的 b1func1()#b1是func1的内部func2 b1()函数的代理模式def func1(an):#此时的an收到的是一个函数 an()#执行这个函数 def func2(): print(我是函数2) func1(func2)#我是函数2实参可以是函数总结函数可以作为返回值进行返回函数可以作为参数进行互相传递函数名实际上就是一个变量名都表示一个内存地址global在局部引入全局变量nonlocal在局部引入外层的局部变量闭包本质内层函数对外层函数的局部变量的使用此时内层函数被称为闭包函数可以让一个变量常驻于内存可以避免全局变量被修改def func1(): a10#局部变量不容易被修改 def func2(): nonlocal a a1 return a return func2 rfunc1() r1r() print(r1)#11 r2r() print(r2)#12总结函数可以做为参数进行传递函数可以作为返回值进行返回函数名称可以当成变量一样进行赋值操作装饰器装饰器本质上是一个闭包作用在不改变原有的函数调用的情况下给函数增加新的功能。直白可以在函数前后添加新功能但是不改原来的代码雏形def wrapperfndef inner*args,**kwargs#在目标函数执行之前retfn*args,**kwargs#执行目标函数#在目标函数执行之后return retreturn inner #千万别加wrapperdef target():passrettarget() #inner()print(ret)def manger(game): def inner(): print(开挂) game() print(结束) return inner manger def play_game(): print(第一个游戏) manger def play(): print(第二个游戏) #play_gamemanger(play_game) play_game() #playmanger(play) play()有参数 有返回值def manger(game): def inner(*args,**kwargs):#表示接收所有的参数打包成元组和字典 print(开挂) retgame(*args,**kwargs)#表示把args元组和kwarga字典打散成 位置参数和关键字参数传递进去 print(结束) return ret return inner manger def play_game(name,password): print(第一个游戏,name,password) return 一把成功 manger def play(name,password,lemo): print(第二个游戏,name,password,lemo) #play_gamemanger(play_game) retplay_game(nihao,123) print(ret) #playmanger(play) play(nihao,123,鲁班)例子添加员工之前先要登录login_flagFalse def login(fn): def inner(*args,**kwargs): global login_flag if login_flagFalse: print(还未登录) while 1: nameinput(请输入账号) passwordinput(请输入密码) if nameadmin and password 123: print(登录成功) login_flagTrue break else: print(登录失败) retfn(*args,**kwargs) return ret return inner login def add(): print(添加员工) add()一个函数被多个装饰器装饰结论就是 wrapper1 wrapper2 wrapper 2 wrapper1wrapper1wrapper2迭代器统一了不同数据类型的遍历工作获取迭代器的两种方案iter内置函数可以直接拿到迭代器__iter__() 特殊方法从迭代器中拿到数据next 内置函数__next__() 特殊方法总结迭代器本省也是可迭代的迭代器本身的特性只能向前不能反复特别的节省内存惰性机制s我是周清.__iter__() print(s.__next__()) print(s.__next__()) print(s.__next__()) print(s.__next__())生成器生成器的本质是迭代器创建生成器的两种方案生成器函数生成器表达式一次性的tuple(i**2 for i in range(10)) for item in tuple: print(item) listlist(tuple) print(list)#[],所以说是一次性的生成器函数生成器函数中有一个关键字yield生成器函数执行的时候并不会执行函数得到的是生成器yield只要函数中出现yield它就是一个生成器函数作用1.可以返回数据2.可以分段的执行函数中的内容通过__next__可以执行到下一个yield位置def func(): print(123) yield 999#yield也有返回的意思 print(244) yield 12 retfunc() print(ret.__next__())#123 #999 print(ret.__next__())#244 #12例子找工厂订购10000衣服每一次给50件分次给存货的压力小def order(): list[] for i in range(1000): list.append(f衣服{i1}) if len(list)50: yield list list[] ciorder() print(ci.__next__())优势节省内存推导式简化代码语法列表推导式[数据 for循环 if判断]集合推导式{数据 for循环 if 判断}字典推导式{k:v for循环 if 判断}list[hfkaas,fgsf] dict{i:list[i] for i in range(len(list))} print(dict)例子将列表中的单词变成大写list1[hfkaas,fgsf] list2[item.upper() for item in list1] print(list2)匿名函数lambda表达式一句话创建一个函数语法变量lambda 参数参数1....:返回值funclambda a,b:a*b sumfunc(1,2) print(sum)
返回列表