博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
闭包,迭代对象与迭代器
阅读量:5138 次
发布时间:2019-06-13

本文共 2674 字,大约阅读时间需要 8 分钟。

闭包 内层函数对外层函数的变量(非全局变量)的引用,并返回函数名就形成了闭包。
1 def packet(): 2     name = '孙飞' 3     def inner(): 4         print(name) 5         print(inner.__closure__)    #判断是否是闭包,如果是闭包对象则返回一个cell 6     return inner 7 f1 = packet() 8 f1() 9 10 name = 'alex'   #全局变量11 def wraaper():12     def inner():13         print(name)14     print(inner.__closure__)  # None,非闭包15     inner()16     return inner17 wraaper()
闭包作用:     当程序执行时,遇到了函数执行,他会在内存中开辟一个空间,局部名称空间,     如果这个函数内部形成了闭包,     那么他就不会随着函数的结束而消失。 可迭代对象
1 for i in 'abc':2     print(i)3 for i in 123:4     print(i)  # 'int' object is not iterable
对象内部含有__iter__方法就是可迭代对象. 可迭代对象满足可迭代协议。 可迭代对象:str list dict,tuple,set,range() str= 'abddef' print(dir(str)) Python下一切皆对象,每个对象都有多个属性(attribute),Python对属性有一套统一的管理方案。 __dict__与dir()的区别: dir()是一个函数,返回的是list; __dict__是一个字典,键为属性名,值为属性值; dir()用来寻找一个对象的所有属性,包括__dict__中的属性,__dict__是dir()的子集; ​ 并不是所有对象都拥有__dict__属性。许多内建类型就没有__dict__属性,如list,此时就需要用dir()来列出对象的所有属性。 判断一个对象是否是可迭代对象: 第一个方法
1 dic = {
'name':'alex'}2 print('__iter__' in dir(s1))3 print('__iter__' in dir(dic))
第二种方法
1 from collections import Iterable    #注意前面的iterable和iterator首字母要大写I2 from collections import Iterator3 4 print(isinstance('alex',Iterable))  # True5 print(isinstance('alex',Iterator))  # True6 print(isinstance('alex',str))7 isinstance是Python中的一个内建函数
语法: isinstance(object, classinfo) 如果参数object是classinfo的实例,或者object是classinfo类的子类的一个实例, 返回True。如果object不是一个给定类型的的对象, 则返回结果总是False。 如果classinfo不表示一个类(类型对象), 那么它要么是一个类的元组, 或者递归地包含这样的(由数据类型构成的)元组.其他的序列类型是不被允许的。 如果classinfo不是一种数据类型或者由数据类型构成的元组,将引发一个TypeError异常。 举例: >> > isinstance(1, int) True >> > isinstance(1.0, float) True 迭代器? 对象内部含有__iter__方法且含有__next__方法就是迭代器.
1 f = open('register', encoding='utf-8')2 print('__iter__' in dir(f))3 print('__next__' in dir(f))4 print('__iter__' in dir(dict))5 print('__next__' in dir(dict))
可迭代对象vs迭代器 可迭代对象不能取值,迭代器是可以取值的。 可迭代对象 --->(转化成)迭代器
lis = [1, 2, 3]  # 可迭代对象# ite1 = lis.__iter__()  # 迭代器  #
ite1 = iter(lis) # 迭代器
print(ite1)
迭代器如何取值?  next一次,取一个值
1 print(ite1.__next__())2 print(ite1.__next__())3 print(ite1.__next__())4 print(ite1.__next__())
1, 可迭代对象不能取值,迭代器是可以取值的。 2, 迭代器非常节省内存。 3,迭代器每次只会取一个值。 4,,迭代器单向的,一条路走到头。
1 s1 = 'kfdsjl'2 for i in s1:3     print(i)
1,将可迭代对象转化成迭代器。 2,调用__next__方法取值。 3,利用异常处理停止报错。 用while模拟for遍历对象的过程
1 iter1 = s1.__iter__()2 while 1:3     try:4         print(iter1.__next__())5     except StopIteration:6         break
1 l1 = [i for i in range(100)]2 print(l1)3 ret =( i for i in range(1000000))4 print(ret.__next__())5 print(ret.__next__())6 print(ret.__next__())7 print(ret.__next__())8 print(ret.__next__())

 

转载于:https://www.cnblogs.com/qilin610/p/9519544.html

你可能感兴趣的文章
treegrid.bootstrap使用说明
查看>>
[Docker]Docker拉取,上传镜像到Harbor仓库
查看>>
javascript 浏览器类型检测
查看>>
nginx 不带www到www域名的重定向
查看>>
记录:Android中StackOverflow的问题
查看>>
导航,头部,CSS基础
查看>>
[草稿]挂载新硬盘
查看>>
[USACO 2017 Feb Gold] Tutorial
查看>>
关于mysql中GROUP_CONCAT函数的使用
查看>>
OD使用教程20 - 调试篇20
查看>>
Java虚拟机(JVM)默认字符集详解
查看>>
Java Servlet 过滤器与 springmvc 拦截器的区别?
查看>>
(tmp >> 8) & 0xff;
查看>>
linux命令之ifconfig详细解释
查看>>
NAT地址转换
查看>>
Nhibernate 过长的字符串报错 dehydration property
查看>>
Deque - leetcode 【双端队列】
查看>>
gulp插件gulp-ruby-sass和livereload插件
查看>>
免费的大数据学习资料,这一份就足够
查看>>
clientWidth、clientHeight、offsetWidth、offsetHeight以及scrollWidth、scrollHeight
查看>>