函数是第一类对象,即函数可以被当做数据处理。
def func(): print('fron func') print(func)
<function func at 0x0000023B491BF5E8>
函数对象的四大功能
1、引用
name = 'tank' dsb = name def index(): print('from index') a = index a()
2、函数名可以当做参数传递
def foo(x, y, func): print(x, y) func() def bar(): print('from bar') foo(1, 2, bar)
3、函数名可以当做返回值使用
传参的时候没有特殊需求一定不要加括号,加括号当场执行
def index(): print("from index") def func(a): return a a = func(index) print(a) a()
4、函数名可以被当做容器类型的元素
def func(): print('from func') l1 = [1, '2', func, func()] f = l1[2] print(f)
练习
def register(): print('register') def login(): print('login') def shopping(): print('shopping') def pay(): print('pay') func_dic = { '1': register, '2': login, '3': shopping, '4': pay } def main(): while True: print(""" 1、注册 2、登录 3、购物 4、付款 5、退出 """) choice = input("请输入对应的编号:").strip() if choice == '5': break if choice not in func_dic: continue else: func_dic[choice]() main()
函数的嵌套定义
函数内部定义的函数,无法在函数外部使用内部定义的函数。
def index(): print('from index') def func(): index() print('from func') 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))
函数的嵌套定义
def index(): def home(): print("from home") home() index()
什么是名称空间?
存放名字的空间
名称空间的分类:
1、内置名称空间:
python提前给你的定义完的名字,就是存在内置名称空间
2、全局名称空间 :
存放于文件级别的名字,就是全局名称空间
if while for 内部定义的名字执行之后都存放于全局名称空间
3、局部名称空间
函数内部定义的所有名字都是存放与当前函数的内置名称空间
生命周期:
1、内置名称空间
在python解释器启动的时候生效,关闭解释器的时候失效
2、全局名称空间
当你启动当前这个py文件的时候生效,当前页面代码执行结束之后失效
3、局部名称空间
当你调用当前函数时生效,函数体最后一行代码执行结束就失效
名称空间的查找顺序:
局部:局部 > 全局 > 内置
全局:全局 > 内置 # 内置再找不到就报错
函数内部使用的名字,在定义阶段已经规定死了,与你的调用位置无关
作用域的分类:
1、全局作用域
全局可以调用的名字就存在于全局作用域
内置名称空间+全局名称空间
2、局部作用域
局部可以调用的名字就存放与局部作用域
局部名称空间
global:声明全局变量(**)
nonlocal:在局部名称空间声明局部变量,在局部修改上层函数的变量()
只有可变类型可以在局部修改外部变量的值 (*)
在局部修改外部函数的变量 x = 1111 def index(): x = 1 def func2(): x = 2 def func(): nonlocal x x = 3 func() print(x) func2() print(x) index() print(x) l1 = [] def index(a): l1.append(a) # print(l1) index(1) print(l1)
# 局部变量的修改无法影响上层,上上层 def index(): x = 1 def index2(): nonlocal x x = 2 index2() print(x) index()