函数进阶
函数进阶
1、函数对象
函数是第一类对象
(1)函数名是可以被引用的
def index(): print("from index") index() a = index print(a) # 输出结果 <function index at 0x00000208897CB730> 为函数对象的内存地址 a() # 若想要用a引用在后面加()即可执行
(2)函数名可以当做参数来传递
def foo(x, y, z): print(x, y) z() def bar(): print("from bar") foo(1, 2, bar)
(3)函数名可以当做返回值来使用
def index(): print("from index") def func(c): return c # 返回时候如果没有特殊需求,一定不要加括号,加括号就执行 a = func(index) a()
(4)函数名可以被当做容器类型的元素
def func(): print("from func") l1 = [1, "2", func, func()] f = l1[2] print(f)
例子:写一个程序,根据用户输入来执行相应的程序
func_dic = { '1': register, '2': login, '3': shopping, '4': pay } def register(): print('register') def login(): print('login') def shopping(): print('shopping') def pay(): print('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()
2、函数嵌套
(1)函数的嵌套调用:在函数内部调用其他函数
def index(): print("from index") def func(): index() print("from func") func()
(2)函数的嵌套定义
def index(): def home(): print("from home") home() index()
3、名称空间
(1)什么是名称空间
名称空间:存放名字的空间
如果想要访问一个变量值,就必须先访问对应的名称空间,拿到名字和对应的内存地址的保定关系
(2)名称空间的分类
①内置名称空间:
在python解释器中,python提前给的定义好的名字,就是存在内置名称空间
②全局名称空间:
存放于文件级别的变量名字就是全局名称空间:
if语句中的赋值执行之后属于全局名称变量
while循环中的赋值执行之后属于全局名称变量
for循环中的赋值执行之后属于全局名称变量
内部定义的名字执行之后属于全局名称变量
③局部名称空间:
函数内部定义的所有名字都是存放于当前函数的内置名称空间
(3)生命周期:
①内置名称空间
在python解释器启动的时候生效,关闭解释器的时候失效
②局部名称空间
启动当前py文件的时候生效,当前页面代码执行结束失效
③局部名称空间
当调用当前函数时生效,函数体代码执行结束后失效
(4)名称空间的查找顺序
局部:局部 > 全局 > 内置
全局:全局 > 内置 # 内置找不到就报错
x = 1 def index(): print(x) def wrapper(): x = 2 index() wrapper()
默认值参数:
x = 1 def index(arg = x): # 此处的arg=x为默认值参数 print(x) print(arg) x = 2 index()
4、作用域
作用域:起作用的范围
(1)作用域的分类
①全局作用域
全局可以调用的名字就存在于全局作用域
内置名称空间、全局名称空间
②局部作用域
局部可以调用的名字就存放于局部作用域
局部名称空间
(2)global:声明全局变量
def index(): global x # 此处将x从局部变量转化为全局变量 x = 2 print(x) index() print(x) # 在全局下也可以打印x变量
(3)nonlocal:在局部修改上层函数的变量
def index(): x = 1 def func(): nonlocal x # 在此处使用nonlocal可以将上层函数变量修改,上层变量改变,不可用于全局 x = 2 func() print(x) index()