Python学习:自定义迭代器,索引取值和分片取值
Python是一种非常流行的编程语言,它有一个非常强大的功能-迭代器。在Python中,迭代器允许您按顺序处理容器(如列表和元组)中的所有元素,而不必逐个访问他们。自定义迭代器可以让您按照您喜欢的方式迭代容器。此外,Python还提供了通过索引取值和分片取值来访问容器中元素的方法。
在本文中,我们将学习如何自定义迭代器,并学习如何在Python中通过索引和切片来访问容器中的元素。我们将从简单的示例开始,并通过几个示例来学习这些概念。
自定义迭代器
迭代器是Python语言中的常见编程概念之一。迭代器在Python的列表、元组、字典、集合等容器中都有应用,让我们可以逐个访问容器中的所有元素。同时我们也可以通过自定义迭代器按照自己的规则遍历容器中的元素。
下面,我们将展示如何创建一个简单的自定义迭代器。假设我们需要创建容器,其中包含数字1到5。
class MyIterator:
def __init__(self):
self.mylist = [1, 2, 3, 4, 5]
self.index = 0
def __iter__(self):
return self
def __next__(self):
if self.index >= len(self.mylist):
raise StopIteration
value = self.mylist[self.index]
self.index += 1
return value
myiter = MyIterator()
for i in myiter:
print(i)
在这个示例中,我们首先定义了一个名为MyIterator的类,并在_init_()方法中初始化属性。然后,我们通过定义__iter__()方法将该对象转换为一个迭代器。
当我们通过迭代该对象时,实际上会调用__next__()方法。在这个方法中,我们检查迭代器是否已经到达了容器的末尾。如果到达了末尾,我们将引发StopIteration异常,以通知Python停止迭代。否则,我们从容器中获取下一个值并返回它。
上面的示例仅仅是一个简单的例子,很显然,实际上产生一个1-5的容器,不需要自定义,Python已经通过range()函数实现了这个功能,但是自定义迭代器的意义在于,通过我们自己的方式遍历容器中的元素。
接下来,我们将创建另一个示例,我们将在一个字符串中找到所有的句子,然后将它们按照字典序排序。
class Sentences:
def __init__(self, text):
self.text = text
self.b=sent_tokenize(text)
self.index = 0
def __iter__(self):
return self
def __next__(self):
if self.index >= len(self.b):
raise StopIteration
value = self.b[self.index]
self.index += 1
return value
def sort(self):
self.b.sort()
text = "A man walks into a bar. He says ouch."
sentences = Sentences(text)
for sentence in sentences:
print(sentence)
sentences.sort()
for sentence in sentences:
print(sentence)
在这个示例中,我们定义了一个名为Sentences的类,它有一个构造函数,构造函数将文本传递给对象,并使用sent_tokenize()函数将文本分解为句子数组。
我们还定义了一个sort()方法,该方法通过sort()函数按字典序排序句子数组。
在__iter__()方法和__next__()方法中,我们遍历句子数组并返回句子。
在这里,我们可以通过实例化Sentences类并迭代该实例来遍历文本中的每个句子。我们还使用sort()函数按字典序排序句子,然后再次通过迭代该实例来输出已排序的句子列表。
索引和切片
迭代器并不是Python中 的容器访问方式。Python还提供了通过索引和切片来访问列表中的元素的方法。.
通俗的说,通过索引取值,可以访问Python中列表、字符串、元组等容器中特定的元素;通过切片取值,可以获取容器的子集(子序列)。
取一个列表的示例:
number_list = [0,1,2,3,4,5,6,7,8,9] # 索引取值 print(number_list[0]) # 0 print(number_list[3]) # 3 # 切片取值, [a:b]的含义是取[a,b)的元素序列 print(number_list[2:5]) # [2,3,4] print(number_list[:-3]) # [0, 1, 2, 3, 4, 5, 6] print(number_list[5:]) # [5,6,7,8,9] # 通过步长筛选 print(number_list[::2]) # [0, 2, 4, 6, 8]
在上面的示例中,我们首先定义了一个包含数字0到9的列表。然后,我们使用索引来访问列表中的一部分元素,并使用切片来访问列表中的子集。请注意,调用list[a:b]将返回列表中索引为a到索引为b-1的元素(前闭后开区间)。
同时可以看到,步长值默认为1,也就是原本的顺序,如果想要以另一种顺序取值,可以通过设定步长值来选择。
运行了上述代码后,我们可以看到,它将返回特定的元素和特定的子序列。当我们想要获取一个列表中的某个元素或一些元素时,就可以通过索引或切片运算符来实现。
总结
在这篇文章中,我们学习了如何自定义迭代器,以及如何使用Python中的索引和切片来访问容器中的元素。
Python中的迭代器让我们可以更容易地遍历容器中的所有元素,而Python中的索引和切片则让我们更容易地获取容器中的特定元素或子序列。
在编写Python代码时,我们应该始终牢记这些有用的工具,并利用它们来编写更优雅、更紧凑的代码。
