格式1:
[i for i in ‘可迭代值’]
举例
list1 = [i for i in range(1, 11)]
print(list1)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
格式2:
[i for i in ‘可迭代值’ if 条件判断]
步骤:
1. for i in ‘可迭代值’
2.if 条件判断
3.输出i
举例
list1 = [i for i in range(0, 11) if i % 2 == 0]
print(list1)
list2 = ['ads', '31', 'sada', '44']
list3 = [i for i in list2 if i.isalpha()]
print(list3)
[0, 2, 4, 6, 8, 10]
['ads', 'sada']
格式3:
[结果1 if 条件判断 else 结果2 for i in ‘可迭代值’]
步骤:
1.for i in ‘可迭代值’
2.if 条件判断
3.结果1 or 结果2
举例
list1 = ['das', 'hdadsa', '312', 'ojiqwe']
list2 = [word.title() if word.startswith('h') and word.isalpha() else word.upper() for word in list1]
# 开头为h的元素首字母大写,其余元素全部大写
print(list2)
['DAS', 'Hdadsa', '312', 'OJIQWE']
格式4:
[(x,y) for x in ‘可迭代值’ for y in ‘可迭代值’]
举例
list1 = [(x, y) for x in range(2) for y in range(3)]
print(list1)
[(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2)]
生成器
1.通过列表推导式方式生成
2.函数+yield
产生元素
1.next(generator) 每次产生一个元素
2.生成器自己的方法 g.__next__() g.send(valus)
***应用:协程
将列表推导式改成()
g = (x * 3 for x in range(20))
print(type(g))
print(g.__next__()) #产生元素
print(next(g))
<class 'generator'>
0
3
生成器生成元素结束,继续调用next或者生成器.__next__,会抛出报错StopIteration
yield关键字会使函数变为生成器
def func():
n = 0
while True:
n += 1
yield n # 相当于return n并且暂停当前状态
g = func()
print(next(g))
print(next(g))
print(next(g))
print(next(g))
1
2
3
4
通过生成器生成斐波那契数列
def fib(lenth):
n = 1
a, b = 1, 1
while n <= lenth:
if n == 1 or n == 2:
yield 1
n += 1
elif n > 2:
yield a + b
a, b = b, (a + b)
n += 1
return '没有更多元素了' # 通过return返回错误消息
g = fib(10)
print(next(g))
print(next(g))
print(next(g))
print(next(g))
1
1
2
3
生成器send的用法
首次执行生成器如果用send的话需要传入None,每次执行send会给函数传入一个值
举例,使用send实现求移动平均值(案例摘自生成器send的用法案例 - aikell - 博客园)
def avg_creater():
num = 0
count = 0
avg = 0
while True:
num1 = yield avg
num += num1
count += 1
avg = num/count
g = avg_creater()
g.__next__()
avg = g.send(10)
avg = g.send(20)
avg = g.send(30)
avg = g.send(40)
avg = g.send(50)
print(avg)
迭代器
可以被next()函数调用并不断返回下一个值的对象成为迭代器:Iterator
1.只能向前不能后退
2.从第一个元素开始访问,指导所有元素被遍历完成
可以使用iter将列表转换为迭代器
list1 = [1, 2, 3, 4, 5]
list2 = iter(list1)
print(next(list2))
print(type(list2))
1
<class 'list_iterator'>