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循环
  • 相关阅读:
    < java.util >-- Set接口
    Codeforces 627 A. XOR Equation (数学)
    Codeforces 161 B. Discounts (贪心)
    Codeforces 161 D. Distance in Tree (树dp)
    HDU 5534 Partial Tree (完全背包变形)
    HDU 5927 Auxiliary Set (dfs)
    Codeforces 27E. Number With The Given Amount Of Divisors (暴力)
    lght oj 1257
    Codeforces 219D. Choosing Capital for Treeland (树dp)
    Codeforces 479E. Riding in a Lift (dp + 前缀和优化)
  • 原文地址:https://www.cnblogs.com/alvin-jie/p/9885182.html
Copyright © 2011-2022 走看看