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()方法

  • 相关阅读:
    OSCP Learning Notes Buffer Overflows(3)
    OSCP Learning Notes Buffer Overflows(5)
    OSCP Learning Notes Exploit(3)
    OSCP Learning Notes Exploit(4)
    OSCP Learning Notes Exploit(1)
    OSCP Learning Notes Netcat
    OSCP Learning Notes Buffer Overflows(4)
    OSCP Learning Notes Buffer Overflows(1)
    OSCP Learning Notes Exploit(2)
    C++格式化输出 Learner
  • 原文地址:https://www.cnblogs.com/ananmy/p/13927612.html
Copyright © 2011-2022 走看看