• 列表生成器-之生成式


    生成器初阶

    A=[]
    for i in range(10):
        i = i*2
        A.append(i)
    print(A)
    
    B = [i*2 for i in range(10)]
    print(B)
    print(B[3])
    
    C=(i*2 for i in range(10))
    aa = (C.__next__)
    print(aa)

    以上就是列表生成式,主要目的就是要让代码整洁;

    举个例子,要生成list [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]可以用range(1, 11)

    >>> range(1,11)
    [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    >>> 

    但如果要生成[1x1, 2x2, 3x3, ..., 10x10]怎么做?方法一是循环:

    >>> L = []
    >>> for x in range(1, 11):
    ...    L.append(x * x)
    ...
    >>> L
    [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

    但是循环太繁琐,而列表生成式则可以用一行语句代替循环生成上面的list:

    A = [x *x for x in range(1,11)]
    print(A)

    输出:[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

    写列表生成式时,把要生成的元素x * x放到前面,后面跟for循环,就可以把list创建出来,十分有用,多写几次,很快就可以熟悉这种语法。

    for循环后面还可以加上if判断,这样我们就可以筛选出仅偶数的平方:

    A = [x *x for x in range(1,11) if x%2 == 0]
    print(A)
    
    输出:[4, 16, 36, 64, 100]

    还可以使用两层循环,可以生成全排列:

    A = [m + n for m in "ABC" for n in "XYZ"]
    print(A)
    
    输出:['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']

    三层和三层以上的循环就很少用到了。

    运用列表生成式,可以写出非常简洁的代码。例如,列出当前目录下的所有文件和目录名,可以通过一行代码实现:

    import os
    A = [d for d in os.listdir()]
    print(A)
    
    输出:['.DS_Store', '.idea', '11.13.py', '11.6.py', '1111.py', '123.py', '1233.py', '__pycache__', 'a.py', 'account_balance.txt', 'asdf.py', 'balance.txt', 'coding.py', 'encoding.py', 'file_local.ini', 'file_lock.ini', 'file_op.py', 'function1.py', 'function2.py', 'function3.py', 'function4.py', 'haproxy.conf', 'history_info.txt', 'infile', 'info.txt', 'login.py', 'login2.py', 'module_.py', 'outfile', 'password.py', 'qq.py', 'Shopping_cart', 'shopping_cart.py', 'shopping_list.txt', 'test.new', 'test.old', 'three_menu.py', 'user_info', 'user_info_table', 'user_lock_table', 'wangcx.log', 'with语句.py', '三级菜.py', '三级菜单.py', '购物车.py']

    for循环其实可以同时使用两个甚至多个变量,比如dictitems()可以同时迭代key和value:

    dict = {"A":1,"B":2,"C":3}
    for k,v in dict.items():
        print(k,"=",v)
    
    输出:
    A = 1
    B = 2
    C = 3

    因此,列表生成式也可以使用两个变量来生成list:

    dict = {"A":"1","B":"2","C":"3"}
    A = [k + "=" + v for k, v in dict.items()]
    print(A)
    
    输出:
    ['A=1', 'B=2', 'C=3']

    最后把一个list中所有的字符串变成小写:

    L = ["Apple","IBM","Vmwear"]
    a = [s.lower() for s in L]
    print(a)
    
    输出:
    ['apple', 'ibm', 'vmwear']

    小结

    运用列表生成式,可以快速生成list,可以通过一个list推导出另一个list,而代码却十分简洁。

    思考:如果list中既包含字符串,又包含整数,由于非字符串类型没有lower()方法,所以列表生成式会报错。

    L = ["Apple","IBM","Vmwear",18]
    a = [s.lower() for s in L]
    print(a)
    
    输出:
    Traceback (most recent call last):
    File "/George_Study/Python_3.0/python_projects/123.py", line 6, in <module>
    a = [s.lower() for s in L]
    File "/George_Study/Python_3.0/python_projects/123.py", line 6, in <listcomp>
    a = [s.lower() for s in L]
    AttributeError: 'int' object has no attribute 'lower'

    使用内建的isinstance函数可以判断一个变量是不是字符串:

    a = 2
    b = "abc"
    print(isinstance(a,int),isinstance(b,str))

    True True

     注意:生成式,生成的是一个列表,列表的大小在内存里是要占容量的,是将数据直接全部存储在内存里的,所以我们下一节就要引入生成器的概念。

  • 相关阅读:
    Delphi中多标签页面的实现
    选择排序
    关于Delphi中TRttiContext.FindType失效的问题
    Delphi中拖动无边框窗口的5种方法
    集中精力做最有价值的事情,而不必把主要精力都浪费在自我包装上(例如学位,头衔,自吹自擂)——沉痛反思:我以前还真是这样
    QModelIndex有internalPointer()函数,可以存任何数据,另有QAbstractItemModel::createIndex来创造节点
    沉没成本——无法收回的成本,但不要影响下一次决策
    使用HttpURLConnection实现多线程下载
    Delphi6/7 中XML 文档的应用
    delphiXE调用Objective-c库
  • 原文地址:https://www.cnblogs.com/wangcx/p/8350060.html
Copyright © 2020-2023  润新知