生成器

1 生成器:
就是自己用python代码写的迭代器,本质就是迭代器。
l1=[1,2,3]
iter1=l1.__iter__()
两种方法:
1,通过生成器函数。
2,生成器表达式。
通过两种方式构建一个生成器


生成器函数:
def func1(x):
x+=1
yield x
dof=func1(5)
print(god.__next__())
一个next对应一个yield
yield将值返回给 生成器对象.__next__()

yield return
return 结束函数,给函数的执行者返回值
yield 不会结束函数,一个next对应一个yield,给生成器对象。__next__() 返回值。




迭代器与生成器的区别:
第一种:自定制的区别
l1=[1,2,3,4,5]
l1.__iter__()

def func1(x):
x+=1
yield x
x+=3
yield x
x+=5
yield x
g1=func1(5)
print(g1.__next__())
print(g1.__next__())
print(g1.__next__())

区别2:
内存级别的区别
迭代器是需要可迭代对象进行转化,可迭代对象非常占内存。
生成器直接创建,不需要转化,从本质就节省内存。
def func1():
for i in range(100000):
yield i
g1=func1()
for i in range(50):
print(g1.__next__())


send与next
def func1():
/print(1)
count=yield 6
print(count)
/print(2)
count1=yield 7
print(count1)
/print(3)
yield 8

g= func1()
next(g)
g.send('alex')
g.send('alex')
g.send('taibai')
g.send('taibai')

send与next一样,也是对生成器取值(执行一个yield)的方法。
send可以给上一个yield传值。
第一次取值永远都是next。
最后一个yield永远也得不到send传的值。


def cloth1(n):
for i in range(n+1):
print('衣服%s号'%i)
cloth1(10000)

def cloth2(n):
for i in range(1,n+1):
yield '衣服%s号'%i
g=cloth2(1000)
for i in range(50):
print(g.__next__())
for i in range(50):
print(g.__next__())

列表推导式:一行代码几乎搞定你需要的任何列表。
循环模式:[变量(加工后的变量) for 变量 in iterable]
l=[i for i in range(1,101)]
print(1)
l2=['python%s期'% i for i in range(16)]
print(l2)
print

列表推导式
优点:一行解决,方便。
缺点:容易着迷,不易排错,不能超过三次循环。
列表推导式不能解决所有列表的问题,所以不要太刻意用。
生成器表达式:将列表推导式的[]换成()即可。
g=(i for i in range (1000000))
print(g.__next__())
print(g.__next__())

筛选模式:
# l3 = [i for i in range(1,31) if i % 2 == 0]
# print(l3)
# print([i for i in range(1,31) if i % 3 == 0])
# print([i**2 for i in range(1,31) if i % 3 == 0])
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])
posted @ 2018-08-21 17:19  i峥嵘岁月  阅读(87)  评论(0编辑  收藏  举报