大数据 爬虫Python AI Sql

python lambda函数

2019-07-19  本文已影响0人  小董不太懂

lambda

是匿名函数 用来表达简单的函数
使用lambda函数应该注意的几点:

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 参数变量规则

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.4 函数体内返回值注意事项

#可变类型
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.split("a")返回的数据类型是是str显然为不可变数据类型,故可以产生新数据,所以不会为None

info=[]
func1=lambda info:info.append("a")
print(func1("gao"))
输出结果

这个显然就无法运行通过,因为info.append("a"),返回的数据类型是[]显然列表是可变数据类型,无法产生新的数据

info=[]
func4=lambda a1:info.append(a1)
print(func4(4))
********************************
D:\anaconda\python.exe D:/bilibili大学/简书代码/推导式.py
None

Process finished with exit code 0

显然返回的数据类型也是列表,故为None

1.5 和三元运算符的结合

func5=lambda n1,n2:n1 if n1>n2 else n2
v=func5(111,2)
print(v)
***************************
D:\anaconda\python.exe D:/bilibili大学/简书代码/推导式.py
111

Process finished with exit code 0

1.6 列表中的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


*********************************************

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

注意:

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

def func():
  for num in range(10):
       pass
  #print(num) 我们尝试在这边加了一句,为了证明num = 9
   v4 = [lambda :num+10,lambda :num+100,lambda :num+100,]
   result1 = v4[1]()
   result2 = v4[2]()
   print(result1,result2)
func()
**************************************************
D:\anaconda\python.exe D:/bilibili大学/简书代码/推导式.py
109 109

分析:第二行for循环,已经将num循环了一遍,并最终将num赋值为9


lambda函数的介绍到此为止,我们不妨进行一些习题练习,加深掌握:

口算题:(先口算然后运行验证)

result = []
for i in range(10):
    func = lambda : i      # 注意:函数不执行,内部代码不会执行。
    result.append(func)
# 这段代码最后相当于result = [lambda : i,lambda : i,lambda : i,.....]
# 因为lambda函数内部不能创建变量只能调用形参,而本段并未调用
# i就一直为9
print(i)#9
print(result)#10个不同地址
v1 = result[0]()#9 全局i 函数执行的时候 查找的是全局的i
v2 = result[9]()#9
print(v1,v2)
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: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)]
 print(v5[0](2))   #18
上一篇下一篇

猜你喜欢

热点阅读