生成器、迭代器、三元表达式和匿名函数等

谁说胖子不能爱 提交于 2019-11-28 20:01:29

一、迭代器

  •  什么是迭代器 ?    
  1. 迭代器是一个可以记住遍历的位置的对象。
  2. 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退
  3. 迭代器有两个基本的方法:iter() 和 next()
  4. 字符串,列表或元组对象都可用于创建迭代器:
  • 可迭代对象和迭代器对象
  1. 可迭代对象指内置方法中有__iter__的对象,如列表,元组,字典,集合,字符串,打开的文件对象
  2. 迭代器对象是有可迭代对象通过调用其__iter__方法(实际上就是(iter(obj))得到的对象,迭代器对象内置方法中有__iter__和__next__方法,其中__next_方法就是执行迭代器对象的下一个值,需要注意的是,当迭代器对象中的值全部取出来之后,里面就没有元素了,再使用___next__会产生异常,所以迭代器对象只能拿取一次   
list1 = [1, 2, 3]
list_iter = list1.__iter__()
print(list_iter.__next__())
print(list_iter.__next__())
print(list_iter.__next__())
print(list_iter.__next__())

"""
1
Traceback (most recent call last):
2
3
  File "C:/Users/12104/PycharmProjects/jiangye/练习/11.py", line 6, in <module>
    print(list_iter.__next__())
StopIteration
"""
  •  迭代器优缺点   
   优点:
    - 提供一种统一的、不依赖于索引的迭代方式
    - 惰性计算,迭代器可以存放无限大的数据流,只有调用__next__方法才会拿到相关数据,比其他容器对象节省内存
  缺点:
    - 无法获取长度(只有在next完毕才知道到底有几个值)
    - 一次性的,只能往后走,不能往前退

 

 二、生成器

  • 什么是生成器?

在 Python 中,使用了 yield 的函数被称为生成器(generator)。跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行调用一个生成器函数,返回的是一个迭代器对象

  •  生成器的使用

   因为生成器本事就是迭代器,所以它也有__tier__和__next__方法,调用__next__方法可以触发生成器所对应的的函数执行

def func():
    print('====>1')
    yield
    print('====>2')
    yield
    print('====>3')
    yield


g = func()
g.__next__()
g.__next__()
g.__next__()

"""
====>1
====>2
====>3
"""
View Code

 

 

           其实除了next()方法可以触发生成器所对应的的函数执行,yield 可以通过一个send方法为它传值  

def func():
    while True:
        res= yield
        print(res)


f = func()
f.send(None) # 对于表达式形式的yield,在使用时,第一次必须传None,g.send(None)等同于next(g)
f.send('hello') 

"""
hello 
"""

 

           利用send()方法,我们可以编写一个生产者消费者模型(实际上就是协程函数)

import time


def comsmer(name):
    print('%s开始吃包子!' % name)
    while True:
        time.sleep(0.2)
        baozi = yield
        print("%s开心地吃%s" % (name, baozi))


def produce():
    p = comsmer('jiangge')
    p.__next__()
    for i in range(5):
        time.sleep(0.2)
        p.send("包子%d" % i)

produce()
View Code

 

          因为生成器是一个返回迭代器的函数,利用这一点,可以利用生成器帮我们保存一些信息

def func():
    for i in range(5):
        yield i


f = func()
for i in f:
    print(i)

"""
0
1
2
3
4
"""
View Code

 

三、三元表达式、列表生成式、生成器表达式

  • 三元表达式

   python三元表达式格式如下:

条件为真时的结果  if  判段的条件  else  条件为假时的结果

   其转化为条件判断语句为:

if 条件的判断为真:

  条件为真时的结果

else:

  条件为假时的结果

 

  • 列表生成式

   列表生成式格式如下:

list=[ i for i in range(n)]

  相当于

list = []

for i in range(n):

  list.append(i)

 

  • 生成器表达式

   生成器表达式格式就是将列表的[]变成()即可,其返回的是一个生成器对象,相对于列表节省许多 空间

list=( i for i in range(n))

 

 

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!