python--函数名的应用,闭包,迭代器----12

函数名的应用   第一类对象

  函数名可以像变量一样进行使用

    1. 将函数名赋给 a,  a(  )   就相当于函数调用

    2. 可以将函数名放到列表中  ,作为列表的  元素

    3. 可以把函数作为参数,传递给另一个函数

    4. 可以把函数名作为返回值

  e.g    #    将函数名赋值给a

    def func()

      print("你好")

    print(   func  )=====>得到的是   func  函数的内存地址

    a=func

    print(   a   )========>  和上边一样, 得到的是  func 的函数的内存地址

    func()====>  你好     #  调用函数

    a ()  ====>   你好    a=func    #调用函数func

  e.g    #  将函数名放到列表中作为列表的元素

    def  f1():

      print("你好")

    def  f2():

      print("大雄")

    def  f3():

      print("哆啦A梦")

    lis=[  f1 ,  f2 , f3  ]

    for el in lis:

      el()====>   每个el 都是一个函数名,  加个括号,表示调用函数

   e.g       #  将函数作为参数

    def  func():

    def  gn():

      print("火锅")

    func(gn)=====>  火锅

  e.g     #    将函数作为返回值

   def func():

    def inner():

      print("不吃")

    return   inner

   ret = func ()     #    func()  执行后获得返回值   inner

   ret()   #    ret = inner   ====>   inner()    调用函数inner

闭包   :   在内层函数中,,调用外层函数的变量

    作用:     可以让一个局部变量  常驻内存    让变量更加安全  

    打印 函数名._ _ closure_ _()  可以查看函数 是不是闭包     None  ===> 不是闭包   否则是闭包

  e.g

   def func():

    name="alex"     #   常驻内存   ,防止其他程序改变这个变量     

              变量写在全局中是不安全的,  我们可以加 global  改变它

    def inner():

      print(name)

    return inner

   ret =func()    #  函数 func 执行过一次之后  ,函数内部 name = "alex"  ,正常情况下会消失

          但是,  由于有  name=alex   def inner():   print(name)    自动检测到要使用

          name    而且还有  ret()   因此 name=alex  会常驻内存    ,每次执行inner 的时候 name=alex 都会存在

   ret()

可迭代的  :  Iterable    (  str   list    tuple   set   dict   range   f 句柄  )

      只要内部包含  _ _ iter_ _()  就是可以迭代      ****    可以迭代不一定就是迭代器

   迭代器 比可迭代对象 多了一个   _ _next_ _()  

迭代器 :   Iterator     (  f 句柄  )    

    内部包含  _ _ iter _ _(),  和  _ _ next _ _()    就是迭代器  

    迭代器一定可以迭代

  迭代器拿出来的还是迭代器   f._ _iter_ _()._ _iter_ _() =====> 结果还是迭代器

迭代器特点:    节省内存       惰性机制    不能反复,只能向下执行

  我们可以通过 dir() 来查看一个对象的数据类型中包含了 哪些东西

e.g   

  lst=[1,2,3]

  print(dir(lst)) ====>   _ _ iter _ _ in dir(s)   可以判断其中有  _ _ iter _ _ ()   ===>   可以迭代

_ _iter _ _() 它的工作是返回一个迭代器

   e.g 

     lst=[  "皇" , "容" , "紫" , "额"  ] 

     it = lst._ _iter_ _()   #   lst是可以迭代的   ,  it  就是获取迭代器

        有了迭代器就可以  _ _next_ _()向外拿元素   # 点一个出来一个

     print(  it._ _ next_ _()   )=====>皇  #  拿一次 出来一个

     print(  it._ _ next_ _()   )=====> 容  

     print(  it._ _ next_ _()   )=====>紫

     print(  it._ _ next_ _()   )=====>额

     print(  it._ _ next_ _()   )=====>   报错  StopIteration  #  最后一个元素拿完了, 后边再迭代拿元素就会  报错

模拟 for  循环

  e.g

    lst =[ "何炅" ," 谢娜 " , " 张杰 " ]

    it=lst . _ _iter_ _()   #  迭代器  相当于  一个班长

    while True:

      try:

        name = it . _ _next _ _()    #   开始点名 

        print( name )

      except StopIteration:    #   当迭代停止时  ,  停止循环  当点到没有人的时候

        break

    ======>   结果就是  何炅  谢娜   张杰

还可以通过一下两种方法检测其  是不是可迭代的    和      是不是迭代器

  print(   "_ _iter_ _" in dir( lst )   )  ====>判断是否  可迭代

  print(  " _ _next_ _ " in dir(lst)   ) ====>  判断是否  是迭代器

  

  from collections import Iterable     #  判断   可迭代的

  from collections import Iterator      #  判断    迭代器

  

isinstance  (  对象 ,   类型  )   判断  **  是否是 ** 类型的

  print(  isinstance  (  lst ,   Iterable  )  )   #   判断   可迭代的     

  print(  isinstance  (  lst ,  Iterator  )  )   #  判断  迭代器

迭代器,只能向下执行

e.g

  lst=[ " 哈哈" , " 呵呵 "]

  it=lst. _ _iter_ _()

  it._ _next_ _()      # 不打印出来,但是拿  ,   相当于   跳过

  print(  it._ _next_ _()  )====>   结果只剩  呵呵

    

  

猜你喜欢

转载自www.cnblogs.com/lynysy/p/9325412.html