Python推导式和生成器
推导式与生成器
"""
1.回顾列表推导式
[x操作 for x in list if 条件]
2.列表生成器
(x操作 for x in list if 条件)
结论:
列表生成器会返回一个generator对象
原理就是一个算法,快速生成一个列表
3.yield关键字 --控制函数的运行
结论:
当函数使用yield关键字后,函数不会运行,函数的控制权不是自己了,而是generator对象
通过next(返回的generator对象)可以控制函数的运行
yield关键字可以返回返回值
yield跟return的区别:
都是可以返回返回值:都可以停止函数
return返回被调处
yield返回的是一个generator对象
"""
区别
| 特性 | 列表推导式 | 生成器表达式 |
|---|---|---|
| 语法 | [] 包裹 |
() 包裹 |
| 内存占用 | 一次性生成所有元素,占内存 | 按需生成元素,省内存 |
| 可迭代次数 | 可多次迭代 | 只能迭代一次 |
| 返回类型 | 列表(list) | 生成器对象(generator) |
示例
python
#1 回顾
list1 = [100,200,300,400,500]
print("原列表:",list1)
list2 = [x + 1 for x in list1 if x > 100]
print("新列表:",list2)
# 生成器
list3 = (x for x in range(5))
print(list3) #内存地址
#迭代元素
#print(next(list3)) #next(list3)相当于一个指针
#print(next(list3))
#print(next(list3))
#print(next(list3))
#print(next(list3))
#print(next(list3)) #StopIteration 停止迭代
try:
while True:
print(next(list3))
except StopIteration as e:
print("迭代完毕")
print("运行后")
#3 yield ---操作函数
#return 1.返回返回值 2.结束函数,返回被调处
def test():
print("test")
return "这是一个return语句"
print("test2") #无效代码
test()
def test2():
print("A")
yield "这是一个yield关键字"
print("B")
res = test2()
try:
while True:
print(next(res))
except StopIteration as e:
print("函数执行完毕")
#案例:控制函数执行过程以此输出ABC
def test3():
print("A")
yield
print("B")
yield
print("C")
res = test3()
try:
while True:
next(res)
except StopIteration as e:
print("函数依次输出ABC,并执行完毕")
