函数对象(函数名本质)
1.函数名传递,可以被引用 # def name(): # print('what is u name') # jinpan = name # jinpan() 2.可以被当作容器类型的元素 # def name(): # print('my name is jinpan') # # # def my_name(): # str = 'my name is jinpan' # return str # # # list_clutter = [True,(1,),{'teacher':'jason'},name,my_name,name(),my_name()] # print(list_clutter) 3.函数名作为参数传入并调用 # def jinpan(): # print('my name is jinpan ') # # def name(jipan): # print('what is u name') # jinpan() # print(jinpan) # print(id(jipan)) # # # res = jinpan # name(res) 4.函数名作为返回值返回 # 返回自己例子 # def name(): # print('what is u name') # return name # # res = name() # res() # 返回其他函数例子 # def jinpan(): # print('hello my name is jinpan') # # # def name(): # print('what is u name') # return jinpan # # res = name() # res()
函数的嵌套
# 在函数内部调用其他函数
# 可以将复杂的逻辑简单化
# def index():
# func()
# print('index')
#
# def func():
# # index()
# print('func')
# index()
# def my_max(x,y):
# if x > y:
# return x
# return y
#
# def my_max4(a,b,c,d):
# res1 = my_max(a,b)
# res2 = my_max(res1,c)
# res3 = my_max(res2,d)
# return res3
# print(my_max4(1,2,10,4))
# def outer():
# x = 1
# print('outer')
# def inner():
# print('inner')
# # print(inner)
# return inner
#
# res = outer()
# # print(res)
# res()
命名空间和调用介绍
命名空间一共分为三种: 全局命名空间 局部命名空间 内置命名空间 内置命名空间中存放了python解释器为我们提供的名字:input,print,str,list,tuple...它们都是我们熟悉的,拿过来就可以用的方法。 全局名称空间:文件级别的代码 局部名称空间:函数体内创建的名字都属于局部名称空间
加载顺序:内置命名空间(程序运行前加载)->全局命名空间(程序运行中:从上到下加载)->局部命名空间(程序运行中:调用时才加载)
取值:
在局部调用:局部命名空间->全局命名空间->内置命名空间
在全局调用:全局命名空间->内置命名空间
命名空间的生命周期:
内置名称空间:只要python解释器已启动立马创建 关闭python解释器的时候内置名称空间自动销毁
全局名称空间:只要你右键运行py文件会自动创建 py文件程序运行结束自动销毁
局部名称空间:函数被调用的时候自动创建 函数指向结束立即销毁(动态创建动态销毁)
命名名称空间的查找原则
函数在定义阶段查找名字的顺序就已经固定了 不会因为函数的调用位置变化而改变(******) 在局部调用:局部命名空间->全局命名空间->内置命名空间 在全局调用:全局命名空间->内置命名空间
函数的作用域
# 全局作用域 # 全局有效: 内置名称空间 全局名称空间 # 局部作用域 # 局部有效 局部作用域 global nonlocal """ 1.在局部修改全局的变量 """ # global 在局部修改全局的不可变数据类型 # x = [] # 因为列表是可变类型 x = 1 # 不可变类型 username = 'jason' def func(): # x.append('嘿嘿嘿') global x,username # 修改全局变量 而不是创建局部名称空间 x = 999 username = 'egon' func() print(x) print(username) # nonlocal 局部修改局部 def func(): x = 1 def index(): nonlocal x x = 2 index() print(x) func() """ global:局部修改全局 如果想修改多个 逗号隔开 nonlocal:局部修局部 如果想修改多个 逗号隔开 """
实例+个人理解
# 函数内定义函数应用场景
""" 写一个函数 该函数用户可以通过传参的不同控制函数执行不同的功能 """ def all_func(type): def register(): print('register...') def login(): print('login....') def shopping(): print('shopping...') if type == '1': register() elif type == '2': login() elif type == '3': shopping() else: print('type value error') while True: choose = input('input 1~3 : int >>>>:') all_func(choose)