首页 > 技术文章 > python基础之名称空间与函数补充

90s-blog 2021-11-16 22:37 原文

目录

一、名称空间的作用域
二、关键字global和nonlocal的使用
三、函数对象(函数名)
四、函数的嵌套调用
五、函数的嵌套定义
六、闭包函数
七、装饰器定义

1、名称空间

1.1 定义

# 名称空间:即存放变量名与变量值绑定关系的地方,类似于生活中的民政局。
# 名称空间分为三类:内置名称空间、全局名称空间、局部名称空间。

1.2 内置名称空间

# 内置名称空间:python解释器提前已经定义好的,可以直接用的。
# 存活周期:随着解释器的启动和关闭而创建销毁。
  len()
  print()
  ...

14.3 全局名称空间

# 全局名称空间:在py文件中顶格编写的代码运行之后都会存入全局名称空间。顶格跟缩进没有关系,不能直接用有无缩进来判断。
# 存活周期:随着py文件的运行与结束而创建销毁。

  name = 'jason' # name全局
  def func():  # func全局
      pass
  if 1:
      a = 3  # a全局
  for i in range(5):
      print(i)  # i全局
  while True:
      a = 123  # a全局

img

14.4 内部名称空间

# 内部名称空间:函数体代码运行之后产生的都是局部名称空间。
# 存活周期:随着函数体代码的执行与结束而创建销毁。

2、名字的查找顺序

# 在查找名字的时候,要先确定自己在哪儿。
如果在局部,查找顺序:局部 >>>全局 >>>内置;
如果在全局,查找顺序:全局 >>>内置。


  x = 111
  def f1():
      x = 222
      def f2():
          x = 333
          def f3():
              x = 444
              def f4():
                  x = 555
                  print(x)
              f4()
          f3()
      f2()
  f1()

img

3、名称空间的作用域

# 作用域即作用范围。
内置名称空间和全局名称空间的作用域是全局有效,即程序在任何位置任何阶段都有效;局部名称空间的作用域一般情况下只在局部有效,即在各自的局部空间中有效。

4、关键字global和nonlocal的使用

# global关键字:
	在局部名称空间修改全局数据,当数据类型为不可变类型时,需要用此关键字声明后才能修改;数据类型可变时不需要声明。
# nonlocal关键字:
	在局部名称空间修改外部的局部数据,当数据类型为不可变类型时,需要用此关键字声明后才能修改;数据类型为可变类型时不需要声明。

    
    
x = 111
def func():
	global x  # 用关键字global说明此处要修改全局的x
	x = 222  # 把x=111修改成x=222
func()
print(x)`

def index():
	y = 444
	def index1():
		nonlocal y  # 在局部用关键字nonlocal声明此处要修改局部的y
		y = 555  # 把局部的y=444修改为555
	index1()
	print(y)
index()

5、函数对象(函数名)

5.1 函数对象当作变量名

def index():
	print('index', 1)
a = index
a()  # 本质就是在调用index函数`

5.2 函数对象当作实参

def func():
	print(111)
def index(a):
	print(a)
	a()
	print(22233)
index(func)  # 把函数名func当成函数index的参数`

5.3 函数对象当作函数返回值

def index():
	print('from index')
def func():
	print('from func')
	return index
res = func()  # 调用func并接受func的返回值
res()`

5.4 函数对象当作容器类型(内存可以存放多个元素)的元素

def func():
	print()
l1 = [111, 333, 566, func]  # 把函数对象func当成列表l1的一个元素
print(l1)`

5.5 小练习

# 1.定义功能的函数
def register():
	print('注册功能')
def login():
	print('登录功能')
def pay():
	print('支付功能')
# 2.定义一个字典
dic = {'1': register, '2': login, '3': pay}
# 3.循环
while True:
	# 4.给用户展示的选项卡
	print("""
	1.注册功能
	2.登录功能
	3.支付功能    
	""")
	# 5.获取用户输入
	choice = input('请输入您需要的功能编号>>>:').strip()
	# 6.判断用户的选项是否在字典的K值
	if choice in dic:
		# 7.如果在的话,则用户输入的选项编号取字典取V值
		res = dic.get(choice)
		# 8.调用该选项编号的函数
		res()
	# 9.否则提示功能编号不存在,请重新输入
	else:
		print('功能编号不存在,请重新输入')`

6、函数的嵌套调用

在函数体内部调用别其他函数:

def index():
	print(1344)
def func():
	index()
	print(789)
func()


# 比较两个大小
def my_max(a, b):
	if a > b:
		return a
	return b
# 比较四个大小,调用前面那个比较两个大小的函数
def many_max(x, y, z, m):
	res = my_max(x, y)
	res1 = my_max(res, z)
	res2 = my_max(res1, m)
	return res2
ret = many_max(1, 2, 3, 4)
print(ret)

7、函数的嵌套定义

在函数体内部定义其他函数。

def func(type):
	def register():
		print('注册')
	def login():
		print('登录')
	def pay():
		print('支付')
	if type == '1':
		register()
	elif type == '2':
		login()
	elif type == '3':
		pay()
	else:
		print('无法识别')
func('1')  # 传值1给形参type

8、闭包函数

# 需要满足两个条件的函数:
1.闭:在内部函数定义函数;
2.包:在内部函数使用外部函数名称空间中的名字。

def outer():
	x = 222
	def func():  # 条件1:在outer函数中定义func函数
		print(x)  # 条件2:在内部函数func中使用了外部outer函数名称空间中的x
	return func
res = outer()
res()

# 利用闭包函数给形参传值
def outer(x,y):
	def my_max():
		if x > y:
			return x
		return y
	return my_max
res = outer(2,40)
print(res())

9、装饰器定义

器:工具
装饰:给被装饰对象添加额外功能。
装饰器的原则:开放封闭原则。即对拓展开放,对修改封闭。
核心原则:在不改变被装饰对象的内部代码和原有调用方式的基础上添加额外功能。

推荐阅读