The python error TypeError: unsupported operand type(s) for -: ‘str’ and ‘str’ occurs when you try to subtract a string from another that contains numbers in both strings. The TypeError is due to the operand type minus (‘-‘) is unsupported between str (string). Auto casting is not supported by python. You can subtract a number from a different number. If you try to subtract a string from another string that may contain a number, the error TypeError: unsupported operand type(s) for -: ‘str’ and ‘str’ will be thrown.
In python, an arithmetic operation can be used between valid numbers. For example, you can subtract a number from a different number. The integer can be subtracted from a float number. If you try to subtract a string from a string that contains a number, the error TypeError: unsupported operand type(s) for -: ‘str’ and ‘str’ will be thrown.
Objects other than numbers can not be used in python substraction. The arithmetic subtract can be used only for numbers. If a number is stored as a string, it should be converted to an integer before subtracting it from each string. If you try to subtract a string to a string containing a number, the error TypeError: unsupported operand type(s) for +: ‘str’ and ‘str’ will be shown.
Exception
The error TypeError: unsupported operand type(s) for-: ‘str’ and ‘str’ will be shown as below the stack trace. The stack trace shows the line where a string is subtracted from a string that may contain valid numbers.
Traceback (most recent call last):
File "/Users/python/Desktop/test.py", line 3, in <module>
print x - y
TypeError: unsupported operand type(s) for -: 'str' and 'str'
[Finished in 0.0s with exit code 1]
How to reproduce this error
If you try to subtract a string from another string containing a number, the error TypeError: unsupported operand type(s) for-: ‘str’ and ‘str’ will be reproduced. Create two python variables. Assign variables with a string that contains a valid number. Subtract from the string to another string.
x = '5'
y = '2'
print x - y
Output
Traceback (most recent call last):
File "/Users/python/Desktop/test.py", line 3, in <module>
print x - y
TypeError: unsupported operand type(s) for -: 'str' and 'str'
[Finished in 0.0s with exit code 1]
Root Cause
Python does not support auto casting. The arithmetic operation subtraction can be used to subtract between two valid numbers. If a string is subtracted from another string, this error will be thrown. The string may contain a valid number. The string should be converted to integer before subtracting.
Solution 1
If you try to subtract a string from another string contains a valid number, convert the string to an integer using the built in function int(). This will resolve the error. The built in function int() converts a string contains a valid number to an integer number.
x = int('5')
y = int('2')
print x - y
Output
3
[Finished in 0.1s]
Solution 2
If you are trying to subtract a string from a string containing a valid number, change the string to an integer. This is going to address the error TypeError: unsupported operand type(s) for-: ‘str’ and ‘str’ . You can not subtract a string from another string.
x = 5
y = 2
print x - y
Output
3
[Finished in 0.1s]
Solution 3
If the variable type is unknown, the variable type should be checked before subtracting the number to another number. The example below shows the method of verification before subtracting the numbers
x = '5'
y = '2'
if (x is int) and (y is int) :
print x - y
else :
print "Not a number"
Output
Not a number
[Finished in 0.0s]
name = input('Enter name here:')
pyc = input('enter pyc :')
tpy = input('enter tpy:')
percent = (pyc / tpy) * 100;
print (percent)
input('press enter to quit')
whenever i run this program i get this
TypeError: unsupported operand type(s) for /: 'str' and 'str'
what can i do to divide pyc by tpy?
asked Mar 5, 2013 at 22:52
By turning them into integers instead:
percent = (int(pyc) / int(tpy)) * 100;
In python 3, the input()
function returns a string. Always. This is a change from Python 2; the raw_input()
function was renamed to input()
.
answered Mar 5, 2013 at 22:53
Martijn Pieters♦Martijn Pieters
1.0m283 gold badges3973 silver badges3296 bronze badges
1
The first thing you should do is learn to read error messages. What does it tell you — that you can’t use two strings with the divide operator.
So, ask yourself why they are strings and how do you make them not-strings. They are strings because all input is done via strings. And the way to make then not-strings is to convert them.
One way to convert a string to an integer is to use the int function. For example:
percent = (int(pyc) / int(tpy)) * 100
answered Mar 5, 2013 at 22:53
Bryan OakleyBryan Oakley
360k50 gold badges531 silver badges670 bronze badges
I would have written:
percent = 100
while True:
try:
pyc = int(input('enter pyc :'))
tpy = int(input('enter tpy:'))
percent = (pyc / tpy) * percent
break
except ZeroDivisionError as detail:
print 'Handling run-time error:', detail
answered Mar 6, 2013 at 2:49
2
There is another error with the forwars=d slash.
if we get this : def get_x(r): return path/'train'/r['fname']
is the same as def get_x(r): return path + 'train' + r['fname']
answered Jun 24, 2020 at 19:32
name = input ('What is your name?: ')
age = input('How old are you?: ')
date = input ('What year is it?: ')
year = (int(date) - int(age) + 100)
print('You'll be 100 in the year ', year)
#That's how I decided to hardcode it. You could get more specific with actual birthdates or else it'll probably be off by a year unless your bday passed.
answered Jan 10, 2022 at 16:31
1
Как исправить: TypeError: неподдерживаемые типы операндов для -: 'str' и 'int'
17 авг. 2022 г.
читать 1 мин
Одна ошибка, с которой вы можете столкнуться при использовании Python:
TypeError : unsupported operand type(s) for -: 'str' and 'int'
Эта ошибка возникает при попытке выполнить вычитание со строковой переменной и числовой переменной.
В следующем примере показано, как устранить эту ошибку на практике.
Как воспроизвести ошибку
Предположим, у нас есть следующие Pandas DataFrame:
import pandas as pd
#create DataFrame
df = pd.DataFrame({'team': ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H'],
'points_for': ['18', '22', '19', '14', '14', '11', '20', '28'],
'points_against': [5, 7, 17, 22, 12, 9, 9, 4]})
#view DataFrame
print(df)
team points_for points_against
0 A 18 5
1 B 22 7
2 C 19 17
3 D 14 22
4 E 14 12
5 F 11 9
6 G 20 9
7 H 28 4
#view data type of each column
print(df.dtypes )
team object
points_for object
points_against int64
dtype: object
Теперь предположим, что мы пытаемся вычесть столбец points_against из столбца points_for :
#attempt to perform subtraction
df['diff'] = df.points_for - df.points_against
TypeError : unsupported operand type(s) for -: 'str' and 'int'
Мы получаем TypeError , потому что столбец points_for является строкой, а столбец points_against — числовым.
Для выполнения вычитания оба столбца должны быть числовыми.
Как исправить ошибку
Чтобы устранить эту ошибку, мы можем использовать .astype(int) для преобразования столбца points_for в целое число перед выполнением вычитания:
#convert points_for column to integer
df['points_for'] = df['points_for'].astype (int)
#perform subtraction
df['diff'] = df.points_for - df.points_against
#view updated DataFrame
print(df)
team points_for points_against diff
0 A 18 5 13
1 B 22 7 15
2 C 19 17 2
3 D 14 22 -8
4 E 14 12 2
5 F 11 9 2
6 G 20 9 11
7 H 28 4 24
#view data type of each column
print(df.dtypes )
team object
points_for int32
points_against int64
diff int64
dtype: object
Обратите внимание, что мы не получаем ошибку, потому что оба столбца, которые мы использовали для вычитания, являются числовыми столбцами.
Дополнительные ресурсы
В следующих руководствах объясняется, как исправить другие распространенные ошибки в Python:
Как исправить KeyError в Pandas
Как исправить: ValueError: невозможно преобразовать число с плавающей запятой NaN в целое число
Как исправить: ValueError: операнды не могли транслироваться вместе с фигурами
Python provides support for arithmetic operations between numerical values with arithmetic operators. Suppose we try to perform certain operations between a string and an integer value, for example, concatenation +. In that case, we will raise the error: “TypeError: unsupported operand type(s) for +: ‘str’ and ‘int’”.
This tutorial will go through the error with example scenarios to learn how to solve it.
Table of contents
- TypeError: unsupported operand type(s) for +: ‘int’ and ‘str’
- What is a TypeError?
- Artithmetic Operators
- Example: Using input() Without Converting to Integer Using int()
- Solution
- Variations of TypeError: unsupported operand type(s) for: ‘int’ and ‘str’
- TypeError: unsupported operand type(s) for -: ‘int’ and ‘str’
- Solution
- TypeError: unsupported operand type(s) for /: ‘int’ and ‘str’
- Solution
- TypeError: unsupported operand type(s) for %: ‘int’ and ‘str’
- Solution
- TypeError: unsupported operand type(s) for ** or pow(): ‘int’ and ‘str’
- Solution
- TypeError: unsupported operand type(s) for //: ‘int’ and ‘str’
- Solution
- TypeError: unsupported operand type(s) for -: ‘int’ and ‘str’
- Summary
TypeError: unsupported operand type(s) for +: ‘int’ and ‘str’
What is a TypeError?
TypeError tells us that we are trying to perform an illegal operation for a specific Python data type. TypeError exceptions may occur while performing operations between two incompatible data types. In this article, the incompatible data types are string and integer.
Artithmetic Operators
We can use arithmetic operators for mathematical operations. There are seven arithmetic operators in Python:
Operator | Symbol | Syntax |
---|---|---|
Addition | + | x + y |
Subtraction | – | x -y |
Multiplication | * | x *y |
Division | / | x / y |
Modulus | % | x % y |
Exponentiation | ** | x ** y |
Floor division | // | x // y |
All of the operators are suitable for integer operands. We can use the multiplication operator with string and integer combined. For example, we can duplicate a string by multiplying a string by an integer. Let’s look at an example of multiplying a word by four.
string = "research" integer = 4 print(string * integer)
researchresearchresearchresearch
Python supports multiplication between a string and an integer. However, if you try to multiply a string by a float you will raise the error: TypeError: can’t multiply sequence by non-int of type ‘float’.
However, suppose we try to use other operators between a string and an integer. Operand x is a string, and operand y is an integer. In that case, we will raise the error: TypeError: unsupported operand type(s) for: [operator]: ‘str’ and ‘int’, where [operator] is the arithmetic operator used to raise the error. If operand x is an integer and operand y is a string, we will raise the error: TypeError: unsupported operand type(s) for: [operator]: ‘int’ and ‘str’. Let’s look at an example scenario.
Example: Using input() Without Converting to Integer Using int()
Python developers encounter a common scenario when the code takes an integer value using the input() function but forget to convert it to integer datatype. Let’s write a program that calculates how many apples are in stock after a farmer drops off some at a market. The program defines the current number of apples; then, the user inputs the number of apples to drop off. We will then sum up the current number with the farmer’s apples to get the total apples and print the result to the console. Let’s look at the code:
num_apples = 100 farmer_apples = input("How many apples are you dropping off today?: ") total_apples = num_apples + farmer_apples print(f'total number of apples: {total_apples}')
Let’s run the code to see what happens:
How many apples are you dropping off today?: 50 --------------------------------------------------------------------------- TypeError Traceback (most recent call last) 1 total_apples = num_apples + farmer_apples TypeError: unsupported operand type(s) for +: 'int' and 'str'
We raise the because Python does not support the addition operator between string and integer data types.
Solution
The solve this problem, we need to convert the value assigned to the farmer_apples variable to an integer. We can do this using the Python int() function. Let’s look at the revised code:
num_apples = 100 farmer_apples = int(input("How many apples are you dropping off today?: ")) total_apples = num_apples + farmer_apples print(f'total number of apples: {total_apples}')
Let’s run the code to get the correct result:
How many apples are you dropping off today?: 50 total number of apples: 150
Variations of TypeError: unsupported operand type(s) for: ‘int’ and ‘str’
If we are trying to perform mathematical operations between operands and one of the operands is a string, we need to convert the string to an integer. This solution is necessary for the operators: addition, subtraction, division, modulo, exponentiation and floor division, but not multiplication. Let’s look at the variations of the TypeError for the different operators.
TypeError: unsupported operand type(s) for -: ‘int’ and ‘str’
The subtraction operator – subtracts two operands, x and y. Let’s look at an example with an integer and a string:
x = 100 y = "10" print(f'x - y = {x - y}')
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) 1 print(f'x - y = {x - y}') TypeError: unsupported operand type(s) for -: 'int' and 'str'
Solution
We must convert the y variable to an integer using the int() function to solve this. Let’s look at the revised code and result:
x = 100 y = "10" print(f'x - y = {x - int(y)}')
x - y = 90
TypeError: unsupported operand type(s) for /: ‘int’ and ‘str’
The division operator divides the first operand by the second and returns the value as a float. Let’s look at an example with an integer and a string :
x = 100 y = "10" print(f'x / y = {x / y}')
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) 1 print(f'x / y = {x / y}') TypeError: unsupported operand type(s) for /: 'int' and 'str'
Solution
We must convert the y variable to an integer using the int()
function to solve this. Let’s look at the revised code and result:
x = 100 y = "10" print(f'x / y = {x / int(y)}')
x / y = 10.0
TypeError: unsupported operand type(s) for %: ‘int’ and ‘str’
The modulus operator returns the remainder when we divide the first operand by the second. If the modulus is zero, then the second operand is a factor of the first operand. Let’s look at an example with an and a string.
x = 100 y = "10" print(f'x % y = {x % y}')
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) 1 print(f'x % y = {x % y}') TypeError: unsupported operand type(s) for %: 'int' and 'str'
Solution
We must convert the y variable to an integer using the int() function to solve this. Let’s look at the revised code and result:
x = 100 y = "10" print(f'x % y = {x % int(y)}')
x % y = 0
TypeError: unsupported operand type(s) for ** or pow(): ‘int’ and ‘str’
The exponentiation operator raises the first operand to the power of the second operand. We can use this operator to calculate a number’s square root and to square a number. Let’s look at an example with an integer and a string:
x = 100 y = "10" print(f'x ** y = {x ** y}')
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) 1 print(f'x ** y = {x ** y}') TypeError: unsupported operand type(s) for ** or pow(): 'int' and 'str'
Solution
We must convert the y variable to an integer using the int() function to solve this. Let’s look at the revised code and result:
x = 100 y = "10" print(f'x ** y = {x ** int(y)}')
x ** y = 100000000000000000000
TypeError: unsupported operand type(s) for //: ‘int’ and ‘str’
The floor division operator divides the first operand by the second and rounds down the result to the nearest integer. Let’s look at an example with an integer and a string:
x = 100 y = "10" print(f'x // y = {x // y}')
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) 1 print(f'x // y = {x // y}') TypeError: unsupported operand type(s) for //: 'int' and 'str'
Solution
We must convert the y variable to an integer using the int() function to solve this. Let’s look at the revised code and result:
x = 100 y = "10" print(f'x // y = {x // int(y)}')
x // y = 10
Summary
Congratulations on reading to the end of this tutorial! The error: TypeError: unsupported operand type(s) for +: ‘int’ and ‘str’ occurs when we try to perform addition between an integer value and a string value. Python does not support arithmetic operations between strings and integers, excluding multiplication. To solve this error, ensure you use only integers for mathematical operations by converting string variables with the int() function. If you want to concatenate an integer to a string separate from mathematical operations, you can convert the integer to a string. There are other ways to concatenate an integer to a string, which you can learn in the article: “Python TypeError: can only concatenate str (not “int”) to str Solution“. Now you are ready to use the arithmetic operators in Python like a pro!
Go to the online courses page on Python to learn more about coding in Python for data science and machine learning.
Have fun and happy researching!
I’ve been doing some more exploration of the UK Coronavirus vaccine data, this time looking at the number of people vaccinated by Local Tier Local Authority.
The government publish data showing the number of people vaccinated in each authority by age group, as well as population estimates for each cohort.
Having loaded that data into two Pandas DataFrames, I wanted to work out the % of people vaccinated per age group per local area.
In this blog post we’ll see how to do that, including my missteps along the way.
Let’s start by importing Pandas:
And now we’re going to create DataFrames with a subset of the data from the Public Health England spreadsheet as of 1st April 2021.
First for the number of vaccinations given:
vaccinations = pd.DataFrame({
"LTLA Code": ["E07000032", "E07000170", "E07000171"],
"LTLA Name": ["Amber Valley", "Ashfield", "Bassetlaw"],
"Under 50": [16498, 17418, 13068],
"50-54": [9002, 8399, 7858]
})
vaccinations
LTLA Code | LTLA Name | Under 50 | 50-54 | |
---|---|---|---|---|
0 |
E07000032 |
Amber Valley |
16498 |
9002 |
1 |
E07000170 |
Ashfield |
17418 |
8399 |
2 |
E07000171 |
Bassetlaw |
13068 |
7858 |
And now the population estimates:
population = pd.DataFrame({
"LTLA Code": ["E07000032", "E07000170", "E07000171"],
"LTLA Name": ["Amber Valley", "Ashfield", "Bassetlaw"],
"Under 50": [72179, 77988, 70832],
"50-54": [10194, 9795, 9354]
})
population
LTLA Code | LTLA Name | Under 50 | 50-54 | |
---|---|---|---|---|
0 |
E07000032 |
Amber Valley |
72179 |
10194 |
1 |
E07000170 |
Ashfield |
77988 |
9795 |
2 |
E07000171 |
Bassetlaw |
70832 |
9354 |
For my first attempt at working out the % of people vaccinated per age group, I optimistically tried dividing the DataFrames, as shown below:
vaccinations / population
Output
Traceback (most recent call last):
File "/home/markhneedham/.local/share/virtualenvs/covid-vaccines-xEbcGJTy/lib/python3.8/site-packages/pandas/core/ops/array_ops.py", line 142, in _na_arithmetic_op
result = expressions.evaluate(op, left, right)
File "/home/markhneedham/.local/share/virtualenvs/covid-vaccines-xEbcGJTy/lib/python3.8/site-packages/pandas/core/computation/expressions.py", line 235, in evaluate
return _evaluate(op, op_str, a, b) # type: ignore[misc]
File "/home/markhneedham/.local/share/virtualenvs/covid-vaccines-xEbcGJTy/lib/python3.8/site-packages/pandas/core/computation/expressions.py", line 69, in _evaluate_standard
return op(a, b)
TypeError: unsupported operand type(s) for /: 'str' and 'str'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/markhneedham/.local/share/virtualenvs/covid-vaccines-xEbcGJTy/lib/python3.8/site-packages/pandas/core/ops/common.py", line 65, in new_method
return method(self, other)
File "/home/markhneedham/.local/share/virtualenvs/covid-vaccines-xEbcGJTy/lib/python3.8/site-packages/pandas/core/arraylike.py", line 113, in __truediv__
return self._arith_method(other, operator.truediv)
File "/home/markhneedham/.local/share/virtualenvs/covid-vaccines-xEbcGJTy/lib/python3.8/site-packages/pandas/core/frame.py", line 5982, in _arith_method
new_data = self._dispatch_frame_op(other, op, axis=axis)
File "/home/markhneedham/.local/share/virtualenvs/covid-vaccines-xEbcGJTy/lib/python3.8/site-packages/pandas/core/frame.py", line 6018, in _dispatch_frame_op
bm = self._mgr.operate_blockwise(right._mgr, array_op)
File "/home/markhneedham/.local/share/virtualenvs/covid-vaccines-xEbcGJTy/lib/python3.8/site-packages/pandas/core/internals/managers.py", line 374, in operate_blockwise
return operate_blockwise(self, other, array_op)
File "/home/markhneedham/.local/share/virtualenvs/covid-vaccines-xEbcGJTy/lib/python3.8/site-packages/pandas/core/internals/ops.py", line 54, in operate_blockwise
res_values = array_op(lvals, rvals)
File "/home/markhneedham/.local/share/virtualenvs/covid-vaccines-xEbcGJTy/lib/python3.8/site-packages/pandas/core/ops/array_ops.py", line 189, in arithmetic_op
res_values = _na_arithmetic_op(lvalues, rvalues, op)
File "/home/markhneedham/.local/share/virtualenvs/covid-vaccines-xEbcGJTy/lib/python3.8/site-packages/pandas/core/ops/array_ops.py", line 149, in _na_arithmetic_op
result = _masked_arith_op(left, right, op)
File "/home/markhneedham/.local/share/virtualenvs/covid-vaccines-xEbcGJTy/lib/python3.8/site-packages/pandas/core/ops/array_ops.py", line 91, in _masked_arith_op
result[mask] = op(xrav[mask], yrav[mask])
TypeError: unsupported operand type(s) for /: 'str' and 'str'
That doesn’t work so well because we still have LTLA Code
and LTLA Name
, which aren’t numeric values and therefore can’t be divided.
What we can do instead is use the divide
function, which lets us pass in a mask that will exclude non-numeric columns.
I learnt about this thanks to a StackOverflow answer by cs95.
Before we try that, we need to check the types of our columns so that we can exclude the right ones.
We can do this using the following code:
Output
LTLA Code object
LTLA Name object
Under 50 int64
50-54 int64
dtype: object
Output
LTLA Code object
LTLA Name object
Under 50 int64
50-54 int64
dtype: object
So it looks like ‘object’ is the type that we need to exclude.
Note |
While playing around with this I found that sometimes columns containing strings might have the type |
Let’s now try to divide the DataFrames, excluding any columns of type object
:
vaccinations.select_dtypes(exclude='object').div(population.select_dtypes(exclude='object'))
Under 50 | 50-54 | |
---|---|---|
0 |
0.228571 |
0.883068 |
1 |
0.223342 |
0.857478 |
2 |
0.184493 |
0.840068 |
Cool!
That’s what we hoped to see, but it would be good if we could also have the LTLA Code
and LTLA Name
columns back as well.
We can do this using the combine_first
function:
vaccinations.select_dtypes(exclude='object').div(population.select_dtypes(exclude='object')).combine_first(population)
50-54 | LTLA Code | LTLA Name | Under 50 | |
---|---|---|---|---|
0 |
0.883068 |
E07000032 |
Amber Valley |
0.228571 |
1 |
0.857478 |
E07000170 |
Ashfield |
0.223342 |
2 |
0.840068 |
E07000171 |
Bassetlaw |
0.184493 |
That’s got the columns back, but the order is a bit messed up.
Luckily it’s not too difficult to retain the column order:
vaccinations.select_dtypes(exclude='object').div(population.select_dtypes(exclude='object')).combine_first(population)[vaccinations.columns]
LTLA Code | LTLA Name | Under 50 | 50-54 | |
---|---|---|---|---|
0 |
E07000032 |
Amber Valley |
0.228571 |
0.883068 |
1 |
E07000170 |
Ashfield |
0.223342 |
0.857478 |
2 |
E07000171 |
Bassetlaw |
0.184493 |
0.840068 |
Обработка ошибок увеличивает отказоустойчивость кода, защищая его от потенциальных сбоев, которые могут привести к преждевременному завершению работы.
Прежде чем переходить к обсуждению того, почему обработка исключений так важна, и рассматривать встроенные в Python исключения, важно понять, что есть тонкая грань между понятиями ошибки и исключения.
Ошибку нельзя обработать, а исключения Python обрабатываются при выполнении программы. Ошибка может быть синтаксической, но существует и много видов исключений, которые возникают при выполнении и не останавливают программу сразу же. Ошибка может указывать на критические проблемы, которые приложение и не должно перехватывать, а исключения — состояния, которые стоит попробовать перехватить. Ошибки — вид непроверяемых и невозвратимых ошибок, таких как OutOfMemoryError
, которые не стоит пытаться обработать.
Обработка исключений делает код более отказоустойчивым и помогает предотвращать потенциальные проблемы, которые могут привести к преждевременной остановке выполнения. Представьте код, который готов к развертыванию, но все равно прекращает работу из-за исключения. Клиент такой не примет, поэтому стоит заранее обработать конкретные исключения, чтобы избежать неразберихи.
Ошибки могут быть разных видов:
- Синтаксические
- Недостаточно памяти
- Ошибки рекурсии
- Исключения
Разберем их по очереди.
Синтаксические ошибки (SyntaxError)
Синтаксические ошибки часто называют ошибками разбора. Они возникают, когда интерпретатор обнаруживает синтаксическую проблему в коде.
Рассмотрим на примере.
a = 8
b = 10
c = a b
File "", line 3
c = a b
^
SyntaxError: invalid syntax
Стрелка вверху указывает на место, где интерпретатор получил ошибку при попытке исполнения. Знак перед стрелкой указывает на причину проблемы. Для устранения таких фундаментальных ошибок Python будет делать большую часть работы за программиста, выводя название файла и номер строки, где была обнаружена ошибка.
Недостаточно памяти (OutofMemoryError)
Ошибки памяти чаще всего связаны с оперативной памятью компьютера и относятся к структуре данных под названием “Куча” (heap
). Если есть крупные объекты (или) ссылки на подобные, то с большой долей вероятности возникнет ошибка OutofMemory
. Она может появиться по нескольким причинам:
- Использование 32-битной архитектуры Python (максимальный объем выделенной памяти невысокий, между 2 и 4 ГБ);
- Загрузка файла большого размера;
- Запуск модели машинного обучения/глубокого обучения и много другое;
Обработать ошибку памяти можно с помощью обработки исключений — резервного исключения. Оно используется, когда у интерпретатора заканчивается память и он должен немедленно остановить текущее исполнение. В редких случаях Python вызывает OutofMemoryError
, позволяя скрипту каким-то образом перехватить самого себя, остановить ошибку памяти и восстановиться.
Но поскольку Python использует архитектуру управления памятью из языка C (функция malloc()
), не факт, что все процессы восстановятся — в некоторых случаях MemoryError
приведет к остановке. Следовательно, обрабатывать такие ошибки не рекомендуется, и это не считается хорошей практикой.
Ошибка рекурсии (RecursionError)
Эта ошибка связана со стеком и происходит при вызове функций. Как и предполагает название, ошибка рекурсии возникает, когда внутри друг друга исполняется много методов (один из которых — с бесконечной рекурсией), но это ограничено размером стека.
Все локальные переменные и методы размещаются в стеке. Для каждого вызова метода создается стековый кадр (фрейм), внутрь которого помещаются данные переменной или результат вызова метода. Когда исполнение метода завершается, его элемент удаляется.
Чтобы воспроизвести эту ошибку, определим функцию recursion
, которая будет рекурсивной — вызывать сама себя в бесконечном цикле. В результате появится ошибка StackOverflow
или ошибка рекурсии, потому что стековый кадр будет заполняться данными метода из каждого вызова, но они не будут освобождаться.
def recursion():
return recursion()
recursion()
---------------------------------------------------------------------------
RecursionError Traceback (most recent call last)
in
----> 1 recursion()
in recursion()
1 def recursion():
----> 2 return recursion()
... last 1 frames repeated, from the frame below ...
in recursion()
1 def recursion():
----> 2 return recursion()
RecursionError: maximum recursion depth exceeded
Ошибка отступа (IndentationError)
Эта ошибка похожа по духу на синтаксическую и является ее подвидом. Тем не менее она возникает только в случае проблем с отступами.
Пример:
for i in range(10):
print('Привет Мир!')
File "", line 2
print('Привет Мир!')
^
IndentationError: expected an indented block
Исключения
Даже если синтаксис в инструкции или само выражение верны, они все равно могут вызывать ошибки при исполнении. Исключения Python — это ошибки, обнаруживаемые при исполнении, но не являющиеся критическими. Скоро вы узнаете, как справляться с ними в программах Python. Объект исключения создается при вызове исключения Python. Если скрипт не обрабатывает исключение явно, программа будет остановлена принудительно.
Программы обычно не обрабатывают исключения, что приводит к подобным сообщениям об ошибке:
Ошибка типа (TypeError)
a = 2
b = 'PythonRu'
a + b
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
in
1 a = 2
2 b = 'PythonRu'
----> 3 a + b
TypeError: unsupported operand type(s) for +: 'int' and 'str'
Ошибка деления на ноль (ZeroDivisionError)
10 / 0
---------------------------------------------------------------------------
ZeroDivisionError Traceback (most recent call last)
in
----> 1 10 / 0
ZeroDivisionError: division by zero
Есть разные типы исключений в Python и их тип выводится в сообщении: вверху примеры TypeError
и ZeroDivisionError
. Обе строки в сообщениях об ошибке представляют собой имена встроенных исключений Python.
Оставшаяся часть строки с ошибкой предлагает подробности о причине ошибки на основе ее типа.
Теперь рассмотрим встроенные исключения Python.
Встроенные исключения
BaseException
+-- SystemExit
+-- KeyboardInterrupt
+-- GeneratorExit
+-- Exception
+-- StopIteration
+-- StopAsyncIteration
+-- ArithmeticError
| +-- FloatingPointError
| +-- OverflowError
| +-- ZeroDivisionError
+-- AssertionError
+-- AttributeError
+-- BufferError
+-- EOFError
+-- ImportError
| +-- ModuleNotFoundError
+-- LookupError
| +-- IndexError
| +-- KeyError
+-- MemoryError
+-- NameError
| +-- UnboundLocalError
+-- OSError
| +-- BlockingIOError
| +-- ChildProcessError
| +-- ConnectionError
| | +-- BrokenPipeError
| | +-- ConnectionAbortedError
| | +-- ConnectionRefusedError
| | +-- ConnectionResetError
| +-- FileExistsError
| +-- FileNotFoundError
| +-- InterruptedError
| +-- IsADirectoryError
| +-- NotADirectoryError
| +-- PermissionError
| +-- ProcessLookupError
| +-- TimeoutError
+-- ReferenceError
+-- RuntimeError
| +-- NotImplementedError
| +-- RecursionError
+-- SyntaxError
| +-- IndentationError
| +-- TabError
+-- SystemError
+-- TypeError
+-- ValueError
| +-- UnicodeError
| +-- UnicodeDecodeError
| +-- UnicodeEncodeError
| +-- UnicodeTranslateError
+-- Warning
+-- DeprecationWarning
+-- PendingDeprecationWarning
+-- RuntimeWarning
+-- SyntaxWarning
+-- UserWarning
+-- FutureWarning
+-- ImportWarning
+-- UnicodeWarning
+-- BytesWarning
+-- ResourceWarning
Прежде чем переходить к разбору встроенных исключений быстро вспомним 4 основных компонента обработки исключения, как показано на этой схеме.
Try
: он запускает блок кода, в котором ожидается ошибка.Except
: здесь определяется тип исключения, который ожидается в блокеtry
(встроенный или созданный).Else
: если исключений нет, тогда исполняется этот блок (его можно воспринимать как средство для запуска кода в том случае, если ожидается, что часть кода приведет к исключению).Finally
: вне зависимости от того, будет ли исключение или нет, этот блок кода исполняется всегда.
В следующем разделе руководства больше узнаете об общих типах исключений и научитесь обрабатывать их с помощью инструмента обработки исключения.
Ошибка прерывания с клавиатуры (KeyboardInterrupt)
Исключение KeyboardInterrupt
вызывается при попытке остановить программу с помощью сочетания Ctrl + C
или Ctrl + Z
в командной строке или ядре в Jupyter Notebook. Иногда это происходит неумышленно и подобная обработка поможет избежать подобных ситуаций.
В примере ниже если запустить ячейку и прервать ядро, программа вызовет исключение KeyboardInterrupt
. Теперь обработаем исключение KeyboardInterrupt
.
try:
inp = input()
print('Нажмите Ctrl+C и прервите Kernel:')
except KeyboardInterrupt:
print('Исключение KeyboardInterrupt')
else:
print('Исключений не произошло')
Исключение KeyboardInterrupt
Стандартные ошибки (StandardError)
Рассмотрим некоторые базовые ошибки в программировании.
Арифметические ошибки (ArithmeticError)
- Ошибка деления на ноль (Zero Division);
- Ошибка переполнения (OverFlow);
- Ошибка плавающей точки (Floating Point);
Все перечисленные выше исключения относятся к классу Arithmetic
и вызываются при ошибках в арифметических операциях.
Деление на ноль (ZeroDivisionError)
Когда делитель (второй аргумент операции деления) или знаменатель равны нулю, тогда результатом будет ошибка деления на ноль.
try:
a = 100 / 0
print(a)
except ZeroDivisionError:
print("Исключение ZeroDivisionError." )
else:
print("Успех, нет ошибок!")
Исключение ZeroDivisionError.
Переполнение (OverflowError)
Ошибка переполнение вызывается, когда результат операции выходил за пределы диапазона. Она характерна для целых чисел вне диапазона.
try:
import math
print(math.exp(1000))
except OverflowError:
print("Исключение OverFlow.")
else:
print("Успех, нет ошибок!")
Исключение OverFlow.
Ошибка утверждения (AssertionError)
Когда инструкция утверждения не верна, вызывается ошибка утверждения.
Рассмотрим пример. Предположим, есть две переменные: a
и b
. Их нужно сравнить. Чтобы проверить, равны ли они, необходимо использовать ключевое слово assert
, что приведет к вызову исключения Assertion
в том случае, если выражение будет ложным.
try:
a = 100
b = "PythonRu"
assert a == b
except AssertionError:
print("Исключение AssertionError.")
else:
print("Успех, нет ошибок!")
Исключение AssertionError.
Ошибка атрибута (AttributeError)
При попытке сослаться на несуществующий атрибут программа вернет ошибку атрибута. В следующем примере можно увидеть, что у объекта класса Attributes
нет атрибута с именем attribute
.
class Attributes(obj):
a = 2
print(a)
try:
obj = Attributes()
print(obj.attribute)
except AttributeError:
print("Исключение AttributeError.")
2
Исключение AttributeError.
Ошибка импорта (ModuleNotFoundError)
Ошибка импорта вызывается при попытке импортировать несуществующий (или неспособный загрузиться) модуль в стандартном пути или даже при допущенной ошибке в имени.
import nibabel
---------------------------------------------------------------------------
ModuleNotFoundError Traceback (most recent call last)
in
----> 1 import nibabel
ModuleNotFoundError: No module named 'nibabel'
Ошибка поиска (LookupError)
LockupError
выступает базовым классом для исключений, которые происходят, когда key
или index
используются для связывания или последовательность списка/словаря неверна или не существует.
Здесь есть два вида исключений:
- Ошибка индекса (
IndexError
); - Ошибка ключа (
KeyError
);
Ошибка ключа
Если ключа, к которому нужно получить доступ, не оказывается в словаре, вызывается исключение KeyError
.
try:
a = {1:'a', 2:'b', 3:'c'}
print(a[4])
except LookupError:
print("Исключение KeyError.")
else:
print("Успех, нет ошибок!")
Исключение KeyError.
Ошибка индекса
Если пытаться получить доступ к индексу (последовательности) списка, которого не существует в этом списке или находится вне его диапазона, будет вызвана ошибка индекса (IndexError: list index out of range python).
try:
a = ['a', 'b', 'c']
print(a[4])
except LookupError:
print("Исключение IndexError, индекс списка вне диапазона.")
else:
print("Успех, нет ошибок!")
Исключение IndexError, индекс списка вне диапазона.
Ошибка памяти (MemoryError)
Как уже упоминалось, ошибка памяти вызывается, когда операции не хватает памяти для выполнения.
Ошибка имени (NameError)
Ошибка имени возникает, когда локальное или глобальное имя не находится.
В следующем примере переменная ans
не определена. Результатом будет ошибка NameError
.
try:
print(ans)
except NameError:
print("NameError: переменная 'ans' не определена")
else:
print("Успех, нет ошибок!")
NameError: переменная 'ans' не определена
Ошибка выполнения (Runtime Error)
Ошибка «NotImplementedError»
Ошибка выполнения служит базовым классом для ошибки NotImplemented
. Абстрактные методы определенного пользователем класса вызывают это исключение, когда производные методы перезаписывают оригинальный.
class BaseClass(object):
"""Опередляем класс"""
def __init__(self):
super(BaseClass, self).__init__()
def do_something(self):
# функция ничего не делает
raise NotImplementedError(self.__class__.__name__ + '.do_something')
class SubClass(BaseClass):
"""Реализует функцию"""
def do_something(self):
# действительно что-то делает
print(self.__class__.__name__ + ' что-то делает!')
SubClass().do_something()
BaseClass().do_something()
SubClass что-то делает!
---------------------------------------------------------------------------
NotImplementedError Traceback (most recent call last)
in
14
15 SubClass().do_something()
---> 16 BaseClass().do_something()
in do_something(self)
5 def do_something(self):
6 # функция ничего не делает
----> 7 raise NotImplementedError(self.__class__.__name__ + '.do_something')
8
9 class SubClass(BaseClass):
NotImplementedError: BaseClass.do_something
Ошибка типа (TypeError)
Ошибка типа вызывается при попытке объединить два несовместимых операнда или объекта.
В примере ниже целое число пытаются добавить к строке, что приводит к ошибке типа.
try:
a = 5
b = "PythonRu"
c = a + b
except TypeError:
print('Исключение TypeError')
else:
print('Успех, нет ошибок!')
Исключение TypeError
Ошибка значения (ValueError)
Ошибка значения вызывается, когда встроенная операция или функция получают аргумент с корректным типом, но недопустимым значением.
В этом примере встроенная операция float
получат аргумент, представляющий собой последовательность символов (значение), что является недопустимым значением для типа: число с плавающей точкой.
try:
print(float('PythonRu'))
except ValueError:
print('ValueError: не удалось преобразовать строку в float: 'PythonRu'')
else:
print('Успех, нет ошибок!')
ValueError: не удалось преобразовать строку в float: 'PythonRu'
Пользовательские исключения в Python
В Python есть много встроенных исключений для использования в программе. Но иногда нужно создавать собственные со своими сообщениями для конкретных целей.
Это можно сделать, создав новый класс, который будет наследовать из класса Exception
в Python.
class UnAcceptedValueError(Exception):
def __init__(self, data):
self.data = data
def __str__(self):
return repr(self.data)
Total_Marks = int(input("Введите общее количество баллов: "))
try:
Num_of_Sections = int(input("Введите количество разделов: "))
if(Num_of_Sections < 1):
raise UnAcceptedValueError("Количество секций не может быть меньше 1")
except UnAcceptedValueError as e:
print("Полученная ошибка:", e.data)
Введите общее количество баллов: 10
Введите количество разделов: 0
Полученная ошибка: Количество секций не может быть меньше 1
В предыдущем примере если ввести что-либо меньше 1, будет вызвано исключение. Многие стандартные исключения имеют собственные исключения, которые вызываются при возникновении проблем в работе их функций.
Недостатки обработки исключений в Python
У использования исключений есть свои побочные эффекты, как, например, то, что программы с блоками try-except работают медленнее, а количество кода возрастает.
Дальше пример, где модуль Python timeit
используется для проверки времени исполнения 2 разных инструкций. В stmt1
для обработки ZeroDivisionError
используется try-except, а в stmt2
— if
. Затем они выполняются 10000 раз с переменной a=0
. Суть в том, чтобы показать разницу во времени исполнения инструкций. Так, stmt1
с обработкой исключений занимает больше времени чем stmt2
, который просто проверяет значение и не делает ничего, если условие не выполнено.
Поэтому стоит ограничить использование обработки исключений в Python и применять его в редких случаях. Например, когда вы не уверены, что будет вводом: целое или число с плавающей точкой, или не уверены, существует ли файл, который нужно открыть.
import timeit
setup="a=0"
stmt1 = '''
try:
b=10/a
except ZeroDivisionError:
pass'''
stmt2 = '''
if a!=0:
b=10/a'''
print("time=",timeit.timeit(stmt1,setup,number=10000))
print("time=",timeit.timeit(stmt2,setup,number=10000))
time= 0.003897680000136461
time= 0.0002797570000439009
Выводы!
Как вы могли увидеть, обработка исключений помогает прервать типичный поток программы с помощью специального механизма, который делает код более отказоустойчивым.
Обработка исключений — один из основных факторов, который делает код готовым к развертыванию. Это простая концепция, построенная всего на 4 блоках: try
выискивает исключения, а except
их обрабатывает.
Очень важно поупражняться в их использовании, чтобы сделать свой код более отказоустойчивым.
При написании программ часто возникает необходимость изменить тип данных, чтобы иметь возможность по-другому манипулировать значениями. Например, нам может потребоваться объединить числовые значения со строками или представить десятичные дроби в виде целых чисел.
В этой статье мы расскажем вам о преобразовании чисел, строк, кортежей и списков. Также вы найдете здесь примеры, которые помогут вам понять, в каких случаях может понадобиться преобразование данных.
Преобразование числовых типов
В Python есть два числовых типа данных: целые числа (integer) и числа с плавающей запятой (float).
Бывает, вы работаете над чужим кодом и вам нужно преобразовать целое число в число с плавающей запятой (и наоборот). Или вы можете обнаружить, что использовали целое число, хотя на самом деле вам нужно число с плавающей запятой. Python имеет встроенные методы, позволяющие легко выполнить все эти преобразования.
Преобразование целых чисел в числа с плавающей запятой
Метод Python float()
преобразует целые числа в числа с плавающей запятой. Чтобы использовать эту функцию, добавьте в скобки целое число:
float(57)
В этом случае 57 будет преобразовано в 57.0.
Этот метод можно использовать и с переменной. Объявим f
равным 57, а затем выведем новое значение с плавающей запятой:
f = 57 print(float(f))
Результат:
57.0
Используя функцию float()
, мы можем преобразовывать целые числа в числа с плавающей запятой.
Преобразование чисел с плавающей запятой в целые числа
Python также имеет встроенную функцию для преобразования чисел с плавающей запятой в целые числа: int()
.
Функция int()
работает аналогично функции float()
. Чтобы преобразовать десятичную дробь в целое число, вы можете добавить его внутрь скобок:
int(390.8)
В этом случае 390.8 будет преобразовано в 390.
Эту функцию можно использовать и с переменными. Давайте объявим b
равным 125.0, а c
— равным 390.8, а затем применим к переменным функцию int()
:
b = 125.0 c = 390.8 print(int(b)) print(int(c))
Результат:
125 390
При преобразовании чисел с плавающей запятой в целые числа с помощью функции int()
Python отсекает все, что идет после запятой. Мы можем ожидать, что 390,8 округлится до 391, но с применением только лишь функции int()
этого не произойдет.
Преобразование чисел путем деления
В Python 3 при делении одного целого числа на другое целое число результат преобразуется в число с плавающей запятой. То есть, если разделить 5 на 2, в Python 3 вы получите число с плавающей запятой:
a = 5 / 2 print(a)
2.5
В Python 2, так как вы имели дело с двумя целыми числами, вы получите ответ в виде целого числа: 5 / 2 = 2. Прочтите «Python 2 vs Python 3: Практические соображения» для получения дополнительной информации о различиях между Python 2 и Python 3.
Преобразования со строками
Тип данных string представляет собой последовательность из одного или нескольких символов (буквы, цифры, символы). Строки — это распространенная форма данных в компьютерных программах. Нам может потребоваться довольно часто преобразовывать строки в числа и наоборот, особенно когда мы получаем данные, созданные пользователем.
Преобразование чисел в строки
Числа в строки можно преобразовать с помощью метода str()
. Мы передаем число или переменную в скобки метода, а на выходе получаем строковое значение.
Давайте сначала рассмотрим преобразование целых чисел. Чтобы преобразовать целое число 12 в строку, передадим его в метод str()
:
str(12)
При запуске str(12)
в интерактивной оболочке Python (чтобы войти в оболочку, введите python
в окне терминала) вы получите следующий вывод:
'12'
Кавычки вокруг числа 12 означают, что оно теперь является строковым значением, а не целым числом.
Практический смысл преобразования чисел в строки становится понятнее, когда вы работаете с переменными. Допустим, мы хотим отслеживать ежедневный прогресс программирования пользователя. Для этого мы вводим, сколько строк кода он пишет за раз. Мы хотели бы давать обратную связь пользователю. Чтобы составить предложение, будем выводить одновременно и строковые, и целочисленные значения:
user = "Sammy" lines = 50 print("Congratulations, " + user + "! You just wrote " + lines + " lines of code.")
Когда мы запускаем этот код, мы получаем следующую ошибку:
TypeError: Can't convert 'int' object to str implicitly
Мы не можем объединять строки и целые числа в Python, поэтому нам придется преобразовать переменную lines
в строковое значение:
user = "Sammy" lines = 50 print("Congratulations, " + user + "! You just wrote " + str(lines) + " lines of code.")
Теперь при запуске кода мы получим следующий вывод, поздравляющий нашего пользователя с прогрессом:
Congratulations, Sammy! You just wrote 50 lines of code.
Если мы хотим преобразовать в строку не целое число, а число с плавающей запятой, порядок действий остается прежним. Мы передаем в метод str()
число с плавающей запятой, а возвращено будет строковое значение. Передавать в метод можно как само число, так и переменную:
print(str(421.034)) f = 5524.53 print(str(f))
'421.034' '5524.53'
Чтобы убедиться, что все правильно, мы можем объединить в выводе преобразованное число и строковые значения:
f = 5524.53 print("Sammy has " + str(f) + " points.")
Sammy has 5524.53 points.
Мы можем быть уверены, что наш float
был правильно преобразован в строку, потому что конкатенация была выполнена без ошибок.
Преобразование строк в числа
Строки могут быть преобразованы в числа при помощи методов int()
и float()
.
Если в вашей строке нет десятичных знаков, вы, скорее всего, захотите преобразовать ее в целое число с помощью метода int()
.
Давайте возьмем пример пользователя Сэмми, отслеживающего количество написанных строк кода. Чтобы предоставить пользователю более интересную обратную связь, мы можем проводить с полученными значениями какие-то математические действия. Но в настоящее время эти значения хранятся в строках:
lines_yesterday = "50" lines_today = "108" lines_more = lines_today - lines_yesterday print(lines_more)
TypeError: unsupported operand type(s) for -: 'str' and 'str'
Поскольку два числовых значения хранились в строках, мы получили ошибку. Операнд «-» для вычитания не является допустимым операндом для двух строковых значений.
Давайте изменим код, чтобы включить в него метод int()
. Он преобразует строки в целые числа и позволит нам выполнять математические действия со значениями, которые изначально были строками.
lines_yesterday = "50" lines_today = "108" lines_more = int(lines_today) - int(lines_yesterday) print(lines_more)
58
Переменная lines_more
автоматически является целым числом, и в этом примере она равна числовому значению 58.
В приведенном выше примере мы также можем преобразовать строчные значения в числа с плавающей запятой, используя метод float()
вместо метода int()
. В этом случае вместо 58 мы получим число с плавающей запятой — 58.0. Пользователь Сэмми зарабатывает очки в дробных числах:
total_points = "5524.53" new_points = "45.30" new_total_points = total_points + new_points print(new_total_points)
5524.5345.30
В этом случае использование операнда «+» с двумя строками является допустимой операцией. Но эта операция объединяет две строки, а не складывает два числовых значения вместе. В результате наш output выглядит необычно, поскольку это просто два значения рядом друг с другом.
Перед выполнением любых математических операций нам нужно преобразовать эти строки в числа с плавающей запятой с помощью метода float()
:
total_points = "5524.53" new_points = "45.30" new_total_points = float(total_points) + float(new_points) print(new_total_points)
5569.83
Теперь, когда мы преобразовали две строки в числа с плавающей запятой, мы получаем ожидаемый результат: сумму чисел 45.30 и 5524.53.
Если мы попытаемся при помощи метода int()
конвертировать строку, представляющую собой десятичную дробь, в целое число, мы получим ошибку:
f = "54.23" print(int(f))
ValueError: invalid literal for int() with base 10: '54.23'
Преобразование строк в числа позволяет нам быстро изменять тип данных, с которым мы работаем. Благодаря этому мы можем выполнять математические операции с числовыми значениями, изначально сохраненными в строчном виде.
Преобразование в кортежи и списки
Вы можете использовать методы list()
и tuple()
для преобразования переданных им значений в тип данных списка и кортежа соответственно. В Python:
- список является изменяемой упорядоченной последовательностью элементов, заключенных в квадратные скобки
[ ]
. - кортеж является неизменяемой упорядоченной последовательностью элементов, заключенных в круглые скобки
( )
.
Преобразование в кортежи
Начнем с преобразования списка в кортеж. Поскольку кортеж — это неизменяемый тип данных, такое преобразование может способствовать существенной оптимизации наших программ. Метод tuple()
возвращает «кортежную» версию переданного ему значения.
print(tuple(['pull request', 'open source', 'repository', 'branch']))
('pull request', 'open source', 'repository', 'branch')
Мы видим, что в результате выводится кортеж, поскольку элементы теперь заключены в круглые, а не в квадратные скобки.
Давайте используем tuple()
с переменной, представляющей список:
sea_creatures = ['shark', 'cuttlefish', 'squid', 'mantis shrimp'] print(tuple(sea_creatures))
('shark', 'cuttlefish', 'squid', 'mantis shrimp')
Опять же, мы видим, что значения списка преобразуются в значения кортежа, что обозначается круглыми скобками.
Мы можем преобразовать в кортеж не только список, но и любой итерируемый тип, включая строки:
print(tuple('Sammy'))
('S', 'a', 'm', 'm', 'y')
Строки можно преобразовывать в кортежи с помощью метода tuple()
, потому что они итерируемые (их можно перебирать). Но с типами данных, которые не являются итерируемыми (пример — целые числа и числа с плавающей запятой), мы получим ошибку:
print(tuple(5000))
TypeError: 'int' object is not iterable
Можно преобразовать целое число в строку, а затем в кортеж: tuple(str(5000))
. Но лучше выбрать читаемый код, а не сложные преобразования.
Преобразование в списки
Преобразование значений, особенно кортежей, в списки может быть полезно, когда вам нужно иметь изменяемую версию этого значения. Для преобразования в список используется метод list()
.
Давайте преобразуем кортеж в список. Будьте внимательны со скобками: одна пара для кортежа, вторая — для метода list()
, а третья — для метода print()
:
print(list(('blue coral', 'staghorn coral', 'pillar coral')))
['blue coral', 'staghorn coral', 'pillar coral']
Квадратные скобки сигнализируют о том, что кортеж, переданный в метод list()
, преобразован в список.
Чтобы сделать код более читабельным, мы можем ввести переменную и удалить одну из пар круглых скобок:
coral = ('blue coral', 'staghorn coral', 'pillar coral') list(coral)
Если мы выведем list(coral)
, мы получим тот же результат, что и выше.
В список можно преобразовать не только кортеж, но и строку:
print(list('shark'))
['s', 'h', 'a', 'r', 'k']
Заключение
В этой статье мы рассмотрели, как можно преобразовать одни типы данных в другие (в основном, с помощью встроенных методов). Возможность конвертировать типы данных в Python дает вам дополнительную гибкость при написании программ.