一:函数对象:函数是第一类对象,即函数可以当作数据传递
=================================
1 可以被引用
2 可以当作参数传递
3 返回值可以是函数
4 可以当作容器类型的元素
=================================
1.函数可以被引用
1 def foo():
2 print('from foo')
3 func=foo
4
5 print(foo)
6 print(func)
7 func()
执行结果
<function foo at 0x00000000006FF598>
<function foo at 0x00000000006FF598>
from foo
函数名本身表示的就是内存地址,可以被其他对象引用
2.被当做参数传递

def foo():
print('from foo')
def bar(func):
print(func)
func()
bar(foo)
执行结果
<function foo at 0x000000000082F598>
from foo
3.返回值可以是函数
def foo():
print('from foo')
def bar(func):
return func
f=bar(foo)
print(f)
f()
执行结果
<function foo at 0x0000000000A6F598>
from foo
bar(foo)返回的就是foo本身,所有f和foo都指向同一块内存地址
4.可以当做容器类型的元素

def select(sql):
print('==========select')
def delete(sql):
print('==========delete')
def insert(sql):
print('==========insert')
def update(sql):
print('==========update')
func_dict={
'select':select,
'update':update,
'insert':insert,
'delete':delete
}
while True:
in_sql=input('sql>').strip()
sql=in_sql.split()
cmd=sql[0]
if cmd in func_dict:
func_dict[cmd](sql)
else:
print('error')
二、函数嵌套
1.函数的嵌套定义

def f1():
def f2():
print('from f2')
def f3():
print('from f3')
f3()
f2()
f1()
2.函数的嵌套调用

def max2(x,y):
return x if x > y else y
def max4(a,b,c,d):
res1=max2(a,b)
res2=max2(res1,c)
res3=max2(res2,d)
return res3
print(max4(10,99,31,22))
三、名称空间与作用域
(一)名称空间包含有三种
1.内置名称空间
2.全局名称空间
3.局部名称空间
引:名字(名称)的定义
变量
name='larry'
函数
def func():
pass
类
class human:
pass
1.内置名称空间
随着解释器的启动而产生
import builtins
for i in dir(builtins):
print(i)
2.全局名称空间
文件的执行会产生全局名称空间,指的是文件级别定义的名字都会放入该空间
3.局部名称空间
调用函数时会产生局部名称空间,只在函数调用时临时绑定,调用结束解绑定

x=10000
def func():
x=1
print(x)
func()
print(x)
执行结果
1
10000
(二)作用域
1.全局作用域:内置名称空间,全局名称空间
2.局部作用域:局部名称空间
名字的查找顺序:局部名称空间---》全局名层空间---》内置名称空间

x=1
def func():
x=2
print(x)
sum=123123
print(sum)
func()
执行结果
2
123123
#查看全局作用域内的名字:gloabls()
#查看局局作用域内的名字:locals()

x=1000
def func():
x=2
print(globals())
print(locals())
print(globals() is locals())
执行结果
{'__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0000000000556C18>, '__spec__': None, '__package__': None, '__file__': 'C:/Users/larry/PycharmProjects/python/day04/fun_exc.py', '__cached__': None, '__name__': '__main__', '__doc__': None, 'func': <function func at 0x000000000071D6A8>, 'x': 1000, '__builtins__': <module 'builtins' (built-in)>}
{'__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0000000000556C18>, '__spec__': None, '__package__': None, '__file__': 'C:/Users/larry/PycharmProjects/python/day04/fun_exc.py', '__cached__': None, '__name__': '__main__', '__doc__': None, 'func': <function func at 0x000000000071D6A8>, 'x': 1000, '__builtins__': <module 'builtins' (built-in)>}
True

x=1000
def func():
x=2
print(globals())
print(locals())
print(globals() is locals())
func()
执行结果
{'func': <function func at 0x000000000102D6A8>, '__name__': '__main__', '__doc__': None, '__package__': None, '__spec__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x00000000006B6C18>, '__file__': 'C:/Users/larry/PycharmProjects/python/day04/fun_exc.py', '__cached__': None, '__builtins__': <module 'builtins' (built-in)>, 'x': 1000}
{'x': 2}
False
#全局作用域:全局有效,在任何位置都能被访问到,除非del删掉,否则会一直存活到文件执行完毕
#局部作用域的名字:局部有效,只能在局部范围调用,只在函数调用时才有效,调用结束就失效

x=1
def f1():
print(x)
def foo():
print(x)
def f(x):
x=4
def f2():
x=3
def f3():
x=2
print(x)
f3()
f2()
f(4)
函数调用时局部有效
来源:https://www.cnblogs.com/geek-ace/p/6906569.html
