python lambda函数

lambda

  • 是匿名函数 同来表达简单的函数
  • 使用lambda函数应该注意的几点:
    • lambda定义的是单行函数,如果需要复杂的函数,应该定义普通函数
    • lambda参数列表可以包含多个参数,如 lambda x, y: x + y
    • lambda中的表达式不能含有命令,而且只限一条表达式
    • 默认返回表达式中的计算结果
    • 可变类型的方法【基本】不会形成新的数据,只会在原始数据上修改,所以这些方法只有默认None返回值

lambda表达式

用于表示简单的函数


func1=lambda 参数:一句话函数体(默认返回函数体内执行的内容)

1.1结构

func=lambda a1,a2 : a1+100
val=func(1,2)
print(val)
#返回101
#不可变类型变化后形成新的字符串-->lambda内部默认返回执行后的值

#原理类似:
def func(a1,a2):
  return a1+100
  

1.2参数变化(0个到多个)


func1=lambda :100#可不写参数
func2=lambda a1:a1*10
func3=lambda *args,**kwargs:len(args)+len(kwargs)#接收任意参数


1.3参数变量规则

  • lambda内部不能创建变量,只能调用自己的形参
  • 和函数查找规则一样优先自己=—>父级查找—>全局

DATA=100
func4=lambda a1:a1+DATA
v=func4(1)
print(v)#101


DATA=100
def func():
  DATA=1000
	func4=lambda a1:a1+DATA
	v=func4(1)
	print(v)#1001
func()

1.5和三元运算符的结合


func5=lambda n1,n2:n1 if n1>n2 else n2
v=func5(111,2)
print(v)

1.4函数体内返回值注意事项

  • 不可变数据类型的方法会有返回值,因为原始数据不能修改,只能形成一个新的值

  • 可变类型的方法【基本】不会形成新的数据,只会在原始数据上修改,所以这些方法只有默认None返回值

  • 但是集合中的集合运算(交并集等),会形成新的数据 即就是会有返回值

#可变类型
info=[]
def func(X):
  v=info.append(X)
  return v
print(func("gao"))
#None
#split/intersection/union 等同理

#不可变类型
def func1(x):
  v=x.strip()
  return v
print(func("gao  "))#gao  没有空格

#练习
func1=lambda info:info.split("a")
print(func1("gao"))#["g","o"]

#练习
info=[]
func1=lambda info:info.append("a")
print(func1("gao"))#None




info=[]
func4=lambda a1:info.append(a1)
print(func4(4))

#None

1.5 列表中的lambda函数表达式


func_list=[lambda x:x.strip(),lambda y:y+199,lambda x,y:x+y]
print(func_list[0]("gao  "))#gao
print(func_list[1](1))#200

12看代码写结果

def func():
    num = 10
    v4 = [lambda :num+10,lambda :num+100,lambda :num+100,]
    for item in v4:
        print(item())
func()
#20
#110
#110

2.lambda 和作用域考点 【子作用域默认不会对父级作用域的值进行重新赋值】


def func():
    for num in range(10):
        pass
    v4 = [lambda :num+10,lambda :num+100,lambda :num+100,]
    result1 = v4[1]()
    result2 = v4[2]()
    print(result1,result2)
func()
#子作用域默认不会对父级作用域的值进行重新赋值】
#109
#109
#————————————————————————————————————————————————————
#改变
def func():
    for num in range(10):
        pass
    v4 = [lambda :num+10,lambda :num+100,lambda :num+100,]
    result1 = v4[1]()
    num=73
    result2 = v4[2]()
    print(result1,result2)
 #109 173  因为改变了全局变量num的值
func()

#——————————————————————————————————————————————————————————————
#看代码写结果
def func():
    for item in range(10):
        pass
    print(item)
func()
#9
#item是fun函数中的变量  不仅限于for循环中   
#python中的for是迭代器 和其他语言中的for不太一样

#——————————————————————————————————————————————————————————————

#for循环 
for i in range(10):
    if i==3:
        i=i+3
    print(i)
 # i 在(1,2,3,4,5,6,7,8,9)中取值一次一次迭代 ->next()将i指向下一个迭代值
    
0
1
2
6#
4#
5
6
7
8
9

5.lambda练习

#猜猜结果
result = []
for i in range(10):
    func = lambda : i      # 注意:函数不执行,内部代码不会执行。
    result.append(func)

print(i)#9
print(result)#10个不同地址
v1 = result[0]()#9 全局i 函数执行的时候 查找的是全局的i
v2 = result[9]()#9 
print(v1,v2)

  1. 难点练习
 
 v5=[lambda:100 for i in range(10)]
 v5[0]()#100
 
 
 v5=[lambda:100+i for i in range(10)]
 v5[0]()#109     匿名函数没有马上执行  但是 i是全局变量在函数执行的时候i已经变成9
 
 v5=[lambda x:x*i for i in range(10)]
 #v5是什么
 #2.v5[0](2)#18
 
 def num():
   return [lambda x:i*x for i in range(4)]
 #num函数返回一个列表  (包含十个函数地址的列表)


 print([m(2) for m in num()])#[6,6,6,6]  
 #遍历列表 每个元素m是一个函数地址
 #m(2)表示lambda函数执行   自己内部没有变量i  则从运行完毕的父级函数中查找到 i 值    此时i值是3
 
 
  • 6
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值