迭代器

mac2022-06-30  20

 迭代器

一.函数名的应用

  函数名是一个变量,但它是一个特殊的变量,与括号配合可以执行函数

  1.函数名的内存地址

1 2 3 4 def  func():         print ( "呵呵" ) print (func) 结果: <function func at  0x1101e4ea0 >

  2.函数名可以赋值给其他变量

1 2 3 4 def  func():         print ( "呵呵" ) print (func) a  =  func     # 把函数当成一个变量赋值给另一个变量 a()      # 函数调用 func()

  3.函数名可以当做容器类的元素

1 2 3 4 5 6 7 8 9 10 11 def  func1():             print ( "呵呵" ) def  func2():         print ( "呵呵" ) def  func3():         print ( "呵呵" ) def  func4():         print ( "呵呵" ) lst  =  [func1, func2, func3]     for  i  in  lst:        i()                     #调用函数

  4.函数名可以当做函数的参数

1 2 3 4 5 6 7 def  func():         print ( "吃了么" ) def  func2(fn):         print ( "我是func2" )         fn()     # 执行传递过来的fn         print ( "我是func2" ) func2(func)      # 把函数func当成参数传递给func2的参数fn.

  5.函数名可以作为函数的返回值

1 2 3 4 5 6 7 8 9 def  func_1():         print ( "这里是函数1" )         def  func_2():                 print ( "这里是函数2" )         print ( "这里是函数1" )         return  func_2 fn  =  func_1()    # 执行函数1.  函数1返回的是函数2, 这时fn指向的就是上面函数2 fn()     # 执行上面返回的函数      

  二.闭包:闭包就是内层函数,对外层函数(非全局)的变量的引用.

   好处:  

     1.保护变量不受外界影响

     2.可以让变量常驻内存

1 2 3 4 5 6 7 def  func1():         name  =  "alex"         def  func2():                 print (name)      # 闭包         func2() func1() 结果: alex   

  可以使用__closure__来检测函数是否是闭包.返回cell就是闭包,返回None就不是闭包.

1 2 3 4 5 6 7 def  func1():         name  =  "alex"         def  func2():                 print (name)      # 闭包         func2()         print (func2.__closure__)     # (<cell at 0x10c2e20a8: str object at 0x10c3fc650>,) func1()

  在函数外部调用内部函数

1 2 3 4 5 6 7 def  outer():         name  =  "alex"     # 内部函数         def  inner():                 print (name)         return  inner fn  =  outer()    # 访问外部函数, 获取到内部函数的函数地址 fn()     # 访问内部函数

  多层嵌套时,一层一层返回即可

1 2 3 4 5 6 7 def  func1():      def  func2():          def  func3():              print ( "嘿嘿" )          return  func3      return  func2 func1()()()

  Python中规定,如果你在内部函数中访问了外层函数中的变量,那么这个变量将不会消亡,将会常驻内存中.

  三.迭代器

    可迭代对象:Iterable,里面有__iter__()可以获取迭代器,没有__next__()

    迭代器:       Iterator,里面有__iter__()可以获取迭代器,还有__next__()

    迭代器的特点:

      1.只能向前

      2.惰性机制

      3.省内存(生成器)

    可以通过dir函数查看类中定义好的方法

1 2 3 4 s  =  "我的哈哈哈" print ( dir (s))        # 可以打印对象中的方法和函数   print ( dir ( str ))      # 也可以打印类中声明的方法和函数

  可迭代对象可以使用for循环

  打印的结果中能找到__iter__函数,则是可迭代对象

  也可以通过isinstance()函数查看对象是不是可迭代对象

1 2 from  collections  import  Iterable   # 可迭代对象 from  collections  import  Iterator     # 迭代器 lst = ["alex为什么这么帅","我不信","你们信吗?"] 1 print ( isinstance (lst, Iterable)) <br> print ( isinstance (lst, Iterator))

  可迭代对象可以通过.__iter__()获取迭代器

  for循环的内部机制

    1.首先获取到迭代器.

    2.使用while循环获取数据

    3.it.__next__()获取数据

    4.处理异常 try: xxx  except StopIteration:

1 2 3 4 5 6 7 8 lst  =  [ "alex" ,  "wusir" ,  "taibai" ,  "ritian" ] it  =  lst.__iter__()  # 获取迭代器 while  1 :      try :     # 尝试执行          el  =  it.__next__()   # 获取下一个元素          print (el)      except  StopIteration:    # 处理错误          break

  

转载于:https://www.cnblogs.com/RootEvils/p/9457711.html

相关资源:JAVA上百实例源码以及开源项目
最新回复(0)