一:函数对象:函数是第一类对象,即函数可以当作数据传递
=================================
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