• day 11 (生成器 三元表达式 递归 )


     一、叠加多个装饰器的加载、运行分析(了解***)

    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(index:wrapper2的内存地址) ===> index=wrapper1的内存地址
    @deco2 # index=deco2(index: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)

    # 二、yield表达式

    # x=yield 返回值

    # A:
    # 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(['一根骨头','aaa'])
    # # g.send('肉包子')
    # # g.send('一同泔水')
    # # g.close()
    # # g.send('1111') # 关闭之后无法传值


    # B:yield后有返回值
    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')
    # res=g.send(None) # next(g)
    # print(res) ==> []
    #
    # res=g.send('一根骨头')
    # print(res) ==> ['一根骨头']
    #
    # res=g.send('肉包子')
    # print(res) ==> ['一根骨头','肉包子']


    def func():
    print('start.....')
    x=yield 1111 # x='xxxxx'
    print('哈哈哈啊哈')
    yield 22222

    g=func()
    res=next(g)
    print(res) ==> 1111

    res=g.send('xxxxx')
    print(res) ==> 22222


    # 三、三元表达式
    # 针对以下需求
    # def func(x,y):
    # if x > y:
    # return x
    # else:
    # return y
    #
    # res=func(1,2)
    # print(res)

    # 三元表达式
    # 语法格式: 条件成立时要返回的值 if 条件 else 条件不成立时要返回的值
    x=1
    y=2

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

    res=111111 if 'egon' == 'egon' else 2222222222
    print(res) ==> 111111

    # 容器类型的生成式
    # 1、列表生成式
    l = ['alex_dsb', 'lxx_dsb', 'wxx_dsb', "xxq_dsb", 'egon']

    # 把后缀是dsb的名字放入新列表
    # 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')]

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

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

    # 2、字典生成式
    # keys=['name','age','gender']
    # dic={key:None for key in keys}

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


    # 3、集合生成式
    # keys=['name','age','gender']
    # set1={key for key in keys}


    # 4、生成器表达式(元组没有生成式)
    # g=(i for i in range(10) if i > 3)

    # 注意:此时g是生成器类型,生成器未实行next()命令,代码不执行,此刻g内部一个值也没有


    # 文件案例:计算文件内字符总长度
    with open('笔记.txt', 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)


    # 四、递归

    # 1、递归的定义

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

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

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


    # 一段代码的循环运行的方案有两种
    # 方式一:while、for循环
    # while True:
    # print(1111)
    # print(2222)
    # print(3333)

    # 方式二:递归的本质就是循环:
    # def f1():
    # print(1111)
    # print(2222)
    # print(3333)
    # f1()
    # f1()


    # 2、需要强调的的一点是:
    # 递归调用不应该无限地调用下去,必须在满足某种条件下结束递归调用

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

    # 3、递归的两个阶段
    # 回溯:一层一层调用下去
    # 递推:满足某种结束条件,结束递归调用,然后一层一层返回

    # age(5) = age(4) + 10
    # age(4) = age(3) + 10
    # age(3) = age(2) + 10
    # age(2) = age(1) + 10
    # age(1) = 18

    # def age(n):
    # if n == 1:
    # return 18
    # return age(n-1) + 10
    #
    # res=age(5)
    # print(res)

    # 4、递归的应用
    l=[1,2,[3,[4,[5,[6,[7,[8,[9,10,11,[12,[13,]]]]]]]]]]

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

    f1(l)
  • 相关阅读:
    MongoDB性能优化五步走之读书笔记
    Effective java 第十章 并发 避免过度同步 读书笔记
    Effective java 第三章对于所有对象都通用的方法(一) 读书笔记
    mongodb设计模式策略之读书笔记
    Effective java 第十章 并发 同步访问共享的可变数据 读书笔记
    搬运工生涯开端
    Effective java 第二章创建和销毁对象 读书笔记
    Mongodb聚合操作之读书笔记
    ArcGIS Engine 的插件式开发
    从一个AE画点的例子来看C#QI机制
  • 原文地址:https://www.cnblogs.com/lee1225/p/12639134.html
Copyright © 2020-2023  润新知