zoukankan      html  css  js  c++  java
  • python生成器 迭代器

    #*****************列表表达式************
    # l=[s**2 for s in range(1,11) if s%2 is 0]
    # print(l)
    # #[4, 16, 36, 64, 100]  1-10内所有偶数的平方

    [m + n for m in 'ABC' for n in 'XYZ']
    #['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']   排列组合
    
    names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'],
             ['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']]
    l2 = [name for i in names for name in i if name.count('e') == 2]      #找列表中有两个"e"的字符串  ,用了两个循环 for i in names 和 for name in i 是嵌套的
    #['Jefferson', 'Wesley', 'Steven', 'Jennifer']
    
    
    
    x = {
        'name':'alex',
        'Values':[{'timestamp':1517991992.94,        
             'values':100,},
            {'timestamp': 1517992000.94,
            'values': 200,},
            {'timestamp': 1517992014.94,
             'values': 300,},
            {'timestamp': 1517992744.94,
             'values': 350},
            {'timestamp': 1517992800.94,
             'values': 280}
          ],}
    
    print([[dic[i] ] for dic in x['Values'] for i in dic  ])      #两个循环嵌套结构
    #[[1517991992.94], [100], [1517992000.94], [200], [1517992014.94], [300], [1517992744.94], [350], [1517992800.94], [280]]
    
    print([  [dic[i] for i in dic]   for dic in x['Values']  ])    #循环的位置不同,得到的列表不同
    #[[1517991992.94, 100], [1517992000.94, 200], [1517992014.94, 300], [1517992744.94, 350], [1517992800.94, 280]]
    #有时直接粘博客上的代码会报错,在pycharm中重新敲一遍就好了
    #**************类似的字典也有表达式 #以下是将字典的键和值互换的字典推导式 mcase = {'a': 10, 'b': 34} print({mcase[i]: i for i in mcase}) #{10: 'a', 34: 'b'}
    #*****************使用列表表达式创建generator,将 [ ]换为 ( )*********
    # l=(s**2 for s in range(1,11) if s%2 is 0)
    # print(l)  #<generator object <genexpr> at 0x0000015C4A3A4BA0> 表明这是一个生成器对象
    # print(next(l))  #4
    # print(next(l))  #16
    # print(next(l))  #36
    # print(next(l))  #64
    
    #************************使用函数创建,yield***************
    def fib(max):
        n, a, b = 0, 0, 1
        while n < max:
            yield b
            a, b = b, a + b
            n = n + 1
        return 'done'
    f=fib(10)       #  规定了循环的总次数,同时fib进行了初始化,指向第0个,这个是必须的,f=fib()把fib()通过yield返回的值一次次传递出来,如果没有那么fib()的值只是第一个yield返回的值
    print(next(f))
    print(next(f))
    print(next(f))
    print(next(f))
    print(next(f))
    print(next(f))
    # 1
    # 1
    # 2
    # 3
    # 5
    # 8
    
    
    for i in fib(10):   #使用迭代代替next
        print(i)
    # 1
    # 1
    # 2
    # 3
    # 5
    # 8
    # 13
    # 21
    # 34
    # 55
    g = fib(6)
    while True:
        try:
            x = next(g)
            print('g:', x)
        except StopIteration as e:
            print('Generator return value:', e.value)
            break
    # g: 1
    # g: 1
    # g: 2
    # g: 3
    # g: 5
    # g: 8
    #*****************杨辉三角**********************
    #           1
    #          / 
    #         1   1
    #        /  / 
    #       1   2   1
    #      /  /  / 
    #     1   3   3   1
    #    /  /  /  / 
    #   1   4   6   4   1
    #  /  /  /  /  / 
    # 1   5   10  10  5   1
    def YH(max):
        n ,l1,count = 0 ,[1] ,0
        while n < max:
            try:
                yield l1
                l2 = []
                for i in range(0, (len(l1) - 1)):
                    l2.append(l1[i] + l1[i + 1])
                l2.insert(0, 1)
                l2.append(1)
                l1 = l2
                n += 1
            except StopIteration as e:
                print('Generator return value:', e.value)
                break
    
    Y = YH(10)
    for i in Y:
        print(i)
    #######迭代器
    isinstance("s",str)  #判断变量s是否是字符串,isinstance是用来判断某个变量的类型,其他的变量类型也可用此判断
    
    # 凡是可作用于for循环的对象都是Iterable类型;
    # 凡是可作用于next()函数的对象都是Iterator类型,它们表示一个惰性计算的序列;
    # 集合数据类型如list、dict、str等是Iterable但不是Iterator,不过可以通过iter()函数获得一个Iterator对象。
    # Python的for循环本质上就是通过不断调用next()函数实现的,例如:
    for x in [1, 2, 3, 4, 5]:
        pass
    #等价于
    
    # 首先获得Iterator对象:
    it = iter([1, 2, 3, 4, 5])
    # 循环:
    while True:
        try:
            # 获得下一个值:
            x = next(it)
        except StopIteration:
            # 遇到StopIteration就退出循环
            break
    '''可迭代对象:Iterable
            内部含有__iter__方法的就是可迭代对象.
            可迭代对象不能取值,因为内部不含有__next__方法.
    
        可迭代对象 ---> 迭代器.
            obj.__iter__()
            iter(obj)
        迭代器:Iterator
            内部含有__iter__,__next__ 方法的对象.
        可迭代对象: str,list,dict,tuple,set,range
        文件句柄:是迭代器.
        迭代器的优点:
            1,节省内存.
            2,惰性机制.
            3,单向,不可逆.
        如何判断可迭代对象,迭代器.
            1,__iter__ in dir(obj)
            2,isinstance(l1,Iterable)
              isinstance(l1,Iterator)
    
        生成器:
            自己用python代码写的迭代器就是生成器.
            生成器的本身就是迭代器.'''
    可迭代对象  内部含有__iter__方法  str,list,tuple,dict,set,range
    迭代器		内部含有__iter__方法,并且含有__next__方法  f文件句柄,map,filter,zip,等,生成器本身就是迭代器
    迭代器的特点:1,节省内存.2,惰性机制3,单向不可逆
    python内置的next()方法实际上就是执行函数的__next__方法
    it = iter([1, 2, 3, 4, 5])   # iter将可迭代对象变为迭代器,也可以在对象的类中加入__next__方法
    

       

    #*******使生成器拿出一个个值的方法
    obj = (i for i in [1,2,3])
    #方法一,使用__next__方法
    ret1 = obj.__next__()
    print(ret1)     #1
    #方法二,使用 for 循环
    for i in obj:
        print(i)
    # 1
    # 2
    # 3
    #方法三,使用list,相当于把生成器转化为列表表达式
    ret2 = list(obj)
    print(ret2)    #通过列表也会执行生成器,把生成器中的值拿出来
    #[1, 2, 3]
    
    #这三种方式不要同时使用,因为如果一个生成器中的元素没拿完的话,下一个执行生成器时会接着生成元素,而不是重新生成
  • 相关阅读:
    SVN版本控制器的使用说明(详细过程)
    tomcat服务器的搭建
    git以及gitHub的使用说明书
    gulp的简单使用
    SASS的应用
    springmvc常用注解
    js创建对象的方法
    SVG入门
    http状态码全解
    Ajax参数详解
  • 原文地址:https://www.cnblogs.com/perfey/p/9152969.html
Copyright © 2011-2022 走看看