函数对象

函数是第一类对象

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
只有可变类型可以在局部修改外部变量的值
 

posted on 2019-11-11 16:14  Everuse  阅读(129)  评论(0编辑  收藏  举报

导航