1.定义函数的三种方式
1.空函数:可以快速搭建框架,使项目架构清晰明了
# 购物车功能 def resgister(): # 注册功能 pass def login(): # 登录功能 pass def shopping(): # 购物功能 pass def pay(): # 支付功能 pass def tranfser(): # 充值功能 pass
2.无参函数
def func(): print('这是无参函数')
3.有参函数
def fun1(x,y,*args,**kwargs): print('这是有参函数')
2.命名关键字(了解)
命名关键字参数:在函数定义阶段,写在*和**可变长参数之间的形参
def func(x,y=1,*args,z=3,m,**kwargs): print(x,y) print(args) print(z,m) print(kwargs) func(1,2,1,2,3,4,5,6,7,78,8,9,0,z=69,m=999,o=666999,l = 999666)
这个函数中,当我们给该函数形参传值时,z和m只能用关键字为他们传值
其中z和m就是命名关键字,不是默认值参数和位置参数
2.函数对象
函数是第一类对象:函数可以被当做数据传递
1.函数名可以被引用
def func(x): print(x) print(func) # 这是func这个函数所存的地址空间 print(id(func)) # 这个函数名的地址空间 f = func # 把func这个函数名赋值给一个新的变量名 f(123456) # 其实这个指向的就是func这个函数
2.函数名可以被当做参数传递给其他函数
def func(): print('这是func') def index(args): args() print(args) print('这是index') # index(1) # 不能被调用 index(func)
代码运行顺序
3.返回值可以是函数名
def func(): print('这是func') def index(): print('这是index') return func # 把函数名当做返回值 res = index() # 将返回值赋值给res print(res) # 打印这个返回值 res() # 加了括号之后就执行了函数体,相当于func()
4.函数名可以被当做容器类型的参数
def func(): print('这是func') l = [1,'2',3,func,func()] # func()函数名加括号一旦遇到就直接执行函数体代码,所以会打印函数体内容 print(l) # func是函数的地址空间,func()返回的值是None
3.函数的嵌套调用
在函数的内部嵌套其他函数,可以使复杂的逻辑简单化
如求两个数的大小
def my_max(x,y): if x > y: return x return y print(my_max(52,65))
这时候需要求四个数的大小,就需要用到嵌套的方法
def my_max4(a,b,c,d): res = my_max(a,b) res1 = my_max(res,c) res2 = my_max(res1,d) return res2 res3 = my_max4(64,89,335,585) print(res3)
在四个数求大小的函数里嵌套进两个数求大小,能简化逻辑与代码
4.函数的嵌套定义
一个函数能通过传参的不同控制函数执行不同的功能
def func(): print('这是func') def index(): print('这是index') return index res = func() res()
5.名称空间
什么是名称空间
存放的是变量名和变量值的内存地址绑定关系的地方,想要访问变量值,必须先去名称空间拿到相应的名字,才能访问变量值
名称空间的分类
1.内置名称空间:python解释器提前定义好的名字,已经存放在内置名称空间中了
如:len,max,min,print
2.全局名称空间:文件级别的代码
如:x = 1 , if xxx: y = 2 , while 1 : z = 3,
这里的x,y,z都存放在全局名称空间里
if,while,for中创建的名字都会存放在全局名称空间内
3.局部名称空间:函数体内创建的名字都属于局部名称空间
在函数体内创建的
名称空间的生命周期
1.内置名称空间:只要python解释器启动就立马创建 >>> 关闭python解释器内置名称空间就销毁
2.全局名称空间:运行py文件是就会自动创建 >>> py文件运行结束自动销毁
3.局部名称空间:函数被调用的时候自动创建(动态创建) >>> 函数指向结束自动销毁(动态销毁)
6.名称空间的查找顺序
用len做例子
len # 这是内置名称空间 第一个len print(len) # len = '这是全局名称空间' # 第二个len def func(): # len = '这是局部名称空间' # 第三个len return len print(len) # 站在全局的位置找len会找全局名称空间的len res = func() # 运行函数体代码,站在局部的位置找len会找局部名称空间的len print(res)
当三个名称空间内都有len,即三个len都没被注释时
当局部名称空间没有len时,即第三个len被注销时
当局部名称空间和全局名称空间都没有len时,即第二个和第三个len都被注销时
名字查找的顺序 :
需要先确定当前查找时所在的位置
1.站在全局:全局 >>> 内置
2.站在局部:局部 >>> 全局 >>> 内置
函数嵌套的名字查找顺序
x = 8 def func(): print(x) def index(): x = 10 print(x) return index x = 100 res = func() res()
这里的执行顺序是这样的
注意:
函数在定义阶段查找名字的顺序就已经固定了 不会因为函数的调用位置变化而改变(******)
7.作用域
全局作用域
全局有效:内置名称空间 全局名称空间
局部作用域
局部有效:局部名称空间
修改变量
global:局部修改全局,如果想修改多个,逗号隔开
nonlocal:局部修改局部,如果想修改多个,逗号隔开
局部修改全局
name = 'sxc' age = 18 print(name, age) def info(): global name,age name = 'zzj' age = 19 print(name,age) info()
局部修改局部
def info1(): username = 'sxc' pwd = 123 print(username, pwd) def index(): nonlocal username,pwd username = 'zzj' pwd = 'zzj123' print(username,pwd) index() info1()
10