生成器初阶:
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
循环其实可以同时使用两个甚至多个变量,比如dict
的items()
可以同时迭代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
注意:生成式,生成的是一个列表,列表的大小在内存里是要占容量的,是将数据直接全部存储在内存里的,所以我们下一节就要引入生成器的概念。