zoukankan      html  css  js  c++  java
  • 《Python》 函数嵌套、闭包和迭代器

    一、函数的嵌套:

       1、函数的嵌套调用

    def max2(x,y):
        m  = x if x>y else y
        return m
    
    def max4(a,b,c,d):
        res1 = max2(a,b)
        res2 = max2(res1,c)
        res3 = max2(res2,d)
        return res3
    
    # max4(23,-7,31,11)
    
    函数的嵌套调用
    函数的嵌套调用

       2、函数的嵌套定义

    函数的嵌套定义

       3、函数的作用域链:小范围作用域可以使用大范围的变量,但是反之不行,他是单向的。

    def f1():
        a = 1
        def f2():
            def f3():
                print(a)
            f3()
        f2()
    
    f1()
    ################
    def f1():
        a = 1
        def f2():
            a = 2
        f2()
        print('a in f1 : ',a)
    
    f1()
    
    作用域链应用举例
    作用域链应用举例

    二、 函数名的本质

       1、函数名就是函数的地址

        print(func)

       2、函数名可以作为变量

         def func1():
        print(666)
        f1 = func1
        f2 = f1
        f2()

       3、函数名可以作为函数的参数

        def func():
         print(666)
        def func1():
         func()
        def func2(x):
         x()
        func2(func1)

       4、函数名可以当做函数的返回值

        def wraaper():
         def inner():
         print('inner ')
         return inner
        ret = wraaper() # inner
        ret() # inner()

       5、函数名可以作为容器类类型的元素

        def func1():
         print('in func1')

        def func2():
         print('in func2')

        def func3():
         print('in func3')

        def func4():
         print('in func4')
        l1 = [func1,func2,func3,func4]
        for i in l1:
         i()

       向上面的函数名这种,第一类对象     

        第一类对象(first-class object)指
          1.可在运行期创建
          2.可用作函数参数或返回值
          3.可存入变量的实体。

       globals()   和 locals()

        globals():返回全局变量的一个字典

        locals():返回当前位置的局部变量的字典

    三、闭包

       内层函数对外层函数的变量(非全局变量)的引用,并返回,就这样形成了闭包。

        def wrapper():

          name='alex'

          def inner():

            print(name)

          inner()

          return inner

        wrapper()

       闭包的作用:

        当程序执行时,遇到了函数执行,他会在内存中开辟一个局部名称空间,如果这个函数内部形成了闭包,那么他就不会随着函数的结束而消失。

    #输出的__closure__有cell元素 :是闭包函数
    def func():
        name = 'eva'
        def inner():
            print(name)
        print(inner.__closure__)
        return inner
    
    f = func()
    f()
    
    #输出的__closure__为None :不是闭包函数
    name = 'egon'
    def func2():
        def inner():
            print(name)
        print(inner.__closure__)
        return inner
    
    f2 = func2()
    f2()
    判断闭包函数的方法__closure__
    def wrapper():
        money = 1000
        def func():
            name = 'eva'
            def inner():
                print(name,money)
            return inner
        return func
    
    f = wrapper()
    i = f()
    i()
    
    闭包嵌套
    闭包嵌套
    from urllib.request import urlopen
    
    def index():
        url = "http://www.xiaohua100.cn/index.html"
        def get():
            return urlopen(url).read()
        return get
    
    xiaohua = index()
    content = xiaohua()
    print(content)
    
    闭包函数获取网络应用
    闭包函数获取网络应用

    四、迭代器

        1、可迭代对象:str,list,dict,tuple,set,range()

        2、对象内部含有__iter__方法就是可迭代对象

        3、可迭代对象满足可迭代协议

       判断一个对象是否是可迭代对象:

         第一种方法:print ('__iter__' in  dir (s1))

         第二种方法:from collcetions import iterable可迭代对象/Iterator迭代器

           print(isinstanse)('alex',Iterable)

           print(isinstanse)('alex',Iterator)

       迭代器:对象内部含有__iter__方法且含有__next__方法就是迭代器

       可迭代对象vs迭代器

         可迭代对象不能取值,迭代器是可以取值的,但是可迭代对象可以转化成迭代器

            lis=[1,2,3]

            itrl=lis.__iter__()

            print(itrl.__next__())

         迭代器如何取值:__next__一次取一个值

       可迭代对象和迭代器的区别:

        (1)可迭代对象不能取值,迭代器可以

        (2)迭代器非常节省内存

        (3)迭代器每次只会取一个值

        (4)迭代器是单向的,不回头

       for 循环:

        将可迭代对象转化成迭代器

        调用__next__方法取值

        利用异常处理停止报错

        s1 = 'kfdsjl'
        iter1 = s1.__iter__()
        while 1:
         try:
         print(iter1.__next__())
         except StopIteration:
         break

     

  • 相关阅读:
    POJ 1469 COURSES 二分图最大匹配
    POJ 1325 Machine Schedule 二分图最大匹配
    USACO Humble Numbers DP?
    SGU 194 Reactor Cooling 带容量上下限制的网络流
    POJ 3084 Panic Room 求最小割
    ZOJ 2587 Unique Attack 判断最小割是否唯一
    Poj 1815 Friendship 枚举+求最小割
    POJ 3308 Paratroopers 最小点权覆盖 求最小割
    1227. Rally Championship
    Etaoin Shrdlu
  • 原文地址:https://www.cnblogs.com/yzh2857/p/9494095.html
Copyright © 2011-2022 走看看