python之路--第一类对象,函数名,变量名

函数对象可以像变量一样进行赋值 , 还可以作为列表的元素进行使用
可以作为返回值返回 , 可以作为参数进行传递

def func():
    def people():
        print('金_卡戴珊')
        print('oh,yes!')
        print('oh,baby!')
    return people
ret = func()
ret()

闭包 -> 函数的嵌套
内层函数对外层函数中的变量的使用

好处:
1. 保护变量不被侵害
2. 让一个变量常驻内存

如何通过代码查看一个闭包
__closure__: 有东西就是闭包. 没东西就不是闭包

def wrapper():
    name = "alex"
    def inner():
        print("胡辣汤")
    print(inner.__closure__) # 查看是否是闭包. 有内容就是闭包, 没有内容就不是闭包
    inner()
wrapper()
def wrapper():
    name = "周杰伦" # 局部变量常驻与内存
    def inner():
        print(name) # 在内层函数中使用了外层函数的局部变量
    return inner  # 返回函数名
    # inner()
ret = wrapper() # ret是一个内层函数
ret() # ret是inner, 执行的时机是不确定的, 必须保证里面的name必须存在

迭代器 -> 固定的思路. for循环
一个数据类型中包含了__iter__函数表示这个数据是可迭代的
dir(数据): 返回这个数据可以执行的所有操作

判断迭代器和可迭代对象的方案(野路子)
__iter__ 可迭代的
__iter__ __next__ 迭代器

lst =['吴彦祖','谢霆锋','阿汤哥','郭达','岳云鹏']
it = lst.__iter__()
print(it.__next__())
print(it.__next__())
print(it.__next__())
print(it.__next__())
print(it.__next__())
print(it.__next__())


判断迭代器和可迭代对象的方案(官方)
from collections import Iterable, Iterator
isinstance(对象, Iterable) 是否是可迭代的
isinstance(对象, Iterator) 是否是迭代器

lst = [1,2,3]
# print(lst.__next__())

print(isinstance(lst, Iterable)) # xxx是否是xxx类型的. True
print(isinstance(lst, Iterator)) # False

it = lst.__iter__()  # 迭代器一定可迭代,  可迭代的东西不一定是迭代器

print(isinstance(it, Iterable)) # xxx是否是xxx类型的. True
print(isinstance(it, Iterator)) # True

模拟for循环
lst= []
# 拿迭代器
it = lst.__iter__()
while 1:
try:
it.__next__()
except StopIteration:
break

lst = ["海尔兄弟", "阿童木", "葫芦娃", "舒克贝塔", "大风车"]
# 模拟for循环 for el in lst:
it = lst.__iter__() # 获取到迭代器0
while 1: # 循环
    try: # 尝试
        el = it.__next__() # 那数据
        print(el)
    except StopIteration: # 出了错误, 意味着数据拿完了
        break # 结束循环

  

猜你喜欢

转载自www.cnblogs.com/attila/p/10098533.html
今日推荐