zoukankan      html  css  js  c++  java
  • Python 全栈开发:python函数进阶

    python函数进阶

    函数嵌套

    函数对象

    命名空间与作用域

    闭包函数

    装饰器

    一、函数嵌套

    函数的嵌套定义

    def func1():
        print('from func1')
        def func2(): #func2=内存地址
            print('from func2')
        print(func2) 
    func1()

    函数的嵌套调用

    # 比较两个数的大小
    def max2(x,y):
        if x > y:
            return x
        else:
            return y
    # 比较三个数的大小
    def max3(x,y,z):
        res1=max2(x,y)
        res2=max2(res1,z)
        return res2
    
    print(max3(11,199,2))

    # 结果
    # 199

    二、函数对象

    函数在python中是第一类对象

    1.可以被引用

    x=1
    y=x
    def bar():
        print('from bar')
    f=bar   # 作为对象赋值时 bar代表的值是 内存地址
    f()

    2.可以当中参数传入(函数名的本质,函数的内存地址)

    f=func

    3.可以当中函数的返回值

    def bar(x):
        print(x)
        x()
    
    bar(func)

    4.可以当中容器类型的元素

    def bar(x): # x=func
        return x #return func
    
    res=bar(func) #res=func
    # print(res)
    res()    

    三、命名空间与作用域

    命名空间:存放名字与绑定关系的空间

    命名空间分为三类

    内置命名空间:存放Python解释器自带的名字,在解释器启动时就生效,解释器关闭则失效

    全局命名空间:文件级别的名字,在执行文件的时候生效,在文件结束或者在文件执行期间被删除则失效

    局部命名空间:存放函数内定义的名字(函数的参数以及函数内的名字都存放与局部名称空间), #在函数调用时临时生效,函数结束则失效

    三种命名空间之间的加载顺序和取值顺序:
    加载顺序:内置(解释器启动时加载,程序运行前加载)-->全局(从上到下顺序加载进来的)-->局部(调用的时候加载)--->内置

    取值:在局部调用:局部命名空间--->全局命名空间--->内置命名空间

    在全局范围找:

    全局----内置----局部使用:   

    全局不能使用局部的    

    局部的可以使用全局的

    作用域:就是作用范围

    1、命名空间和作用域是分不开的.

    2、作用域分为两种

      全局作用域:全局命名空间与内置命名空间的名字都属于全局范围,在整个文件的任意位置都能被引用,全局有效

      局部作用域:局部命名空间,只能在局部范围内生效

    3、站在全局看

      使用名字的时候,如果全局有,用全局的

      如果全局没有,用内置的

    4、为什么要有作用域

      为了函数内的变量不会影响到全局

    5、

    pass

    四、闭包函数

    闭包:1.闭 :内部的函数
       2.包 :包含了对外部函数作用域中变量的引用

    def hei():
      x=20
      def inner():
        x=10 #如果x定义了,他就用自己的了,就实现不了闭包
    print(x) 
    # 闭包的常用形式: 
    def hei(): 
      x=20 
      def inner(): 
        '''闭包函数''' 
        print(x) 
    return inner()
    
    闭包函数的常见形式

    判断闭包函数的方法:__closure__

    #输出的__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()
    View Code

    闭包获取网络应用

    # from urllib.request import urlopen
    # def index(url):
    #     def inner():
    #         return  urlopen(url).read()
    #     return inner
    # u='http://www.cnblogs.com/Eva-J/articles/7156261.html#_label1'
    # get = index(u)
    # print(get())
    View Code

    五、装饰器

    pass

  • 相关阅读:
    IE设置代理后登录QQ再关闭代理仍然可以使用QQ
    ubuntu14.04下Qt开发环境搭建遇到的问题
    CButtonST使用技巧: CButtonST简介
    springboot webapi 支持跨域 CORS
    服务注册和发现 Eureka
    开发框架 springBoot
    springBoot springCloud
    springBoot 微服务
    springBoot AOP环绕增强、自定义注解、log4j2、MDC
    springBoot 热部署
  • 原文地址:https://www.cnblogs.com/fixdq/p/8665513.html
Copyright © 2011-2022 走看看