>>> squares = [] >>> for x in range(10): ... squares.append(x**2) ... >>> squares [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
注意这个 for 循环中的被创建(或被重写)的名为 x 的变量在循环完毕后依然存在。使用如下方法,我们可以计算 squares 的值而不会产生任何的副作用:。
1
squares = list(map(lambda x: x**2, range(10)))
等价于下面的列表推导式。
1
squares = [x**2 for x in range(10)]
上面这个方法更加简明且易读。
列表推导式由包含一个表达式的中括号组成,表达式后面跟随一个 for 子句,之后可以有零或多个 for 或 if 子句。结果是一个列表,由表达式依据其后面的 for 和 if 子句上下文计算而来的结果构成。
例如,如下的列表推导式结合两个列表的元素,如果元素之间不相等的话:
1 2 3 4 5 6 7 8 9 10 11 12
>>> [(x, y) for x in [1,2,3] for y in [3,1,4] if x != y] [(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)] 等同于:
>>> combs = [] >>> for x in [1,2,3]: ... for y in [3,1,4]: ... if x != y: ... combs.append((x, y)) ... >>> combs [(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]
值得注意的是在上面两个方法中的 for 和 if 语句的顺序。
列表推导式也可以嵌套。
1 2 3
>>> z = [x + 1 for x in [x ** 2 for x in a]] >>> z [2, 5, 10]
元组
元组是由数个逗号分割的值组成。
1 2 3 4 5 6 7 8 9
>>> a = 'Fedora', 'ShiYanLou', 'Kubuntu', 'Pardus' >>> a ('Fedora', 'ShiYanLou', 'Kubuntu', 'Pardus') >>> a[1] 'ShiYanLou' >>> for x in a: ... print(x, end=' ') ... Fedora ShiYanLou Kubuntu Pardus
你可以对任何一个元组执行拆封操作并赋值给多个变量,就像下面这样:
1 2 3 4 5 6 7
>>> divmod(15,2) (7, 1) >>> x, y = divmod(15,2) >>> x 7 >>> y 1
元组是不可变类型,这意味着你不能在元组内删除或添加或编辑任何值。如果你尝试这些操作,将会出错:
1 2 3 4 5
>>> a = (1, 2, 3, 4) >>> del a[0] Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'tuple' object doesn't support item deletion
要创建只含有一个元素的元组,在值后面跟一个逗号。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
>>> a = (123) >>> a 123 >>> type(a) <class 'int'> >>> a = (123, ) >>> b = 321, >>> a (123,) >>> b (321,) >>> type(a) <class 'tuple'> >>> type(b) <class 'tuple'>
>>> # 演示对两个单词中的字母进行集合操作 ... >>> a = set('abracadabra') >>> b = set('alacazam') >>> a # a 去重后的字母 {'a', 'r', 'b', 'c', 'd'} >>> a - b # a 有而 b 没有的字母 {'r', 'd', 'b'} >>> a | b # 存在于 a 或 b 的字母 {'a', 'c', 'r', 'd', 'b', 'm', 'z', 'l'} >>> a & b # a 和 b 都有的字母 {'a', 'c'} >>> a ^ b # 存在于 a 或 b 但不同时存在的字母 {'r', 'd', 'b', 'm', 'z', 'l'}
从集合中添加或弹出元素:
1 2 3 4 5 6
>>> a = {'a','e','h','g'} >>> a.pop() 'h' >>> a.add('c') >>> a {'c', 'e', 'g', 'a'}
#!/usr/bin/env python3 n = int(input("Enter the number of students: ")) data = {} # 用来存储数据的字典变量 Subjects = ('Physics', 'Maths', 'History') # 所有科目 for i in range(0, n): name = input('Enter the name of the student {}: '.format(i + 1)) # 获得学生名称 marks = [] for x in Subjects: marks.append(int(input('Enter marks of {}: '.format(x)))) # 获得每一科的分数 data[name] = marks for x, y in data.items(): total = sum(y) print("{}'s total marks {}".format(x, total)) if total < 120: print(x, "failed :(") else: print(x, "passed :)")
matrixmul.py
这个例子里我们计算两个矩阵的 Hadamard 乘积。要求输入矩阵的行/列数(在这里假设我们使用的是 n × n 的矩阵)。
#!/usr/bin/env python3 n = int(input("Enter the value of n: ")) print("Enter values for the Matrix A") a = [] for i in range(n): a.append([int(x) for x in input().split()]) print("Enter values for the Matrix B") b = [] for i in range(n): b.append([int(x) for x in input().split()]) c = [] for i in range(n): c.append([a[i][j] * b[j][i] for j in range(n)]) # 此处不把第一个 for 循环也放到列表推导式是因为 # 矩阵每一行生成一个列表方便后面的打印。 print("After matrix multiplication") print("-" * 7 * n) for x in c: for y in x: print(str(y).rjust(5), end=' ') # rjust() Python rjust() 返回一个原字符串右对齐, # 并使用空格填充至长度 width 的新字符串。 # 如果指定的长度小于字符串的长度则返回原字符串 # str.rjust(width[, fillchar]) fillchar 可以指定填充的字符 print() print("-" * 7 * n)
运行如下:
这里我们使用了几次列表推导式。[int(x) for x in input().split()] 首先通过 input() 获得用户输入的字符串,再使用 split() 分割字符串得到一系列的数字字符串,然后用 int() 从每个数字字符串创建对应的整数值。我们也使用了 [a[i][j] * b[j][i] for j in range(n)] 来得到矩阵乘积的每一行数据。