• day11-函数对象、名称空间和作用域


    函数对象

    在Python中,一切皆对象,函数也是一类对象。即函数也具有以下特性

    1.可以被引用,赋值:将函数赋值给a

    # 定义一个self_max函数
    def self_max(x, y):
        if x > y:
            return x
        return y
    a = self_max
    

    2.可以当做函数的返回值:将函数f2当做函数f1的返回值

    def f2():
        print('from f2')
    def f1():
        return f2
    f = f1()
    print(f)		# 打印结果<function f2 at 0x00000176C99FF1E0>
    print(f2)		# 打印结果<function f2 at 0x00000176C99FF1E0>
    

    3.可以当作函数参数传递

    def f1():
        print('from f1')
    def f2(m):
        return m
    f = f2(f1)
    f()			# 执行了f1(),打印出'from f1'
    

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

    def f1():
        print('from f1')
    s_list = ['str',1,f1]
    s_list[2]()			# 执行了f1(),打印出'from f1'
    

    函数的嵌套

    函数的嵌套就是在函数体中再定义函数

    def f1():
        def f2():
            print('from f1')
        f2()
    f1()
    

    举个例子:根据输入的指令求圆的周长和面积

    from math import pi
    def circle(r, action):
        if action == 'a':
            
            # 在函数里定义求圆面积的函数
            def area():			
                return pi * r **2
            res = area()
            return res
    
        elif action == 'p':
            # 在函数里定义求圆周长的函数
            def perimeter():
                return pi * r *2
            res = perimeter()
            return res
    
        else:
            return "error"
        
    r = int(input('请输入半径》》》').strip())
    action_choice = input("请输入选择的功能,a表示求面积,p表示求周长》》》").strip()
    res = circle(r, action=action_choice)
    print(res)
    

    名称空间和作用域

    就是用来存放名字的地方。分成内置名称空间、局部名称空间和全局名称空间

    内置名称空间

    我们所学的内置方法如len(),其实就是一个个函数。python在启动的时候就会定义这些函数,并把这些函数丢入到内存空间,这个内存空间就叫做内置名称空间。

    生命周期:从python启动的时候就生效,直到python关闭

    全局名称空间

    除了内置名称空间和局部名称空间就是全局名称空间

    生命周期:程序文件运行的时候生效,直到程序运行结束

    局部名称空间

    函数内部的都叫局部名称空间,也就是函数内部定义的名字都放入了局部名称空间中了

    生命周期:函数运行的时候生效,直到函数运行结束

    小结:

    名称空间的执行顺序:内置名称空间 ---> 全局名称空间 ---> 局部名称空间

    名称空间的查找顺序:局部名称空间 ---> 全局名称空间 ---> 内置名称空间。从当前名称空间开始查找,然后逐步往上

    作用域

    作用域就是作用的区域,分为全局作用域和局部作用域

    全局作用域

    全局有效,全局存活,包含内置名称空间和全局名称空间。即全局可以修改内置的,内置可以修改全局的

    x = 1
    def f1():
        def f2():
        	print(x)
        return f2()
    f1()				# 打印出 1
    

    局部作用域

    只能使用于局部范围,在局部定义的名字只能在局部获取

    def f1():
        def f2(): 
            print(x)
        x = 2
        return f2()
    f1()		# 打印出2
    

    注意点:1. 作用域关系在函数的定义阶段就固定死了,与函数的调用无关

    2. 函数与函数之间可能会有相同名字的变量,但是这两个变量毫无关系,作用域不同

    x= 1000
    def f1():
        x = 1
        def f2():
            print(x)		# 打印 1,在定义阶段 x=1,与函数调用无关
        return f2
    f2 = f1()
    x = 10
    def f3():
        x = 15
        f2()
    f3()
    

    global和nonlocal

    global:在局部修改全局变量,声明是全局变量

    x = 1
    def f1():
        global x		# 声明x是全局变量
        x = 2
    f1()
    print(x)			# 运行函数后,修改了x的值,打印结果为2
    

    nonlocal:把局部改成外部

    def f1():
        x= 1
        def f2():
            nonlocal x  # 声明x是外部,嵌套函数的内部的外部,不能修改全局的
            x = 3
        f2()
        print(x)
    f1()
    
  • 相关阅读:
    1
    Dockerfile概述
    协议
    部署环境
    协议与数据2
    【笔记】刚到公司,初识dll
    C#Winform学习笔记
    VS2019添加VisionPro控件(此方法是大师分享的)
    VisionPro脚本
    Visionpro相机取像操作,.NET4.0
  • 原文地址:https://www.cnblogs.com/863652104kai/p/10951839.html
Copyright © 2020-2023  润新知