What ispython
Iterator? Let’s take the simplest example:
list1 = ["pdudo","juejin","hello"] tuple1 = ("pdudo","juejin","hello") dict1 = {"name":"pdudo"} for i in list1: print(i) for i in tuple1: print(i) for i in dict1: print(i)
This is the python
iterator. Okay, that’s it, let’s do it manually.
Yes, using the for...in
method, the bottom layer uses iterators. When you wrote before, you were never curious about why you traverse different All data types can be used for...in
is universal?
My brother, I am the same. I have never thought about why it can be written like this. We have already talked about the iterator syntax. Next, let’s peel off the veil of iterators.
As long as it meets the python
iterator conditions, you can use for...in
to traverse elements, that is: Use the same code to traverse different data containers. I think this is the root cause.
If the above description is not clear, we can use c
and python
to traverse the array and string, and we will have a clear understanding.
The above code is c
language traversing array"pdudo","hello","juejin"
and stringpdudohellojuejin
, we need to write the critical value of the traversal condition ourselves.
And how to use python
to write it? Let’s take a look.
list1 = ["pdudo","hello","juejin"] char1 = "pdudohellojuejin" for v in list1: print(v) for c in char1: print(c)
You only need to define the array and string, and then use for...in
and you are done.
I think the above example is enough to prove why you should use iterators, because it’s really fun.
After going through the first two paragraphs, I guess you must want to know how iterators work, right? Now it's here.
When using the for...in
statement, it will call the inter()
object, which will return an iterator object. The object also defines the __next__()
method, which returns one container element at a time. When no more elements can be returned, a StopIteration
exception will be thrown to indicate for
Terminate the loop.
Still don’t understand? It doesn’t matter, let’s write another case to illustrate.
list1 = ["pdudo","hello","juejin"] it = iter(list1) print(next(it)) print(next(it)) print(next(it)) print(next(it))
The above code defines a list whose values are: "pdudo", "hello", "juejin", and then calls the iter
method, which will return an iterator, and then The next
method is called to return the next element, but the length of the list we defined is 3, and the next
method is called 4 times. It can be seen that the last time an exception will be thrown.
After we execute, the effect is as follows:
It can be seen that it is consistent with our above guess, in the for...in
statement , the inter()
container object is also called, and __next__
is used to return subsequent iterable objects, and so on, until an exception StopIteration
is encountered and the loop ends.
Okay, do you know how iterators work? So, let’s throw another question to see if you can answer it? How to determine if a data type can be iterated?
We have learned how to use iterators and know how iterators work. This paragraph will introduce how to create an iterator. Before looking at this , let’s think about a question, will the following code report an error?
a = 9527 for i in a: print(i)
We use for...in
to traverse a int
type of data.
The above code will of course report an error, which leads to our knowledge point: What kind of data type can be iterated?
is like this. Whether it can be iterated depends on whether the method has a __iter__
method.
You can look at the following example. We have customized an iterator for flashback output data.
#!/bin/env python class flashBack: def __init__(self,list1): self.data = list1 self.index = len(list1)-1 def __iter__(self): return self def __next__(self): if self.index < 0: raise StopIteration val = self.data[self.index] self.index = self.index - 1 return val def main(): list1 = [1,2,3,4,5] tuble1 = ("pdudo","juejin","hello") for i in flashBack(list1): print(i) for i in flashBack(tuble1): print(i) if __name__ == '__main__': main()
After execution, the result is:
It can be seen that to create an iterator, at least the __iter__
method and are required __next__
method.
Okay, with this basic case, let’s write a linked list?
#!/bin/env python class Node: def __init__(self,val): self.val = val self.nextNode = None class Lists: def __init__(self,currentNodes): self.currentNode = currentNodes def __iter__(self): return self def __next__(self): if self.currentNode is None: raise StopIteration v = self.currentNode.val self.currentNode = self.currentNode.nextNode return v def main() : node1 = Node(1) node2 = Node(2) node3 = Node(3) node1.nextNode = node2 node2.nextNode = node3 for i in Lists(node1): print(i) if __name__ == '__main__': main()
As shown in the above code, we first create the node Node
, which has 2 values, val
is the recorded value, and nextNode
is the record The pointer to the next Node
, and then defines the class Lists
. When calling, you need to pass in a Node
, which will currentNodes
Record the current Node
. Focus on __next__
. When the current node is empty, StopIteration
is returned to inform for
that the iterator is over. Otherwise, take out the val
of the current node and return it, and slide it down to the next node.
The above code, after running, the results are as follows:
The above is the detailed content of How to create an iterator in Python?. For more information, please follow other related articles on the PHP Chinese website!