函数
一.函数优点
#函数的优点: 1.减少代码的冗余 2.是代码结构更加的清晰 3.方便功能的扩展、便于维护
二.函数分类
#函数的分类: 1.内置函数 Python解释器已经为我们定义好的,开箱即用的函数。例如,max,len,sum... 2.自定义函数 用户自己通过自定义创建的函数,更多的是一种定制化的函数
三.函数定义
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
定义函数的三种形式: 1.无参数函数:一般都是一些简单的交互或者打印,不需要进一步的处理。 2.有参函数:一般需要传入参数,然后在代码逻辑里边进行进一步的处理。 3.空函数:使用pass站位。 #1.无参函数: def foo(): print('from foo') foo() #2.有参函数: def foo(x,y): print(x + y) foo(1,2) #3.空函数:用于展示程序的体系结构。 def foo(): pass #函数的三种调用形式 1.直接加括号调用:foo() 2.在表达式中调用:3*len('你好') 3.作为另外一个函数的参数形式的调用:range(len('hello')) '''
四.函数定义的三种形式
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
定义函数的三种形式: 1.无参数函数:一般都是一些简单的交互或者打印,不需要进一步的处理。 2.有参函数:一般需要传入参数,然后在代码逻辑里边进行进一步的处理。 3.空函数:使用pass站位。 #1.无参函数: def foo(): print('from foo') foo() #2.有参函数: def foo(x,y): print(x + y) foo(1,2) #3.空函数:用于展示程序的体系结构。 def foo(): pass
五.函数的返回值
#函数的返回值:return 1.无返回值:无返回值的函数默认也是有返回值的,为:None 2.一个返回值,返回一个值。 3.多个返回值,返回多个值,多个值之间用逗号分隔,返回的结果是个元组。
六.函数参数详解
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
''' #函数的参数: 形参:形参就是变量名,在定义函数的时候出现的参数。 实参:实参就是变量值,在函数调用的时间对应传入的参数。 形参:位置参数,默认参数。 实参:位置参数,关键字参数。 位置参数: 形参位置参数:必须被传值,一个不能多,一个不能少。 实参位置参数:按照位置给形参传值。 默认参数: 可以传值,可以不传值。 默认参数必须放到位置参数后边 通常默认参数必须定义为不可变参数。 关键字参数:实参中 key = values的形式。 1.必须放到位置参数右边 2.不需要按照位置给形参传值。 3.对同一个形参不能重复传值。 可变长参数:实参的个数不固定 指形参可以接收来自实参的不定个数的参数 *args用于接收溢出的位置参数 **kwargs 用于接收溢出的关键字参数 例如: #== == == == == =*args == == == == == = def foo(x, y, *args):#形参位置的*args中的'*'号会接收多余的位置参数并放入元组然后赋值给args,args=(3,4,5) print(x, y) print(args) foo(1, 2, 3, 4, 5) def foo(x, y, *args): print(x, y) print(args) foo(1, 2, *[3, 4, 5])#实参中的"*"号会先打散所有元素,变成一般的位置参数,变成(1,2,3,4,5) def foo(x, y, z): print(x, y, z) foo(*[1, 2, 3]) #== == == == == = ** kwargs == == == == == = def foo(x, y, **kwargs):#形参中的"**"会接收溢出的关键字参数并转换成字典形式,然后赋值给kwargs.变成了(x,y,{a:1,b:2,c:3}) print(x, y) print(kwargs) foo(1, y=2, a=1, b=2, c=3) def foo(x, y, **kwargs): print(x, y) print(kwargs) foo(1, y=2, **{'a': 1, 'b': 2, 'c': 3})#实参中的"**"号会首先打散后边的字典,变成一般的关键字参数。 def foo(x, y, z): print(x, y, z) foo(**{'z': 1, 'x': 2, 'y': 3}) #== == == == == =*args + ** kwargs == == == == == = def foo(x, y): print(x, y) def wrapper(*args, **kwargs): print('====>') foo(*args, **kwargs) 注意:对于上边的这用嵌套函数,两次函数中都用到了*args, **kwargs,这样的话,就相当于把外边传过来的参数原封不动的传给内部参数。 '''
七.函数对象
函数是一种对象,可以用以下几种方式来使用: #1 可以被引用 #2 可以当作参数传递 #3 返回值可以是函数 #3 可以当作容器类型的元素
八.函数嵌套
#函数的嵌套: 1.函数的嵌套定义 def foo(): print('from foo') def bar(): print('from inner bar') 2.函数的嵌套调用 def max(x,y): return x if x > y else y def max4(a,b,c,d): res1=max(a,b) res2=max(res1,c) res3=max(res2,d) return res3 print(max4(1,2,3,4))
九.名称空间和作用域
名称空间定义: 存放名字的地方,x = 1,x是存放到名称空间的,存放的是x和1的绑定关系 名称空间的加载顺序: python test.py #1、python解释器先启动,因而首先加载的是:内置名称空间 #2、执行test.py文件,然后以文件为基础,加载全局名称空间 #3、在执行文件的过程中如果调用函数,则临时产生局部名称空间 名称空间的查找顺序: 局部名称空间--->全局名称空间--->内置名称空间 #需要注意的是:在全局无法查看局部的,在局部可以查看全局的
作用域:
#1、作用域即范围 - 全局范围(内置名称空间与全局名称空间属于该范围):全局存活,全局有效 - 局部范围(局部名称空间属于该范围):临时存活,局部有效 #2、作用域关系是在函数定义阶段就已经固定的,与函数的调用位置无关,如下 x=1 def f1(): def f2(): print(x) return f2 x=100 def f3(func): x=2 func() x=10000 f3(f1()) #3、查看作用域:globals(),locals() LEGB 代表名字查找顺序: locals -> enclosing function -> globals -> __builtins__ locals 是函数内的名字空间,包括局部变量和形参 enclosing 外部嵌套函数的名字空间(闭包中常见) globals 全局变量,函数定义所在模块的名字空间 builtins 内置模块的名字空间
十.闭包函数