列表解析式
列表解析式常用于实现创建新的列表,不会因为简写而影响效率,反而会提高效率。减少程序员工作量,减少出错。 举例,输出0-10的偶数:
#不用解析式的一般写法
size = 10
even_numbers = []
n = 0
while n < size:
if n % 2==0:
even_numbers.append(n)
n += 1
print(even_numbers)
#使用解析式
even_numbers=[ x for x in range(10) if x % 2==0 ]
print(even_numbers)
由此可见,列表解析式的方法极大的简略了代码,但同时可读性也增强了。
形式
形式: {expr(item) for item in iterable if cond_expr(item)} 也可以使用中括号、小括号包裹
第一部分:元素,对元素的操作(运算与函数都可以) 第二部分:遍历行为 第三部分:筛选条件(可选),应该注意if条件后面不能再跟elif 最后:用小括号,中括号,大括号包含住三部分,得到不同的数据结构或对象
中括号解析式
enumerate() 函数返回生成器,生成器每次给出下标和Iterable的内容。一般用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用于 for 循环当中。 对比:
#range函数或一般的sequence,遍历的只有元素的值
for i in range(10):
print(i)
#enumerate函数遍历的是元素的下标和值
for id, value in enumerate(10):
print(i)
例子:
test =['Ainur','Dragons','Dwarves','Elves','Ents','Hobbits','Men','Orcs']
print(['{0}:{1}'.format(idx,element) for idx,element in enumerate(test) ])
['0:Ainur', '1:Dragons', '2:Dwarves', '3:Elves', '4:Ents', '5:Hobbits', '6:Men', '7:Orcs']
小括号、大括号解析式
使用小括号做解析式并不会返回一个不可变元组而是生成器,占用O(1)内存空间。 大括号解析式则比较普通,使用大括号解析可以得到集合或字典。 要生成字典时使用key:value的形式:
x = range(10)
print({ idx:i**2 for idx,i in enumerate(x) if i%2==0 })
{0: 0, 2: 4, 4: 16, 6: 36, 8: 64}
{key:value for key in "ABC" for value in range(1,10)}
{'A': 9, 'B': 9, 'C': 9}
|