lambda也是python支持的一种定义函数的方法,Python 中有意思的语法

原标题:Python 中有意思的语法

01、python中有意思的函数

1、lambda

很多语言都有匿名函数,python的匿名函数写作lambda,当需要实现一定功能而又不想定义一个函数时,lambda就是最好的选择

2e27834df55f3915dfd6603dde727ee4.png

也可以将它赋值给一个变量,后续程序中就可以用该变量调用这个匿名函数

31130f04fa9867b9fa0e209aab21ee5d.png

当然,这里其实没必要应用lambda来实现,因为既然要显式调用,还不如干脆直接写个明确的函数罢了。

lambda函数更广泛的应用场景在于该匿名函数作为另一个函数的参数传递时,应用就比较合适了,例如,将lambda作为sort()函数的key参数,就可以实现特定功能的排序

62336d2cab11c278f12db66444b77b7a.png

2、zip

zip函数人如其名,是打包或者解包的函数,接受2个以上可迭代变量,输出对应位置组成元组后的迭代类型

a7f98fa72ba74a76c0514cdcb5e779df.png

如果各迭代变量长度不一致也不会报错,只是此时返回迭代变量取决于输入总长度最短的一个

108aad116b401a22bc79c1b20afdbaa6.png

3、map

map函数也正如其取名一样,是一个将接受的迭代变量依次经过某种映射,并输出映射后的迭代变量。

将列表中的每个元素转为字符串

f8e461b55facc0bd52d23850cd71d0be.png

当第一个函数的参数是是一个多变量函数时,map也可以接受更多的参数

10bfbbebac99e73bde83c9b399510ebf.png

与zip函数中类似,当map里的函数参数长度不匹配时并不会报错,只是输出结果将由最短的决定

f8001b4c9e07c3ef4e809845246aafda.png

4、filter

与map函数类似,filter函数也接受一个函数及其变量作为参数,只是要求这个函数的返回结果是bool型,并用这个bool的结果决定输出的取舍问题。

例如需要对一个输入列表过滤,要求保留2的倍数:

2523442db4360de12502e9f37af43a4d.png

5、reducemap和filter函数都是多入多出型,实质上是完成了特定的变换或筛选。

reduce则是归约函数,将一系列输入变量经过特定的函数后转化为一个结果输出

896abc70bf279166f87d821363ad64ef.png

reduce函数还可以接受一个可选的初始值作为参数

54a41707eb3e095ac0cf9ac66fe38fb6.png

02、python中的“星星”

1、作为乘法或者是乘幂运算符

3f908ae6e30b208ef67a06e14a561ec6.png

作为基础的Python应用,乘法运算和乘幂运算是大家最容易想到的星号作用。上述程序中,单个星号运算符起到了乘法运算的目的,而连续的两个乘号起到了乘幂运算的目的。从结果可以看出,2 * 2的结果是4,而2的3次方是8

2、接受多个参数

当我们在编写函数时,有时候函数的参数数量太多,所以我们想尽量的缩短程序,让程序看起来简介。

除此之外,我们可能不知道函数有多少个具体的参数,这个时候,就可以用星号来发挥作用

4a98a0a755e8a3a918d5e954e432cd52.png

单个星号起到的作用是帮助我们捕获多个位置参数,然后将其放入到字典中,需要注意的是,在传入参数时,它的顺序位置需要明确,以方便在函数调用中使用。

而对于双星号的参数,可以帮助我们捕获多个带关键字名字的参数,并放入到字典中去,这样的话,我们在程序内使用的时候,可以根据关键字名字来调用,而无需过多关注参数的顺序位置。

3、解包

可以利用星号来实现可迭代对象的解压

9d5785fb55fb834e0ed315ce95ee507f.png

4、压缩

00ed5aca1ca3a98986399ec8d15a614a.png

当我们从可迭代对象中取值,例如上例中a,b,c,d与list_data中的元素是一一对应的关系,既不能多也不能少,而当我们只想取出某一部分的元素时,就可以利用星号来进行剩余部分元素的一个压缩。

03、理解python的dataclass

在python中创建一个类,我们需要写__init__方法进行初始化对象操作,需要对对象进一步说明的话,最好写一个__repr方法,这样我们直接输出对象的话,方便理解这个对象是啥。

但在python3.7以后的版本中给我们提供了一个更加简单的方式dataclasses

1、定义

首先我们用常规的方法创建一个类

067d7aeba9c91234eb521b882f83a6b4.png

下面使用dataclasses去创建一个类

30ae072d44e5c4f59c25e48049896b8b.png

可以看到相对于普通类的写法是不是显得简单很多?

2、默认值

让我们看看如何给设置默认值

320ac1f2fa36924cb39e488a3084cf6d.png

3、添加一个方法

fcc3fae4fa0b8163d475503f8dc8091d.png

4、frozen

frozen实例是在初始化对象后无法修改其属性的对象。

6e0122fac32a6a5fe2afb9cbdbb6e9b3.png

8306e406859e78bf88ef7817b9ed9a15.png

5、后期初始化处理

有了 dataclass,需要定义一个 __init__ 方法来将变量赋给 self 这种初始化操作已经得到了处理。

但是我们失去了在变量被赋值之后立即需要的函数调用或处理的灵活性,我们可以通过__post_init__来实现。

例如以下在初始化之后立即计算整数和小数部分:

db279539b351c8265b9276cc41885458.png

ddaf961b0d0d502a90cfcfad9186ef5d.png

6、继承

Dataclasses 支持继承,就像普通的 Python 类一样。

4718d0debec1975194a75da24007b8bb.png

c376afec2865dd19483117dcb636dde0.png

Student 的参数是在类中定义的字段的顺序。

7、field

先看下field的原型

dataclasses.field(*, default=MISSING, default_factory=MISSING, repr=True, hash=None, init=True, compare=True, metadata=None)

通常我们无需直接使用,装饰器会根据我们给出的类型注解自动生成field,但有时候我们也需要定制这一过程,这时dataclasses.field就显得格外有用了

548b744c4650a72e2205314735b45208.png

e44a646c24b127c6990204c2c173b982.png

我们再来试下default_factory,如果在创建对象时没有赋值,则使用该方法初始化该字段。

aa0a67c442ec9b31ea9ab85b05a19048.png

11e2208dae33075549a7176c6ee2852c.png

当然我们也可以使用__post_init__来实现。返回搜狐,查看更多

责任编辑:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值