• Python 函数之嵌套、闭包


    1.函数的嵌套调用:(函数里面调用函数)

    def max(a,b):
        return a if a>b else b
    
    def the_max(x,y,z):
        c = max(x,y) #函数的嵌套调用
        return c if c>z else z
    
    print(the_max(1,2,3))
    ##
    3

    2.三元运算

    格式:

    变量 = 条件返回True的结果 if 条件 else 条件返回False的结果

    条件:1,必须要有结果。2,必须要有if。3,只能是简单的结果

    ##嵌套多个函数也可以
    def max1(x,y):
        m  = x if x>y else y
        return m
    
    def max2(a,b,c,d):
        res1 = max1(a,b)
        res2 = max1(res1,c)
        res3 = max1(res2,d)
        return res3
    
    max2(23,-7,31,11)
    # 31

    3.函数嵌套定义的执行流程(定义的函数如果不调用就不执行)

    ##inner

     ##在函数嵌套定义时,内部函数可以使用外部函数的变量

    def outer():
        a = 1#外部函数的变量
        def inner():
            print(a)#内部函数可以使用外部函数的变量
            print("inner")
        inner()
    outer()
    #1
    #inner

    ##三层嵌套:

    def outer():
        a = 1
        def inner1():
            b = 2
            print(a)
            print("inner1")
            def inner2():
                print(a,b)
                print("inner2")
            inner2()
        inner1()
    outer()
    
    ###
    1
    inner1
    1 2
    inner2

    关键字:nonlocal

      1.外部必须有这个变量(对全局变量无效)

      2.在内部函数声明nonlocal变量之前不能再出现同名变量

      3.内部修改这个变量如果想在外部有这个变量的第一层函数中生效(只是对最近的一层的局部变量有效)

    def f1():
        a = 1
        def f2():
            nonlocal a
            a = 2
        f2()
        print('a in f1 : ',a)
    
    f1()
    #a in f1 :  2
    def f1():
        a = 1
        def f2():
            #nonlocal a
            a = 2
        f2()
        print('a in f1 : ',a)
    
    f1()
    #a in f1 :  1

    4 函数的本质(函数名就是内存地址)

    第一类对象:(可以赋值、可以作为参数、可以作为返回值)

    1、函数名是可以赋值的

    def func1():
        print(123)
    
    func2 = func1 #函数名可以赋值
    func2()
    
    L = [func1,func2] #函数名可以作为容器数据类型
    print(L)
    for i in L: 
        i()
    
    ####
    123
    [<function func1 at 0x000001BB8BE42E18>, <function func1 at 0x000001BB8BE42E18>]
    123
    123

    2、函数名是可以作为一个数据结构的元素(可以作为容器数据类型的元素)

    3、函数名是可以作为一个函数的参数

    ##函数名可以作为参数来传递
    def f1():
        print("aaa")
    def f2(f):
        f()
    f2(f1)
    ##aaa

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

    def f1():
        print("aaa")
    def f2(f):
        f()
        return f  #函数名做为返回值给f3
    f3 = f2(f1)
    f3()
    ###
    aaa
    aaa

    5.闭包

    #闭包:首先是嵌套函数,并且内部函数调用外部函数的变量
    def outer():
        a = 1
        def inner():
            print(a)
        print(inner.__closure__)
    
    outer()
    
    #(<cell at 0x000002567BB095B8: int object at 0x0000000055A06C10>,)

    ##闭包的标准用法:

    def outer():
        a = 1
        def inner():
            print(a)
        return inner
    
    inn = outer()
    inn()
    
    # 1

    嵌套闭包:
    def wrapper():
        money = 1000
        def func():
            name = 'eva'
            def inner():
                print(name,money)
            return inner
        return func
    
    f = wrapper()
    i = f()
    i()
    ##
    eva 1000

    ##判断闭包函数的方法__closure__

    #输出的__closure__有cell元素 :是闭包函数
    def func():
        name = 'eva'
        def inner():
            print(name)
        print(inner.__closure__)
        return inner
    
    f = func()
    f()

    #输出的__closure__为None :不是闭包函数
    name = 'span'
    def func2():
        def inner():
            print(name)
        print(inner.__closure__)
        return inner
    
    f2 = func2()
    f2()
    ##
    None

    ##闭包函数获取网络应用

    ###############
    from urllib.request import urlopen
    
    def get_url():
        url = "http://www.xiaohua100.cn/index.html"
        def get():
            return urlopen(url).read()
        return get
    
    get_func = get_url()
    content = get_func()
    print(content)

    ##闭包的好处:在调用内部函数的时候不用重复的生成外部的变量。(节省时间)

     
  • 相关阅读:
    $resource详解
    大白话讲解Promise(一)
    《AngularJS》5个实例详解Directive(指令)机制
    Openstack实现共有云VPC的SDN网络
    Openstack实现共有云多flat网络
    Openstack使用NFS作为后端存储
    Openstack块存储cinder安装配置
    Openstack创建镜像
    Openstack深入了解虚拟机
    Python全栈day26-27(面向对象进阶)
  • 原文地址:https://www.cnblogs.com/shaopan/p/10001612.html
Copyright © 2020-2023  润新知