原标题:Python 中有意思的语法
01、python中有意思的函数
1、lambda
很多语言都有匿名函数,python的匿名函数写作lambda,当需要实现一定功能而又不想定义一个函数时,lambda就是最好的选择
也可以将它赋值给一个变量,后续程序中就可以用该变量调用这个匿名函数
当然,这里其实没必要应用lambda来实现,因为既然要显式调用,还不如干脆直接写个明确的函数罢了。
lambda函数更广泛的应用场景在于该匿名函数作为另一个函数的参数传递时,应用就比较合适了,例如,将lambda作为sort()函数的key参数,就可以实现特定功能的排序
2、zip
zip函数人如其名,是打包或者解包的函数,接受2个以上可迭代变量,输出对应位置组成元组后的迭代类型
如果各迭代变量长度不一致也不会报错,只是此时返回迭代变量取决于输入总长度最短的一个
3、map
map函数也正如其取名一样,是一个将接受的迭代变量依次经过某种映射,并输出映射后的迭代变量。
将列表中的每个元素转为字符串
当第一个函数的参数是是一个多变量函数时,map也可以接受更多的参数
与zip函数中类似,当map里的函数参数长度不匹配时并不会报错,只是输出结果将由最短的决定
4、filter
与map函数类似,filter函数也接受一个函数及其变量作为参数,只是要求这个函数的返回结果是bool型,并用这个bool的结果决定输出的取舍问题。
例如需要对一个输入列表过滤,要求保留2的倍数:
5、reducemap和filter函数都是多入多出型,实质上是完成了特定的变换或筛选。
reduce则是归约函数,将一系列输入变量经过特定的函数后转化为一个结果输出
reduce函数还可以接受一个可选的初始值作为参数
02、python中的“星星”
1、作为乘法或者是乘幂运算符
作为基础的Python应用,乘法运算和乘幂运算是大家最容易想到的星号作用。上述程序中,单个星号运算符起到了乘法运算的目的,而连续的两个乘号起到了乘幂运算的目的。从结果可以看出,2 * 2的结果是4,而2的3次方是8
2、接受多个参数
当我们在编写函数时,有时候函数的参数数量太多,所以我们想尽量的缩短程序,让程序看起来简介。
除此之外,我们可能不知道函数有多少个具体的参数,这个时候,就可以用星号来发挥作用
单个星号起到的作用是帮助我们捕获多个位置参数,然后将其放入到字典中,需要注意的是,在传入参数时,它的顺序位置需要明确,以方便在函数调用中使用。
而对于双星号的参数,可以帮助我们捕获多个带关键字名字的参数,并放入到字典中去,这样的话,我们在程序内使用的时候,可以根据关键字名字来调用,而无需过多关注参数的顺序位置。
3、解包
可以利用星号来实现可迭代对象的解压
4、压缩
当我们从可迭代对象中取值,例如上例中a,b,c,d与list_data中的元素是一一对应的关系,既不能多也不能少,而当我们只想取出某一部分的元素时,就可以利用星号来进行剩余部分元素的一个压缩。
03、理解python的dataclass
在python中创建一个类,我们需要写__init__方法进行初始化对象操作,需要对对象进一步说明的话,最好写一个__repr方法,这样我们直接输出对象的话,方便理解这个对象是啥。
但在python3.7以后的版本中给我们提供了一个更加简单的方式dataclasses
1、定义
首先我们用常规的方法创建一个类
下面使用dataclasses去创建一个类
可以看到相对于普通类的写法是不是显得简单很多?
2、默认值
让我们看看如何给设置默认值
3、添加一个方法
4、frozen
frozen实例是在初始化对象后无法修改其属性的对象。
5、后期初始化处理
有了 dataclass,需要定义一个 __init__ 方法来将变量赋给 self 这种初始化操作已经得到了处理。
但是我们失去了在变量被赋值之后立即需要的函数调用或处理的灵活性,我们可以通过__post_init__来实现。
例如以下在初始化之后立即计算整数和小数部分:
6、继承
Dataclasses 支持继承,就像普通的 Python 类一样。
Student 的参数是在类中定义的字段的顺序。
7、field
先看下field的原型
dataclasses.field(*, default=MISSING, default_factory=MISSING, repr=True, hash=None, init=True, compare=True, metadata=None)
通常我们无需直接使用,装饰器会根据我们给出的类型注解自动生成field,但有时候我们也需要定制这一过程,这时dataclasses.field就显得格外有用了
我们再来试下default_factory,如果在创建对象时没有赋值,则使用该方法初始化该字段。
当然我们也可以使用__post_init__来实现。返回搜狐,查看更多
责任编辑: