zoukankan      html  css  js  c++  java
  • python 生成器和各种推导式

    ##################################总结###############################

    什么是迭代器?

      可迭代对象通过__iter__()可以转换成迭代器,满足迭代器协议。

      内部含有__iter__且__next__方法的就是迭代器。

    # l = [1, 2, 3]
    # l_obj = l.__iter__()
    # print(l_obj)

    迭代器的取值两种方法:
    l = [1, 2, 3]
    l_obj = l.__iter__()
    print(l_obj)------------------<list_iterator object at 0x000002B84DE73748>
    方法一:__next__()
    print(l_obj.__next__())-------------1
    print(l_obj.__next__())-------------2
    print(l_obj.__next__())-------------3
    
    方法二 for循环
    for i in l_obj:
        print(i)
    print('__next__' in dir(l_obj))
    -------------1
            2
            3
            True

    第二种判断方法:

    from collections import Iterable
    from collections import Iterator
    print(isinstance('123', Iterable))
    print(isinstance('123', Iterator))

    迭代器:

      1,节省内存

      2,满足惰性机制

      3,取值过程单向不可逆(一条路走到黑)

    生成器

            生成器函数中包含 yield , 返回数据和return差不多.
            return 会立即结束这个函数的执行
            yield 可以分段的执行一个函数
    
            生成器函数在执行的时候返回生成器. 而不是直接执行此函数
    
            能向下执行的两个条件:
                __next__(), 执行到下一个yield
                send(), 执行到下一个yield, 给上一个yield位置传值
    
            所有的生成器都是迭代器都可以直接使用for循环
            都可以使用list()函数来获取到生成器内所有的数据
    
            生成器中记录的是代码而不是函数的运行
            def func():
                print("我的天哪 ")
    
                yield "宝宝"
    
            gen = func() # 创建生成器.  此时运行会把生成器函数中的代码记录在内存
            当执行到__next__(), 运行此空间中的代码, 运行到yield结束.
    def func():
        print("1111")
        yield "林志颖"
        print('22222')
        yield "周润发"
        print('33333')
    ret=func()
    print("返回值是",ret)#返回值是 <generator object func at 0x00000000021B1F48>
    
    
    print(ret.__next__())#1111 林志颖
    print(ret.__next__())#22222 周润发
    # print(ret.__next__())

    ##################################作业#############################

    (1)过滤掉长度小于3的字符串列表,并将剩下的转换成大写字母
    lst=['qwe1','ert','oo']
    lse2=[i.upper() for i in lst if len(i) >3]
    print(lse2)
    (2)求(x,y)其中x是0-5之间的偶数,y是0-5之间的奇数组成的元祖列表
    li=[(x,y) for x in range(6) for y in range(6) if x %2==0 and if y%2==1]
    print(li)
    
    for x in range(0,6):
        print('111111111111')#0次 包含了 0 1 2 3 4 5
                             #1次 包含了 0 1 2 3 4 5
        print(x)
        for y in range(0, 6):
            print('22222222222')
            print(y)
            if x % 2 == 0:
                print(x)
                print('=========')
            if y % 2 == 1:
                print(y)
    (3)求M中3,6,9组成的列表
    
    

    lst = [3, 6, 9]
    result = [[n-2, n-1, n] for n in lst]
    print(result)

    ##############[[1, 2, 3], [4, 5, 6], [7, 8, 9]]

    M = [[1,2,3],[4,5,6],[7,8,9]]
    result = [lst[2] for lst in M]
    print(result)

    #############打印出 3 6 9

    
    
    (4)求出50以内能被3整除的数的平方,并放入到一个列表中。
    li=[i*i for i in range(1,51) if i %3 ==0]
    print(li)
    (5)构建一个列表:['python1期', 'python2期', 'python3期', 'python4期', 'python6期', 'python7期', 'python8期', 'python9期', 'python10期']
    li=['python%s期' %i for i in range(1,11)]
    print(li)
    (6)构建一个列表:[(0, 1), (1, 2), (2, 3), (3, 4), (4, 5), (5, 6)]
    li =[(x,y)for x in range(6) for y in range(7) if x==y-1]
    print(li)

    print([ (n, n + 1) for n in range(6) ])

    # for x in range(6):
    # for y in range(7):#0 0123456 1 0123456 2 0123456
    # # 1-1=0 #2-1=1 #3-1=2
    # if x == y - 1:
    # print(x)

    for i in range(2):
    for j in range(3):
    print(i, j)
    if i == j - 1:
    print('====',i,j)
    (7)构建一个列表:[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
    
    
    li = [i for i in range(19) if i % 2 == 0]
    print(li)
    
    
    (8)有一个列表l1 = ['alex', 'WuSir', '老男孩', '太白']将其构造成这种列表['alex0', 'WuSir1', '老男孩2', '太白3']
    l1 = ['alex', 'WuSir', '老男孩', '太白']
    li=[l1[i]+str(i) for i in range(len(l1))]
    print(li)

    #####思路
    # l1 = ['alex', 'WuSir', '老男孩', '太白']
    # for i in range(len(l1)):
    # a=l1[i]+str(i)
    # print(a)
    (9)有以下数据类型:
    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}
    ],}
    将上面的数据通过列表推导式转换成下面的类型:
    [[1517991992.94, 100], [1517992000.94, 200], [1517992014.94, 300], [1517992744.94, 350], [1517992800.94, 280]]
    
    
    # for i in x['Values']:
    #     print([i['timestamp'],i['values']])
    
    li=[[i['timestamp'],i['values']] for i in x['Values']]
    print(li)
    
    
    不怕大牛比自己牛,就怕大牛比自己更努力
  • 相关阅读:
    结合使用allure当中的方法 让用例执行结果内 显示详细描述信息
    pytest-repeat插件,指定用例重复运行、重复运行次数
    pytest-xdist 分布式执行用例
    token
    使用pytest-ordering 来自定义用例执行顺序
    用例编写规则、命令行执行用例、用例执行的先后顺序
    python 中的doctest单元测试框架
    pytest 对用例mark标记分类(且用例也可按照分类来执行)
    学习webpack基本配置(一)
    (剑指offer)数组中出现次数超过一半的数字
  • 原文地址:https://www.cnblogs.com/zaizai1573/p/10104885.html
Copyright © 2011-2022 走看看