Python 参数类型,闭包函数,匿名函数等多种函数的总结分析

笔者前言

面向对象(Object Oriented Programming)作为一种更优秀的编程思想和面向过程(Procedure Oriented Programming)相比,我们实际中会发现抽象程度更高,做了更加完善的封装,而函数式编程(Functional Programming)也是能补充 OOP 的方案。

image-20200801025401727

一、位置参数的函数

  • 形参格式:参数名前无前缀

  • 调用函数:函数名(参数值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}

如图所示

image-20200801021919269

五、内嵌函数与闭包

#格式如下:
def exfunc()	#外部函数
	x=1
	def infunc()  #内嵌函数
    	...
  	return infunc

【大事】当内嵌函数 infunc() 引用了外部函数 exfunc() 的变量(引用外部函数的参数也算)

【结果】被内嵌函数引用的外部函数变量,称之为自由变量(free variables)

【结果】引用了外部函数变量的内嵌函数,就称为闭包(closures)(当然外部函数返回了内嵌函数的引用)

【敲黑板】

  1. 桥梁作用:可以通过改变某些外部自由变量的值,来改变闭包内的运行效果;
  2. 当然了,闭包中使用外部函数的自由变量,直接用即可,没任何毛病;
  3. 但是并不能通过闭包“直接修改”外部的自由变量的值,要先闭包中声明自由变量为 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

image-20200801020236763

六、lambda 匿名函数

1.匿名函数作为值赋给一个变量

Python 用 lambda 来创建一个匿名的函数,等价于普通函数可以简化书写,一般会与 map,filter 和 sort 方法结合使用,可以在一行代码中完成大量工作。

定义:lambda 参数,参数,...: 一条表达式
调用1:一个变量=lambda 参数,参数,...: 一条表达式   #lambda 函数作为值赋给一个变量
调用2:其他函数(lambda 参数,参数:表达式,其他参数值) #lambda 函数作为参数值传给其他函数

一定注意

  1. 因为没有函数名称,就只能定义在调用处,即哪里要调用该匿名函数,就在哪里定义该匿名函数;
  2. 而且不能重复调用,就只能调用这一次。
#定义匿名函数(将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

image-20200801021317206

2.匿名函数作为参数值传给其他函数

更常用的是:把匿名函数作为参数值传递给其他函数。

#实例如下
def fun(para,*paras):
    print( para(*paras)	) #这里 para 作为了一个函数使用,所以要传进来一个匿名函数给它
fun(lambda x,y:x**y,2,8)
#输出如下
256

如图所示
image-20200801180058611

七、其他一些简单用法

1.函数设定参数默认值
#实例
def  func(a = 1, b = 1):
    print("a=",a,"b=",b)
func(3)
#输出
a= 3 b= 1

image-20200801022657421

2.函数返回多个值
#实例
def  func(a = 1, b = 2):
    return a, b
print(func(666))
#输出
(666, 2)

image-20200801023023405

八、博主原创,手动码字记得收藏点赞哦欢迎评论。

原创手动码字,记得收藏点赞哦欢迎评论。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值