迭代器和生成器

---恢复内容开始---

一:迭代器

双下方法:很少直接调用方法,一般是用其他语句触发

可迭代的一般含有_iter_ 的方法

可迭代的是可以被for循环的

迭代器:含有_iter_,_next_方法

迭代器一定是可迭代的,通过_next()方法一个一个得到。但是可迭代的不一定是迭代器

迭代器的特点:

         很方便,且只能去所有数据一次

         节省内部空间,因为只有你要用的时候,内存才会产生,

 

二:生成器
生成器的本质也就是相当于迭代器

生成器的表现:生成器函数,生成器的表达式

生成器函数,函数里面有yield关键字,就是生成器函数

特点:

        调用函数的时候不执行函数,而是返回一个生成器

        每次调用一个_next()函数返回一个值

        直到取完最后一个值,在调用_next()会报错

 

生成器写一个:一个文件,用户写什么,我能从文件读取到内容,也可以我要看什么内容,用户写了,我就能看到

 1 def fun():
 2     f = open('file', encoding='utf-8')
 3     while True:
 4        a= f.readline().strip()
 5        if a.strip():
 6            yield a
 7 
 8 b= fun()---调用函数,是变成一个生成器函数,还不会执行
 9 for d in b:
10     print(d)

 2.使用send方法写的一个移动平均值,用户输入一个10,那么平均值就是10,如果用户在输入一个值,那么就是总数/个数=的平均值

def fun(f):
       def inner(*args, **kwargs):
          ret = f(*args, **kwargs)
          ret.__next__()
          return ret
       return inner


@fun
def fun1():
    sun = 0
    cont = 0
    avg = 0
    while True:
        ret = yield avg
        sun += ret
        cont += 1
        avg = sun / cont


a = fun1()
b = a.send(10)
print(b)

 

列表推导式

lis_ne = ['自动%s' % i for i in range(10)]
print(lis_ne)

生成器推导式
g = ('自动%s' % i for i in range(10))
for b in g:
    print(b) 列表和生成器推导式的区别:
 1.列表推导器是的[] 生成器推导器的是()
2.返回值不一样,列表的是直接返回,生成器推导式是不返回,要用的时候,在存在内存。


各种推导式
 
lise = [i for i in range(30) if i % 3 == 0]
print(lise)

lise1 = [i * i for i in range(30) if i % 3 == 0]
print(lise1)

# 字典推导式
# 集合推导式,自带去重功能

lise2 = {i * i for i in [1, -1, 2]}
print(lise2)

# 生成器:生成器取完值后,就没有了,惰性,取一次

 


 

---恢复内容结束---

posted @ 2018-10-07 21:13  明朗学习之路  阅读(120)  评论(0编辑  收藏  举报