Меню

Typeerror unsupported operand type s for list and int что значит ошибка

user1588967

0 / 0 / 0

Регистрация: 27.02.2020

Сообщений: 5

1

20.09.2020, 14:36. Показов 12589. Ответов 1

Метки нет (Все метки)


Как избежать этой ошибки на 7 строке?

Python
1
2
3
4
5
6
7
8
9
10
11
12
k=int(input('Введите количество k элементов списка: '))
a=[]
b=a
d=a
for i in range(k):
    a.append([int(k) for k in input('Введите элементы списка через пробел ').split()])
    c=(sum(a)/len(a))
    d.append(a)
    a=[]
    b.append(c)
print('Исходный список', d)
print('Изменённый список', b)

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



Йуный падаван

Эксперт PythonЭксперт Java

13845 / 8089 / 2468

Регистрация: 21.10.2017

Сообщений: 19,548

20.09.2020, 16:45

2

Цитата
Сообщение от asdgovno
Посмотреть сообщение

a.append([int(k) for k in input(‘Введите элементы списка через пробел ‘).split()])

вот здесь ты в список добавляешь список. Список, а не его элементы!



0



IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

20.09.2020, 16:45

2

  • #1

Python:

import pygame

pygame.init()

display_w = 800 
display_h = 600 

display = pygame.display.set_mode((display_w, display_h)) 

pers_width = 60
pers_height = 100

def rect(offset, height):
    pers_0_x = display_w // offset
    pers_0_y = display_h - height - pers_height
    pers_1_x = display_w // offset
    pers_1_y = display_h - height + pers_height
rect(4, [100, 600])

def rect(offset, height):
    pers_2_x = display_w - offset
    pers_2_y = display_h - height - pers_height
    pers_3_x = display_w - offset
    pers_3_y = display_h - height + pers_height
rect(260, [100, 600])

def rungame():
    game = True
    while game: 
        for event in pygame.event.get(): 
            if event.type == pygame.QUIT: 
                pygame.quit() 
                quit()
display.fill((255, 255, 255))
pygame.draw.rect(display, (251,186,0), (pers_0_x, pers_0_y, pers_width, pers_height)) 
pygame.draw.rect(display, (168,91,56), (pers_1_x, pers_1_y, pers_width, pers_height))
pygame.draw.rect(display, (34,253,48), (pers_2_x, pers_2_y, pers_width, pers_height)) 
pygame.draw.rect(display, (11,28,189), (pers_3_x, pers_3_y, pers_width, pers_height)) 
pygame.display.update() 
rungame()

Код:

Traceback (most recent call last):
  File "D:PythonGame on PythonПерсонаж1.py", line 21, in <module>
    rect(4, [100, 600])
  File "D:PythonGame on PythonПерсонаж1.py", line 18, in rect
    pers_0_y = display_h - height - pers_height
TypeError: unsupported operand type(s) for -: 'int' and 'list'

Как исправить подобную ошибку на примере вот этого кода? Если знаете, помогите пожалуйста.

abc


  • #2

Переведите ошибку и посмотрите, что вы передаёте в качестве height

overpathz


  • #3

В 18 (и не только) строке, ты передаешь list. В самом методе, над аргументом height выполняются операции сложения и вычитания. (То есть ты складываешь число и список)
В общем, при вызове метода rect(), передай аргумент нужного типа.
И потом, если решить эту проблему, у тебя появятся другие — ты используешь локальные переменные метода за его пределами.
Можешь вернуть лист значений, и по индексу что-то отковырять, либо, не использовать локальные переменные.

upd: Ко всему вышеперечисленному, у тебя 2 одинаковых метода.

Бырое решение, чисто чтобы оно запустилось:

Python:

import pygame

pygame.init()

display_w = 800
display_h = 600

display = pygame.display.set_mode((display_w, display_h))

pers_width = 60
pers_height = 100


def rect(offset, height):
    pers_0_x = display_w // offset
    pers_0_y = display_h - height - pers_height
    pers_1_x = display_w // offset
    pers_1_y = display_h - height + pers_height
    return [pers_0_x, pers_0_y, pers_1_x, pers_1_y]


rect(4, 600)


