zoukankan      html  css  js  c++  java
  • 3-列表推导式 字典推导式 生成器 迭代器

    1.列表推导式

    思考:如何生成一个num0-100的列表

    用for 循环来实现:

    my_list = []
    for i in range(101):
        li = "num{}".format(i)
        my_list.append(li)
    print(my_list)

    用列表推导式---依赖for循环,表达式放在列表里面,根据前面的式子,按照for循环取值依次放在列表中

    my_list1 = ["num{}".format(i) for i in range(101)]
    print(my_list1)

    output:['num0', 'num1', 'num2', 'num3', 'num4'。。。。。。。'num100']

    栗子2: 1-100能被3整除但是不能被2整除的数

    #Python中的真假测试对于整数而言,0为假,非0为真
    #下面的式子就是能被2整除的是假,不能被3整除的,就是非0,即是真
    #下面的式子实现的功能就是:1-100能被3整除但是不能被2整除的数
    a = [i for i in range(100) if not(i % 3) and (i % 2)] 
    print(a)  #output:[3, 9, 15, 21, 27, 33, 39, 45, 51, 57, 63, 69, 75, 81, 87, 93, 99]

    2.字典推导式

    知道来列表推导式,再来看看字典推导式,照葫芦画瓢

    dic = {"num{}".format(i):i+1 for i in range(5)}
    print(dic) #{'num0': 1, 'num1': 2, 'num2': 3, 'num3': 4, 'num4': 5}

    练习1:使用字典推导式,将下面字符串格式的数据,改成字典类型的数据

    str = "name=zhangsan;age=17;gender=boy;phone=1309998890"
    dict1 = { item.split("=")[0]:item.split("=")[1] for item in str.split(";")}
    print(dict1) #{'name': 'zhangsan', 'age': '17', 'gender': 'boy', 'phone': '1309998890'}

     练习2:value 是对key的奇偶判读,比如key是偶数,value就是True

    dic = {i:(i % 2== 0) for i in range(10)}
    print(dic) #output: {0: True, 1: False, 2: True, 3: False, 4: True, 5: False, 6: True, 7: False, 8: True, 9: False}

    3.生成器 ---节省内存,提高性能

    1⃣️按照上面的推导式,用元组,是不是元组推导式呢?看下:

    tu = (i for i in range(6))  
    print(tu) #<generator object <genexpr> at 0x102f57150>

    嗯?不是元组推导式,是一个generater,生成器。--------没有元组推导式的说法哦!!!!

    生成器保留计算的规则,即生成器对象存储的是计算公式,想需要多少数据,再去生成,避免内存的浪费。---比如存储1000万条数据,用列表存储,就要放1000条数据进去;生成器只是存储个公式,减少内存。

    2⃣️获取生成器的全部数据--将其转化为list

    tu = (i for i in range(6))
    print(tu) #<generator object <genexpr> at 0x102f57150>
    print(list(tu))#[0, 1, 2, 3, 4, 5]

    如何一个一个获取生成器的数据

    tu = (i for i in range(6))
    print(tu) #<generator object <genexpr> at 0x102f57150>
    # print(list(tu))
    print(next(tu))
    print(next(tu))
    print(next(tu))
    print(next(tu))
    print(next(tu))
    print(next(tu))
    print(next(tu))
    """
    <generator object <genexpr> at 0x10b6d9150>
    0
    1
    2
    3
    4
    5
    Traceback (most recent call last):
      File "/Users/juan.cao/virenv/soft_deve_day1/列表推导shi.py", line 28, in <module>
        print(next(tu))
    StopIteration
    """

    取完所有数据以后,再执行取元素操作,会报错。

    4.yield生成器

    1⃣️定义个函数,没有return值,打印结果为none

    def fun():
        #yield
        print("python")
    
    print(fun())
    #output: python
    #        None

    2⃣️加上yield,就是一个生成器函数

    def fun():
        yield
        print("python")
    
    print(fun()) #<generator object fun at 0x101464150>

    拓展

    def fun():
        "函数生成器"
        yield 100
        print("python")
        yield 1000
        print("hello")
        yield 10000
    
    print(fun())   #<generator object fun at 0x101464150>
    res = fun()
    print(next(res)) #函数运行到yield,输出100,在此处暂停
    print(next(res)) #再次运行,从第一个yield处释放,运行print("python"),继续运行到yield输出数据,又暂停
    print(next(res)) #同理,从第二个yield处释放,运行到最后。函数生成器的全部数据已经取完,再执行就会报错。
    #<generator object fun at 0x1090eb150>
    # 100
    # python
    # 1000
    # hello
    # 10000

    栗子:用生成器实现费布那契数列(1,1,2,3,5,8,13,21.。。。)

    #费布那契数列的实现
    def Fibonacci():
        a = 0
        b = 1
        while True:
            a,b = b,a + b
            yield a
    
    for i in Fibonacci(): if i < 100: #100以内的费布那契数列 print(i)

    5.迭代器

    迭代的意思,就类似于循环,每一次重复的过程就是一次迭代的过程,每一次迭代的结果,被用作再一次迭代的初始值

    那么,提供迭代方法的容器,就称作迭代器

    通常,我们接触的迭代器是序列:列表、元祖、字符串、字典  ,他们都支持迭代操作

    一般用for 循环来做迭代。

    1⃣️字符串容器--迭代器

    for i in "python": #字符串是一个容器,同时也是一个迭代器;for语句就是触发这个迭代器的迭代功能,每次从容器中拿出一个值,就是所谓的迭代操作
        print(i)

    2⃣️字典容器--迭代器

    #字典实现迭代
    my_dict = {"name":"zhangsan","age":18,"gender":"boy"}
    for each in my_dict:
        print("{}是{}".format(each,my_dict[each]))
    # 结果:
    # name是zhangsan
    # age是18
    # gender是boy

    3⃣️用for 循环跟while实现迭代

    下面2种方法都可以实现对字符串的迭代输出

    #迭代器
    str = "python"
    for i in str:
        print(i)
    it = iter(str)
    while True:
        try:
            print(next(it))
        except StopIteration:
            break

    那么iter()方法

  • 相关阅读:
    LCA+线段树/树状数组 POJ2763 Housewife Wind
    图论 洛谷P2052 道路修建
    动态规划 洛谷P2365 任务安排
    GCD问题 洛谷P1372 又是毕业季I & P1414 又是毕业季II
    动态规划 洛谷P1140 相似基因
    动态规划 洛谷P1868 饥饿的奶牛
    动态规划 P1280 尼克的任务
    倍增LCA BZOJ1776 cowpol奶牛政坛
    P1416 攻击火星
    搜索 洛谷 P1434滑雪
  • 原文地址:https://www.cnblogs.com/ananmy/p/13927612.html
Copyright © 2011-2022 走看看