zoukankan      html  css  js  c++  java
  • python之路-day11-迭代器闭包

     

    一 、 函数名的运用

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

      1、函数名的内存地址

      

      def func():

        print("呵呵")

      print(func)

      结果:

      <function func at 0x1101e4ea0>

      

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

      def func():

        print("呵呵")

      print(func)

      a = func    # 把函数当成一个变量赋值给另一个变量

      a()      # 函数调用 func()

      

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

      def func1():

        print("呵呵")

      def func2():

        print("呵呵")

      def func3():

        print("呵呵")

      def func4():

        print("呵呵")

      lst = [func1, func2, func3]

      for i in lst:

        i()

     

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

      

      

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

      

           

    二、闭包

     1、 什么是闭包?闭包就是内层函数,对外层函数(非全局)的变量的引用。叫闭包

      def func1():

        name = "alex"

        def func2():

          print(name)    # 闭包

        func2()

      func1()

      结果:

      alex

        

    2、我们可以使用__closure__来检测函数是否是闭包.使用函数名.__closure__
    返回cell就是闭包。返回None就不是闭包
    def func1():
    name = 'alex'
    def func2():
    print(name)
    func2()
    print(func2.__closure__)
    func1()
    结果:(<cell at 0x00000248D5C77618: str object at 0x00000248D5D07068>,)

     3、如何在函数外边调用内部函数

    def outer():

      name = 'alex'

      # 内部函数

      def inner()

        print(name)

      return inner

    fn = outer()              # 访问外部函数,获取到内部函数的地址

    fn()         # 访问内部函数

     

    4、总结

      闭包:在内层函数中引入外层函数的变量

      作用:

        1、保护变量不收侵害

        2、让一个变量常驻内存

    三、迭代器

       dir() 查看变量能够执行的方法(函数)

       Iterator : 迭代器,   __iter__(), __next__()

       Iterable:可迭代的  __iter__()

       for循环的流程:

       it = lst.__iter__()

       while 1:

         try:

           el = it.__next__()

                 for循环的循环体

          except StopIteration:

             break

       # 从迭代器中获取数据的唯一方法: __next__()

       三个特征:

        1、省内存

        2、惰性机制

        3、只能往前。不能退后

    #  如何判断一个数据是否是可迭代对象
    # 1. dir() -> __iter__ 可迭代的
    # dir() -> __next__ 迭代器
    # lst = ["秦始皇", "汉武帝", "孝文帝", "隋炀帝", "李世民"]
    # print("__iter__" in dir(lst)) # True 可迭代的
    # print("__next__" in dir(lst)) # False 不是迭代器
    #
    # print("__iter__" in dir(int))
    # print("__next__" in dir(int))
    #
    # it = lst.__iter__() # 迭代器
    # print("__iter__" in dir(it)) # True 迭代器本身就是可迭代的
    # print("__next__" in dir(it)) # True
    lst = ["秦始皇", "汉武帝", "孝文帝", "隋炀帝", "李世民"]

    # collections 关于集合类的相关操作
    # Iterable : 可迭代的
    # Iterator : 迭代器

    from collections import Iterable, Iterator
    print(isinstance(lst, Iterable)) # True
    print(isinstance(lst, Iterator)) # False

    print(isinstance({1,2,3}, Iterable)) # True, 可以使用for循环
  • 相关阅读:
    微博短地址识别正则表达式
    VM 虚拟机, linux mount windows的共享目录,php报错:Fatal error: Unknown: Failed opening required
    新贵 轻雅 100 数字键 numlock问题
    [转]人大常委会委员:文理分科降低民族整体素质
    NTFS变RAW后的修复
    西门子plc视频教程
    ProE 工程图教程系列3 Pro/E消息区域中错误、警告消息的处理
    奥运会上同时升起三面五星红旗
    亦歌 在线听歌网站
    [转]国内外常用钢号对照表
  • 原文地址:https://www.cnblogs.com/alvin-jie/p/9885182.html
Copyright © 2011-2022 走看看