语法:[expression for item in iterable if condition]作用:只保留满足condition的元素,类似筛选
1 2 3
# 生成偶数列表 evens = [x for x inrange(10) if x % 2 == 0] # 等价于:[0, 2, 4, 6, 8]
if-else 表达式用于条件赋值
语法:[expression if condition else expr_else for item in iterable]作用:根据condition的结果,为每个元素选择不同的表达式值。
1 2 3 4
# 将负数转换为 0,正数保持不变: nums = [-1, 2, -3, 4] result = [x if x >= 0else0for x in nums] # 等价于:[0, 2, 0, 4]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
# `L = ['Hello', 'World', 18, 'Apple', None]`将字符串中字母变为小写,其余元素不变。 L = ['Hello', 'World', 18, 'Apple', None] #第一种解法: [L[i].lower() iftype(L[i]) isstrelse L[i] for i inrange(5)]#isinstance(x, str) #第二种解法 [x.lower() ifisinstance(x, str) else x for x in L]
# `keys = ['a', 'b', 'c']` `values = [1, 2, 3]`,根据给出的keys和values,用字典推导式生成新字典。 keys = ['a', 'b', 'c'] values = [1, 2, 3] #第一种解法 {keys[i]: values[i] for i inrange(len(keys))} #第二种解法 {k: v for k, v inzip(keys, values)}
# `words = ['hello', 'world', 'python', 'you']`,用集合推导式求出words中的元素长度都有哪些。 words = ['hello', 'world', 'python', 'you'] {len(x) for x in words}
li = [1, 2, 3] #{1: 'k', 2: 'l', 3: 'p'} # iter_lio = iter(li) # for i in iter_lio: # print(i) next(iter_lio) next(iter_lio) next(iter_lio)
注意事项:
迭代器或生成器遍历完一遍之后,不能再次遍历;若想再次遍历需要重新生成另外的迭代器或生成器。
用for循环迭代输出列表和列表迭代器,输出的都是一样的吗?如果一样,那为什么还要使用迭代器呢?
使用 for
循环迭代列表和直接使用列表迭代器,其输出结果相同,但迭代器有其独特优势。迭代器支持懒加载,按需生成数据,节省内存,特别适用于处理大数据集。它们能够维护状态,记住迭代位置,实现多次迭代,并提供可扩展性,允许自定义迭代行为。迭代器在逐行读取大文件或处理流数据时尤为有用,因为它们不需要一次性加载所有数据。总之,迭代器是
Python 中实现高效和灵活数据处理的关键工具。
1 2 3 4 5 6 7 8 9 10 11 12 13
import time
start = time.time() li = [x for x inrange(1,10)]#[1,2,3,4,5] #[x for x in range(1,6)] for i in li: print(i) print(f"li:{time.time() - start} s") start2 = time.time() my_li = iter(li) for j in my_li: print(j) print(f"my_li:{time.time() - start2} s")
#使用yield语句\关键字,只能在函数内部定义 defreverse(data): # 使用 for 循环遍历 data 的索引,从最后一个元素开始向前遍历到第一个元素 for index inrange(len(data)-1, -1, -1): yield data[index] for char in reverse('Python!'): print(char)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
#生成器例子: defgenerate_squares(): for i inrange(4): yield i**2# 每次生成一个平方数,并暂停函数执行,直到下一次调用
ge = generate_squares() # 检查ge是否是迭代器(Iterator),并打印生成器对象 print(isinstance(ge, Iterator), ge)
# 第一次运行生成器 for i in ge: print(i) # 第二次运行生成器 ge = generate_squares() for i in ge: print(i) #或者把迭代器放到容器中 gg = list(ge)
1 2 3 4 5 6 7
#生成器表达式 la = (2**x for x inrange(8)) list(la)
# 生成一个以3为底,5到60为幂次的生成器。 xx = (3**x for x inrange(5, 61)) list(xx) #生成器要显示输出结果,需要用构造函数转换输出