一 、定义函数的三种方式
1.空函数:可以快速帮助你构建项目框架,使项目框架清晰明了,应用频率非常高。
def register(): pass def login(): pass def shopping(): pass def pay(): pass def func(): pass
2.无参函数:函数名括号内没有参数
def func(): print('from func') # 无参函数
3.有参函数:函数名括号内有参数
def func1(x,y,*args,**kwargs): #有参函数 pass
二、函数对象
函数是第一类对象:函数名指向的值可以被当中的参数传递
1、函数名可以被传
def func(): print('from func') print('func') print(id(func)) f=func #函数名可以被传递 func() print(f) f()
2.函数名可以被当作参数传递给其他函数
def func(): print('from func') def index(args): print(args) args() print('from index') # index(1) index(func)
3.函数名可以被当作函数的返回值
def index(): print('index') def func(): print('func') return index res = func() print(res)#函数名可以被当作函数的返回值
4.函数名可以被当作容器类型的参数
def func(): print('func') print(func()) l =[1,2,func,func()] print(l) # 函数名可以当做容器类型的参数
三、函数的嵌套调用
作用:在函数内部调用其他函数
可以将复杂的逻辑简单化
def my_max(a,b,): if a >b : return a return b def my_max4(a,b,c,d): #比较四个数的大小 res = my_max(a,b) res1 = my_max(res,c) res2 = my_max(res1,d) return res2 print(my_max4(1,2,33,23))
定义:写一个函数,该函数用户可以通过传参的不同控制函数执行不同的功能
def outer(): x = 1 print('outer') def inner(): print('inner') return inner res = outer() print(res)
四、名称空间
定义 :
存放的是变量名和变量值的内存地址绑定关系的地方,也就是放名称的地方。
要想访问一个变量的值,必须先去名称空间中拿到对应的名字才能访问变量的值。
分类:
1.内置名称空间:python解释器提前给你定义好的名字(已经存放到内置名称空间中了)
2.全局名称空间:文件级别的代码
3.局部名称空间:函数体内创建的名字都属于局部名称空间
x = 1 if 1 ==1 : y = 2 # print(y) # while True: # z = 3 for i in [1,2,3]: print(i) print(i) def func(): username = 'jason' print(x) func()
生命周期:
内置名称空间:
只要python解释器已启动立马创建
关闭python解释器的时候内置名称空间自动销毁
全局名称空间:
只要你右键运行py文件会自动创建
py文件程序运行结束自动销毁
局部名称空间:
函数被调用的时候自动创建
函数指向结束立即销毁
五、名称空间的查找顺序
名称的查找:
1.需要先确定你当前在哪
2.站在全局: 全局>>>>内置
3.站在局部:局部>>>>全局>>>>内置
#返回的是1
def func(): x = 1 def index(): print(x) # 获取全局找x return index res = func() x = 999 res()
"""
函数在定义阶段查找名字的顺序就已经固定了 不会因为函数的调用位置变化而改变(******)
"""
x=111 def outer(): def inner(): print('from inner',x) #x返回的是222,因为222覆盖了111 return inner f=outer() x = 222 f()
x=111 def outer(): def inner(): print('from inner',x) # 返回的是111 return inner f=outer() def func(): x=333 f() func()
六、作用域
分类:
全局作用域:内置名称空间 全局名称空间
局部作用域: 局部作用域
1.global 局部修改全局的变量
global 在局部修改全局的不可变类型
x = 1 # 不可变类型 username = 'jason' def func(): # x.append('嘿嘿嘿') global x,username # 修改全局变量 而不是创建局部名称空间 x = 999 username = 'egon' func() print(x) print(username)
2.nonlocal 局部修改局部
def func(): x = 1 def index(): nonlocal x x = 2 index() print(x) func()
总结:global: 局部修改全局 如果想修改多个 逗号隔开
nonlocal: 局部修局部 如果想修改多个 逗号隔开