zoukankan      html  css  js  c++  java
  • Python学习

    1、生成器函数

    def generator():
        print(123)
        content = yield 1
        print('=======',content)
        print(456)
        yield
    g = generator()     #   g得到生成器,函数没有执行
    g.__next__()
    print('***',generator().__next__())

    2、send()函数

    def generator():
        print(123)
        content = yield 1
        print('=======',content)
        print(456)
        yield
    
    g = generator()
    ret = g.__next__()
    print('***',ret)
    ret = g.send('hello')   #send的效果和next一样
    print('***',ret)

      1)send() 获取下一个值的效果和__next__()基本一致

      2)只是在获取下一个值的时候,给上一yield的位置传递一个数据

      3)使用send()的注意事项

        第一次使用生成器的时候 是用__next__()获取下一个值

        最后一个yield不能接受外部的值

    # send()
    def generator():
        print(123)
        content = yield(1)
        print('<<<',content)
        print(456)
        yield(2)
    
    g = generator()
    ret = g.__next__()
    print('>>>',ret)
    ret = g.send('hello')
    print('>>>',ret)

    3、预激生成器的装饰器

    # 获取移动平均值
    # 10 20 30 10
    # 10 15 20 17.5
    # avg = sum/count
    def average():
        sum = 0
        count = 0
        avg = 0
        while True:
            num = yield avg
            sum += num    # 10
            count += 1    # 1
            avg = sum/count
    
    avg_g = average()
    avg_g.__next__()
    avg1 = avg_g.send(10)
    avg1 = avg_g.send(20)
    print(avg1)
    # 预激生成器的装饰器
    def init(func):
        def inner(*args,**kwargs):
            g = func(*args,**kwargs)
            g.__next__()
            return g
        return inner
    
    @init
    def average():
        sum = 0
        count = 0
        avg = 0
        while 1:
            # num = yield
            num = yield avg
            sum += num
            count += 1
            avg = sum / count
    
    avg_g = average()
    ret = avg_g.send(30)
    print(ret)
    ret = avg_g.send(30)
    print(ret)
    ret = avg_g.send(90)
    print(ret)

    4、yield from

    # 普通方法
    def generator():
        a = 'abcde'
        b = '12345'
        for i in a:
            yield i
        for i in b:
            yield i
    
    g = generator()
    for i in g:
        print(i)
    #   Python 3方法
    def generator():
        a = 'abcde'
        b = '12345'
        yield from a
        yield from b
    
    g = generator()
    for i in g:
        print(i)

    5、生成器的表达式

      1)列表推导式

    # 列表推导式
    egg_list=['鸡蛋%s'%i for i in range(10)]
    print(egg_list)
    # 普通方法
    egg_list = []
    for i in range(10):
        egg_list.append('鸡蛋%s'%i)
    print(egg_list)
    #  10以内数据的2次幂
    print([i**2 for i in range(10)])

      2)生成器表达式

    g = (i for i in range(10))
    print(g)    #   得到生成器
    for i in  g:
        print(i)

        * 生成器表达式与列表表达式的不同点:

          # 外围括号不一样

          # 返回的值不一样生成器表达式 几乎不占用内存

    老母鸡=('鸡蛋%s'%i for i in range(10))   #生成器表达式
    print(老母鸡)              #   得到生成器
    forin 老母鸡:
        print(蛋)

    6、各种推导式

       遍历处理操作:每一个元素或者是和元素相关的操作 for 元素 in 可迭代数据类型

       筛选操作:满足条件的元素相关的操作 for 元素 in 可迭代数据类型 if 元素相关的条件

      1)列表推导式

    #30以内所有能被3整除的数
    ret = [i for i in range(30) if i%3 == 0]  #完整的列表推导式
    print(ret)
    g = (i for i in range(30) if i%3 == 0)  #生成器表达式
    for i in g:
        print(i)
    #30以内所有能被3整除的数的平方
    ret = [i*i for i in range(30) if i%3 == 0]          #完整的列表推导式
    print(ret)
    g = (i*i for i in range(30) if i%3 == 0)            #生成器表达式
    for i in g:
        print(i)
    # 例三:找到嵌套列表中名字含有两个‘e’的所有名字
    names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'],
             ['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']]
    ret = [name for lst in names for name in lst if name.count('e') ==2]                 #完整的列表推导式
    print(ret)
    g = (name for lst in names for name in lst if name.count('e') ==2)                  #生成器表达式
    for i in g:
        print(i)

      2)字典推导式

    # 例一:将一个字典的key和value对调
    mcase = {'a': 10, 'b': 34}
    #{10:'a' , 34:'b'}
    mcase_frequency = {mcase[k]: k for k in mcase}
    print(mcase_frequency)
    # 例二:合并大小写对应的value值,将k统一成小写
    mcase = {'a': 10, 'b': 34, 'A': 7, 'Z': 3}
    #{'a':10+7,'b':34,'z':3}
    mcase_frequency = {k.lower(): mcase.get(k.lower(), 0) + mcase.get(k.upper(), 0) for k in mcase}
    print(mcase_frequency)

      3)集合推导式

        自带结果去重功能

    squared = {x**2 for x in [1, -1, 2]}
    print(squared)
  • 相关阅读:
    uva 408 Uniform Generator
    Java实现 蓝桥杯VIP 算法提高 栅格打印问题
    Java实现 蓝桥杯VIP 算法提高 栅格打印问题
    Java实现 蓝桥杯VIP 算法提高 栅格打印问题
    Java实现 蓝桥杯VIP 算法提高 打水问题
    Java实现 蓝桥杯VIP 算法提高 打水问题
    Java实现 蓝桥杯VIP 算法提高 打水问题
    Java实现 蓝桥杯VIP 算法提高 打水问题
    Java实现 蓝桥杯VIP 算法提高 不同单词个数统计
    Java实现 蓝桥杯VIP 算法提高 不同单词个数统计
  • 原文地址:https://www.cnblogs.com/SharkJiao/p/9396973.html
Copyright © 2011-2022 走看看