迭代器,生成器,生成器表达式,常用内置方法

Posted zhangchaocoming

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了迭代器,生成器,生成器表达式,常用内置方法相关的知识,希望对你有一定的参考价值。

迭代器

迭代器的定义:迭代器指的是迭代取值的工具,迭代是一种重复的过程,每一次重复都是基于上一次的结果而来单纯的重复不是迭代。比如:while的死循环打印同一个值就不是迭代。

l=[‘a‘,‘b‘,‘c‘]
i=0
while i < len(l):
      print(l[i])
      i+=1

这个while循环每一次取值都是基于上一次的结果往下进行,这就是一个迭代的过程。

迭代器的使用原因:迭代器提供了一种通用的且不依赖索引的迭代取值的方式

迭代器的使用方式

  特点:可迭代的(iterable)对象都内置有__iter__方法,称之为尅迭代对象。比如:str、list、dict、set、tuple、文件对象。

技术图片

执行可迭代对象下的__iter__或iter(可迭代对象)方法,返回值就是一个迭代器对象(iteration)

      1. 既内置有__next__方法的对象,执行迭代器__next__方法可以不依赖索引取值
      2. 又内置有__iter__方法的对象,执行迭代器__iter__方法得到的仍然是迭代器本身

迭代器使用__next__取值,取一次只返回一个值,就类似之前说的‘老母猪’

ps:

dic=‘x‘:1,‘y‘:2,‘z‘:3
 iter_dic=dic.__iter__()

 print(iter_dic)
 print(iter_dic.__next__())
 print(iter_dic.__next__())
 print(iter_dic.__next__())
 print(iter_dic.__next__())或者写成print(next(iter(dic)))

技术图片

当迭代器一一取出所有元素的时候,再使用next(迭代器)方法,就会出现取值异常,报错(stopiteration),这可以被看做是一种结束取的信号。

ps:迭代器对象一定是可迭代的对象,而可迭代的对象却不一定是迭代器对象;文件对象本身就是一个迭代器对象。

调用可迭代的对象__iter__得到的是迭代对象,然后在对迭代器对象连续使用__iter__得到的仍然是这个迭代器对象本身。比如:print(iter_l is iter_l.__iter__().__iter__().__iter__().__iter__().__iter__().__iter__())

内置方法len()其实就是__len__,比如dic.__len__,得到的就是dic中元素的个数,其内部包含(__iter__和__next__)

 

对于迭代器取完所有值异常情况的处理

技术图片

   for循环(也称之为迭代器循环)的工作原理:

          1,先调用in后面那个对象的__iter__的方法,将其变成一个迭代器对象‘

           2,调用next(迭代器),将其得到的返回值赋值给变量名K,

    3,循环往复直到next(迭代器)抛出异常,for会自动捕捉异常,然后结束循环。   

               dic=‘x‘:1,‘y‘:2,‘z‘:3

                 for k in dic:
                     print(k)

   迭代器总结:

优点:

         1,提供一种通用的且不依赖索引的迭代取值的方式

          2,同一时刻在内存中只存在一个值,更节省内存。

缺点:

            1,取值不如按照索引的方式灵活,(不能区指定的某一个值而且取值是从左往右,)

    2,无法预测迭代器的长度,取完之后会报stopiteration错

内置方法reduce的使用:

 技术图片

  map的使用:

map在Python中做了优化,其返回值是一个迭代器,可以节省内存空间。

技术图片

 

 

 

二,生成器:用户自定义的迭代器,本质就是迭代器。优点:节省内存(如果数据量较大,最好不要用列表生成式),代码量更少,执行更高效。

 

 

 

技术图片

 

从图中看出,只要函数体中包含yield关键字,调用函数不会执行函数体代码,会得到一个返回值,该返回值就是生成器对象。

技术图片      技术图片

上面两张图看出,yield可以返回一个或多个值,多个值按照元组的形式返回,如果没有返回值,在调用next()返回值是none。图中的g=func()是生成器初始化:将函数变成迭代器。

   

技术图片

图中g.__text__会出发函数体执行代码,直到遇到一个yield停下来,并将yield后面的值当作本次next的结果返回。

 

 

技术图片

 yield支持外界为其传参,必须先将代码运行至yield 才能够为其传值, 给yield左边的变量传参  触发了__next__方法。

yield:

        1,帮我们提供了一种自定义生成器方式;2,能将函数的运行状态暂停住。

 

yield与return之间的异同点:

                                     相同点:都可以返回值,并且都可以返回多个值

                                      不同点:

                                                     yield可以返回多次值,而return只能返回一次,函数立即结束。

                                                      yield还可以接受外部传入的值。

 

生成器表达式:生成器不会主动执行任何一行代码,必须通过__next__触发代码的运行。

技术图片

 

 

三,常用内置方法

abs(求绝对值)  ps:print(abs(-11.11))  返回值式11.11

all、any

all:判断一个tuple或者list是否全不为空,全不为空,返回True,否则内部包含例如0,‘ ’,或者False、[]、()、等,则返回False;

any:只要内部元素不全部为空,就返回True,全为空返回False。

globals和locals

globals:无论在哪 查看的都是全局名称空间

locals:当前语句在哪个位置 就会返回哪个位置所存储的所有的名字

技术图片

技术图片

bin()、oct()、hex() 分别将一个十进制数转换为对应的二进制数(bin),八进制数(oct),十六进制数(hex).

print(int(‘0b1010‘,2)) #二进制数转换为十进制

  print(int(‘o   ‘,8))八进制转换为十进制

print(int(‘x  ’,16))十六进制数转换为十进制数

bool返回布尔值的True或者False

 

bytes 将任意数据类型转换为二进制

s = ‘hello‘
print(s.encode(‘utf-8‘)) #b‘hello‘
print(bytes(s,encoding=‘utf-8‘)) #b‘hello‘
callable 是否可调用
chr和ord
chr将数字转换为ASCII码表对应的字符 #print(chr(97))
ord将字符按照ASCII码表转成对应的数字 #print(ord(‘a‘))

dir 获取当前对象名称空间里面的名字

技术图片

    divmod (x,y)分页器  x代表总数,y代表x/y的余数。

    enumerrate 枚举

    eval、exec  可以对注释中的Python代码执行并返回结果,但eval不支持逻辑代码,只支持一些简单的python代码

format 占位符   三种站位方式:1,位置站位  2,索引站位, 3,指名道姓

help 可以帮助我们获取解释器对于Python中的某些东西的提示。

isinstance:判断对象是否属于某个数据类型

pow(x,y):表示x的y次方  #print(pow(2,3))  结果就是8

round:类似于四舍五入,但这里必须大于0.5才进1。   print(round(3.5))  返回结果为3。print(round(3.6))  返回结果为4

 

以上是关于迭代器,生成器,生成器表达式,常用内置方法的主要内容,如果未能解决你的问题,请参考以下文章

python迭代器和生成器(3元运算,列表生成式,生成器表达式,生成器函数)

python之迭代器生成器和内置函数,匿名函数

迭代器 生成器 内置函数

Python之第十五天的努力--生成器,列表推导式,生成器表达式,内置函数1(了解)

函数嵌套 ,名称空间与作用域 ,闭包函数 ,装饰器 ,迭代器, 生成器 三元表达式,列表解析,生成器表达式 递归与二分法, 内置函数

可迭代对象迭代器与生成器