• 迭代器,生成器和递归


    迭代器和生成器

    可迭代对象

    具有__iter__方法的对象,就是可迭代对象。
    可迭代对象返回的值是一个具有__next__方法的对象叫迭代器对象

    In [2]: a = [1,2]
    
    In [3]: it = a.__iter__()
    
    In [4]: it
    Out[4]: <list_iterator at 0x1e69be013c8>
    
    In [5]: it.__next__()
    Out[5]: 1
    

    可迭代对象有:str, list, tuple, dict, set, file

    迭代器对象返回的还是迭代器对象,具有`__next__`方法
    In [5]: it.__next__()
    Out[5]: 1
    
    In [6]: it
    Out[6]: <list_iterator at 0x1e69be013c8>
    
    In [7]: for i in it:
       ...:     print(i)
       ...:
    2
    
    In [8]: it2 = it.__iter__()
    
    In [9]: it2
    Out[9]: <list_iterator at 0x1e69be013c8>
    

    三元表达式

    In [11]: print(1) if 1<2 else print(2)
    1
    

    列表推导式

    In [15]: b = (i for i in range(8))
    
    In [16]: b
    Out[16]: <generator object <genexpr> at 0x000001E69BE82CA8>
    In [20]: lst = list(b)
    
    In [21]: lst
    Out[21]: [0, 1, 2, 3, 4, 5, 6, 7]
    

    字典生成式

    In [23]: keys = ["a", "b", "c"]
    
    In [24]: values = (1,2,3)
    
    In [25]: d = dict(zip(keys, values))
    
    In [26]: d
    Out[26]: {'a': 1, 'b': 2, 'c': 3}
    
    In [27]: z = zip(keys, values)
    
    In [28]: z
    Out[28]: <zip at 0x1e69bd30d88>
    
    In [29]: z.__iter__()
    Out[29]: <zip at 0x1e69bd30d88>
    
    In [30]: z.__next__()
    Out[30]: ('a', 1)
    

    生成器

    yield关键字

    在函数中出现yield关键字,函数就会暂停执行,并返回一个值

    In [31]: def func():
        ...:     yield 1
        ...:     yield 2
        ...:
    
    In [32]: a = func()
    
    In [33]: a
    Out[33]: <generator object func at 0x000001E69BE82200>
    
    In [34]: a.__iter__()
    Out[34]: <generator object func at 0x000001E69BE82200>
    
    In [35]: a.__next__()
    Out[35]: 1
    

    生成器是一种特殊的迭代器,生成器自动实现了“迭代器协议”(即__iter__和next方法),不需要再手动实现两方法

    递归

    一种特殊的嵌套调用,是指在调用一个函数的过程中,又直接或间接的调用了自身。

    递归满足的特点:

    • 问题规模会随着递归减小
    • 递归函数要有出口
    
    In [36]: lis = [1, [2, [3, [4, [5, [6, ]]]]]]
        ...: 
        ...: 
        ...: def tell(lis):
        ...:     for i in lis:
        ...:         if type(i) is list:
        ...:             tell(i)
        ...:         else:
        ...:             print(i)
        ...:
    
    In [37]: tell(lis)
    1
    2
    3
    4
    5
    6
    
  • 相关阅读:
    java内存模型
    如何保证消费者接收消息的顺序
    mysql事务隔离级别
    mysql加锁读
    mysql一致性读
    InnoDB锁
    JDK1.8中的线程池
    JDK1.8中HashMap实现
    物品推荐(基于物品的协同过滤算法)
    CRM 2013 生成自动编号
  • 原文地址:https://www.cnblogs.com/YajunRan/p/11582123.html
Copyright © 2020-2023  润新知