目录
笔者前言
面向对象(Object Oriented Programming)作为一种更优秀的编程思想和面向过程(Procedure Oriented Programming)相比,我们实际中会发现抽象程度更高,做了更加完善的封装,而函数式编程(Functional Programming)也是能补充 OOP 的方案。
一、位置参数的函数
-
形参格式:参数名前无前缀
-
调用函数:函数名(参数值1,参数值2,…) or 函数名(参数名1=值1,参数名2=值2,…)
平时大多数用的都是按位置传参;除了不定长参数,关键字参数之外的函数,就是位置参数的函数,或者叫普通参数的函数,一个位置只能传递一个参数值。
# 格式如下
def func(opt_paras):
...
# 实例如下
def func(a,b,c):
print(a,b,c)
func(1,2,3) #标准调用方式
func(a=1,b=2,c=3) #关键字调用方式
# 输出如下
1 2 3
1 2 3
二、不定长参数的函数
-
形参格式:*参数名
-
调用函数:函数名(参数1,参数2,…,参数n) #只能标准调用方式
# 函数格式如下
def func(*params):
...
# 调用格式如下
func(arg1,arg2,...,argN)
-
用法
不定长参数的函数,要求一个位置传递任意多个参数值,
*params
会自动收集传入的多个参数,在函数内部作为一个元组对象使用。
# 实例代码如下:
def func(*params):
print(params)
func([1,2,3,4],'tom', 3)
# 输出代码如下:
([1, 2, 3, 4], 'tom', 3)
三、关键字参数的函数
-
形参格式:**参数名
-
调用函数:函数名(参数1=值1,参数2=值2,…) #只能关键字调用方式
# 函数格式如下
def func(**keywords):
...
# 调用格式如下
func(key1=value1,key2=value2,...)
- 用法
关键字函数,要求一个位置传递任意多个“参数=参数值”,即键值对形式传参,**keywords
会自动收集传入的键值对,在函数内部作为一个字典对象使用。
# 实例代码如下:
def func(**keywords):
print(keywords)
func( key1=1, key2=2, key3=3 ) # 不用关心参数位置
# 输出如下:
{'key1': 1, 'key2': 2, 'key3': 3} # 是一个 dictionary
四、混合参数类型的函数
一个函数同时有3种类型参数,则必须按(位置参数,*不定长参数,**关键字参数)的顺序排列,且不定长参数和关键字参数都只能有一个。
# 实例如下:
def func(x,y,*a,**b):
print(x,y,a,b)
func(1,2,3,4,5,6,a=1,b=2)
#输出如下:
1 2 (3, 4, 5, 6) {'a': 1, 'b': 2}
如图所示
五、内嵌函数与闭包
#格式如下:
def exfunc() #外部函数
x=1
def infunc() #内嵌函数
...
return infunc
【大事】当内嵌函数 infunc()
引用了外部函数 exfunc()
的变量(引用外部函数的参数也算)
【结果】被内嵌函数引用的外部函数变量,称之为自由变量(free variables)
【结果】引用了外部函数变量的内嵌函数,就称为闭包(closures)(当然外部函数返回了内嵌函数的引用)
【敲黑板】
- 桥梁作用:可以通过改变某些外部自由变量的值,来改变闭包内的运行效果;
- 当然了,闭包中使用外部函数的自由变量,直接用即可,没任何毛病;
- 但是并不能通过闭包“直接修改”外部的自由变量的值,要先闭包中声明自由变量为 nolocal,如
nolocal x
- 自由变量将和这个内嵌函数一同存在,即便它已经离开了创造它的环境
- 内嵌函数距离成为闭包函数,相差了一个引用外部函数变量的距离_
#实例代码如下:
def exfunc(a, b):
x=3
def infunc():
return x*a+b;
return infunc
f1= exfunc(4,5)
f2= exfunc(6,7)
print( f1(),f2() )
#输出如下:
17 25
六、lambda 匿名函数
1.匿名函数作为值赋给一个变量
Python 用 lambda
来创建一个匿名的函数,等价于普通函数可以简化书写,一般会与 map,filter 和 sort 方法结合使用,可以在一行代码中完成大量工作。
定义:lambda 参数,参数,...: 一条表达式
调用1:一个变量=lambda 参数,参数,...: 一条表达式 #lambda 函数作为值赋给一个变量
调用2:其他函数(lambda 参数,参数:表达式,其他参数值) #lambda 函数作为参数值传给其他函数
一定注意
- 因为没有函数名称,就只能定义在调用处,即哪里要调用该匿名函数,就在哪里定义该匿名函数;
- 而且不能重复调用,就只能调用这一次。
#定义匿名函数(将lambda 函数作为值,赋值给变量)
variable = lambda arg1,arg2… : expression
#调用匿名函数
variable()
以下是和普通函数的对比
#实例代码如下:
def myfunc(x, y):
return x + y
print (myfunc(1,2)) # 打印调用普通函数结果3
# ———————————————————————————————————————
variable = lambda x, y : x + y
print (variable(1,2)) # 打印调用匿名函数结果3
2.匿名函数作为参数值传给其他函数
更常用的是:把匿名函数作为参数值传递给其他函数。
#实例如下
def fun(para,*paras):
print( para(*paras) ) #这里 para 作为了一个函数使用,所以要传进来一个匿名函数给它
fun(lambda x,y:x**y,2,8)
#输出如下
256
如图所示
七、其他一些简单用法
1.函数设定参数默认值
#实例
def func(a = 1, b = 1):
print("a=",a,"b=",b)
func(3)
#输出
a= 3 b= 1
2.函数返回多个值
#实例
def func(a = 1, b = 2):
return a, b
print(func(666))
#输出
(666, 2)
八、博主原创,手动码字记得收藏点赞哦欢迎评论。
原创手动码字,记得收藏点赞哦欢迎评论。