男女人体艺术,条码识别器,短信群发网站
def v(dar): v = dar() def n (): print(444) v(n) # 实例2 def v(): print(666) def n(): return v m =n() m() # 实例3 def func(): print(555) def info(): print(666) return func() v = info() print(v)
练习
# 实例1 def v(): print(666) def n(): return v m =n() m() # 实例2 def v(): print(666) def n(): print('alex') v() n() # 实例3 name ='alex' def v(): print(name) def v1(): name = 'aicr' print(name) v() # alex v1() # aicr
函数其实也是一种数据类型,可以当变量存储
# 实例1 def fucn(): print('alex') list = [fucn,fucn,fucn()] # 加()直接执行了 list[0]() list[1]() # 实例2 def fucn(): print('alex') dic = {'k1':fucn,'k2':fucn()} dic['k1']()
'''用函数实现: 用户输入 f1 话费查询 f2 余额查询 f3 人工服务 f4 宽带业务 ''' # 方法1 usee = input('请输入业务 :') if usee =='f1': print(话费查询) elif usee =='f2': xxxxx else: xxxxxx # 方法二 函数 def v1(): print('话费') def v2(): print('余额') def v3(): print('人工') def v4(): print('宽带') dic = {'f1':v1,'f2':v2,'f3':v3,'f4':v4} usee = input('请输入:') dic[usee]()
# 实例1 def func(): a = 2 def info(): print(a) # 调用外层函数 info() func() # 实例 2 def get(): name = 'alex' def info(): print(name) return info # 返回info的内存id v = get() v() # 相当于调用info # 实例 3 def get(arg): def func(): return arg return func() v = get(666) print(v)
作用 1 保护变量,不受外部改变 ''' a = 10 def func(): global a a =2 def info(): global a a = 3 先 func() 再 info() a =3 先 info() 再 func() a= 2 全局变量不稳定,受影响 ''' # 闭包 def func(): a = 10 def info(): print(a) info() # 这样保护了变量不受其他影响 作用 2 使变量常驻内存 def func(): a = 10 def info(): print(a) return info v = func() v()
def func(): a = 10 def info(): print(a) info() print(info.__closure__) # 不是闭包返回 none func()
''' 闭包 应用 简易版爬虫 ''' from urllib.request import urlopen def func(): get = urlopen('https://www.dytt8.net/').read() def info(): print(get) return info print('第一次,慢') v = func() v() print('以后就在内存读出') v() v() # 闭包常驻内存 , 直接内存读出
三元运算
print('ture') if v > 6 else print('flase')
lambda ( 匿名函数)
v = lambda x: x*3 print(v(3)) v = lambda x,y:x*y print(v(4,6)) # 三元运算和lambda n = lambda x:x if x<4 else x+1 print(n(14))
# 也可以当作参数 lst = [lambda x: x*3 ,lambda x: x*3,lambda x: x*3 ] n = lst[0](3) print(n) print(lst[1](3))
map + lambda
n = map(lambda x:x*5,[1,2,3,4]) for line in n : print(line)
map (多对一)
# 实例1 n = map(lambda x : x+2,[1,2,3,4]) for i in n: print(i) # 实例2 lst =[map(lambda x:x+1,[1,2,3]),map(lambda x:x+2,[1,2,3]),map(lambda x:x+3,[1,2,3])] print(lst) '''[<map object at 0x000002b3d40b17f0>, <map object at 0x000002b3d40b1940>, <map object at 0x000002b3d40b1c50>]''' #实例3 lst =[map(lambda x:x+1,[1,2,3]),map(lambda x:x+2,[1,2,3]),map(lambda x:x+3,[1,2,3])] n = lst[0] for line in n : print(line) # 实例4 lst =[map(lambda x:x+1,[1,2,3]),map(lambda x:x+2,[1,2,3]),map(lambda x:x+3,[1,2,3])] for i in lst: for line in i: print(line)
filter 过滤掉不符合条件的数据
# 实例1 n = filter(lambda x :x>4,[1,22,33,4,5,]) for line in n: print(line) # 22,33,5 # 实例2 n = filter(lambda x :x if x<4 else print('flase') ,[1,22,3,4,5,]) for line in n: print(line)
列表
lst = [i for i in range(10)] lst1 = [1 for i in range(10)] lst2 = [ i for i in range(10) if i <6] # [迭代的变量 for i in 可迭代的对象 判断 ] lst3 =[ i if i < 5 else 777 for i in range(10) ] print(lst5) # 加if 在for后 , 加 if ....else 在for前 lst4 = [lambda : i for i in range(10)] ''' v =[] for i in range(10): v.append(lambda :i) n = v[1]() print(n)''' lst5 = [ lambda x : x if x+i >10 for i in range(10)] def func(): pass lst6 = [func for i in range(10)] # 面试题 def func(): return [lambda x : x+i for i in range(10)] lst7 = [ i for i in func() ] print(lst7[1](7))
上面这个题。 不要死磕。 能明白多少就明白多少。 这个题对小白很不友好
元祖(集合)
# 元祖和集合都要循坏打印 set1 =(i for i in range(18 )) for i in set1: print(i) set1 ={lambda : i for i in range(18 )} for i in set1: print(i()) def func(): print(222) set3 = (func for i in range(10)) for i in set3: i()
字典
dic ={ 'k%d'%i:i for i in range(10)} print(dic) #同列表
# 实例1 def func(a): print(a) a = a +1 func(a) func(1) # 实例2 def func(a): print(a) if a < 5: func( a + 1) func(1) # 1,2,3,4,5 # 实例3 def func(a): if a < 5: func( a + 1) print(a) func(1) # 5,4,3,2,1 ''' 函数在每进入下一层的时候,当前层的函数并未结束,它必须等它调用的下一层函数执行结束返回后才能继续往下走。 所以最下面的那句print(n)会等最里层的函数执行时才会执行,然后不断往外退层,所以会出现 5,4,3,2,1的效果 ''' # 实例 4 def func(a): if a ==5: return a info = func(a + 1) + 10 return info v = func(1) print(v) # 34
装饰器就是在不改变原函数的情况下,调用函数前后增加代码
def func(arg): def info(): print('aaaaaaaaaaaaaaaaaaa') arg() return info def v(): xxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxx print(1111111111111) return 3333 data = func(v) data() def v1(): xxxxxxxxxxxxxxxxxxx print('alex') xxxxxxxxxxxxxxxxxxx lst = func(v1) lst() ''' 如果在 函数v 和函数v1 加上百行代码, 你要一个一个加 函数如果不只有 v v1 很多 怎么办 -------------装饰器-------------- ''' # 实例1 def func(arg): def info(): print('alrx sb') # 在调用函数前打印 alx sb arg() print('aaaaaaaaaaa') #在调用函数后打印 aaaaaaaaa return info def v(): print(1111111111111) data = func(v) # func的参数传入v函数 此时data = info 函数 data() # 执行data = 执行 info() # 实例2 def func(arg): def info(): print('aaaaaaaaaaaaa') v = arg() return v return info def v(): print(1111111111111) return 3333 data = func(v) print(data())
''' 上面的装饰器很low 因为 如果装饰上百个函数的话 要重复 赋值操作 ''' def func(arg): def info(): print('alex sb') arg() print('aaaaaaaaaa') return info @func # @func 简化 func函数的赋值 # @ 函数 第一步,调用func 把下面的函数名当做func函数的参数 # arg = v # 第二步 , func 的return info,赋值给下面函数 v = info # 但是 func中 arg还是指向 v函数id 而 v 重新的赋值 def v(): print(666) v()
# 实例1 ''' 如果装饰的函数需要传参数 ''' def func(arg): def info(a): arg(a) return info @func def data(n): print(n) data() # 第一步 执行func(data) # data = info函数 #执行data(参数) ########如果被装饰的函数n个参数,需要改装饰器 # 优化 def func(arg): def info(*args,**kwargs): arg(*args,**kwargs) # 加上*args **keargs 不用管被装饰的函数需要几个参数都能传 return info @func def data(n1,n2,n3): print(n1,n2,n3) data(1,2,n3=3) @func def inner(a1,a2,a3,a4): print(a1,a2,a3,a4) inner('alex',1,2,3) # alex 1 2 3
装饰器标准格式
def func(arg): def info(*args,**kwargs): data = arg() return data return info @func
# 实例1 def func(arg): def info(*args,**kwargs): data = arg(*args,**kwargs) return data return info @func def inner(): print('alex') v = inner() print(v) # none # 实例2 def func(arg): def info(*args,**kwargs): data = arg(*args,**kwargs) return data return info @func def inner(): print('alex') return 666 v = inner() print(v) # 666
# 练习题 # 1 判断文件是否存在 ''' imprt os os.path.exists() true or flase ''' import os def func(arg): def info(*args,**kwargs): # 检查文件的路径是否存在 lst= args[0] if not os.path.exists(lst): print('路径不存在') return none data = arg(*args,**kwargs) return data return info @func def inner(path): f1 = open(path,mode='r',encoding='utf-8') v = f1.read() print(v) f1.close() return true v = inner("e:\代码库\电影下载地址.txt") print(v)
# 实例1 def inner(a): # 在闭包外再嵌套一层,即带参数的装饰器 print(a) def func(arg): def info(*args,**kwargs): data = arg(*args,**kwargs) return data return info return func @inner('alex') # 执行 inner # inner 返回的值func @func # 执行ear = func(ear) = info # 执行info函数 def ear(v): print(v) n = ear(111) print(n) # 实例2 def inner(a): print(a) def func(arg): def info(*args,**kwargs): data = arg(*args,**kwargs) return data return info return func @inner('alex') def ear(v): print(v) return 666 n = ear(111) print(n)
带参数的装饰器的执行过程其实是这样的。 先inner(xxx) 然后inner函数返回值再和前面的@组合成装饰器
如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复
Blazor server side 自家的一些开源的, 实用型项目的进度之 CEF客户端
.NET IoC模式依赖反转(DIP)、控制反转(Ioc)、依赖注入(DI)
vue+.netcore可支持业务代码扩展的开发框架 VOL.Vue 2.0版本发布
网友评论