列表生成器-之生成式

生成器初阶

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

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

posted on 2018-01-25 10:30  承祥君  阅读(144)  评论(0编辑  收藏  举报

导航