def rect(offset, height):
    pers_2_x = display_w - offset
    pers_2_y = display_h - height - pers_height
    pers_3_x = display_w - offset
    pers_3_y = display_h - height + pers_height
    return [pers_2_x, pers_2_y, pers_3_x, pers_3_y]


rect(260, 600)


def rungame():
    game = True
    while game:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                quit()


display.fill((255, 255, 255))

pygame.draw.rect(display, (251,186,0), (rect(260, 600)[0], rect(260, 600)[1], pers_width, pers_height))
pygame.draw.rect(display, (168,91,56), (rect(260, 600)[2], rect(260, 600)[3], pers_width, pers_height))
pygame.draw.rect(display, (34,253,48), (rect(260, 600)[0], rect(260, 600)[1], pers_width, pers_height))
pygame.draw.rect(display, (11,28,189), (rect(260, 600)[2], rect(260, 600)[3], pers_width, pers_height))
pygame.display.update()
rungame()

Последнее редактирование: Май 28, 2021

  • #4

В 18 (и не только) строке, ты передаешь list. В самом методе, над аргументом height выполняются операции сложения и вычитания. (То есть ты складываешь число и список)
В общем, при вызове метода rect(), передай аргумент нужного типа.
И потом, если решить эту проблему, у тебя появятся другие — ты используешь локальные переменные метода за его пределами.
Можешь вернуть лист значений, и по индексу что-то отковырять, либо, не использовать локальные переменные.

upd: Ко всему вышеперечисленному, у тебя 2 одинаковых метода.

Бырое решение, чисто чтобы оно запустилось:

Python:

import pygame

pygame.init()

display_w = 800
display_h = 600

display = pygame.display.set_mode((display_w, display_h))

pers_width = 60
pers_height = 100


def rect(offset, height):
    pers_0_x = display_w // offset
    pers_0_y = display_h - height - pers_height
    pers_1_x = display_w // offset
    pers_1_y = display_h - height + pers_height
    return [pers_0_x, pers_0_y, pers_1_x, pers_1_y]


rect(4, 600)


def rect(offset, height):
    pers_2_x = display_w - offset
    pers_2_y = display_h - height - pers_height
    pers_3_x = display_w - offset
    pers_3_y = display_h - height + pers_height
    return [pers_2_x, pers_2_y, pers_3_x, pers_3_y]


rect(260, 600)


def rungame():
    game = True
    while game:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                quit()


display.fill((255, 255, 255))

pygame.draw.rect(display, (251,186,0), (rect(260, 600)[0], rect(260, 600)[1], pers_width, pers_height))
pygame.draw.rect(display, (168,91,56), (rect(260, 600)[2], rect(260, 600)[3], pers_width, pers_height))
pygame.draw.rect(display, (34,253,48), (rect(260, 600)[0], rect(260, 600)[1], pers_width, pers_height))
pygame.draw.rect(display, (11,28,189), (rect(260, 600)[2], rect(260, 600)[3], pers_width, pers_height))
pygame.display.update()
rungame()

Но можно поинтересоваться, почему выводится только 1 прямоугольник?

overpathz


  • #5

Но можно поинтересоваться, почему выводится только 1 прямоугольник?

Потому что мы в параметры передаем одни и те же значения. Вот, другие значения.

Python:

import pygame

pygame.init()

display_w = 800
display_h = 600

display = pygame.display.set_mode((display_w, display_h))

pers_width = 60
pers_height = 100


def rect(offset, height):
    pers_0_x = display_w // offset
    pers_0_y = display_h - height - pers_height
    pers_1_x = display_w // offset
    pers_1_y = display_h - height + pers_height
    return [pers_0_x, pers_0_y, pers_1_x, pers_1_y]


rect(4, 600)


def rect(offset, height):
    pers_2_x = display_w - offset
    pers_2_y = display_h - height - pers_height
    pers_3_x = display_w - offset
    pers_3_y = display_h - height + pers_height
    return [pers_2_x, pers_2_y, pers_3_x, pers_3_y]


rect(260, 600)


def rungame():
    game = True
    while game:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                quit()


display.fill((255, 255, 255))

