函数对象
函数是第一类对象
1、函数名是可以被引用
name = 'tank'
dsb = name
def index():
print('from index')
a = index
a()
from index
2、函数名可以当做参数传递
def foo(x, y, func):
print(x, y)
func()
def bar():
print('from bar')
foo(1, 2, bar)
1 2
from bar
3、函数名可以当作返回值使用
传参的时候没有特殊需求,一定不要加括号,加括号当场就执行了
def index():
print("from index")
def func(a):
return a
a = func(index)
a()
from index
4、函数名可以被当作容器类型的元素
def func():
print('from func')
l1 = [1, '2', func, func()]
f = l1[2]
print(f)
from func
<function func at 0x00000216CF937288>
函数的嵌套调用:在函数内调用函数
def index():
print('from index')
def func():
index()
print('from func')
func()
from index
from func
def func1(x, y):
if x > y:
return x
else:
return y
print(func1(1, 2))
def func2(x, y, z, a):
result = func1(x, y)
result = func1(result, z)
result = func1(result, a)
return result
print(func2(1, 200000, 3, 1000))
2
200000
函数的嵌套定义:
def index():
def home():
print("from home")
home()
index()
from home
名称空间
什么是名称空间?
存放名字的空间
如果你想访问一个变量值,必须先访问对应的名称空间,拿到名字和对应的内存地址的绑定关系
名称空间的分类
1、内置名称空间:
python提前给你定义完的名字,就是存在内置名称空间
print(print)
print(input)
<built-in function print>
<built-in function input>
2、全局名称空间
存放于文件级别的名字,就是全局名称空间
if while for 内部定义的名字执行之后都存放于全局名称空间
x = 1
print(x)
1
x = 1
print(x)
def index():
pass
print(index)
if 1 == 1:
x = 1
print(x)
1
<function index at 0x0000028DEC9E75E8>
1
while True:
a = 2
break
print(a)
for i in range(2):
print(i)
print(i)
def index():
a = 1
index()
print(a)
2
0
1
1
2
3、局部名称空间
def index():
a = 1
print(a)
Traceback (most recent call last):
File "C:/Users/ever/PycharmProjects/untitled/oldboy/正式开班/day10/test.py", line 119, in <module>
print(a)
NameError: name 'a' is not defined
函数内部定义的所有名字都是存放与当前函数的内置名称空间
生命周期:
1、内置名称空间
在python解释器启动的时候生效,关闭解释器的时候失效
2、全局名称空间
当你启动当前这个py文件的时候生效,当前页面代码执行结束之后失效
3、局部名称空间
当你调用当前函数时生效,函数体最后一行代码执行结束就失效
名称空间的查找顺序:
局部: 局部 > 全局 > 内置
全局: 全局 > 内置 # 内置再找不到就报错
函数内部使用的名字,在定义阶段已经规定死了,与你的调用位置无关
x = 111
def func1():
x = 222
def func2():
x = 333
def func3():
# x = 444
def func4():
# x = 555
print(x)
print('from func4')
func4()
func3()
func2()
func1()
333
from func4
作用域
作用域的分类:
1、全局作用域
全局可以调用的名字就存在于全局作用域
内置名称空间+全局名称空间
2、局部作用域
局部可以调用的名字就存放于局部作用域
局部名称空间
global:声明全局变量(***)
x = 1
def index():
print(x)
index()
1
在局部加一个变量看可以打印不(发现不能打印)
# x = 1
def index():
x = 2
print(x)
index()
print(x)
File "C:/Users/ever/PycharmProjects/untitled/oldboy/正式开班/day10/test.py", line 154, in index
print(x)
NameError: name 'x' is not defined
可以用global来声明全局变量
# x = 1
def index():
global x
x = 2
print(x)
index()
print(x)
2
2
nonlocal:在局部名称空间声明局部变量,在局部修改上层函数的变量(*)
def index():
x = 1
def func():
x = 2
func()
print(x)
index()
1
我们现在注释x = 1,看局部变量的是否打印(发现不可以报错x没有被定义)
def index():
# x = 1
def func():
x = 2
func()
print(x)
index()
File "C:/Users/ever/PycharmProjects/untitled/oldboy/正式开班/day10/test.py", line 170, in index
print(x)
NameError: name 'x' is not defined
我们可以用nonlocal来解决
def index():
x = 1
def func():
nonlocal x
x = 2
func()
print(x)
index()
2
只有可变类型可以在局部修改外部变量的值