码迷,mamicode.com
首页 > 编程语言 > 详细

11.Python迭代器

时间:2020-01-11 00:21:06      阅读:118      评论:0      收藏:0      [点我收藏+]

标签:不能   访问   包括   ati   错误   rabl   obj   inf   返回   

?. 函数名的运?

函数名是?个变量, 但它是?个特殊的变量, 与括号配合可以执?函数的变量.

1. 函数名的内存地址

技术图片

2. 函数名可以赋值给其他变量

技术图片

3. 函数名可以当做容器类的元素

技术图片

 技术图片

4. 函数名可以当做函数的参数

技术图片

5. 函数名可以作为函数的返回值

技术图片

?. 闭包

什么是闭包? 闭包就是内层函数, 对外层函数(非全局)的变量的引?. 叫闭包

技术图片

我们可以使?__closure__来检测函数是否是闭包. 使?函数名.__closure__返回cell就是

闭包. 返回None就不是闭包

技术图片

问题, 如何在函数外边调?内部函数呢?

技术图片

那如果多层嵌套呢? 很简单, 只需要?层?层的往外层返回就?了

技术图片

由它我们可以引出闭包的好处. 由于我们在外界可以访问内部函数. 那这个时候内部函

数访问的时间和时机就不?定了, 因为在外部, 我可以选择在任意的时间去访问内部函数. 这

个时候. 想?想. 我们之前说过, 如果?个函数执?完毕. 则这个函数中的变量以及局部命名

空间中的内容都将会被销毁. 在闭包中. 如果变量被销毁了. 那内部函数将不能正常执?. 所

以. python规定. 如果你在内部函数中访问了外层函数中的变量. 那么这个变量将不会消亡.

将会常驻在内存中. 也就是说. 使?闭包, 可以保证外层函数中的变量在内存中常驻. 这样做

有什么好处呢? 非常?的好处. 我们来看?个关于爬?的代码:

技术图片

 技术图片

综上, 闭包的作?就是让?个变量能够常驻内存. 供后?的程序使?.

三. 迭代器

我们之前?直在?可迭代对象进?迭代操作. 那么到底什么是可迭代对象. 本?节主要讨

论可迭代对象. ?先我们先回顾?下?前我们所熟知的可迭代对象有哪些:

str, list, tuple, dict, set. 那为什么我们可以称他们为可迭代对象呢? 因为他们都遵循了可

迭代协议. 什么是可迭代协议. ?先我们先看?段错误代码:

技术图片

注意看报错信息中有这样?句话. ‘int‘ object is not iterable . 翻译过来就是整数类型对象

是不可迭代的. iterable表?可迭代的. 表?可迭代协议. 那么如何进?验证你的数据类型是否

符合可迭代协议. 我们可以通过dir函数来查看类中定义好的所有?法.

技术图片

在打印结果中. 寻找__iter__ 如果能找到. 那么这个类的对象就是?个可迭代对象.

技术图片

 技术图片

我们发现在字符串中可以找到__iter__. 继续看?下list, tuple, dict, set

技术图片

 技术图片

 技术图片

 技术图片

我们发现这?个可以进?for循环的东?都有__iter__函数, 包括range也有. 可以??试?

下.

这是查看?个对象是否是可迭代对象的第?种办法. 我们还可以通过isinstence()函数来查

看?个对象是什么类型的

技术图片

综上. 我们可以确定. 如果对象中有__iter__函数. 那么我们认为这个对象遵守了可迭代协议.

就可以获取到相应的迭代器. 这?的__iter__是帮助我们获取到对象的迭代器. 我们使?迭代

器中的__next__()来获取到?个迭代器中的元素. 那么我们之前讲的for的?作原理到底是什

么? 继续看代码

技术图片

for循环的机制:

技术图片

使?while循环+迭代器来模拟for循环(必须要掌握)

技术图片

总结:

Iterable: 可迭代对象. 内部包含__iter__()函数

Iterator: 迭代器. 内部包含__iter__() 同时包含__next__().

迭代器的特点:

1. 节省内存.

2. 惰性机制

3. 不能反复, 只能向下执?.

我们可以把要迭代的内容当成?弹. 然后呢. 获取到迭代器__iter__(), 就把?弹都装在弹夹

中. 然后发射就是__next__()把每?个?弹(元素)打出来. 也就是说, for循环的时候. ?开始的

时候是__iter__()来获取迭代器. 后?每次获取元素都是通过__next__()来完成的. 当程序遇到

StopIteration将结束循环.

11.Python迭代器

标签:不能   访问   包括   ati   错误   rabl   obj   inf   返回   

原文地址:https://www.cnblogs.com/xuweng/p/12178337.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!