函数对象、名称空间与作用域

一、函数对象

函数的名字就是函数对象,它在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 函数的嵌套定义:

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

1def func1():
	print('from func1')
	def func2():
		print('from func2')
	func2()
func1()
2def 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、只有可变类型可在局部修改外部的值

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用\[1\]中提到了函数的命名规则和参数的使用方式。函数的名字首字母必须大写,而函数的参数在函数体内使用时需要加上前缀"a:"。这样做是为了避免用户自定义函数与内置函数命名冲突,并且在使用函数参数时避免出现未定义的变量错误。此外,函数名称属于全局命名空间,在所有脚本中都可以使用。而引用\[2\]中提到了作用域的概念,函数内部的代码环境称为局部作用域函数作用域。在函数内部定义的变量只能在该函数内部使用。另外,JavaScript中没有块级作用域的概念,即在if语句、循环语句中创建的变量可以在整个函数内部使用。引用\[3\]中提到了函数提升的概念,即函数的声明会被提升到当前作用域的最上面,但不会立即调用函数。这意味着可以在函数声明之前调用函数。另外,函数表达式的声明方式需要注意,需要先声明函数变量再调用函数。根据以上引用内容,作用域首选项名称指的是在函数内部定义的变量的名称。 #### 引用[.reference_title] - *1* [VimScript脚本语言学习------变量作用域函数](https://blog.csdn.net/smstong/article/details/20775695)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [Javascript基础第六天知识点以及案例:作用域、JS预解析、对象](https://blog.csdn.net/m0_46597922/article/details/105752076)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值