pygame.draw.rect(display, (251,186,0), (rect(260, 600)[0], rect(260, 600)[1], pers_width, pers_height))
pygame.draw.rect(display, (168,91,56), (rect(260, 600)[2], rect(260, 600)[3], pers_width, pers_height))

pygame.draw.rect(display, (34,253,48), (rect(100, 600)[0], rect(100, 600)[1], pers_width, pers_height))
pygame.draw.rect(display, (11,28,189), (rect(100, 600)[2], rect(100, 600)[3], pers_width, pers_height))
pygame.display.update()
rungame()

1622303719998.png

overpathz


  • #6

Сам не понял что сделал, но кода стало меньше. (завернул повторяющие фрагменты в функцию)

Python:

import pygame

pygame.init()

display_w = 800
display_h = 600

display = pygame.display.set_mode((display_w, display_h))

pers_width = 60
pers_height = 100


def rect(offset, height):
    pers_0_x = display_w // offset
    pers_0_y = display_h - height - pers_height
    pers_1_x = display_w // offset
    pers_1_y = display_h - height + pers_height
    return [pers_0_x, pers_0_y, pers_1_x, pers_1_y]


def draw(color, offset, height):
    pygame.draw.rect(display, color, (rect(offset, height)[2], rect(offset, height)[3], pers_width, pers_height))


def run_game():
    game = True
    while game:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                quit()


display.fill((255, 255, 255))


draw('red', 300, 600)
draw('black', 5, 600)


pygame.display.update()
run_game()

a = []
k=1
for x in range(0,10):
    a.append(int(input()))
for x in range(0,30):
    if (a%2==0):
        k=k*a
print(k)

need answer ASAP

stullis

Minister of Silly Walks


Posts: 444

Threads: 1

Joined: Sep 2018

Reputation:
62

Nov-20-2018, 03:02 AM
(This post was last modified: Nov-20-2018, 03:02 AM by stullis.)

Because «a» is a list, you cannot simply perform mathematics with it. You can iterate over «a» and take the modulus of each number in it:

a = []
k=1

for x in range(0,10):
    a.append(int(input()))
    
for x in a:
    if (x % 2 == 0):
        k *= x

print(k)

BashBedlam likes this post

Posts: 11,550

Threads: 445

Joined: Sep 2016

Reputation:
444

Feb-22-2022, 02:19 AM
(This post was last modified: Feb-22-2022, 02:20 AM by Larz60+.)

to get your list:
for numeric:

a = list(num for num in range (0, 11))
print(a)

Output:

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
a = list(str(num) for num in range (0, 11))
print(a)

Output:

['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10']

Posts: 6

Threads: 2

Joined: May 2022

Reputation:
0

May-07-2022, 07:28 AM
(This post was last modified: May-07-2022, 07:28 AM by cool_person.)

nonprimenumbers=[]
primenumbers = []
for i in range (2,100000):
  if (i%primenumbers==0):
    nonprimenumbers.append 
else: 
  primenumbers.append 
  print(primenumbers)

Output:

Traceback (most recent call last): File "main.py", line 8, in <module> if (i % primenumbers == 0): TypeError: unsupported operand type(s) for %: 'int' and 'list'

answer ASAP

Posts: 790

Threads: 94

Joined: Sep 2019

Reputation:
70

Look at your append. You need ()

Обработка ошибок увеличивает отказоустойчивость кода, защищая его от потенциальных сбоев, которые могут привести к преждевременному завершению работы.

Синтаксис обработки исключений

Прежде чем переходить к обсуждению того, почему обработка исключений так важна, и рассматривать встроенные в 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, а в stmt2if. Затем они выполняются 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 их обрабатывает.

Очень важно поупражняться в их использовании, чтобы сделать свой код более отказоустойчивым.

Ситуация: начинающий программист более-менее освоил JavaScript и перешёл к Python. Чтобы освоить новый язык на практике, программист решил переписать свой старый проект с JavaScript на Python и столкнулся с таким фрагментом:

var a = 2;
var b = ' ствола';
var c = a + b;

Программист помнит, что в Python для переменных не нужен var, а можно просто объявлять их в нужном месте, поэтому он написал такой код:

a = 2
b = ‘ ствола’
c = a + b

