昨日内容补充:
定义函数的三种方式:
1.空函数:快速构建项目框架,是项目框架清晰明了。(应用频率很高)如:
购物车功能 def register(): pass def login(): pass def shopping(): pass def pay(): pass
2.无参函数:
def func(): print('from func')
3.有参函数:
def func(x,y,*args,**kwargs) pass
# 了解知识:
命名关键字参数:在函数定义阶段,写在*与**可变长参数之间的形参。如:
def func(x, y=1, *args, z=3, m, **kwargs): print(x, y) # 1 2 分别一一对应 print(args) # (1, 2, 3, 4, 5, 6, 7, 78, 8, 9, 0) 返回来一个元祖 print(z, m ) # 69 999 print(kwargs) # {'o': 666999, 'l': 999666} 字典的形式 func(1, 2, 1, 2, 3, 4, 5, 6, 7, 78, 8, 9, 0, z=69, m=999, o=666999, l=999666)
今日内容:
函数对象、函数的嵌套调用与定义、名称空间、作用域
函数对象:函数式第一类对象:函数名指向的值可以被当作参数传递
1.函数名可以被传递:相当于将函数名更改了,更改后的函数名起着原函数名相同的作用,仍然指向原函数体代码的内存地址,具有调用函数的功能。
2.函数名可以被当做参数传递给其他函数:func()函数中的函数名func被当作函数index()的实参。
3.函数名可以被当作函数的返回值:下面例子中的函数名index被当作函数func()执行过后的返回值。
4.函数名可以被当作容器类型的参数:
# 详细步骤:检测函数体语句 >>> 执行func()这个函数体 >>> 打印func并返回一个值None >>> print(None) >>> 执行func()这个函数体 >>> 打印func并返回一个值None >>> 打印列表l
函数的嵌套调用
意思就是在函数的内部调用其他函数;
作用:可以将复杂的逻辑简单化,如:
再如:
注:执行(函数my_max(a,b,c,d))内部中的第4/7/10步时候调用函数my_max(x,y),省去了很多步骤。
函数的嵌套定义:应用场景:只写一个函数,用户就可以通过传参的不同控制函数执行不同的功能。
注:第七部赋值的过程是将inner()函数的内存地址赋值给res,相当于将inner赋值给res,此时res就可以直接调用函数inner()了
名称空间:
作用:用来存放变量名,而变量名中有指向变量值得内存地址。
# 要想访问一个变量的值,必须先去名称空间拿到对应的名字,才能够访问到变量的值
名称空间的分类:
1.内置名称空间:存放python解释器提前定义好名字的空间,如len/max/min
2.全局名称空间:It's hard to say. (if/while/for无论嵌套多少层,它们内部所创建的名字都是属于全局空间的)
3.局部名称空间:函数体内创建的名字都属于局部名称空间
三种名称空间的生命周期:
内置名称空间:python解释器启动立马创建,关闭则自动销毁
全局名称空间:运行py文件时候创建,运行结束则自动销毁
局部名称空间:函数被调用的时候创建,函数指向结束立即销毁(动态创建,动态销毁)
*********************************
名称空间的查找顺序:*****************
首先确定自己查找位置!!!!!!!!!!
情况一:站在全局:先全局>>>内置
情况二:站在局部:先局部>>>全局>>>内置
***************************************
作用域:
作用域:
全局作用域:全局有效:内置名称空间、全局名称空间
局部作用域:局部有效:局部名称空间
关键词:global、nonlocal
global:在局部修改全局的不可变类型。(如果想要修改多个,用逗号隔开)如:
注:第五步时候表示修改全局,此时x被赋值为999,username被赋值为egon;这种修改是修改全局,而不是创建局部名称空间
nonlocal:在局部修改局部。(如果想要修改多个,用逗号隔开)如: