函数名应用 闭包 迭代器

1 函数名就是函数的内存地址

2 函数名可以当作变量

# def func1():
#     print(666)
# f1 = func1
# f2 = f1
# f2()

3 函数名可以作为函数的参数

4 函数名可以当作函数的返回值

5 函数名可以作为容器类类型的元素

globals()   返回全局变量的一个字典

locals()  返回当前位置 的局部变量的字典

闭包:  内层函数对外层函数的变量(非全局变量)的引用,并返回,这样就形成了闭包。

闭包的作用: 当程序执行时,遇到函数执行,他会在内存中开辟一个空间,局部名称空间

      如果这个函数内部形成了闭包,那么他就不会随着函数的结束而消失。

迭代器---------------

对象内部含有_ _iter_ _ 的方法就是可迭代对象 ,可迭代对象满足可迭代协议

可迭代对象: str  list  dict   tuple   set   range()

判断一个对象是否是可迭代对象   

方法一:

dic = {'name':'alex'}
print('__iter__' in dir(dic))

方法二:

from collections import Iterable
from collections import Iterator

print(isinstance('alex',Iterable))  
print(isinstance('alex',Iterator))  

print(isinstance('alex',str))

对象内部含有_ _iter_ _方法并且还有_ _next_ _方法的就是迭代器

# f = open('register', encoding='utf-8')
# print('__iter__' in dir(f))
# print('__next__' in dir(f))
# print('__iter__' in dir(dict))
# print('__next__' in dir(dict))

可迭代对象不能取值,迭代器是可以取值的

# 可迭代对象 --->(转化成)迭代器 的两种格式
# lis = [1, 2, 3]  # 可迭代对象
# # ite1 = lis.__iter__()  # 迭代器  <list_iterator object at 0x0000027A183BFFD0>
# ite1 = iter(lis)  # 迭代器  <list_iterator object at 0x0000027A183BFFD0>
# print(ite1)

迭代器如何取值?   next 一次  取一个值

# print(ite1.__next__())
# print(ite1.__next__())
# print(ite1.__next__())
# print(ite1.__next__())

1可迭代对象不能取值,迭代器是可以取值的

2迭代器非常节约内存

3迭代器每一次只取一个值

4迭代器是单向的  一条路走到黑

s1 = 'kfdsjl'
for i in s1:
    print(i)
 这其实是for循环内部把值取出来的 

1 将可迭代对象转化成迭代器

2 调用__next__方法取值

3利用异常处理停止报错

用while 循环 模仿 for循环内部运行

while 1:
    try:
        print(iter1.__next__())
    except StopIteration:
        break

 

原文地址:https://www.cnblogs.com/single82/p/9505898.html