• day14.生成器进阶,推导式


    生成器中取值的三种方法

    方法1:next()

    方法2:for 循环

    方法3:数据类型的强制转换

    def func():
        for i in range(20):
            yield '赛车*{}'.format(i)
    
    ret = func()
    print(ret.__next__())
    
    for i in ret:
        print(i)
    
    l1 = list(ret)
    print(l1)

    send() 方法

    send 获取下一个值得时候给上一个yield位置传递一个数据

    第一个 yiled 必须使用next 获取下一个值

    最后一个yield 不能接受任何值

    def func():
        print(1)
        con = yield 111
        print('yield1 的返回值测试:',con)
    
        print(2)
        con2 = yield 222
    
    g = func()
    ret1 = g.__next__()
    print(ret1)
    
    ret2 = g.send('hello,world')
    print(ret2)
    1 111 yield1 的返回值测试: hello,world 2 222

     send方法获取动态平均值小练习

    简略版分析:

    def avg():
        sum = 0
        count = 0
        avg = 0
        num = yield      # next方法执行至此,执行yield之前的所有函数。下面执行send方法时,执行赋值给num
        sum += num
        count += 1
        avg = sum/count
        yield avg       
    
    avg_g = avg()
    avg_g.__next__()      
    last = avg_g.send(10)  
    print(last)

    进阶版本:

    def avg():
        sum = 0
        count = 0
        avg = 0
        while True:
            num = yield avg  # 直接传参,避免count = 0无法执行报错
            count += 1
            sum += num
            avg = sum / count
    
    avg_g = avg()
    avg_g.__next__()
    last = avg_g.send(10)
    print(last)
    last1 = avg_g.send(20)
    print(last1)
    10.0
    15.0

     yield from 方法

    在生成器函数中,可以替代 for 循环取值

    def func():
        a = 'abcde'
        b = '12345'
        yield from a
        yield from b
    g = func()
    for i in g:
        print(i)

     列表推到式

    记住就行了,不难

    print([i for i in range(10)])
    print(['倒数15个数:{}'.format(i) for i in range(5,0,-1)])
    [0,
    1, 2, 3, 4, 5, 6, 7, 8, 9] ['倒数15个数:5', '倒数15个数:4', '倒数15个数:3', '倒数15个数:2', '倒数15个数:1']

    生成器表达式

    列表表达式会将结果全部打印出来,占内存。

    print((i for i in range(10)))
    <generator object <genexpr> at 0x00000244643515C8>

     例:1到10 取每个数的平方

    g = (i**2 for i in range(10))
    for i in g:
        print(i)

     列表推导式

    例1:30以内所有能被3整出的数,以及此数的平方

    ret = [i for i in range(30) if i%3 == 0]
    print(ret)
    
    ret = [i*i for i in range(30) if i%3 == 0]
    print(ret)

    例2:找到嵌套列表中名字含有两个 ‘e’ 的所有名字

    嵌套列表有点意思,两个循环

    names = [['tom','aa','aece'],['bob','bcde','edde']]
    ret = [name for i in names for name in i if name.count('e') == 2]
    print(ret)

    字典推导式:

    例1:将字典的 key 和 value 对调位置

    shop = {'手机':1000,'电脑':3000,'鼠标':100}
    shop2 = {shop[k]:k for k in shop}
    print(shop2)

    例2:合并字典大小写对应的value值,将k统一成小写

    利用了一个字典的查找功能,找不到可以自定义返回值,很好用

    mcase = {'a':10,'b':30,'A':7,'Z':3}
    mcase2 = {k.lower():mcase.get(k.lower(),0) + mcase.get(k.upper(),0) for k in mcase}
    print(mcase2)

    字典的get 方法

    a = {'a':10,'b':20}
    ret1 = a.get('a',100)
    ret2 = a.get('c',30)
    print(ret1,ret2)
    
    10 30

    python3 集合

    集合(set)是一个无序的不重复元素序列。

    可以使用大括号 { } 或者 set() 函数创建集合,注意:创建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典。

    >>>basket = {'apple', 'orange', 'apple', 'pear', 'orange', 'banana'}
    >>> print(basket)                      # 这里演示的是去重功能
    {'orange', 'banana', 'pear', 'apple'}
    >>> 'orange' in basket                 # 快速判断元素是否在集合内
    True
    >>> 'crabgrass' in basket
    False
    >>> # 下面展示两个集合间的运算.>>> a = set('abracadabra')
    >>> b = set('alacazam')
    >>> a                                  
    {'a', 'r', 'b', 'c', 'd'}
    >>> a - b                              # 集合a中包含而集合b中不包含的元素
    {'r', 'd', 'b'}
    >>> a | b                              # 集合a或b中包含的所有元素
    {'a', 'c', 'r', 'd', 'b', 'm', 'z', 'l'}
    >>> a & b                              # 集合a和b中都包含了的元素
    {'a', 'c'}
    >>> a ^ b                              # 不同时包含于a和b的元素
    {'r', 'd', 'b', 'm', 'z', 'l'}

    集合推导式

    集合推导式类似于列表推导式,自带去重功能

    ret1 = {i**2 for i in [-1,1,2]}
    print(ret1)
    {1,4}
  • 相关阅读:
    阿里云 redis 通过rinetd 进行端口透传
    Linux文件系统的实现
    门外汉的IT
    被解放的姜戈05 黑面管家
    被解放的姜戈04 各取所需
    被解放的姜戈03 所谓伊人
    统计Go, Go, Go
    被解放的姜戈02 庄园疑云
    被解放的姜戈01 初试天涯
    亚马逊云架设WordPress博客
  • 原文地址:https://www.cnblogs.com/jiuyachun/p/10456507.html
Copyright © 2020-2023  润新知