2019-12-28(97)

本文深入探讨Python中的Lambda函数,解析其语法特点与使用场景,同时讲解map、filter、reduce等高阶函数的应用技巧,通过实例展示如何利用这些函数提升代码效率。

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"],"*"))
2018-12-31 2019-12-31 2020-12-31 2021-12-31 2022-12-31 2022-03-31 2023-03-31 销售商品、提供劳务收到的现金 135029126382.98 16638769795352 155890384313.86 169646517565.79 191722692750.88 34938337935.53 55960307451.44 经营活动现金流入小计 146209763702.97 17519592331418 163892764321.22 177201260717.00 198587680806.39 40091032415.99 58432088448.68 购买商品、接受劳务支付的现金 78045526788.80 9421477138983 121793121343.62 145601518405.47 140307498966.97 30980014864.90 31827908073.37 经营活动现金流出小计 119268972159.99 147302209220.59 144654127012.06 175306897458.28 169919244885.12 36696775626.84 43366935483.08 经营活动产生的现金流量净额 26940791542.98 2789371409359 19238637309.16 1894363258.72 28668435921.27 3394256789.15 15065152965.60 处置固定资产、无形资产和其他长期资产收回的现金净额 6302072.99 9614513.94 6631829.54 14956809.63 22767686.65 259315.01 15474235.20 投资活动产生的现金流入小计 9948975741.20 8445533871.01 14155332757.58 55391360332.62 10527205021.13 3695781030.58 8093538687.67 购建固定资产、无形资产和其他长期资产支付的现金 3837549166.56 4713187965.97 4528646805.03 5727074800.44 6036136315.75 1705506674.22 1652039470.92 投资活动产生的现金流出小计 31794741016.87 19720582471.78 14057602607.40 25639376773.27 47584037812.54 6992621930.22 14881228706.69 投资活动产生的现金流量净额 -21845765275.67 -11275048600.77 97730150.18 29751983559.35 -37056832791.41 -3296840899.64 -6787690019.02 取得借款收到的现金 27633970524.35 2126825792368 37599791534.80 88802444041.60 102926746831.03 31094489421.57 48401456038.48 筹资活动现金流入小计 27639080524.35 2159510792368 37614461534.80 89991092450.05 102978746831.03 31109489421.57 49519529355.28 尝还债务支付的现金 24227160995.94 27657703656 20 29475431119.54 57868429527.67 60908105526.39 12433460610.50 30612174002.53 分配股利、利润或偿付利息支付的现金 862910396.59 13159380388.41 14236014439.83 17546695095.00 18469103441.58 413496361.36 6179611385.10 筹资活动现金流出小计 25125234042.18 40817084044.61 58725959033.00 115321676340.53 93055954517.92 21821892502.81 46794386619.22 筹资活动产生的现金流量净额 2513846482.17 -19221976120.93 -21111497498.20 -25330583890.48 9922792313.11 9287596918.76 2725142736.06 请结合上述财务数据和格力与美的的实际状况及战略进行现金流分析
06-02
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值