zoukankan      html  css  js  c++  java
  • 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)

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

     
  • 相关阅读:
    CSS3—— 2D转换 3D转换 过渡 动画
    CSS3——边框 圆角 背景 渐变 文本效果
    CSS3——表单 计数器 网页布局 应用实例
    CSS3——提示工具 图片廓 图像透明 图像拼接技术 媒体类型 属性选择器
    CSS3——对齐 组合选择符 伪类 伪元素 导航栏 下拉菜单
    CSS3——分组和嵌套 尺寸 display显示 position定位 overflow float浮动
    CSS3——盒子模型 border(边框) 轮廓(outline)属性 margin外边距 padding填充
    Eclipse连接数据库报错Local variable passwd defined in an enclosing scope must be final or effectively final
    数据库——单表查询
    数据库——添加,修改,删除
  • 原文地址:https://www.cnblogs.com/shaopan/p/10001612.html
Copyright © 2011-2022 走看看