函数
一、函数的功能:
1.增加代码的重用性;把代码用函数名装起来后,只需要在调用的地方,代用函数名即可。
2.增加代码的可读性;
二、函数的定义和调用
遵循的原则:先定义、后调用
#基本的格式 #函数的定义 def func(): ‘’‘注释’‘’ print('123') print('2351') return 'aaaa' 函数的调用 func()
函数的返回值,关键字return
1 函数的返回值,是return 后边的内容,可以是一个变量名,也可以是多个。 2 此处需要注意,不管函数体内部有多复杂的运算,只要调用此函数,运算结果就是return 后边的内容。
return 的用法
1.没有返回值 ①函数内部不写return (默认返回None) ②函数最后只写return (返回None,还有结束本函数的作用,不会再执行本函数后边的内容) ③函数最后写return None (一般不用这么写) 2.返回1个值 return xxx 可以返回任意数据类型的值, 3.返回多个值 返回的多个值,如果只能一个变量来接收,会组成一个元祖的形式,也可以用多个变量来接收,有几个返回值,就需要有几个变量名。
函数的参数
分为形式参数(定义时)、实际参数(调用时) 形式参数: 位置参数:调用时必须传参。 默认参数:在定义时写上默认值,调用时,可以不传,则用默认值,如果传参数,则用传入的参数代替默认值。 动态参数: *args 接收位置参数类型的参数,并打包成元祖形式。 **kwargs 接收默认参数,并打包成字典的形式。 顺序:位置参数、*args、默认参数、**kwargs 实际参数: 按位置传参, 按关键字传参, 位置、关键字混用,
下图是老师总结的图,可用来回顾用,感谢美丽的老师~~
函数的进阶知识点
一、命名空间
本质:存放名字与值的绑定关系
内置空间:打开python解释器时,在内存创建的空间,存放了python解释器为我们提供的名字:input,print,str,list,tuple...
全局空间:代码在运行伊始,创建的存储“变量名与值的关系”的空间
局部空间:在函数的运行中开辟的临时的空间叫做局部命名空间
二、作用域
作用域就是作用范围,按照生效范围可以分为全局作用域和局部作用域。
全局作用域:包含内置名称空间、全局名称空间,在整个文件的任意位置都能被引用、全局有效
局部作用域:局部名称空间,只能在局部范围内生效。
用法:小范围的可以调用大范围的,但是不能修改,除非用global、nonlocal关键字。大范围的不能用小范围的。
如果小范围要用一个变量,如果自己的范围内有,就用自己范围的,没有,则想更大一级的范围找,没找到,再去更大一级的范围,都没有,则报错。
1 #作用域示例 2 3 name = 'egon' 4 5 def my_name(): 6 name = 'tom' 7 print('my name is',name) 8 9 my_name() 10 print(name) 11 12 结果是: 13 >>>my name is tom 14 >>>egon
因为函数调用执行的时候,name在自己的局部空间找到了name = ‘tom’,就用自己空间的。在10行中的name,自己的空间是全局,就在全局找到name = 'egon'.
三、函数名的本质——————自己重点需要看
函数名的本质,函数名本质上就是函数的内存地址,类似变量名,例如,x = 1 ,x指向内存中的1的地址。
函数名可以作为参数,返回值(这时候不加括号,加括号是调用!!!)
1 #函数做参数 2 def func1(): 3 print('from func1') 4 5 def func2(fun): 6 fun() 7 print('form func2') 8 9 func2(func1) 10 11 运算结果: 12 >>>from func1 13 >>>form func2 14 15 调用func2时,把func1当成参数传入了。
1 #函数作为返回值 2 3 def func1(): 4 def func2(): 5 print('form func2') 6 return func2 7 8 res = func1() 9 print(res) 10 11 >>><function func1.<locals>.func2 at 0x000001C9637BC9D8> 12 13 返回func2函数在内存中的地址,
四、闭包(掌握装饰器的必备知识)
定义:1.在函数内部定义的函数;
2.内部函数包含对外部作用域而非全剧作用域变量的引用
#定义一个闭包函数 def outer(): name = 'tom' def inner(): print('my name is',name) #inner 函数满足闭包的两个要求,故是闭包函数。
五、装饰器
应用场景:为已经定义好的函数,增加额外的功能,但是不修改原来函数的源代码,并且不改变原函数的调用方式。
装饰器的功能是将被装饰的函数当作参数传递给装饰器函数,并返回包装后的被装饰的函数”。
##装饰器格式 以及执行顺序 def wrapper(func): 顺序1 def inner(*args,**kwargs):顺序5 ret = func() 顺序7 return ret 顺序10 return inner 顺序3 @wrapper #本质是 func() 顺序4 = wrapper(func)顺序2 def func(a,b): c = a+b 顺序8 return c 顺序9 res = func(1,2) #调用函数 顺序6 本质是调用inner函数,传入的位置参数,传递到了inner函数的args中,