zoukankan      html  css  js  c++  java
  • 函数对象、名称空间与作用域

    一、函数对象

    函数的名字就是函数对象,它在python中是第一类对象,函数名指向的是函数的内存地址。

    1.1 函数对象的作用:

    1、函数名可以被引用

    def bar():
    	print('from bar')
    f=bar
    f()
    

    2、函数名可以当作参数传入

    def bar():
    	print('from bar)
    def wrapper(func):  #func=bar
    	func()
    wrapper(bar)
    

    3、可以当函数的返回值

    def bar():
    	print('from bar')
    def foo(func):
    	return func
    #print(bar)
    f = foo(bar)    #      f ---> bar
    #print(f)
    f()
    

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

    def get():
    	print('from get')
    def put():
        print('from put')
    l = [get,put]
    #print(l)
    l[0]()
    

    1.2 函数对象的应用:

    可以优雅地取代if分支

    二、函数嵌套

    作用:让内层函数封闭起来,不让外部直接调用

    2.1 函数的嵌套调用:

    在函数内又调用其他函数,将复杂并且小的功能,在函数内部调用,解决代码结构清晰问题

    def max1(x,y):
    	if x > y:
    		return x
    	else:
    		return y
    def max2(x,y,z):
    	res1 = max1(x,y)
    	res2 = max1(res1,z)
    	return res2
    print(max2(11,199,2))
    

    2.2 函数的嵌套定义:

    在函数内又定义了其他函数

    例1:
    def func1():
    	print('from func1')
    	def func2():
    		print('from func2')
    	func2()
    func1()
    
    例2:
    def f1():
        print('f1')
        def f2():
            print('f2')
            def f3():
                print('f3')
            f3()
        f2()
    f1()
    

    三、名称空间

    名称空间:存放名字与值绑定关系的地方,如果你想访问一个变量值,必须要先访问对应的名称空间

    名称空间的分类:

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

    全局名称空间:文件级别(顶头写的名字)的名字。
    在执行文件时生效,在文件结束或者在文件执行期间被删除的就失效

    def func():  #func是全局的
    	pass
    
    if 10>3:    
    	y =333   #y 是全局的
    
    
    x = 1 
    def f1():
    	def f2():
    		print(x)
    	f2()
    f1()	
    

    局部名称空间:存放函数内定义的名字(函数的参数以及函数内的名字都存放于局部内存空间)。
    在调用当前函数时临时生效,函数体代码执行结束时失效。

    加载顺序:内置名称空间 -->>全局名称空间-->>局部名称空间
    名称空间的查找顺序:局部名称空间-->>全局名称空间-->>内置名称空间

    len = 'global'
    def f1():
        # len = 1
        def f2():
            # len = 2
            print(len)
        len = 1
        f2()
    f1()
    

    四、作用域

    作用域:名称空间发挥作用的范围

    作用域的分类:

    1、全局作用域:包含的是内置名称空间与全局名称空间的名字
    特点: 只要程序一直执行,永久存活,若程序结束,则销毁

    2、局部作用域:包含的是局部名称空间的名字
    特点:只能在函数内使用,调用函数时生效,调用结束失效

    补充:
    1、global:声明全局变量

    def index():
        global x  #声明X是全局变量
        x=2
        print(x)
    index()
    print(x)
    

    2、nonlocal:在局部名称空间声明局部变量,在局部修改外部(上层函数)的变量

    def index():
        x=1
        def func():
            nonlocal x
            x=2
    
        func()
        print(x)
    index()
    

    3、只有可变类型可在局部修改外部的值

    在这里插入图片描述

  • 相关阅读:
    2019年11月4日随堂测试 最多输入字母统计
    写增删改查中间遇到的问题
    2019年12月9日下午自习成果
    2019年12月16日 分级考试
    2019年11月18日 JAVA期中考试 增删改查
    sql语言积累
    【转载】Java项目中常用的异常处理情况总结
    泛型
    C#数字格式化输出
    委托,Lambda的几种用法
  • 原文地址:https://www.cnblogs.com/baohanblog/p/12143037.html
Copyright © 2011-2022 走看看