函数嵌套和作用域
# 1. 函数的嵌套调用
在调用一个函数的过程中,又调用了另一个函数
def bar():
print('from nbar')
def foo():
print('from foo')
bar()
foo()
输出:
from foo
from nbar
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
函数的嵌套定义:在一个函数的内部,又定义另一个函数
def f1():
x=1
def f2():
print('from f2')
f2()
f1()
1
2
3
4
5
6
7
2
3
4
5
6
7
# 2. 名称空间
存放名字的地方,准确的说名称空间是存放名字与变量值绑定关系的地方
**内置名称空间:**在python解释器启动时产生,存放一些python内置的名字
**全局名称空间:**在执行文件时产生,存放文件级别定义的名字
**局部名称空间:**在执行文件的过程中,如果调用了函数,则会产生该函数的局部名称空间,用来存放该函数内定义的名字,该名字在函数调用时生效,在函数调用结束时失效
x=1 #全局名称空间
def func():
y=2 #局部名称空间
def f1():pass
print
import os #内置名称空间
class Foo:
pass
del x
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
加载顺序: 内置---》全局---》局部
查找顺序: 局部---》全局---》内置
# 3. 作用域
作用域的范围
**全局作用域:**全局存活,全局有效 globals()
**局部作用域:**临时存活,局部有效 locals()
x=11111111111111111111111111111111111111111111
def f1():
x=1
y=2
def f2():pass
# print(locals())
print(globals()) #globals返回的是一个字典类型的全局范文
f1()
print(locals() is globals()) #返回布尔值True,局部包含在全局中
# print(locals())
#
# print(dir(globals()['__builtins__'])) #dir查看globals模块下包含内容
x=1
def f1():
global x #在局部中修改全局的变量
x=2
f1()
print(x)
l=[]
def f2():
l.append('f2')
f2()
print(l)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
globals的使用:
- 针对不可变数据类型(字符串等),在局部中需要使用globals进行修改
- 针对可变数据类型(列表、字典等),不用使用globals
nonlocal的使用:
- nonlocal在局部中使用,能够跨局部使用,但不能修改全局
x=0
def f1():
# x=1
def f2():
# x=2
def f3():
# global x
nonlocal x
x=3
f3()
# print(x)
f2()
print(x)
f1()
print(x)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
作用域关系,在函数定义时就已经固定,于调用位置无关,在调用函数时,必须回到函数原来定义的位置去找作用域关系
小范围的可以用大范围的,但是大范围的不能用小范围的
范围从大到小(如图):
如果在小范围内,要用一个变量,是当前这个小范围有的,就用自己的
如果在小范围内没有,就用上一级的,上一级没有的,就用上上级的,以此类推
如果都没有,报错
# 4. 闭包函数
什么是闭包函数?
- 定义在函数内部的函数
- 包含对外部作用域名字的引用,而不是对全局作用域名字的引用,那么该内部函数就称为闭包函数
#闭包函数的应用:惰性计算
import requests #pip3 install requests
# def get(url):
# return requests.get(url).text
#
# print(get('https://www.python.org')) #为get函数传入参数
# def index(url):
# # url='https://www.python.org'
# def get(): #以闭包的形式给函数定义一个状态
# # return requests.get(url).text
# print(requests.get(url).text)
#
# return get
#
# python_web=index('https://www.python.org') # baidu_web=index('https://www.baidu.com')
# python_web()
# baidu_web()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 5. 三元运算
if 条件 成立的结果
if 条件 else 条件不成立的结果
例:
a=20
b=10
c=a if a>b else b
print(c)
1
2
3
4
2
3
4
上次更新: 2023/07/05, 16:57:02