一、函数的定义:
1.空函数:可以快速帮助你构建项目框架 使项目架构清晰明了
应用频率非常高
# 购物车的功能,梳理整体的大框架,在依次分布实行各个功能模块 def register():#商品 pass def login(): pass def shopping(): #购物 pass def pay(): pass def fun(): pass
2.无参函数:
def func():
print('from func')
3:有参函数:
def func(x,y,*arg,*kwargs): pass
二、命名关键字参数:在函数定义阶段 写在*与**可变长参数之间的形参
强调:1、在给命名关键字参数传值的时候 只能用关键字为其传值
2、在**args和**kwargs 是命名关键字参数 不是默认值参数和位置参数
def func(x,y,*arges,z=9,m,**kwargs): print(x,y) print(arges) print(z,m) print(kwargs) func(3,5,51,78,78,12,89,10,30,7,9,12,z=78,m=89,l=78,p=56)
关于*rags和*kwards:
函数可以接收调用者传入的任意个数的参数
def func(*args,**kwargs):
print(args) # 按位置传值多余的参数都由args统一接收,保存成一个元组的形式
print(kwargs) # **之后的变量名一字典的形式返回
三、函数对象:
1、函数是一类对象:函数名指向的值可以被当作参数传递
def func(): print('from func') print(id(func)) f=func func() print(f) f() #其实指向的也是函数func指向函数体代码的内存地址
2.函数名可以被当做参数传递给其他函数
def func(): print('from func') def index(args): print(args) args() #函数名被当做关键字来传参 print('from func ') index(func)
3.函数名可以被当做函数的返回值
def index(): print('index') def func(): print('func') return index res = func() #函数名被当做函数的返回值 print(res) res()
4.函数名可以被当做容器类型的参数
def func(): print('func') print(func()) l = [1,2,func,func()] # [1,2,<function func at 0x000001F7D79899D8>,None] print(l)
四、函数的嵌套调用
在函数内部调用其他函数
作用:可以将复杂的逻辑简单化
def index(): print('index') def func(): print('func') return index res=func() #函数的嵌套调用,只要被定义后可以在任何地方调用 print(res) res()
# 被调用后先执行函数内的函数体,没有就网上找,没有就全局找
比较四个值的大小:
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(-45,58,9,93))
五、名称空间:(解释:存放的是变量名与变量值的内存地址得绑定关系的地方)
username='jason'(函数命名的空间,username指向jason指向的内存空间地址,而username在外部也有自己的空间)
代码在运行伊始,创建的存储“变量名与值的关系”的空间叫做全局命名空间,在函数的运行中开辟的临时的空间叫做局部命名空间
命名空间的本质:存放名字与值的绑定关系
命名空间一共分为三种:
全局命名空间 # 创建函数名之前定义的变量名与值的关系,一般放在函数体的开端
局部命名空间 # 在函数运行中也就是函数体内命名的函数叫局部空间
内置命名空间 # 内置命名空间中存放了python解释器为我们提供的名字:input,print,str,list,tuple...
1.全局名称空间:文件级别的代码
x = 1 if 1 ==1 : y = 2 print(y) while True:
x,y,z都会放到全局名称空间
if for while 无论嵌套多少层 它们内部所创建的名字都是全局名称空间的 z = 3
2、局部名称空间:函数体内创建的名字都属于局部名称空间
def outer(): x = 1 ##局部名称 print('outer') def inner(): print('inner') # print(inner) return inner res = outer() # print(res) res()
3.内置名称空间:python解释器提前给你定义好的名字(已经存放到内置名称空间中了)
len
max
min
生命周期:
内置名称空间:只要python解释器已启动立马创建 关闭python解释器的时候内置名称空间自动销毁
全局名称空间:只要你右键运行py文件会自动创建 py文件程序运行结束自动销毁
局部名称空间:函数被调用的时候自动创建 函数指向结束立即销毁(动态创建动态销毁)
三种命名空间之间的加载与取值顺序:
加载顺序:内置命名空间(程序运行前加载)->全局命名空间(程序运行中:从上到下加载)->局部命名空间(程序运行中:调用时才加载)
取值:在局部调用:局部命名空间->全局命名空间->内置命名空间
在全局调用:全局命名空间->内置命名空间
小范围的可以用大范围的
但是大范围的不能用小范围的
范围从大到小
在小范围内,如果要用一个变量,是当前这个小范围有的,就用自己的
如果在小范围内没有,就用上一级的,上一级没有就用上上一级的,以此类推。
如果都没有,报错
x = 111 def f1(): x = 222 def f2(): x = 333 def f3(): # x = 444 def f4(): # x = 555 print(x) x = 777 # 纯粹为了教学演示 f4() x = 777 # 纯粹为了教学演示 f3() f2() f1()
函数在定义阶段查找名字的顺序就已经固定了 不会因为函数的调用位置变化而改变
def func(): x=1 def index(): print(x) return index res=func() x=963 res()
作用域
作用域就是作用范围,按照生效范围可以分为全局作用域和局部作用域。
全局作用域:包含内置名称空间、全局名称空间,在整个文件的任意位置都能被引用、全局有效
局部作用域:局部名称空间,只能在局部范围内生效