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

一 . 第一类对象

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

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

二 . 闭包

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

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

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

复制代码
def wrapper():
    name = "周杰伦" # 局部变量常驻与内存
    def inner():
        print(name) # 在内层函数中使用了外层函数的局部变量
     print(inner.__closure__) # 有东西就是闭包
    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 = ["海尔兄弟", "阿童木", "葫芦娃", "舒克贝塔", "大风车"]
# 模拟for循环 for el in lst:
it = lst.__iter__() # 获取到迭代器0
while 1: # 循环
    try: # 尝试
        el = it.__next__() # 那数据
        print(el)
    except StopIteration: # 出了错误, 意味着数据拿完了
        break # 结束循环
复制代码
原文地址:https://www.cnblogs.com/uiys/p/10673137.html