Python从进阶到高级—通俗易懂版(五)

# ==================================
# Author : Mikigo
# Env    :deepin 20.4 os
# ==================================

自定义序列

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
<generator object <genexpr> at 0x7f5676c57390>

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

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

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

posted @ 2022-10-27 15:46  mikigo  阅读(84)  评论(0编辑  收藏  举报