□ 应用情景:
□ 生成一个列表,元素0~9,对每一个元素自增1后,求平方,返回一个新的列表
以往的常规解决方案:
lst= list(range(10))
newList = []
for i in lst:
newList.append((i + 1) ** 2)
print(newList)
列表解析方式:
lst = [(x+1) ** 2 for x in range(10)]
print(lst)
□ [返回值 for 元素 in 可迭代对象 if条件]
□ 使用[]中括号,内部是for循环,if条件可选
□ 返回的是一个新的列表
□ 列表解析式是一种语法糖,编译器会优化,不会因为简写而影响效率,反而因优化提高了效率
# 举例,求10以内的偶数,比较执行效率.
import datetime
start = datetime.datetime.now()
even = []
for x in range(10):
if x % 2 == 0:
even.append(x)
print(even)
delta = (datetime.datetime.now() - start).total_seconds()
print(delta)
# 举例,求10以内的偶数,比较执行效率.
import datetime
start = datetime.datetime.now()
even = [x for x in range(10) if x % 2 == 0]
print(even)
delta = (datetime.datetime.now() - start).total_seconds()
print(delta)
□ [expr for item in iterable if cond1 if cond2]
# 等价于
ret = []
for item in itertable:
if cond1:
if cond2:
ret.append(expr)
举例:20以内既能被2整除,又能被3整除的数
[i for i in range(20) if i % 2 == 0 and if i % 3 == 0 ]
# or
[i for i in range(20) if i % 2 == 0 if i % 3 == 0 ]
□ [expr for i in iterable1 for j in iterable2]
# 等价于
ret = []
for i in iterable1 :
for j in iterable2 :
ret.append(expr)
举例:
[(x, y) for x in ‘abc’ for y in range(3)]
[[x, y] for x in ‘abc’ for y in range(3)]
[{x, y} for x in ‘abc’ for y in range(3)]
□ (返回值 for 元素 in 可迭代对象 if条件)
□ 列表解析式的中括号[]换成小括号()就ok了
□ 返回的是一个生成器
□ 列表解析式是一种语法糖,编译器会优化,不会因为简写而影响效率,反而因优化提高了效率
□ 和列表解析式的区别:
□ 生成器表达式是按需计算(或称惰性求值,延迟计算)
□ 而列表解析式是立即返回所有结果
□ 生成器
□ 可迭代对象
□ 迭代器
举例:
it = (x for x in range(10) if x % 2)
print(next(it))
使用next(iterable)方法可以取出生成器中的元素,每次返回一个值,当生成器中所有元素都被next取出后,生成器结束,无法再次使用next
□ {返回值 for 元素 in 可迭代对象 if条件}
□ 列表解析式的中括号[]换成小括号{}就ok了
□ 返回的是一个新的集合
举例:
it = {x for x in range(10) if x % 2}
print(it)
□ {返回值 for 元素 in 可迭代对象 if条件}
□ 列表解析式的中括号[]换成小括号{}就ok了
□ 返回值使用key:value形式
□ 返回的是一个新的字典