Но при запуске проекта компьютер указал на последнюю строку и выдал ошибку:

Exception has occurred: TypeError
unsupported operand type(s) for +: ‘int’ and ‘str’

Почему так происходит: в JavaScript есть автоматическое приведение типов, и компьютер берёт на себя перевод данных из одного типа в другой. В нашем примере он сделает так:

  1. Возьмёт число и строку.
  2. Увидит, что их нужно сложить.
  3. Посмотрит по своим правилам, к какому одному типу проще всего привести всё в этой ситуации. 
  4. Поймёт, что проще перевести число в строку, чем наоборот.
  5. Сделает так и на выходе получит строку «2 ствола»

Но Python так не умеет — ему нужно, чтобы данные были одного типа или хотя бы из одного семейства: оба числовые, оба строковые и так далее. Так как сейчас идёт сложение разных типов данных, то Питон говорит, что он так делать не будет, и падает с ошибкой.

Что делать с ошибкой Exception has occurred: TypeError

Чтобы исправить эту ошибку, нужно вручную привести данные к одному типу или явно указать их при операции.

В нашем случае можно сделать так: при сложении сказать компьютеру напрямую, что мы хотим в сложении использовать переменную a как строку:

a = 2
b = ‘ ствола’
c = str(a) + b

Команда str() не меняет тип и содержимое переменной a, но зато компьютер понимает, что это временно стало строкой, и спокойно её складывает со второй строкой.

Как исправить: 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: операнды не могли транслироваться вместе с фигурами

@soumith. Another problem that I don’t know how to solve it has happened. After success to load the real images based on transformation defined above, my label variable is empty. sorry for this question but I am little new. Could you please help? here is the output of below command:
print(labels)

[[(‘image_id’, ‘image_id’, ‘image_id’, ‘image_id’, ‘image_id’, ‘image_id’, ‘image_id’, ‘image_id’, ‘image_id’, ‘image_id’, ‘image_id’, ‘image_id’, ‘image_id’, ‘image_id’, ‘image_id’, ‘image_id’), (‘iscrowd’, ‘iscrowd’, ‘iscrowd’, ‘iscrowd’, ‘iscrowd’, ‘iscrowd’, ‘iscrowd’, ‘iscrowd’, ‘iscrowd’, ‘iscrowd’, ‘iscrowd’, ‘iscrowd’, ‘iscrowd’, ‘iscrowd’, ‘iscrowd’, ‘iscrowd’), (‘category_id’, ‘category_id’, ‘category_id’, ‘category_id’, ‘category_id’, ‘category_id’, ‘category_id’, ‘category_id’, ‘category_id’, ‘category_id’, ‘category_id’, ‘category_id’, ‘category_id’, ‘category_id’, ‘category_id’, ‘category_id’), (‘segmentation’, ‘segmentation’, ‘segmentation’, ‘segmentation’, ‘segmentation’, ‘segmentation’, ‘segmentation’, ‘segmentation’, ‘segmentation’, ‘segmentation’, ‘segmentation’, ‘segmentation’, ‘segmentation’, ‘segmentation’, ‘segmentation’, ‘segmentation’), (‘area’, ‘area’, ‘area’, ‘area’, ‘area’, ‘area’, ‘area’, ‘area’, ‘area’, ‘area’, ‘area’, ‘area’, ‘area’, ‘area’, ‘area’, ‘area’), (‘id’, ‘id’, ‘id’, ‘id’, ‘id’, ‘id’, ‘id’, ‘id’, ‘id’, ‘id’, ‘id’, ‘id’, ‘id’, ‘id’, ‘id’, ‘id’), (‘bbox’, ‘bbox’, ‘bbox’, ‘bbox’, ‘bbox’, ‘bbox’, ‘bbox’, ‘bbox’, ‘bbox’, ‘bbox’, ‘bbox’, ‘bbox’, ‘bbox’, ‘bbox’, ‘bbox’, ‘bbox’)]]

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии

А вот еще интересные материалы:

  • Яшка сломя голову остановился исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного где ошибка
  • Typeerror type object is not subscriptable ошибка
  • Typeerror string indices must be integers ошибка