3.2.2 lambda函数
lambda语句被用来创建新的函数对象,并且在运行时返回它们。
Python使用lambda关键字来创建匿名函数。这种函数得名于省略了用def声明函数的标准步骤。
lambda只是一个表达式,函数体比def简单很多
lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。
lambda函数拥有自己的名字空间,且不能访问自由参数列表之外全局名字空间里的参数。
虽然lambda函数看起来只能写一行,却不等同于C或C++的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率。
lambda会返回一个函数对象,但这个对象不会赋给一个标识符,而def则会把函数对象赋值给一个变量(函数名)。
像if或for或print等语句不能用于lambda中。
lambda函数不能共享给别的程序调用, def定义的函数可
func=lambda x:x+1
print(func(1))
def func(x):
return x+1
func=lambda x,y,z:x+y*z
print(func(1,2,3))
def func(x,y,z):
return x+y*z
def make_repeater(n):
return lambda s:s*n #返回一个函数对象
twice=make_repeater(2) #将函数对象赋值twice
#相当于twice=lambda s:s*2
print(twice("word")) #s="word"
print(twice(5)) #s=5
lambda表达式会返回一个函数对象,如果没有变量接受这个返回值,它很快就会被丢弃,也正是由于lambda只是一个表达式,所以它可以直接作为list、dict等的成员。
list_a=[lambda x:x+2,lambda y:y*2]
print(list_a)
print(list_a[0](4))
print(list_a[1](2))
[<function <lambda> at 0x000002B6B09F14C8>, <function <lambda> at 0x000002B6B09F1438>]
6
4
3.2.5 map函数
将每个列表元素或字符串都执行某个函数,结果返回可迭代对象
>>> map(str,[1,2,3,4])
<map object at 0x0000014EAA2FAF88>
>>> map(int,"1234")
<map object at 0x0000014EAA2FC0C8>
>>> for i in map(int,"1234"):
... print(i)
...
1
2
3
4
>>> for i in map(int,"1234"):
... print(type(i),i)
...
<class 'int'> 1
<class 'int'> 2
<class 'int'> 3
<class 'int'> 4
>>> l=map(int,"1234")
>>> l
<map object at 0x0000014EAA2FC108>
>>> print(l)
<map object at 0x0000014EAA2FC108>
>>> type(l)
<class 'map'>
>>> for i in l:
... print(i)
...
1
2
3
4
>>> len(l)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: object of type 'map' has no len()
>>> "".join(map(str,[1,2,3,4]))
'1234'
#求两个数的和
res=map(lambda x,y:x+y,[1,2,3],[4,5,6])
for i in res:
print(i)
5
7
9
当对应位置操作数类型不一致时,报错
res=map(lambda x,y:x+y,[1,2,3],[4,5,"a"])
for i in res:
print(i)
当对应位置长度不一致时,可以处理,对应到多少就处理多少。
res=map(lambda x,y:x+y,[1,2,3],[4,5,6,7])
for i in res:
print(i)
3.2.6 filter函数
对序列对过滤处理,即可以使用一个自定义的函数过滤一个序列,把序列的每一项传到自定义的过滤函数里处理,并返回结果做过滤。最终一次性返回过滤后的结果以生成器的方式生成。
def func(num):
if num>5 and num<10:
return num
result=filter(func,[1,2,5,6,7,9,10])
for i in result:
print(i)
3.2.6 reduce函数
print(reduce(lambda x,y:x+y,[1,2,3,4,5]))
#第一次:x=1,y=2
#第二次:x=1+2,y=3
#第三次:x=3+3,y=4
#第四次:x=6+4,y=5
#结果:15
print(reduce(lambda x,y:x+y,[1,2,3,4,5],0)) #指定x的初始值为0
#第一次:x=0,y=1
#第二次:x=0+1,y=2
#第三次:x=1+2,y=3
#第四次:x=3+3,y=4
#第五次:x=6+4,y=5
#结果:15
def func(x,y):
return x*10+y
def char2num(s):
d={"0":0,"1":1,"2":2,"3":3,"4":4,"5":5}
return d[s]
print(reduce(func,map(char2num,"135")))
#第一次:x=1,y=3
#第二次:x=1*10+3=13,y=5
#结果:13*10+5=135
3.2.6 eval函数
用来计算存储在字符串中的有效python表达式,并返回计算结果
>>> s="3*4+8"
>>> eval(s)
20
def calc():
return 3+4*2
print(eval("calc()"))
3.2.7 exec函数
用来执行存储在字符串或文本中有效的python语句
>>> exec("print('hello world')")
hello world
def print_sth():
print("hello world")
exec("print_sth()")
习题
188、尝试自定义字符串的split函数
def split(s,chr):
if not isinstance(s,str):
return None
result=[]
temp=""
for i in s:
if i!=chr:
temp+=i
else:
result.append(temp)
temp=""
result.append(temp)
return result
print(split("a1 b1 c1"," "))
print(split("123*abc*&^%","*"))
189、请分别用python3 的六大剑客写一个例子;
#map
print(list(map(lambda x:pow(x,2), list(range(10)))))
#filter
print(list(filter(lambda x:x%2==1,list(range(100)))))
#reduce
from functools import reduce
print(reduce(lambda x,y:x+y,["1","3","5","7","9"]))
#lambda
f = lambda x,y:x+y**2
print(f(10,5))
#切片
l = list(range(10))
for i in range(len(l),-1,-1):
print(i,end=" ")
print()
print(l[::-1])
print(l[::2])
print(l[:])
#推导列表
a = "abc"
b = "XYZ"
print([x+y for x in a for y in b if x in "ac" and y in "XZ"])
190、自定义实现python的join()函数
def join(l,chr):
result=""
for i in l:
result+=(str(i)+chr)
return result[:len(result)-1]
print(join(["a","b","c"],"*"))
本文深入探讨Python中的Lambda函数,解析其语法特点与使用场景,同时讲解map、filter、reduce等高阶函数的应用技巧,通过实例展示如何利用这些函数提升代码效率。
3万+

被折叠的 条评论
为什么被折叠?



