生成器以及列表表达式
生成器:就是自己用python代码写的迭代器,生成器的本质就是迭代器
用以下两种方式构建一个生成器:
(1)通过生成器函数 2)生成器表达式
# 函数
def func1(x):
x+=1
return x
print(func1(5))
#生成器函数
def func1(x):
x+=1
print(111)
print(112)
yield x
x+=2
print(222)
yield 'alex'
g=func1(5)
print(g) #<generator object func1 at 0x000000B3680297D8>
print(g.__next__()) #111 112 6
print(g.__next__()) #111 112 6 222 alex
一个next对应一个yield
yield将值返回给 生成器对象.__next__()
yield 与 return的区别:
return 结束函数。给函数的执行者返回值
yield 不会结束函数,一个next对应一个yield,给 生成器对象.__next__()返回值。
生成器函数和迭代器的区别
(1)内存级别的区别
迭代器是需要可迭代对象进行转化,可迭代对象非常占内存。
生成器直接创建,不需要转化,从本质上节省内存。
def func1():
for i in range(1,1000):
yield i
g1=func1()
for i in range(10):
print(g1.__next__())
#1 2 3 4 5 6 7 8 9 10
send与next
func1():
count=yield 6
print(count)
count1=yield 7
print(count1)
yield 8
g=func1()
next(g)
g.send('alex')
g.send('太太')
#alex 太太
send与next一样,也是对生成器取值(执行一个yield)的方法
send可以给上一个yield传值
第一次取值永远都是next
最后一个yield永远也得不到send传的值
列表推导式:一行代码几乎搞定你需要的任何的列表。
(1)循环模式 [ 变量[加工后的变量]for 变量 in iterable]
l1=[i for i in range(1,11)]
print(l1) #[1,2,3,4,5,6,7,8,9,10]
l2=['python%s期'% i for i in range (1,11)]
print(l2) #['python1期', 'python2期', 'python3期', 'python4期', 'python5期', 'python6期', 'python7期', 'python8期', 'python9期', 'python10期']
print([i**2 for i in range(1,11)] #[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
(2)筛选模式[变量(加工后的变量)for 变量 initerable(可迭代对象) if 条件]
l3=[i for i in range(1,31) if i %3==0]
print(l3) #[3, 6, 9, 12, 15, 18, 21, 24, 27, 30]
print([i**2 for i in range(1,31)if i % 3==0])
#[9, 36, 81, 144, 225, 324, 441, 576, 729, 900]
names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'],
['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']]
print([j for i in names for j in i if j.count('e')==2])
#['Jefferson', 'Wesley', 'Steven', 'Jennifer']
列表推导式:
优点:一行解决,方便
缺点:容易着迷,不易排错,不能超过三次循环。
生成器表达式:将列表推导式的[]换成()即可
g=(i for i in range(100000))
print(g)
print(g.__next__()) #0
print(g.__next__()) #1
print(g.__next__()) #2
for i in range(10):
print(g.__next__()) #3,4,5,6,7,8,9,10,11,12
字典的生成器表达式
mcase={'a':10,'b':20}
mcase_f={mcase[k]:k for k in mcase}
print(mcase_f) #{10: 'a', 20: 'b'}
元组的去重性
s={x**2 for x in [1,-1,2]}
print(s) #{1, 4}
清风深知杨柳意,啤酒龙虾难相聚。

浙公网安备 33010602011771号