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

2023-08-1808:13:30编程语言入门到精通Comments760 views字数 1509阅读模式

1、可切片对象

切片大家都很熟悉,在 Python 基础里面是必学的,对列表使用中括号取值,正切、反切、加步长等都没问题,这里我们主要讲怎么实现一个可切片对象。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/53928.html

隆重请出魔法函数:__getitem__ ,它是我们实现可切片对象的关键。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/53928.html

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"])

咱们对实例对象切片试试文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/53928.html

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

简直没难度哈,对象可以切片了。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/53928.html

这里再补充一点没有用的小知识,实现了 __getitem__ 方法实际上也是一个可迭代的对象了,也就是说可以使用 for 循环。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/53928.html

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

这其实是可迭代对象的一种退而求其次的处理,它找不到迭代协议,但是找到了 __getitem__ ,也可以进行迭代,这点相信 99% 的同学都不知道,没关系哈,关于可迭代对象和迭代器咱们后面会专门讲。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/53928.html

2、列表推导式

列表推导是 Python 提供的一种独有特性,可以用一行代码生成一个列表。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/53928.html

普通操作:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/53928.html

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

这样生成一个列表,至少需要3行,来看看列表推导式:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/53928.html

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

一行就搞定,多么的简洁优雅,而且可读性和性能都非常高,爱了。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/53928.html

还可以加一些逻辑判断和数据处理,以下是项目实例:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/53928.html

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

这里要提醒一下,不要为了推导而推导,如果你的逻辑很复杂,加了多重判断和处理,不建议使用推导式,老老实实分开写,因为这样写出来的表达式会很复杂,就失去了我们编码最重要的一点,就是可读性。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/53928.html

3、生成器表达式

前面讲了列表推导式,是用中括号里面写表达式,那把中括号换成小括号是什么呢?好多同学聪明的小脑袋肯定想到了,元组推导式 ... 。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/53928.html

注意元组是不可变序列,没法推导的,小括号的表达式实际上是生成器表达式。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/53928.html

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

验证一下:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/53928.html

from collections.abc import Generator

print(isinstance(my_gen, Generator))
print(my_gen)
True
<generator object <genexpr> at 0x7f5676c57390>

你看,确实是一个生成器吧。生成器细节,咱们也放到后面讲哈。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/53928.html

4、字典推导式

理解了列表推导式,再来看字典推导式就很简单了。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/53928.html

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

第一个元素就是字典的 key 和 value,注意字典的key 是唯一的(可哈希),值无所谓。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/53928.html

打印看下文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/53928.html

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

就这,简直没难度,还是要注意一点,代码可读性哈,别整复杂了。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/53928.html

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)}

这是自动化测试项目中的一个实例,感受下,如果再复杂点就建议拆开写了。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/53928.html

作者:mikigo
来源:稀土掘金
文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/53928.html
  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/ymba/53928.html

Comment

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定