列表生成式即List Comprehensions,是Python
内置的非常简单却强大的可以用来创建list的生成式。
通常我们在循环遍历一个列表时,都是通过for
循环来完成
L = []
for i in range(1,11)
L.append(x*x)
结果如下:
[1,4,9,16,25,36,49,64,81,100]
然而,python号称是人生苦短,我用python,那么简单的方法会是什么呢?答案当然是有的
[x * x for x in range(1,11)]
[1,4,9,16,25,36,49,64,81,100]
通过运行我们发现,可以得到以上的同样结果,这就是python的强大之处,可以简化代码,减少程序员的工作量
我们在写出成列表生成式时,需要把要生成的元素或者表达式写在前面,然后后面跟上for循环
,就可以把list
创建出来。
for循环后面还可以加上if判断语句:
[x * x for x in range(1,11) if x % 2 == 0]
[4,16,36,64,100]
if--else的用法
这里需要注意的是:
不能在
for
后面的if
语句后加上else
else 要在for循环之前,否则会报错
例子:
[错误样式]
[x for x in range(1, 11) if x % 2 == 0 else 0]
File "<stdin>", line 1
[x for x in range(1, 11) if x % 2 == 0 else 0]
^
SyntaxError: invalid syntax
将 if 单独写在 for 前面也会报错
[x if x % 2 == 0 for x in range(1, 11)]
File "<stdin>", line 1
[x if x % 2 == 0 for x in range(1, 11)]
^
SyntaxError: invalid syntax
[正确样式]
[x if x % 2 == 0 else -x for x in range(1, 11)]
[-1, 2, -3, 4, -5, 6, -7, 8, -9, 10]
这样子就可以正常输出了
原因:
- for前面的部分是一个表达式,它必须根据x计算出一个结果。因此,考察表达式:x if x % 2 == 0,它无法根据x计算出结果,因为缺少else,必须加上else
- 跟在for后面的if是一个筛选条件,不能带else,否则如何筛选?
- 可见,在一个列表生成式中,for前面的if ... else是表达式,而for后面的if是过滤条件,不能带else。
循环还可以用好几层,以下演示的是两层的
[m + n for m in "ABC" for n in "xyz"]
['Ax', 'Ay', 'Az', 'Bx', 'By', 'Bz', 'Cx', 'Cy', 'Cz']
基本上三层及以上的就很少用了
列出当前目录下的所有文件和目录名
import os # 导入os模块
[d for d in os.listdir('.')] # os的listdir可以列出文件和目录
['chardetect.exe', 'easy_install-3.7.exe', 'easy_install.exe', 'pip.exe', 'pip3.7.exe', 'pip3.exe', 'pyppeteer-install-script.py', 'pyppeteer-install.exe', 'tqdm.exe']
>>> [d for d in o
[d for d in os.listdir('..')] # .表示当前目录 ..表示上一级目录
['Animated.py', 'crawler.py', 'DLLs', 'Doc', 'friends.py', 'img', 'include', 'Lib', 'libs', 'LICENSE.txt', 'NEWS.txt', 'pip', 'pip-19.1.1-py2.py3-none-any.whl', 'pip-19.1.1.tar.gz', 'python.exe', 'python3.dll', 'python37.dll', 'pythonw.exe', 'qweqwewqe.py', 'robots', 'Scripts', 'tcl', 'test.txt', 'Tools', 'vcruntime140.dll', '__pycache__']