• 迭代器 生成器 列表推导式 生成器表达式的一些总结


    02,迭代器
    可迭代对象:
        内部含有__iter__ 遵循可迭代协议
    dir 显示里面的所有方法 有 __iter__ 的方法就是 可迭代对象

    # print(dir('123'))  # '__iter__'
    # print('__iter__' in dir([1, 2, 3]))
    # print('__iter__' in dir({'name':'alex'}))
    # print('__iter__' in dir({'name'}))
    # print('__iter__' in dir((1, 2, 3)))
    # print('__iter__' in dir(1))  # False
    # print('__iter__' in dir(True))  # False
    
    
        迭代器:可迭代对象.__iter__()可以转换成迭代器 ,满足迭代器协议 
    # l = [1, 2, 3]
    # l_obj = l.__iter__()
    # print(l_obj)
            内部含有__iter__且__next__
    迭代器的取值的两种方法:
    # 迭代器的取值两种方法:
    # 方法一:__next__()
    # print(l_obj.__next__())
    # print(l_obj.__next__())
    # print(l_obj.__next__())
    # print(l_obj.__next__())
    
    
    # 方法二 for循环
    # for i in l_obj:
    #     print(i)
    # print('__next__' in dir(l_obj))


    判断 __iter__ 在不在dir(对象中)
    isinstance()
    from collections import Iterable
    from collections import Iterator
    print(isinstance('123', Iterable))
    print(isinstance('123', Iterator))
    
    
    # 实际上可迭代对象是不可以一个一个的一次取值的,因为他没有__next__方法。
    # for循环提供一个机制:
    # 1,将可迭代对象转化成迭代器。
    # 2,利用__next__进行取值。
    # 3,用try异常处理方法防止报错。


    迭代器的特点

    节省内存。
    满足惰性机制。
    取值过程单向不可逆。


    for 循环的机制:
    # l = [1, 2, 3, 4, 5]
    # l_obj = l.__iter__()
    # while True:
    #     try:
    #         print(l_obj.__next__())
    #     except Exception:
    #         break


    03,生成器
    本质上是迭代器,用python代码构建的。

    # 1,通过生成器函数构建。
    # 2,通过生成器推导式构建。

    构建过程:
    # def func1():
    #     print(11)
    #     print(333)
    #     yield 222
    #     print(666)
    #     yield 777
    # g_obj = func1()  # 生成器对象 generator object
    # print(g_obj.__next__())
    # print(g_obj.__next__())
    
    
    
    PS:
    # def cloth1():
    #     for i in range(1,10001):
    #         print('衣服%s' % i)
    # # cloth1()
    #
    #
    # def cloth2():
    #     for i in range(1,10001):
    #         yield '衣服%s' % i
    #
    # g = cloth2()
    # for i in range(1,51):
    #     print(g.__next__())
    #
    # for i in range(1, 151):
    #     print(g.__next__())
    
    
    
    



    yield
    send 和 next 区别
    def func1():
        count = yield 222
        print(count)
        yield 777
        yield 888
    g_obj = func1()  # 生成器对象 generator object
    print(g_obj.__next__())
    print(g_obj.send('wusir'))
    # 1,send 具有next功能。
    # 2,send 可以给上一个yield传值。
    # 3, 第一个取值不能使用send.
    # 4,最后一个yield不会得到send的值。、
    # 列表推导式:
       能用列表推导式完成的,用python代码都可以完成。

      用一句话构建一个你想要的列表。
    # 优点:简单,稍微难理解。
    # 缺点: 不能用debug。
    格式 :  [ 变量(加工后的变量) for 变量 in 可迭代对象 ]  遍历模式
    li = [i for i in range(1, 12)]
    
    
    # li = ['alex', 'wusir', 'taibai', 'nvshen', 'ritian']
    # li = ['python%s期' % i for i in range(1, 12)]
    # print(li)
    # [ 变量(加工后的变量) for 变量 in 可迭代对象 ]  遍历模式
    # [ 变量(加工后的变量) for 变量 in 可迭代对象 if 判断] 筛选模式
    
    
    # l1 = [i for i in range(1, 101) if i % 2 == 0]
    # print(l1)
    #1,筛选,100以内所有的奇数。
    # l2 = [i for i in range(1, 101) if i % 2 == 1]
    # l2 = [i for i in range(1, 101, 2)]
    # print(l2)
    #2,10以内所有数的平方。 [1,4,9,16.。。100]
    # print([i*i for i in range(1, 11)])
    #3,将100以内所有内被三整除的数留到列表中。
    # print([i for i in range(1,101) if i % 3 == 0])
    #30以内所有能被3整除的数的平方
    
    # print([i*i for i in range(1, 31) if i % 3 ==0])
    # 列表推导式 简单明了,但是占内存
    # 生成器表达式 节省内存,不易看出。
    # names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'],
    #          ['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']]
    # l3 = [ name for i in names for name in i if name.count('e') == 2]

    # print(l3)
     
    
    

       字典

    
    
    mcase = {'a': 10, 'b': 34}
    mcase_frequency = {mcase[k]: k for k in mcase}
    print(mcase_frequency)
    
    
    
     


    
    
  • 相关阅读:
    yum与rpm常用命令
    centos7更改时区,同步时间
    剑指Offer45:扑克牌顺子(java)
    剑指Offer44:翻转单词顺序列(java)
    剑指Offer43:左旋转字符串(Java)
    剑指Offer42:和为S的两个数字(java)
    剑指Offer41:和为S的连续正数序列(Java)
    剑指Offer39:平衡二叉树(Java)
    剑指Offer40:数组中只出现一次的数字(Java)
    剑指Offer38:二叉树的深度(Java)
  • 原文地址:https://www.cnblogs.com/HoneyTYX/p/9047203.html
Copyright © 2020-2023  润新知