python语法记录|
map()函数
A = [1, -3, 5]
A_abs = list(map(abs, A))
map(func, A),把func函数作用到A的每个元素上,返回的是惰性迭代器,依次产出1,3,5,不能直接打印或索引;用list()把它一次性拉出来,变成普通列表[1, 3, 5]。
迭代器和可迭代对象
只要看到“数据可能很大”或者“只想遍历一次”,优先用迭代器;需要随机访问、长度、多次复用,再转成列表。
Iterable | 可迭代对象:列表、元组、字符串、字典、集合... for x in 可迭代对象,能被 iter() 变成迭代器
Iterator | 迭代器:支持 next(),for x in 迭代器相当于反复调用 next(),例如enumerate,zip/filter,文件对象,reversed/sorted...
点击查看代码
#可迭代对象
lst = [10, 20, 30]
it = iter(lst) # 变成迭代器
next(it) # 10
for k in {'a':1, 'b':2}: # 默认遍历键
print(k) # a b
#迭代器
for i in range(10**8): # 不会真的建 1 亿个整数
if i > 5: break
for idx, val in enumerate(['a', 'b', 'c'], start=1):
print(idx, val) # 1 a 2 b 3 c
name = ['tom', 'jerry']
age = [18, 17]
for n, a in zip(name, age):
print(n, a) # tom 18 jerry 17
m = map(abs, [-1, -2, 3]) # 迭代器
list(m) # [1, 2, 3]
f = filter(str.isdigit, ['1', 'a', '2'])
list(f) # ['1', '2']
with open('big.log') as f: # 一次只读一行
for line in f:
if 'ERROR' in line:
print(line.rstrip())
for ch in reversed('abc'): # 不产生新字符串
print(ch) # c b a
squares = (x*x for x in range(5)) # 生成器
next(squares) # 0
sum(squares) # 30 (1+4+9+16)
d = {'a': 1, 'b': 2}
for k in d: # 默认按键
print(k)
for v in d.values(): # 值迭代器
print(v)
for kv in d.items(): # 键值对迭代器
print(kv) # ('a', 1) ...
点击查看代码
data = range(5)
list_comp = [x*x for x in data] # 列表推导 → 真·list
gen_exp = (x*x for x in data) # 生成器表达式 → 生成器对象

浙公网安备 33010602011771号