首页 > 编程语言 > 详细

python学习8-闭包、迭代器(转载)

时间:2019-01-04 14:09:45      阅读:159      评论:0      收藏:0      [点我收藏+]

一、第一类对象:

函数名是一个变量,可以当普通变量使用,但它又是一个特殊的变量,与括号配合可以执行函数。

函数名的运用

1、单独打印是一个内存地址

2、可以给其他变量赋值

3、可以作为容器类变量的元素

4、可以作为函数的参数

5、可以作为函数的返回值

二、闭包

如果一个内层函数有对外层函数变量的引用,那么就称为这个内层函数为闭包函数,也叫闭包

那么,如何检查一个函数是不是闭包函数呢?

  用__closure__()方法可以检查函数是否是闭包函数,返回值不为None就是闭包函数。

技术分享图片
def func():
    name = "alex"
    def func2():
        print(name)
    func2()
    print(func2.__closure__) #(<cell at 0x00000000027375B8: str object at 0x00000000027B81B8>,)
func()
print(func.__closure__)  #None
技术分享图片

闭包的作用

  1、保护变量不受侵害。闭包函数引用的是局部变量,因此变量不容易被修改

  2、可以让一个变量常驻内存。因为内层函数执行的时机是不确定的,为了inner函数能正常执行,必须保证变量存在。

如何访问内部函数?

  访问内部函数,可以先调用外部函数,获取内部函数地址,再调用内部函数即可。多层嵌套就一层一层的返回

技术分享图片
def outer():
    name = "alex"
    #内部函数
    def inner():
        print(name)
    return inner
fn = outer()  #调用外部函数 获取内部函数的函数地址
fn()  #调用内部函数
技术分享图片

两个方法:

__doc__() 查看函数的文档注释

__name__() 查看函数名

 

三、迭代器

迭代器就是个可以使用__next__函数一个一个往外拿值的容器。比如 a是一个迭代器,那么a.__next__()就表示从a中拿出了一个值。

 

dir()  能够查看数据类型能够执行的操作,即该数据类型支持的内部方法

技术分享图片
print(dir(list))

#结果
[‘__add__‘, ‘__class__‘, ‘__contains__‘, ‘__delattr__‘, ‘__delitem__‘, ‘__dir__‘, 

‘__doc__‘, ‘__eq__‘, ‘__format__‘, ‘__ge__‘, ‘__getattribute__‘, ‘__getitem__‘, ‘__gt__‘,
‘__hash__‘, ‘__iadd__‘, ‘__imul__‘, ‘__init__‘, ‘__init_subclass__‘, ‘__iter__‘, ‘__le__‘,
‘__len__‘, ‘__lt__‘, ‘__mul__‘, ‘__ne__‘, ‘__new__‘, ‘__reduce__‘, ‘__reduce_ex__‘, ‘__repr__‘,

‘__reversed__‘, ‘__rmul__‘, ‘__setattr__‘, ‘__setitem__‘, ‘__sizeof__‘, ‘__str__‘,

‘__subclasshook__‘, ‘append‘, ‘clear‘, ‘copy‘, ‘count‘, ‘extend‘, ‘index‘, ‘insert‘, ‘pop‘,

‘remove‘, ‘reverse‘, ‘sort‘]
技术分享图片

通过对list、set、tuple、str等数据类型查看,我们都能发现一个__inter__函数,这是可迭代对象的共性。其实__inter__函数相当于是一个可迭代协议,只要有这个函数,就表示它是可迭代的。__inter__函数的作用是获取对象的迭代器。

因此

一个对象有__inter__函数,表示可迭代的(iterable)

有__iter__, __next__函数,表示是迭代器(iterator),迭代器都是可迭代的

 

如何判断一个对象是否是可迭代对象?

1、dir(x)      查看是否具有__iter__函数

2、“__iter__”  in  dir(x)    判断是否可迭代 返回值是True 或False  

  "__next__" in  dir(x)      判断是否是迭代器 返回值是True 或False

3、专业方法

from  collections  import  Iterable,Iterator

isinstance(x ,Iterable)   表示 x是否是Iterable

isinstance(x,Iterator)    表示x 是否是Iterator

 

迭代器的三个特点:

1、节省内存

2、惰性机制    必须通过__next__()才能拿值

3、只能往前,不能后退

 

使用while+迭代器模拟for循环:

lst = [1,2,3]

it = lst.__iter__()  #得到迭代器

while 1:
  try:
    el = it.__next__()
    for循环的循环体
  except StopIteration:
    break

技术分享图片
lst = [1,2,3]
it = lst.__iter__()

while 1:
    try:
        el = it.__next__()
        print(el)
    except StopIteration:
        break


#等价于
for el in lst:
    print(el)
技术分享图片

python学习8-闭包、迭代器(转载)

原文:https://www.cnblogs.com/wuyufeng-9-14/p/10218986.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!