匿名函数 & 闭包的定义与使用

匿名函数

   在传入函数时,有时不需要显式地定义函数,直接传入匿名函数更为方便。
   在Python中,对匿名函数提供了支持。计算 f(x)=x2时,除了定义一个 f(x) 的函数外,还可以直接传入匿名函数。使用 lambda 可以声明一个匿名函数。
   lambda 表达式就是一个简单的函数。使用 lambda 声明的函数可以返回一个值,在调用函数时,直接使用 lambda 表达式的返回。使用 lambda 声明函数的语法格式如下。

lambda arg1, arg2, arg3… :<表达式>

   其中 arg1/agr2/arg3 为函数的参数。<表达式>相当于函数体。运算结果是:表达式的运算结果。
   匿名函数有个限制,就是只能有一个表达式,不用写 return,返回值就是该表达式的结果。
   用匿名函数的优点:由于匿名函数没有名字,不用担心函数名冲突。此外,匿名函数也是一个函数对象,可以把匿名函数赋值给一个变量,再利用变量来调用该函数。
【示例】lambda 表达式使用

f = lambda a,b,c: a+b+c
print("2+3+4的结果:", f(2,3,4))

   执行结果为 9

【示例】匿名函数实现 f(x)=x*x

L = map(lambda x: x*x, [1,2,3,4,5,6,7,8,9])
print(list(L))

   执行结果为 [1,4,9,16,25,36,49,64,81]

【示例】sorted 对自定义对象进行排序

class Student:
	def __init__(self, age, name):
		self.name = name
		self.age = age

stu1 = Student(11, 'bbb')
stu2 = Student(22, 'aaa')
stu3 = Student(33, 'eee')
#按年龄大小排序
student_list = sorted([stu1, stu2, stu3], key=lambda x: x.age)
for stu in student_list:
    print('name:',stu.name,'age:',stu.age)
print('---------------------------------------')
#按字符串的ASCII码排序
student_list = sorted([stu1, stu2, stu3], key=lambda x: x.name)
for stu in student_list:
	print('name:',stu.name,'age:',stu.age)

   执行结果如下:
在这里插入图片描述

闭包

   顾名思义,可以形象地把闭包理解为一个封闭的包裹,这个包裹就是一个函数。当然,还有函数内部对应的逻辑,包裹里面的东西就是自由变量,自由变量可以随着包裹到处游荡。还需有个前提,这个包裹是创建出来的。在Python语言中,闭包意味着要有嵌套定义,内部函数使用外部函数中定义的变量,如果调用一个函数 A,这个函数 A 返回一个函数 B,这个返回的函数 B 就叫做闭包。

'''
1.什么是闭包(闭包为后期装饰器做铺垫)
    闭包就是一个函数
2.如何创建闭包
    a.要有函数的嵌套(外部函数、内部函数)
    b.内部函数中要是用外部函数的变量
    c.外部函数必须有返回值,返回内部函数名
3.如何使用闭包
    f = funOut(100) #调用外部函数
    print(type(f))  
    result = f(200) #通过变量调用内部函数
'''
#闭包的定义
def funOut(num1):
    def funInt(num2):
        #内部函数修改外部函数的变量需声明
        nonlocal num1
        num1 += 100
        return num2+num1
    return funInt

#对外部函数调用
f = funOut(100)
#外部调用后,f与funInt都指向内部函数
print(type(f))
#调用内部函数
result = f(200)
print('两个数的和:', result)

   执行结果为 400,其中<class ‘function’>为 f 变量的类型,是函数
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值