day11 ,12 闭包 迭代器 生成器

1.闭包

函数名第一类对象

       1函数名其实就是变量名

    2可以像变量一样互相赋值.

       3 可以作为函数的参数,进行传递

    4 可以作为返回值返回

       5可以作为集合的元素进行存储
  内部函数对外部函数中的变量的调用
  def outrt():
       a=10
       def innerr():
           a
           return

  好处:
      保护变量
      常住内存
  2.迭代器
     1. Iterable:  可迭代的.里面有 __iter__()
    2. Iterator:  迭代器. 里面有__iter__() 还有 __next__()
  特点:
    1,节省内存
    2,惰性机制(只有执行__next__()才会取值)
    3,只能向前取值,不能反复
  dir() #查看数据可执行操作的方法
  isinstance() #判断xxx对象是否是xxx类型
  __name__() #查看函数的名字
  __doc__() #查看函数的文档注释
  lst=[1,2,3]
  it=lst.__iter__()
  while 1:
      try:
          it.__next__()
      except StopIteration:
          break
 3.生成器
     生成器的本质就是迭代器
     生成器由生成器函数来创建或者通过生成器表达式来创建
 4.生成器函数
     生成器函数:在函数中return换成yield.这个函数是生成器函数
     def func():
         yield
     gen=func()  #函数并不会执行,而是创建一个生成器对象
     取值:
         gen.__next__()  #下一个
         gen.send()    #可以给上一个yield传值,第一次执行不能用send()
     特性:
         1.节省内存
         2.惰性机制
         3.只能向前
 5.各种推导式
         1.列表推导式: [结果 for循环 if条件]
         2.字典推导式: { key: value for循环 if条件}
         3.集合推导式: {key for循环 if条件}
 6. 生成器表达式(笔试题)
     (结果 for循环 if条件)
  # 计算两个数的和
  def add(a, b):
      return a + b
  def test():  # 生成器函数
      for t in range(4):
        yield t
  g = test()
  for n in [2, 10]:
      g = (add((n, i) for i in g))
  print(list(g))


     惰性机制
     记录在内存中的一段代码.