zoukankan      html  css  js  c++  java
  • Python入门day19——叠加多个装饰器、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)
    
    yield表达式
    # x=yield 返回值
    
    # 一:
    def dog(name):
        print('%s准备吃东西啦...' %name)
        while True:
            # x拿到的是yield接收到的值
            x = yield # x = '肉包子'
            print('%s吃了 %s' %(name,x))
    
    g=dog('alex')
    print(g)
    g.send(None) # 等同于next(g)
    g.send(['123','aaa'])
    g.send('肉包子')
    g.send('666')
    g.close()
    g.send('1111') # 关闭之后无法传值
    
    # 结果
    <generator object dog at 0x000002526BDE1200>
    alex准备吃东西啦...
    alex吃了 ['123', 'aaa']
    alex吃了 肉包子
    alex吃了 666
    报错 StopIteration
    
    # 二:
    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)
    
    g.send('666')
    print(res)
    
    # 结果
    alex准备吃东西啦...
    []
    alex吃了 一根骨头
    ['一根骨头']
    alex吃了 肉包子
    ['一根骨头', '肉包子']
    alex吃了 666
    ['一根骨头', '肉包子', '666']
    
    def func():
        print('start.....')
        x=yield 1111  # x='xxxxx'
        print('哈哈哈啊哈')
        print('哈哈哈啊哈')
        print('哈哈哈啊哈',x)
        y = yield 22222 # y = 'yyy
        print(y)
        yield 
    
    g=func()
    res=next(g)
    print(res)
    
    res=g.send('xxxxx')
    print(res)
    
    res=g.send('yyy')
    print(res)
    
    # 结果
    start.....
    1111
    哈哈哈啊哈
    哈哈哈啊哈
    哈哈哈啊哈 xxxxx
    22222
    yyy
    None
    
    三元表达式
    # 针对以下需求
    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
    
    res=111111 if 'egon' == 'egon' else 2222222222
    print(res) # 111111
    
    # 应用举例
    def func():
        if 1 > 3:
            x=1
        else:
            x=3
            
    def func():
        x = 1 if 1 > 3 else 3
    
    生成式
    # 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)
    
    new_l=[name for name in l if name.endswith('dsb')]
    print(new_l) # ['alex_dsb', 'lxx_dsb', 'wxx_dsb', 'xxq_dsb']
    new_l=[name for name in l]
    print(new_l) # ['alex_dsb', 'lxx_dsb', 'wxx_dsb', 'xxq_dsb', 'egon']
    
    # 把所有小写字母全变成大写
    new_l=[name.upper() for name in l]
    print(new_l) # ['ALEX_DSB', 'LXX_DSB', 'WXX_DSB', 'XXQ_DSB', 'EGON']
    
    # 把所有的名字去掉后缀_dsb
    new_l=[name.replace('_dsb','') for name in l]
    print(new_l) # ['alex', 'lxx', 'wxx', 'xxq', 'egon']
    
    # 2、字典生成式
    keys=['name','age','gender']
    dic={key:None for key in keys}
    print(dic) # {'name': None, 'age': None, 'gender': None}
    
    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)) # {'gender', 'name', 'age'} <class 'set'>
    
    # 4、生成器表达式
    g=(i for i in range(10) if i > 3) # 此刻g内部一个值也没有
    print(g,type(g)) # <generator object <genexpr> at 0x0000028E93591200> <class 'generator'>
    
    print(next(g)) # 4
    print(next(g)) # 5
    print(next(g)) # 6
    print(next(g)) # 7
    print(next(g)) # 8
    print(next(g)) # 9
    print(next(g)) # 报错 StopIteration
    
    # 计算文本中字符长度
    with open('笔记.txt', mode='rt', encoding='utf-8') as f:
        # 方式一:
        res=0
        for line in f:
            res+=len(line)
        print(res)
    with open('笔记.txt', mode='rt', encoding='utf-8') as f:
        # 方式二:
        res=sum([len(line) for line in f])
        print(res)
    with open('笔记.txt', mode='rt', encoding='utf-8') as f:
        # 方式三 :效率最高
        # res = sum((len(line) for line in f))
        # 上述可以简写为如下形式
        res = sum(len(line) for line in f)
        print(res)
    
    函数的递归调用
    # 一:递归的定义
    # 函数的递归调用:是函数嵌套调用的一种特殊形式
    # 具体是指:在调用一个函数的过程中又直接或者间接地调用到本身
    
    # 直接调用本身
    def f1():
        print('123')
        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()
    
    # 二:递归调用不应该无限地调用下去,必须在满足某种条件下结束递归调用
    n=0
    while n < 10:
        print(n)
        n+=1
    
    def f1(n):
        if n == 10:
            return
        print(n)
        n+=1
        f1(n)
    
    f1(0)
    
    # 三:递归的两个阶段
    # 回溯:一层一层调用下去
    # 递推:满足某种结束条件,结束递归调用,然后一层一层返回
    
    # 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) # 58
    
    # 四:递归的应用
    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) # 1 2 3 4 5 6 7 8 9 10 11 12 13
    
  • 相关阅读:
    SDWebImage 原理及使用问题
    iOS沙盒目录
    java基础知识积累总结
    切片原型[start:stop:step]
    select嵌套问题
    Numpy:字符串转为数值型、日期型;日期型转为数值型
    数据标准化处理(简单整理)
    Numpy:自定义复合数据类型
    Numpy:数组创建 numpy.arrray() , numpy.arange()、np.linspace ()、数组基本属性
    Numpy:使用索引、切片提取一维数组、多维数组内数据
  • 原文地址:https://www.cnblogs.com/yding/p/12569275.html
Copyright © 2011-2022 走看看