函数(嵌套、名称空间及作用域)

昨日内容补充:

定义函数的三种方式:

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:在局部修改局部。(如果想要修改多个,用逗号隔开)如:

原文地址:https://www.cnblogs.com/pupy/p/11164777.html