从小白到小黑 python学习之旅 日常总结 19(yield表达式 三元表达式 生成式 函数的递归调用)

叠加多个装饰器

 

加载顺序自下而上
执行顺序自上而下

def deco1(func1): # func1 = wrapper2的内存地址
    def wrapper1(*args,**kwargs):
        print('正在运行===>deco1.wrapper1')
        res1=func1(*args,**kwargs)
        return 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 outter3(func3): # func3=被装饰对象index函数的内存地址
        def wrapper3(*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))

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


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

 





yield表达式


针对表达式形式的yield,生成器对象必须事先被初始化一次,让函数挂起在x=yield的位置,等待调用g.send()方法为函数体传值,g.send(None)等同于next(g)。

 

def dog(name):
    food_list=[]
    print('道哥%s准备吃东西啦...' %name)
    while True:
        # x拿到的是yield接收到的值
        x = yield food_list
        print('道哥%s吃了 %s' %(name,x))
        food_list.append(x)

g=dog('alex')

res=g.send(None)  # next(g) #.send 可以给 yield 赋值
# 道哥alex准备吃东西啦...
print(res)
# []

res=g.send('一根骨头')
# 道哥alex吃了 一根骨头
print(res)
# ['一根骨头']

res=g.send('肉包子')
# 道哥alex吃了 肉包子
print(res)
# ['一根骨头', '肉包子']

 

 

 

 

三元表达式

 

语法格式: 条件成立时要返回的值 if 条件 else 条件不成立时要返回的值
def func(x,y):
    if x > y:
        return x
    else:
        return y

res=func(1,2)
print(res)
#2
将以上需求改为三元表达式
# 语法格式: 条件成立时要返回的值 if 条件 else 条件不成立时要返回的值
x=1
y=2

res=x if x > y else y
print(res)
#2

 

 

 


生成式


1、列表生成式
l = ['alex_dsb', 'lxx_dsb', 'wxx_dsb', "xxq_dsb", 'egon']
new_l=[]
for name in l:
    if name.endswith('dsb'):
        new_l.append(name)
print(new_l)
#['alex_dsb', 'lxx_dsb', 'wxx_dsb', 'xxq_dsb']



# 列表生成式

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

 


2、字典生成式

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



3、集合生成式

keys=['name','age','gender']
set1={key for key in keys}
print(set1,type(set1))
#{'name', 'gender', 'age'} <class 'set'>

 


4、生成器表达式

g=(i for i in range(10) if i > 5)

# !!!!!!!!!!!强调!!!!!!!!!!!!!!!
# 此刻g内部一个值也没有

print(g,type(g))
#<generator object <genexpr> at 0x00000000026A9970> <class 'generator'>

print(next(g))
#6

print(next(g))
#7

 

with open('D:\cool\login', mode='rt', encoding='utf-8') as f:
    # 方式一:
    res=0
    for line in f:
        res+=len(line)
    print(res) # 8

    # 方式二:
    res=sum([len(line) for line in f])   # sum 取出的行数 之和
    print(res) # 8

    # 方式三 :效率最高
    #res = sum((len(line) for line in f)) 
    # 上述可以简写为如下形式
    res = sum(len(line) for line in f) # sum 取出的行数 之和
    print(res) # 8

 

 

 








函数的递归调用


一:递归的定义

函数的递归调用:是函数嵌套调用的一种特殊形式
具体是指:
在调用一个函数的过程中又直接或者间接地调用到本身



直接调用本身
def f1():
    print('是我是我还是我')
    f1()
f1()

间接接调用本身
def f1():
    print('===>f1')
    f2()

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

f1()

 

递归的本质就是循环

递归调用不应该无限地调用下去,必须在满足某种条件下结束递归调用

n=0
def f1(n):
    if n == 10:
        return
    print(n)
    n+=1
    f1(n)

f1(0)
#0
#1
#2
#3
#4
#5
#6
#7
#8
#9

 



递归的两个阶段

回溯:一层一层调用下去
递推:满足某种结束条件,结束递归调用,然后一层一层返回

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


res=age(5)
print(res)
#58

 




递归的应用

l=[1,2,[3,4,[5]]]

def f1(list1):
    for x in list1:
        if type(x) is list:
            # 如果是列表,应该再循环、再判断,即重新运行本身的代码
            f1(x)
        else:
            print(x)

f1(l)
#1
#2
#3
#4
#5

 




















 

posted @ 2020-03-25 17:45  It's_cool  阅读(108)  评论(0)    收藏  举报