python基础之 迭代器回顾,生成器,推导式

1.迭代器回顾html

 可迭代对象:Iterable
  能够直接做用于for循环的对象统称为可迭代对象:Iterable。由于可迭代对象里面存在可迭代协议,因此才会被迭代
  可迭代对象包括:
        列表(list)
        元组(tuple)
        字典(dict)
        集合(set)
        字符串(str)
        生成器(generator)
        也能够说除了int和bool类型的数据之外,都是可迭代对象。
  为何他们能被迭代? 由于他们还有__iter__方法
  可使用isinstance()判断一个对象是不是Iterable对象。python

 迭代器:Iterator
   它表示的是一个数据流,Iterator对象能够被next()函数调用并不断返回下一个数据,直到没有数据时抛出StopIteration错误。可
   以把这个数据流看作是一个有序序列,但咱们却不能提早知道序列的长度,只能不断经过next()函数实现按需计算下一个数据,因此Iterator的计算是惰性的,
   只有在须要返回下一个数据时它才会计算。Iterator甚至能够表示一个无限大的数据流,例如全体天然数。而使用list是永远不可能存储全体天然数的。
   迭代器包括:
         生成器(generator)都是Iterator对象
        但list、dict、str虽然是Iterable,却不是Iterator。 程序员

如何把可迭代对象变成迭代器?
  python2
    把list、dict、str等Iterable变成Iterator可使用iter()函数
    isinstance(iter('abc'), Iterator)
  python3
    把list、dict、str等Iterable变成Iterator可使用__iter__()函数
    from collections import Iterable
    str ="abc"
    print(isinstance(str.__iter__(),Iterable))算法

2.生成器 generator闭包

装饰器的本质是闭包
生成器的本质是迭代器

python中的generator保存的是算法,真正须要计算出值的时候才会去往下计算出值。它是一种惰性计算(lazy evaluation)。

 在python中有三种方式来获取生成器(python中提供的生成器)
   1.经过生成器函数
   2.经过各类推到式来实现生成器
   3.经过数据的转换也能够获取生成器(目前还不会)ide

1.经过生成器函数函数

def func():
    print(1)
    yield 5  # 个人函数走到这了
    print(2)
    yield 9  # 个人函数走到这了

g = func()  # 生成一个生成器
print(g.__next__())

1.在函数中使用yield关键字,函数就变成了一个generator。(看到有yiled的存在就是生成器函数)
其中的yiled能够和普通函数中的return进行比较:
  普通函数碰到return就结束函数
  生成器函数碰到yield不结束就挂起,进行分段执行。在执行到yiled的时候,函数会记住本次执行到的位置,当下一次调用时,就从该位置开始。
yiled特色:
  1.挂起函数
  2.返回值给调用者
  3.接受值,能够接受调用者传参

注意:调用生成器函数不会获得返回的具体的值,而是获得一个可迭代的对象,每一次得到可迭代文件的值,就能推进函数执行,获取新的返回值,直到函数结束
2.若是咱们循环和传参的话,须要使用的send()函数。
  send函数的做用和__next__函数同样,都是让生成器执行到下一个yiled
  区别:
    send能够给上一个yield的位置传递值,不能给最后一个yield发送值,在第一次执行生成器的时候最好不要使用send(),若是非要使用的话,须要给个传递个空值。send(None)
  send()函数的本质是next+参数
  comment = yiled 2
  print(comment)
  若是调用的时send(10)的话,会返回2和10,由于yiled可已接收参数,来赋值给yiled左边的变量,可是yiled的值不改变

3.生成调用方法
  1.__next__方法
  2.生成器调用方法(这个地方不知道当时为何这么作笔记)
  3.send方法(本质是next+参数)
4.生成器优势
  在了解迭代器的时候咱们知道,迭代器是经过python语言自己实现的迭代功能,来节省内存地址的
  起始生成器也是同样,只是为了在某些状况下,咱们也须要节省内存,就只能本身写。咱们本身写的这个能实现迭代器功能的东西就叫生成器。

5.在python3中提供一种能够直接把可迭代对象中的每个数据做为生成器的结果进行返回
  def func():
    lst = ['卫龙','老冰棍','北冰洋','牛羊配']
    yield from lst 至关于for item in lst:
  g = func()
  for i in g:
    print(i) --->

2.经过推导式(把一个列表生成式的[]改为(),就建立了一个generator)lua

g = (i for i in range(10))
print(g) --->   <generator object <genexpr> at 0x0000000002143D00>

3.生成器总结spa

1.生成器的本质就是一个迭代器
2.生成器必定是一个迭代器,迭代器不必定是一个生成器
3.生成器是可让程序员本身定义的一个迭代器
4.生成器的好处,节省内存空间 5.生成器的特性 一次性的,惰性机制,从上向下
6.send至关于 next+传值,第一次触生成器的时候,若是使用send(None),值必须是None,通常我建议大家使用__next__
7.python2 iter()  next()
  python3 iter()  next()  __next__() __iter__()
8.yield from 将可迭代对象元素逐个返回
9.生成器没有索引
10.调用生成器函数不会获得返回的具体的值,而是获得一个可迭代的对象

 3.推导式code

推导式的用法
  【结果 语法】 容器  就是将【】替换成想要推导的数据类型的符号 (第一个位置是结果,剩下的都是语句)

推导式:
1.列表推导式
  print([item for item in range(10)])
2.集合推导式
  print({item for item in range(10)})
3.字典推导式
  print({item:item+1 for item in range(10)})
4.生成器推导式:(最简单的办法是将列表推导式的[]换成())
    print(i for i in range(10))--->打印出来的是生成器的内存地址,__next__才会调用
    
#根据推导式写出小于100的奇数
    print([item for item in range(100) if item %2 !=0 ])

注意:
  推导式不宜写太长,可读性差
  实现小的需求时,可使用推导式,节省代码

4.other

1.大批量的数据的时候首先要想到生成器
2.生成器的好处,很是节省内存
3.yiled既能够返回值给调用者,又能接受参数,还能够将函数挂起,挂起的时候返回None
4.第一次调用生成器的时候使用send里边的值必须是None
5.看见yield就是生成器函数
6.几个yiled就应该对应几个(next+count)总数
7.yiled和return的区别是:多了一个挂起,少了一个终止函数
8.生成器函数和普通函数的区别????
  1.在打印函数名()的时候,普通函数是打印函数的返回值而生成器函数打印的时生成器的内存地址,必需要函数名().__next__()才能看到返回值
  2.返回值的方式不一样,yiled和return

如何查看一个包,类中全部可用的方法(属性):

[x for x in dir(list) if not x.startswith('_')] 
  查看某个具体方法的使用:
  help(类名) help(list)
  help(类名.方法名)     help(list.pop)

使用生成器获取100以内7的倍数

def test():
      for item in range(0,100):
            yield item
ret = test()
for item in range(0,100):
      ss =ret.__next__()
      if  ss %7 == 0:
            print(ss)

生成器读取文件

 

def func():
    with open('t','r',encoding='utf-8')as f:
        for i in f:
            i = i.strip('\r\n')
            yield i
g = func()
for i in g:
    try:
        print(i)
    except StopIteration:
        # pass
        print(1)
View Code

 

 

 

 

 

返回系列

相关文章
相关标签/搜索