By Lenin Mishra
in
python
—
Handle StopIteration error in Python using the try-except block.
To understand StopIteration
Exception, you need to understand how iterators work in Python.
- Iterator is an object that holds values which can be iterated upon.
- It uses the
__next__()
method to move to the next value in the iterator. - When the
__next__()
method tries to move to the next value, but there are no new values, aStopIteration
Exception is raised.
Example 1
Code
y = [1, 2, 3]
x = iter(y)
print(x.__next__())
print(x.__next__())
print(x.__next__())
print(x.__next__())
Output
1
2
3
Traceback (most recent call last):
File "some_file_location", line 6, in <module>
print(x.__next__())
StopIteration
You can catch such errors using the StopIteration
Exception class.
Example 2
Code
y = [1, 2, 3]
x = iter(y)
try:
print(x.__next__())
print(x.__next__())
print(x.__next__())
print(x.__next__())
except StopIteration as e:
print("StopIteration error handled successfully")
Output
1
2
3
StopIteration error handled successfully
Check out other Python Built-in Exception classes in Python.
built-in-exception-classes — Pylenin
A programmer who aims to democratize education in the programming world and help his peers achieve the career of their dreams.
Python StopIteration Error is an exception which occurred by built-in next() and __next__() method in iterator to signal that iteration is done for all items and no more to left to iterate.
Example of Python StopIteration Error
In this example string value “FacingIssuesOnIT” is Iterating to print character. In this case while loop will run indefinitely and call next() method on iterable value to print value.
iterable_value = 'FacingIssuesOnIT' iterable_obj = iter(iterable_value) while True: try: # Iterate by calling next item = next(iterable_obj) print(item) except StopIteration as err: print('Stop Iteration occured') break
Output
F a c i n g I s s u e s O n I T Stop Iteration occurred
In this program after completing the iteration next() element print of iterable_value when it goes to next element print it will throw StopIteration exception because there is no more element in iterable_value.
Solution
Whenever you apply the next() method of iterable object always check the length of iterable object then run the loop to get element by next() method otherwise through Python StopIteration Error.
Related Posts
Your Feedback Motivate Us
If our FacingIssuesOnIT Experts solutions guide you to resolve your issues and improve your knowledge. Please share your comments, like and subscribe to get notifications for our posts.
Happy Learning !!!
“Learn From Others Experience»
I have just read a bunch of posts on how to handle the StopIteration error in Python, I had trouble solving my particular example.I just want to print out from 1 to 20 with my code but it prints out error StopIteration. My code is:(I am a completely newbie here so please don’t block me.)
def simpleGeneratorFun(n):
while n<20:
yield (n)
n=n+1
# return [1,2,3]
x = simpleGeneratorFun(1)
while x.__next__() <20:
print(x.__next__())
if x.__next__()==10:
break
dreftymac
31.5k26 gold badges120 silver badges182 bronze badges
asked Apr 27, 2018 at 19:48
Any time you use x.__next__()
it gets the next yielded number — you do not check every one yielded and 10 is skipped — so it continues to run after 20 and breaks.
Fix:
def simpleGeneratorFun(n):
while n<20:
yield (n)
n=n+1
# return [1,2,3]
x = simpleGeneratorFun(1)
while True:
try:
val = next(x) # x.__next__() is "private", see @Aran-Frey comment
print(val)
if val == 10:
break
except StopIteration as e:
print(e)
break
answered Apr 27, 2018 at 19:55
Patrick ArtnerPatrick Artner
50.4k9 gold badges43 silver badges70 bronze badges
4
First, in each loop iteration, you’re advancing the iterator 3 times by making 3 separate calls to __next__()
, so the if x.__next__()==10
might never be hit since the 10th element might have been consumed earlier. Same with missing your while condition.
Second, there are usually better patterns in python where you don’t need to make calls to next
directly. For example, if you have finite iterator, use a for loop to automatically break on StopIteration:
x = simpleGeneratorFun(1)
for i in x:
print i
answered Apr 27, 2018 at 19:59
jlaujlau
3761 silver badge4 bronze badges
1
Updated June 2, 2023
Introduction to Python StopIteration
The following article outlines Python StopIteration as we know the topic ‘iterator’ and ‘iterable’ in Python. The basic idea of what the ‘iterator’ is? An iterator is an object that holds a value (generally a countable number) that is iterated upon. Iterator in Python uses the __next__() method to traverse to the next value. To tell that no more deals need to be traversed by the __next__() process, a StopIteration statement is used. Programmers usually write a terminating condition inside the __next__() method to stop it after reaching the specified state.
Syntax of Python StopIteration
When the method used for iterators and generators completes a specified number of iterations, it raises the StopIteration exception. It’s important to note that Python treats raising StopIteration as an exception rather than a mistake. Like how Python handles other exceptions, this exception can be handled by catching it. This active handling of the StopIteration exception allows for proper control and management of the iteration process, ensuring that the code can gracefully handle the termination of the iteration when required.
The general syntax of using StopIteration in if and else of next() method is as follows:
class classname:
def __iter__(self):
…
… #set of statements
return self;
def __next__(self):
if …. #condition till the loop needs to be executed
…. #set of statements that needs to be performed till the traversing needs to be done
return …
else
raise StopIteration #it will get raised when all the values of iterator are traversed
How StopIteration works in Python?
- It is raised by the method next() or __next__(), a built-in Python method to stop the iterations or to show that no more items are left to be iterated upon.
- We can catch the StopIteration exception by writing the code inside the try block, catching the exception using the ‘except’ keyword, and printing it on screen using the ‘print’ keyword.
- The following () method in both generators and iterators raises it when no more elements are present in the loop or any iterable object.
Examples of Python StopIteration
Given below are the examples mentioned:
Example #1
Stop the printing of numbers after 20 or printing numbers incrementing by 2 till 20 in the case of Iterators.
Code:
class printNum:
def __iter__(self):
self.z = 2
return self
def __next__(self):
if self.z <= 20: #performing the action like printing the value on console till the value reaches 20
y = self.z
self.z += 2
return y
else:
raise StopIteration #raising the StopIteration exception once the value gets increased from 20
obj = printNum()
value_passed = iter(obj)
for u in value_passed:
print(u)
Output:
Explanation:
- In the above example, we use two methods, namely iter() and next(), to iterate through the values. The next() method utilizes if and else statements to check for the termination condition of the iteration actively.
- If the iterable value is less than or equal to 20, it continues to print those values at the increment of 2. Once the value exceeds 20, the next() method raises a StopIteration exception.
Example #2
Finding the cubes of number and stop executing once the value becomes equal to the value passed using StopIteration in the case of generators.
Code:
def values(): #list of integer values with no limits
x = 1 #initializing the value of integer to 1
while True:
yield x
x+= 1
def findingcubes():
for x in values():
yield x * x *x #finding the cubes of value ‘x’
def func(y, sequence):
sequence = iter(sequence)
output = [ ] #creating an output blank array
try:
for x in range(y): #using the range function of python to use for loop
output.append(next(sequence)) #appending the output in the array
except StopIteration: #catching the exception
pass
return output
print(func(5, findingcubes())) #passing the value in the method ‘func’
Output:
Explanation:
- In the above example, we find the cubes of numbers from 1 to the number passed in the function. We generate multiple values at a time using generators in Python, and to stop the execution once the value reaches the one passed in the function, we raise a StopIteration exception.
- We create different methods serving their respective purposes, such as generating the values, finding the cubes, and printing the values by storing them in the output array. The program uses basic Python functions like range and append, which should be clear to the programmer in the initial stages of learning.
How to Avoid StopIteration Exception in Python?
- As seen above StopIteration is not an error in Python but an exception and is used to run the next() method for the specified number of iterations. Iterator in Python uses two methods, i.e. iter() and next().
- The next() method raises a StopIteration exception when the next() method is called manually.
- The best way to avoid this exception in Python is to use normal looping or use it as a normal iterator instead of writing the next() method repeatedly.
- Otherwise, if not able to avoid StopIteration exception in Python, we can simply raise the exception in the next() method and catch the exception like a normal exception in Python using the except keyword.
Conclusion
As discussed above in the article, it must be clear to you what is the StopIteration exception and in which condition it is raised in Python. StopIteration exception could be an issue to deal with for the new programmers as it can be raised in many situations.
Recommended Articles
This is a guide to Python StopIteration. Here we discuss how StopIteration works in Python and how to avoid StopIteration exceptions with programming examples. You may also have a look at the following articles to learn more –
- Python Regex Tester
- Python Rest Server
- Python String Operations
- Python Counter
Есть некоторые распространенные исключения в Python. Эти исключения обычно поднимаются в разных программах. Они могут явным образом вызываться программистом, или интерпретатор Python может неявно вызывать исключения такого типа.
Ошибка AssertionError может возникать, когда оператор assert не выполняется. В Python есть некоторые, мы также можем установить некоторые утверждения assert в нашем коде. Утверждение assert всегда должно быть верным. если условие не выполнено, оно вызовет AssertionError.
Пример кода
class MyClass: def __init__(self, x): self.x = x assert self.x > 50 myObj = MyClass(5)
Вывод
--------------------------------------------------------------------------- AssertionError Traceback (most recent call last) <ipython-input-21-71785acdf821> in <module>() 4 assert self.x > 50 5 ----> 6 myObj = MyClass(5) <ipython-input-21-71785acdf821> in __init__(self, x) 2 def __init__(self, x): 3 self.x = x ----> 4 assert self.x > 50 5 6 myObj = MyClass(5) AssertionError:
Exception AttributeError
Ошибка атрибута может возникнуть, когда мы попытаемся получить доступ к некоторому атрибуту класса, но его нет в нем.
Пример кода
class point: def __init__(self, x=0, y=0): self.x = x self.y = y def getpoint(self): print('x= ' + str(self.x)) print('y= ' + str(self.y)) print('z= ' + str(self.z)) pt = point(10, 20) pt.getpoint()
Вывод
x= 10 y= 20 --------------------------------------------------------------------------- AttributeError Traceback (most recent call last) <ipython-input-15-f64eb52b2192> in <module>() 10 11 pt = point(10, 20) ---> 12 pt.getpoint() <ipython-input-15-f64eb52b2192> in getpoint(self) 7 print('x= ' + str(self.x)) 8 print('y= ' + str(self.y)) ----> 9 print('z= ' + str(self.z)) 10 11 pt = point(10, 20) AttributeError: 'point' object has no attribute 'z'
Исключение ImportError
Ошибка ImportError может возникнуть, когда в операторе импорта возникла проблема с импортом некоторого модуля. Это также может быть вызвано, когда имя пакета в операторе from является правильным, но не найдено ни одного модуля с указанным именем.
Пример кода
from math import abcd def __init__(self, x=0, y=0):
Вывод
--------------------------------------------------------------------------- ImportError Traceback (most recent call last) <ipython-input-23-ff4519a07c77> in <module>() ----> 1 from math import abcd ImportError: cannot import name 'abcd'
Исключение ModuleNotFoundError
Это подкласс ошибки ImportError. Когда модуль не находится, эта ошибка может возникать. Он также может быть вызван, если в sys.modules отсутствует None.
Пример кода
import abcd
Вывод
--------------------------------------------------------------------------- ModuleNotFoundError Traceback (most recent call last) <ipython-input-24-7b45aaa048eb> in <module>() ----> 1 import abcd ModuleNotFoundError: No module named 'abcd'
Исключение IndexError
Ошибка индекса может возрасти, когда нижний индекс последовательности (List, Tuple, Set и т. Д.) Выходит за пределы допустимого диапазона.
Пример кода
myList = [10, 20, 30, 40] print(str(myList[5]))
Вывод
--------------------------------------------------------------------------- IndexError Traceback (most recent call last) <ipython-input-29-a86bd85b04c9> in <module>() 1 myList = [10, 20, 30, 40] ----> 2 print(str(myList[5])) IndexError: list index out of range
Exception RecursionError
RecursionError — это ошибка времени выполнения. Когда максимальная глубина рекурсии будет превышена, она будет увеличена.
Пример кода
def myFunction(): myFunction() myFunction()
Вывод
--------------------------------------------------------------------------- RecursionError Traceback (most recent call last) <ipython-input-39-8a59e0fb982f> in <module>() 2 myFunction() 3 ----> 4 myFunction() <ipython-input-39-8a59e0fb982f> in myFunction() 1 def myFunction(): ----> 2 myFunction() 3 4 myFunction() ... last 1 frames repeated, from the frame below ... <ipython-input-39-8a59e0fb982f> in myFunction() 1 def myFunction(): ----> 2 myFunction() 3 4 myFunction() RecursionError: maximum recursion depth exceeded
Исключение
В python мы можем получить ошибку StopIteration с помощью встроенного метода next(). Если у одного итератора нет дополнительного элемента, метод next() вызовет ошибку StopIteration.
Пример кода
myList = [10, 20, 30, 40] myIter = iter(myList) while True: print(next(myIter))
Вывод
10 20 30 40 --------------------------------------------------------------------------- StopIteration Traceback (most recent call last) <ipython-input-42-e608e2162645> in <module>() 2 myIter = iter(myList) 3 while True: ----> 4 print(next(myIter)) StopIteration:
Исключение IndentationError
Если в коде Python есть недопустимый отступ, это вызовет ошибки такого рода. Он наследует класс SyntaxError в Python.
Пример кода
for i in range(10): print("The value of i: " + str(i))
Вывод
File "<ipython-input-44-d436d50bbdc8>", line 2 print("The value of i: " + str(i)) ^ IndentationError: expected an indented block
Исключение TypeError
Ошибка TypeError может возникнуть, когда операция выполняется над объектом неподходящего типа. Например, если мы предоставим число с плавающей точкой в индексе массива, он вернет TypeError.
Пример кода
muList = [10, 20, 30, 40] print(myList[1.25])
Вывод
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-46-e0a2a05cd4d4> in <module>() 1 muList = [10, 20, 30, 40] ----> 2 print(myList[1.25]) TypeError: list indices must be integers or slices, not float
Исключение ZeroDivisionError
Когда возникает ситуация, когда знаменатель равен 0 (нулю) для проблемы деления, он вызывает ZeroDivisionError.
Пример кода
print(5/0)
Вывод
--------------------------------------------------------------------------- ZeroDivisionError Traceback (most recent call last) <ipython-input-48-fad870a50e27> in <module>() ----> 1 print(5/0) ZeroDivisionError: division by zero