zoukankan      html  css  js  c++  java
  • python学习之老男孩python全栈第九期_day014知识点总结

    # 迭代器和生成器
    # 迭代器
    # 双下方法:很少直接调用的方法,一般情况下,是通过其他语法触发的
    # 可迭代的 --> 可迭代协议:含有__iter__的方法( '__iter__' in dir(数据) )
    # 可迭代的一定可以被for循环
    # 迭代器协议:含有__iter__、__next__的方法
    # 迭代器一定可迭代,可迭代的通过调用iter()方法就能得到一个迭代器
    # 迭代器的特点:
    # 很方便使用,且只能取所有的数据取一次
    # 节省内存空间

    # 生成器
    # 生成器的本质就是迭代器
    # 生成器的表现形式
    # 生成函数
    # 生成器表达式
    # 生成器函数:
    # 含有yield关键字的函数就是生成器函数
    # 特点:
    # 调用函数之后函数不执行,返回一个生成器
    # 调用next方法的时候会取到一个值
    # 直到取完最后一个,再执行next会报错
    # def generator():
    # for i in range(2000000):
    # yield '娃哈哈%s'%i
    # g = generator() # 调用生成器函数得到一个生成器
    # ret = g.__next__() # 每一次执行g.__next__就是从生成器中取值,预示着生成器函数中的代码继续执行
    # print(ret)
    # num = 0
    # for j in g:
    # num += 1
    # if num > 50:
    # break
    # print(j)

    # 从生成器中取值的几个方法
    # next
    # for
    # 数据类型的强制转换:占用内存
    def generator():
    for i in range(20):
    yield '娃哈哈%s' % i
    g = generator() # 调用生成器函数得到一个生成器
    print(list(g)) # 强制转换需要在全部运行完之后才打印

    def generator():
    print(123)
    content = yield 1
    print('=====',content)
    print(456)
    yield 2
    print(789)


    g = generator()
    print('*',g.__next__())
    print('**',g.send('hello'))
    # print('**',g.send(None)) # send的效果和next一样
    # print('***',g.__next__())
    # print('*****',g.__next__())

    # send 获取下一个值的效果和next基本一致
    # 只是在获取下一个值的时候,给上一个值的位置传递一个数据
    '''
    其实next()和send()在一定意义上作用是相似的
    区别是send()可以传递yield表达式的值进去,而next()不能传递特定的值,只能传递None进去
    因此,我们可以看做c.next() 和 c.send(None) 作用是一样的
    需要提醒的是,第一次调用时,请使用next()语句或是send(None),不能使用send发送一个非None的值,否则会出错
    最后一个yield不能接受外部的值
    '''

    # 获取移动平均值
    # 比如:计算最近7天的平均值

    # 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()
    # avg_g.send(None) # avg_g.__next__()
    # print(avg_g.send(10))
    # print(avg_g.send(20))


    def init(func): # 装饰器 func ==average
    def inner(*args,**kwargs):
    g = func(*args,**kwargs) # g = average()
    g.__next__()
    return g
    return inner
    @init # average == init(average) == inner
    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() # --> inner
    ret = avg_g.send(10)
    print(ret)
    ret = avg_g.send(20)
    print(ret)

    # python 3
    # 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)

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

    # 回顾
    # send
    # send的作用范围和next一样
    # 第一次不能用send
    # 函数中的最后一个yield不能接收新的值

    # 计算移动平均值的例子
    # 预激生成器的装饰器的例子
    # yield from


    # 列表推导式
    # 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)

    print([i for i in range(10)]) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    print([i*2 for i in range(10)]) # [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

    # 生成器表达式
    g = (i for i in range(10)) # g是一个生成器
    print(g)
    for i in g:
    print(i)

    # 两者不同点:
    # 括号不一样
    # 返回值不一样 --> 生成器表达式几乎不占用内存


    老母鸡 = ('鸡蛋%s'%i for i in range(10)) # 老母鸡是一个生成器
    print(老母鸡)
    for 蛋 in 老母鸡:
    print(蛋)


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

    # 列表推导式
    # [每一个元素或是和元素相关的操作 for 元素 in 可迭代数据类型] # 遍历之后挨个处理
    # [满足条件才进行操作的元素 for 元素 in 可迭代数据类型 if 元素相关的条件 ] # 筛选功能


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

    # 字典推导式
    # 1. 将一个字典的key和value对调
    mcase = {'a': 10, 'b': 34}
    dic = {mcase[k]:k for k in mcase}
    print(dic)

    # 2. 合并大小写对应的value值,将k统一成小写
    mcase = {'a': 10, 'b': 34, 'A': 7, 'Z': 3}
    # mcase = {'a': 10 + 7, 'b': 34, 'z': 3}

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

    # 集合的推导式
    # 1. 计算列表中每个值的平方,自带去重功能
    squared = {x*x for x in [1, -1, 2]}
    print(squared)

    # 没有元组推导式

    # 各种推倒时:生成器 列表 字典 集合
    # 遍历操作
    # 筛选操作
  • 相关阅读:
    PyCharm设置中文字体
    pycharm中设置鼠标滚动放大和缩小页面
    cas5.3.2单点登录-自定义登录页面(十四)
    P1616疯狂的采药
    P2430严酷的训练
    P1164小A点菜
    P1015回文数
    P2871 手链
    《学习OpenCV》课后习题解答6
    《学习OpenCV》课后习题解答5
  • 原文地址:https://www.cnblogs.com/lpgit/p/9338801.html
Copyright © 2011-2022 走看看