名称空间与作用域

一:名称空间namespaca:存放名字的地方,是对栈区的划分

有了名称空间之后,就可以在栈区中存放相同的名字,详细的,名称空间

分三种

1.1 内置名称空间

存放的名字:存放的python解释器内置的名字
>>>input
<built-in function input>
存活周期:python解释器启动则产生,python解释器关闭则销毁

1.2 全局名称空间

存放的名字:只要不是函数内定义,也不是内置的,剩下的全都是局部名称空间的名字

import os
x=10
if 13 > 3:
	y=22
	if 3 == 3:
		z=20
# func=函数的内存地址
def func():
	a=111
	b=222

1.3 局部名称空间

# 存放的名字:在调用函数体代码过程中产生的函数内的名字
# 存活周期:在调用函数时存活,函数调用完毕后则销毁
def func(a,b):
	pass

func(10,33)
func(22,33)
func(4,23)
func(43,5)

1.4 名称空间的加载顺序

内置名称空间>全局名称空间>局部名称空间

1.5 销毁顺序

局部内存空间>全局名空间>内置名称空间

1.6 名字的查找优先级:从当前所在的位置向上一层一层查找

内置名称空间
全局名称空间
局部名称空间
如果当前在局部名称空间
局部名称空间->全局名称空间->内置名称空间
# input=333

def func():
	# input=234
	print(input)

func()

# 如果当前在局部名称空间
# 全局名称空间->内置名称空间
input=333
def func():
	# input=234

func()
	print(input)

示范

# 示范1:
def func():
	print(x)

x=111

func()

# 示范2:名称空间的"嵌套"关系是以函数定义阶段为准,与调用位置无关
x=1
def func():
	print(x)

def foo():
	x=222
	func()
foo()

# 示范3:函数嵌套,先从当前位置一层层往外找
input=123
def f1():
	def f2():
		input=222
		print(input)
	input=111
	f2()
f1()

# 示范4:
x=111
def func():

	print(x)
	x=222
func()

二:作用域->作用范围

全局作用域: 内置名称空间、全局名称空间

1、全局存活

2、全局有效:被所有函数共享

x=122

def foo():
	print(x,id(x))

def bar():
	print(x,id(x))

foo()
bar()
print(x,id(x))

局部作用域: 局部名称空间的名字

1、临时存活

2、局部有效:函数内有效

示范

# 示范1:
def foo(x):
	def f1():
		def f2():
			print(x)

# 示范2:如果再局部想要修改全局的名字对应的(不可变类型)值,需要用global
x=111
def func():
	global x     # 声明x这个名字是全局的名字,不要再造新的名字
	x=222

func()
print(x)

# 示范3:
l=[11,22]
def func():
	l.append(33)
	print(l)

func()
print(l)

nonlocal(了解)

由内全局局部x=0
def f1():
	x=1
	def f2():
		nonlocal x
		x=22
	f2()
	print('f1内的x: ',x)

f1()
# 局部 全局 内置 由内向外查找
x=11
def f1():
	def f2():

		# x=123
		print(x)

	# x=124
	f2()

f1()
x=213
print(x)

名称空间的嵌套关系决定了名字的查找顺序

而名称空间的嵌套关系是以函数定义阶段为准的

即函数的嵌套关系与名字的查找顺序是再定义阶段就要经确定好的

x=10
def f():
	x=23
	print(x)
	x=23
f()

三:函数对象

# 精髓 :可以把函数当变量去用
def func():
	print('from func')
1、可以赋值
f=func
print(f,func)
f()
# 2、可以把当做函数当作参数传给另一个函数
def foo(x):  # x= func的内存地址
	print(x)
	x()

foo(func) # foo(func的内存地址)
# 3、可以当作函数当作另一个函数的返回值
def foo(x):		# x=func的内存地址
	return x   # return func的内存地址

res=foo(func)  # foo(func的内存地址)
print(res)		# res=func的内存地址
res()
# 4、可以当做容器类型的元素
l=[func,]
# print(l)
l[0]()

dic={'k1':func}
print(dic)
dif['k1']()

应用

def login():
	print('登录功能')

def transfer():
	print('转账功能')

def check_banlance():
	print('查询余额')

def withdraw():
	print('提现')

def register():
	print('注册')

func_dic={
	'0':['退出'None],
	'1':['登录',login],
	'2':['转账',transfer],
	'3':['查询',check_banlance],
	'4':['提现',withdraw],
	'5':['注册',register]
}

while True:
	for k in func_dic:
		print(k,func_dic[k][0])
	choice = input('请输入命令编号: ').strip()
	if not choice.isdigit(): continue

	if choice == 0:
		break

	if choice in func_dic:
		func_dic[choice][1]()
	else:
		print('输入的指令不存在')

扩展

import requests
# 传参方案一
def get(url):
	response=requests.get(url)
	print(len(response.text))

get('https://translate.google.cn/')

# 传参方案二

def outter(url):
	# url='https://translate.google.cn/'
	def get():
		response=requests.get(url)
		print(len(response.text))
	return get
baidu=outter('https://translate.google.cn/')
baidu()
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Yuno Wang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值