今日学习目标:
- 了解什么是名称空间,学会查找和理解其作用域
- 理解运用global与nonlocal关键字
- 对函数名和函数的嵌套有所理解
今日学习内容:
内容简要:
- 名称空间
- 作用域
- global与nonlocal关键字
- 函数名对象
- 函数的嵌套
内容详细:
名称空间
是存放变量名与变量值绑定关系的地方
Python 的名称空间包括:
-
内置名称空间
存放python解释器内置的名字(例如:print、input、len)print(print) print(input) print(len)
存活周期:
python解释器启动则产生,python解释器关闭则销毁
-
全局名称空间
在py文件中编写的代码运行产生的名字都会存到全局名称空间(也可以说是只要不是函数内定义、也不是内置的,剩下的都是全局名称空间的名字)name = 'jason' # 变量名name存入全局名称空间 def index(): # 函数名index存入全局名称空间 pass if True: a = 111 # 变量名a存入全局名称空间 for i in range(10): # 变量名i存入全局名称空间 pass while True: b = 222 # 变量名b存入全局名称空间
存活周期:
python文件执行则产生,python文件运行完毕后销毁
-
局部名称空间
在调用函数时,运行函数体代码过程中产生的函数内的名字a=1 #全局名称 b=2 #全局名称 def func(a,b): #括号中的a,b就是局部名称 print(a,b) func(10,1) #==>10 1
存活周期:
在调用函数时存活,函数调用完毕后则销毁。
名字的加载、销毁、查找顺序
名称 | 解释 |
---|---|
名称空间的加载 | 内置名称空间==>全局名称空间==>局部名称空间 |
名称空间的销毁 | 局部名称空间==>全局名称空间==>内置名称空间 |
名称查找优先级 | 当前位置向上一层一层查找(当前位置在局部名称空间:局部名称空间==>全局名称空间==>内置名称空间) |
举例:
示范1:
len = '我是全局名称空间中的len'
def index():
len = '我是局部名称空间中的len'
print(len)
index() # 调用函数 函数体就会执行 就会产生局部名称空间
print(len)
示范2:函数嵌套定义
input=111
def f1():
def f2():
input=333
print(input)
input=222
f2()
f1() #==>333
示范3:名称空间的"嵌套"关系是以函数定义阶段为准,与调用位置无关:
def index1():
name = 'jason'
def index2():
age = 18
print(name) # 报错
index1()
index2()
作用域
-
1.什么是作用域 ?
Python 的作用域决定了我们在程序中能否直接使用名称空间中的名称,直接访问的意思是指不需要在名称前添加名称空间的前缀。
-
2.作用域分类:
类别 详情 全局作用域 内置名称空间、全局名称空间。特点:1.全局存活,2.全局有效:被所有函数共享 局部作用域 局部名称空间的名字。特点:1.临时存活,2.局部有效:函数内有效 举例:
x=111 def foo(): print(x,id(x)) def bar(): print(x,id(x)) foo() bar() print(x,id(x)) #执行结果: 111 140723555909904 111 140723555909904 111 140723555909904
global与nonlocal关键字
名称 | 解释 |
---|---|
gloabl关键字 | 局部修改全局不可变类型 |
nonlocal关键字 | 修改函数外层函数包含的名字对应的值 |
举例
global声明时全局名称
示范1:如果在局部想要修改全局的名字对应的值(不可变类型),需要用global
x=111
def func():
global x # 声明x这个名字是全局的名字,不要再造新的名字了
x=222
func()
print(x,id(x))
#执行结果
222 140723555913456
示范2:如果在局部想要改全局的可变类型的名字里的值,不需要global
l=[111,222]
def func():
l.append(333)
func()
print(l)
#执行结果
[111, 222, 333]
nonlocal(了解)
示范3:不可变类型:
x=0
def f1():
x=11
def f2():
nonlocal x
x=22
f2()
print('f1内的x:',x)
f1()#执行结果f1内的x: 22
示范4:可变类型:
def f1():
x=[]
def f2():
x.append(1111)
f2()
print('f1内的x:',x)
f1()
#执行结果
f1内的x: [1111]
函数名对象
类型 | 用法 |
---|---|
用法1 | 函数名可以当做变量名赋值 |
用法2 | 函数名还可以当成函数的实参 |
用法3 | 函数名还可以当做函数的返回值 |
用法4 | 函数名可以作为容器类型的元素 |
举例
示范1:
def index():
print('from function index')
print(index)
res = index # 让res也指向函数体代码
print(res)
res() # index()
#执行结果
<function index at 0x000002278D38F5E0>
<function index at 0x000002278D38F5E0>
from function index
示范2:
def index():
print('from index')
def func(a):
print('from func')
print(a)
a()
func(index)
#执行结果
from func
<function index at 0x0000018498DDF820>
from index
示范3:
def func():
print('from func')
return index # 将函数名当做返回值
def index():
print('from index')
res = func() # res接收函数名
print(res) # 指向的是index函数的内存地址
res() # index()
#执行结果
from func
<function index at 0x0000024EC4C7F700>
from index
示范4:
def index():
print('from index')
l1 = [11, 22, 33, 44, index]
print(l1)
l1[-1]() # index()
#执行结果
[11, 22, 33, 44, <function index at 0x000001430EC4F700>]
from index
函数的嵌套
函数的嵌套:在函数里面还有函数。分为外函数和内函数。
嵌套函数是为函数内部服务的,比如减少代码的重复,想要调用函数,要使用函数名,内函数也一样。如果不用函数名调用内函数,内函数就永远不会执行。
举例
def f1(): #print('in f3')
def f2(): #print('in f1')
def f3(): #print('in f2')
print('in f3')
print('in f2')
f3()
print('in f1')
f2()
f1()
执行结果:
in f1
in f2
in f3
注意
1.函数嵌套时一定要记住函数是先定义再调用
2.当函数只有定义时就可以直接跳过该函数代码段,因为没有调用的函数就相当于该函数没写的效果一样
3.如果不是嵌套关系 那么函数之间就是互不干涉!!!
今日学习时间:
这里统计计划学习的时间
1、 上午8:30~12:30
2、 下午2:30~5:30
3、 晚上6:30~9:30
今日学习产出:
这里统计学习计划的总量
- 1、 技术笔记 1遍
- 2、CSDN 技术博客 1篇
- 3、每日录音,预习明日内容