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)}
这是项目中的一个实例,感受下,如果再复杂点就建议拆开写了。
本文来自博客园,作者:mikigo,转载请注明原文链接:https://www.cnblogs.com/mikigo/p/16832533.html