Python进阶到高级:自定义序列

2023年 8月 18日 55.5k 0

1、可切片对象

切片大家都很熟悉,在 Python 基础里面是必学的,对列表使用中括号取值,正切、反切、加步长等都没问题,这里我们主要讲怎么实现一个可切片对象。

隆重请出魔法函数:__getitem__ ,它是我们实现可切片对象的关键。

class AutoTest:

    def __init__(self, name_list):
        self.name_list = name_list

    def __getitem__(self, item):
        return self.name_list[item]
    
AT = AutoTest(["mikigo", "lt", "jjb", "hhz"])

咱们对实例对象切片试试

print(AT[1])
print(AT[2])
lt
jjb

简直没难度哈,对象可以切片了。

这里再补充一点没有用的小知识,实现了 __getitem__ 方法实际上也是一个可迭代的对象了,也就是说可以使用 for 循环。

for i in AT:
    print(i)
mikigo
lt
jjb
hhz

这其实是可迭代对象的一种退而求其次的处理,它找不到迭代协议,但是找到了 __getitem__ ,也可以进行迭代,这点相信 99% 的同学都不知道,没关系哈,关于可迭代对象和迭代器咱们后面会专门讲。

2、列表推导式

列表推导是 Python 提供的一种独有特性,可以用一行代码生成一个列表。

普通操作:

my_list = []
for i in range(10):
    my_list.append(i)

这样生成一个列表,至少需要3行,来看看列表推导式:

my_list = [i for i in rang(10)]

一行就搞定,多么的简洁优雅,而且可读性和性能都非常高,爱了。

还可以加一些逻辑判断和数据处理,以下是项目实例:

app_id_list = [int(_id) for _id in app_id if _id]  # to int

这里要提醒一下,不要为了推导而推导,如果你的逻辑很复杂,加了多重判断和处理,不建议使用推导式,老老实实分开写,因为这样写出来的表达式会很复杂,就失去了我们编码最重要的一点,就是可读性。

3、生成器表达式

前面讲了列表推导式,是用中括号里面写表达式,那把中括号换成小括号是什么呢?好多同学聪明的小脑袋肯定想到了,元组推导式 ... 。

注意元组是不可变序列,没法推导的,小括号的表达式实际上是生成器表达式。

my_gen = (i for i in range(10))

验证一下:

from collections.abc import Generator

print(isinstance(my_gen, Generator))
print(my_gen)
True

你看,确实是一个生成器吧。生成器细节,咱们也放到后面讲哈。

4、字典推导式

理解了列表推导式,再来看字典推导式就很简单了。

my_dict = {i: None for i in range(10)}

第一个元素就是字典的 key 和 value,注意字典的key 是唯一的(可哈希),值无所谓。

打印看下

print(my_dict)
{0: None, 1: None, 2: None, 3: None, 4: None, 5: None, 6: None, 7: None, 8: None, 9: None}

就这,简直没难度,还是要注意一点,代码可读性哈,别整复杂了。

tag_dict = {f"{int(i[0]):0>3}": i[1:] for i in ReadCsv.read_csv_by_str(csv_dict.get(app), from_data=False)}

这是自动化测试项目中的一个实例,感受下,如果再复杂点就建议拆开写了。

相关文章

JavaScript2024新功能:Object.groupBy、正则表达式v标志
PHP trim 函数对多字节字符的使用和限制
新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
为React 19做准备:WordPress 6.6用户指南
如何删除WordPress中的所有评论

发布评论