python之叠加装饰器

叠加装饰器

  • 叠加多个装饰器
    • 加载顺序
    • 运行分析
  • 生成器的高级玩法
    • yield挂起函数
  • 生成式
    • 列表生成式
    • 字典生成式
    • 集合生成式
    • 生成器表达式
  • 函数的递归调用

叠加多个装饰器

加载顺序

一、叠加多个装饰器的加载(了解)
加载顺序自下而上

#@deco1 #index = deco1(deco2.wrapper的内存地址)
#@deco2 #deco2.wrapper的内存地址=deco2(deco3.wrapper的内存地址)
#@deco3 #deco3.wrapper的内存地址=deco3(index)

def deco1(func1): #func1=wrapper2的内存地址
	def wrapperr(*args,**kwargs):
		print('正在运行==>deco.wrapper1')
		res1=func1(*args,**kwargs)
		print res1
	return wrapper1

def deco2(func2): #func2=wrapper3的内存地址
	def wrapper2(*args,**kwargs):
		print('正在运行==>deco2.wrapper2')
		res2=func2(*args,**kwargs)
		return res2
	return wrapper2

def deco3(x):
	def outter(func3): #func3=被装饰对象index函数的内存地址
		def wrapper(*args,**kwargs):
			print('正在运行==>deco3.outter3.wrapper3')
			res3=func3(*args,**kwargs)
			return res3
		return wrapper3
	return outter3

#加载顺序自下而上(了解)
@deco1    #index = deco1(wrapper2的内存地址)==>index=wrapper1的内存地址
@deco2    #index=deco2(wrapper3的内存地址)==>index=wrapper2的内存地址
@deco3(111) #outter3==>index=outter3(index)==>index=wrapper3的内存地址

def index(x,y):
	print('from index %s:%s' %(x,y))

print(index)

运行分析

执行顺序:自上而下的
python之叠加装饰器_第1张图片

def deco1(func1): #func1=wrapper2的内存地址
	def wrapperr(*args,**kwargs):
		print('正在运行==>deco.wrapper1')
		res1=func1(*args,**kwargs)
		print res1
	return wrapper1

def deco2(func2): #func2=wrapper3的内存地址
	def wrapper2(*args,**kwargs):
		print('正在运行==>deco2.wrapper2')
		res2=func2(*args,**kwargs)
		return res2
	return wrapper2

def deco3(x):
	def outter(func3): #func3=被装饰对象index函数的内存地址
		def wrapper(*args,**kwargs):
			print('正在运行==>deco3.outter3.wrapper3')
			res3=func3(*args,**kwargs)
			return res3
		return wrapper3
	return outter3


@deco1   
@deco2   
@deco3(111) 

def index(x,y):
	print('from index %s:%s' %(x,y))

#执行顺序:自上而下的,即wrapper1->wrapper2->wrapper3
index(1,2)

运行结果:

正在运行==>deco1.wrapper1
正在运行==>deco2.wrapper2
正在运行==>deco3.outer3.wrapper3
from index 1:2

生成器的高级玩法

yield挂起函数

x = yield 返回值
#了解
一、

def dog(name):
	print('道哥%s准备吃东西了' %name)
	while True:
		#x拿到的是yield接收到到的值
		x = yield   x='一根骨头’
		print('道哥%s吃了 %s' %(name,x))

g = dog('alex')
g.send(None) #等同于next(g)
g.send('一根骨头')
g.send('肉包子')
#g.close()
#g.send('111')

运行结果

    g.send('1111')
StopIteration
刀哥alex准备吃东西了
刀哥alex吃了 ['一根骨头', 'aaa']
刀哥alex吃了 肉包子

二、

def dog(name):
	food_list=[]
	print('道哥%s准备吃东西了' %name)
	while True:
		#x拿到的是yield接收到的值
		x = yield food_list #x=‘一根骨头’
		print('道哥%s吃了%s' %(name,x))
		food_list.append(x)
g = dog('alex')
res1 = g.sned(None) #等同于next(g)
print(res1)
res2 = g.send('一根骨头')
print(res2)
res3 = g.send('肉包子')
print(res3)

运行结果

刀哥alex准备吃东西了
[]
刀哥alex吃了 一根骨头
['一根骨头']
刀哥alex吃了 肉包子
['一根骨头', '肉包子']

三、

def func():
	print('start...')
	x = yield 111 #x='xxx'
	print('哈哈哈哈哈')
	print('哈哈哈哈哈')
	print('哈哈哈哈哈')
	print('哈哈哈哈哈')
	yield 2222

g = func()
res = g.send(None)
print(res)
res = g.send('xxx')
print(res)

运行结果:

start...
111
哈哈哈哈哈
哈哈哈哈哈
哈哈哈哈哈
哈哈哈哈哈
2222

生成式

列表生成式

l = ['alex_dsb','lxx_dsb','wxx_dsb','xxq_dsb','egon']
new_l = []
for name in l:
	if name.endswith('dsb'):
		new_l.append(name)

#列表生成式
new_l = [name for name in l if name.endswith('dsb')]
print(new_l)

#把所有小写字母全变成大写
new_l =[name.upper() for name in l]
print(new_l)

#把所有的名字去掉后缀
new_l = [name.replace('_dsb','') for name in l]
print(new_l)

字典生成式

keys = ['name','age','gender']
dic = {
     key:None for key in keys}
print(dic)
items = [('name','egon'),('age',18),('gender','male')]
res = {
     k:v for k,v in items if k!='gender'}
print(res)

集合生成式

keys = ['name','egon','gender']
set1={
     key for key in keys}
print(set1,type(set1))

生成器表达式

g = (i for i in range(10) if ii>3)
#!!!!强调!!!!!
#此刻g内部一个值也没有

print(g)
print(next(g)

)

运行结果

<generator object <genexpr> at 0x0000022343DA5900>
4
with open('笔记'.mode='rt',encoding='utf-8') as f:
	#方式一
	res = 0
	for line in f:
		res += len(line)
	print(res)

	#方式二
	res = sum([len(line) for line in f)
	print(res)

	#方式三
	res= sum((len(line) for line in f))
	#上述可以简写以下形式
	res = sum(len(line) for line in f)
	print(res)

函数的递归调用

1.函数递归调用:是函数嵌套调用的一种特殊形式。具体是指:在调用一个函数的过程中又直接或者间接地调用到本身。
2.直接调用本身(python会限制调用次数,1000)

def f1():
	print('是我是我还是我')
	f1()
f1()

间接调用

def f1():
	print('====>f1')
	f2()

def f2():
	print('====>f2')
	f1()
f1()

3.一段代码的循环运行方案有两种
方式一:while、for循环

while True:
	print(111)
	print(222)
	print(333)

方式二:递归的本质就是循环

def f1():
	print(111)
	print(222)
	print(333)
	f1()
f1()

4.需要强调的是:递归调用不应该无限的调用下去,必须在满足某种条件下结束递归

n = 0 
while n<10:
	print(n)
	n+=1
def func(n):
	if n == 10:
		return 
	print(n(
	n+=1
	func(n)

func(0)

5.递归的两个阶段
①回溯:一层一层调用下去
②递推:满足某种结束条件,结束递归调用,然后一层一层返回
age(5) = age(4)+10
age(4) = age(3)+10
age(3) = age(2)+10
age(2) = age(1)+10
age(1)= 10

def age(n):
	if n == 1:
		return 18
	return age(n-1) +10

res = age(5)
print(res)

6.递归的调用

l = [1,2,,[3,4]]
for x in l:
	if type(x) is list:
		for a in x:
			if type(a) is list:
				pass
			else:
				print(a)
	else:
		print(x)
l = [1,2,[3,4,[56,23,[242,345,[232343,445]]]]]
def f1(list1):
	for x in list1:
		if type(x) is list:
		#如果是列表,应该再循环、再判断、即重新运行本身的代码
			f1(x)
		else:
			print(x)
f1(l)

你可能感兴趣的:(python入门)