Самоучитель PythonВыпуск 2Дмитрий Мусинмая 07, 2017
Скачать 0.74 Mb.
|
4.2. Несколько специальных случаев 14 Глава 5 Программа не работает. Что делать? Моя программа не работает! Что делать? В данной статье я постараюсь собрать наибо- лее частые ошибки начинающих программировать на python 3, а также расскажу, как их исправлять. Проблема: Моя программа не запускается. На доли секунды появляется чёрное окошко, а затем исчезает. Причина: после окончания выполнения программы (после выполнения всего кода или при возникновении исключения программа закрывается. И если вы её вызвали двойным кликом по иконке (а вы, скорее всего, вызвали её именно так), то она закроется вместе с окошком, в котором находится вывод программы. Решение: запускать программу через IDLE или через консоль. Проблема: Не работает функция input. Пишет SyntaxError. Пример кода: >>> a = input() hello world File " hello world ^ SyntaxError: unexpected EOF while parsing Причина: Вы запустили Python 2. Решение: Установить Python 3 Проблема: Где-то увидел простую программу, а она не работает. Пример кода: 15 Самоучитель Python, Выпуск 0.2 name = raw_input() print name Ошибка: File "a.py" , line 3 print name ^ SyntaxError : invalid syntax Причина: Вам подсунули программу на Python 2. Решение: Прочитать об отличиях Python 2 от Python 3 . Переписать её на Python 3. Напри- мер, данная программа на Python 3 будет выглядеть так: name = input () (name) Проблема: TypeError: Can’t convert ‘int’ object to str implicitly. Пример кода: >>> a = input () + 5 8 Traceback (most recent call last): File " , line 1 , in TypeError : Can't convert 'int' object to str implicitly Причина: Нельзя складывать строку с числом. Решение: Привести строку к числу с помощью функции int(). Кстати, заметьте, что функ- ция input() всегда возвращает строку! >>> a = int ( input ()) + 5 8 >>> a 13 Проблема: SyntaxError: invalid syntax. Пример кода: a = 5 if a == 5 ( 'Ура!' ) Ошибка: File "a.py" , line 3 if a == 5 ^ SyntaxError : invalid syntax 16 Самоучитель Python, Выпуск 0.2 Причина: Забыто двоеточие. Решение: a = 5 if a == 5 : ( 'Ура!' ) Проблема: SyntaxError: invalid syntax. Пример кода: a = 5 if a = 5 : ( 'Ура!' ) Ошибка: File "a.py" , line 3 if a = 5 ^ SyntaxError : invalid syntax Причина: Забыто равно. Решение: a = 5 if a == 5 : ( 'Ура!' ) Проблема: NameError: name ‘a’ is not defined. Пример кода: (a) Причина: Переменная “a” не существует. Возможно, вы опечатались в названии или за- были инициализировать её. Решение: Исправить опечатку. a = 10 (a) Проблема: IndentationError: expected an indented block. Пример кода: a = 10 if a > 0 : (a) Причина: Нужен отступ. 17 Самоучитель Python, Выпуск 0.2 Решение: a = 10 if a > 0 : (a) Проблема: TabError: inconsistent use of tabs and spaces in indentation. Пример кода: a = 10 if a > 0 : (a) ( 'Ура!' ) Ошибка: File "a.py" , line 5 ( 'Ура!' ) ^ TabError : inconsistent use of tabs and spaces in indentation Причина: Смешение пробелов и табуляции в отступах. Решение: Исправить отступы. a = 10 if a > 0 : (a) ( 'Ура!' ) Проблема: UnboundLocalError: local variable ‘a’ referenced before assignment. Пример кода: def f (): a += 1 (a) a = 10 f() Ошибка: Traceback (most recent call last): File "a.py" , line 7 , in < module > f() File "a.py" , line 3 , in f a += 1 UnboundLocalError : local variable 'a' referenced before assignment Причина: Попытка обратиться к локальной переменной, которая ещё не создана. Решение: 18 Самоучитель Python, Выпуск 0.2 def f (): global a a += 1 (a) a = 10 f() Проблема: Программа выполнилась, но в файл ничего не записалось / записалось не всё. Пример кода: >>> f = open ( 'output.txt' , 'w' , encoding = 'utf-8' ) >>> f write( 'bla' ) 3 >>> Причина: Не закрыт файл, часть данных могла остаться в буфере. Решение: >>> f = open ( 'output.txt' , 'w' , encoding = 'utf-8' ) >>> f write( 'bla' ) 3 >>> f close() >>> Проблема: Здесь может быть ваша проблема. Комментарии чуть ниже :) Также вам может быть полезно это описание: 19 Глава 6 Инструкция if-elif-else, проверка истинности, трехместное выражение if/else Условная инструкция if-elif-else (её ещё иногда называют оператором ветвления) - ос- новной инструмент выбора в Python. Проще говоря, она выбирает, какое действие следу- ет выполнить, в зависимости от значения переменных в момент проверки условия. Синтаксис инструкции if Сначала записывается часть if с условным выражением, далее могут следовать одна или более необязательных частей elif, и, наконец, необязательная часть else. Общая форма записи условной инструкции if выглядит следующим образом: if test1: state1 elif test2: state2 else : state3 Простой пример (напечатает ‘true’, так как 1 - истина): >>> if 1 : ( 'true' ) else : ( 'false' ) true 20 Самоучитель Python, Выпуск 0.2 Чуть более сложный пример (его результат будет зависеть от того, что ввёл пользова- тель): a = int ( input ()) if a < - 5 : ( 'Low' ) elif - 5 <= a <= 5 : ( 'Mid' ) else : ( 'High' ) Конструкция с несколькими elif может также служить отличной заменой конструкции switch - case в других языках программирования. Проверка истинности в Python • Любое число, не равное 0, или непустой объект - истина. • Числа, равные 0, пустые объекты и значение None - ложь • Операции сравнения применяются к структурам данных рекурсивно • Операции сравнения возвращают True или False • Логические операторы and и or возвращают истинный или ложный объект-операнд Логические операторы: X and Y Истина, если оба значения X и Y истинны. X or Y Истина, если хотя бы одно из значений X или Y истинно. not X Истина, если X ложно. Трехместное выражение if/else Следующая инструкция: if X: A = Y else : A = Z 6.2. Проверка истинности в Python 21 Самоучитель Python, Выпуск 0.2 довольно короткая, но, тем не менее, занимает целых 4 строки. Специально для таких случаев и было придумано выражение if/else: A = Y if X else Z В данной инструкции интерпретатор выполнит выражение Y, если X истинно, в против- ном случае выполнится выражение Z. >>> A = 't' if 'spam' else 'f' >>> A 't' 6.3. Трехместное выражение if/else 22 Глава 7 Циклы for и while, операторы break и continue, волшебное слово else В этой статье я расскажу о циклах for и while, операторах break и continue, а также о слове else, которое, будучи употребленное с циклом, может сделать программный код несколько более понятным. Цикл while While - один из самых универсальных циклов в Python, поэтому довольно медленный. Выполняет тело цикла до тех пор, пока условие цикла истинно. >>> i = 5 >>> while i < 15 : (i) i = i + 2 5 7 9 11 13 Цикл for Цикл for уже чуточку сложнее, чуть менее универсальный, но выполняется гораздо быст- рее цикла while. Этот цикл проходится по любому итерируемому объекту (например стро- 23 Самоучитель Python, Выпуск 0.2 ке или списку), и во время каждого прохода выполняет тело цикла. >>> for i in 'hello world' : (i * 2 , end = '' ) hheelllloo wwoorrlldd Оператор continue Оператор continue начинает следующий проход цикла, минуя оставшееся тело цикла (for или while) >>> for i in 'hello world' : if i == 'o' : continue print (i * 2 , end = '' ) hheellll wwrrlldd Оператор break Оператор break досрочно прерывает цикл. >>> for i in 'hello world' : if i == 'o' : break print (i * 2 , end = '' ) hheellll Волшебное слово else Слово else, примененное в цикле for или while, проверяет, был ли произведен выход из цикла инструкцией break, или же “естественным” образом. Блок инструкций внутри else выполнится только в том случае, если выход из цикла произошел без помощи break. >>> for i in 'hello world' : if i == 'a' : break else : ( 'Буквы a в строке нет' ) Буквы a в строке нет 7.3. Оператор continue 24 Глава 8 Ключевые слова, модуль keyword Сегодня я по-быстрому пробегусь по всем ключевым словам в Python, а заодно и по моду- лю keyword. Ключевые слова False - ложь. True - правда. None - “пустой” объект. and - логическое И. with / as - менеджер контекста assert условие - возбуждает исключение, если условие ложно. break - выход из цикла. class - пользовательский тип , состоящий из методов и атрибутов. continue - переход на следующую итерацию цикла. def - определение функции del - удаление объекта. elif - в противном случае, если. else - см. for/else или if/else except - перехватить исключение. 25 Самоучитель Python, Выпуск 0.2 finally - вкупе с инструкцией try, выполняет инструкции независимо от того, было ли исключение или нет. for - цикл for. from - импорт нескольких функций из модуля. global - позволяет сделать значение переменной, присвоенное ей внутри функции, до- ступным и за пределами этой функции. if - если import - импорт модуля. in - проверка на вхождение. is - ссылаются ли 2 объекта на одно и то же место в памяти. lambda - определение анонимной функции. nonlocal - позволяет сделать значение переменной, присвоенное ей внутри функции, до- ступным в объемлющей инструкции. not - логическое НЕ. or - логическое ИЛИ. pass - ничего не делающая конструкция. raise - возбудить исключение. return - вернуть результат. try - выполнить инструкции, перехватывая исключения while - цикл while. yield - определение функции-генератора. Модуль keyword В общем-то, keyword - не такой уж и модуль, но все же. keyword.kwlist - список всех доступных ключевых слов. keyword.iskeyword(строка) - является ли строка ключевым словом. 8.2. Модуль keyword 26 Глава 9 Встроенные функции Краткий обзор встроенных функций в Python 3. Встроенные функции, выполняющие преобразование типов bool(x) - преобразование к типу bool, использующая стандартную процедуру проверки ис- тинности . Если х является ложным или опущен, возвращает значение False, в противном случае она возвращает True. bytearray([источник [, кодировка [ошибки]]]) - преобразование к bytearray . Bytearray - из- меняемая последовательность целых чисел в диапазоне 0<=X<256. Вызванная без аргу- ментов, возвращает пустой массив байт. bytes([источник [, кодировка [ошибки]]]) - возвращает объект типа bytes , который явля- ется неизменяемой последовательностью целых чисел в диапазоне 0<=X<256. Аргументы конструктора интерпретируются как для bytearray(). complex([real[, imag]]) - преобразование к комплексному числу dict([object]) - преобразование к словарю float([X]) - преобразование к числу с плавающей точкой . Если аргумент не указан, возвра- щается 0.0. frozenset([последовательность]) - возвращает неизменяемое множество int([object], [основание системы счисления]) - преобразование к целому числу list([object]) - создает список memoryview([object]) - создает объект memoryview. object() - возвращает безликий объект, являющийся базовым для всех объектов. 27 Самоучитель Python, Выпуск 0.2 range([start=0], stop, [step=1]) - арифметическая прогрессия от start до stop с шагом step. set([object]) - создает множество slice([start=0], stop, [step=1]) - объект среза от start до stop с шагом step. str([object], [кодировка], [ошибки]) - строковое представление объекта. Использует метод __str__. tuple(obj) - преобразование к кортежу Другие встроенные функции abs(x) - Возвращает абсолютную величину (модуль числа). all(последовательность) - Возвращает True, если все элементы истинные (или, если по- следовательность пуста). any(последовательность) - Возвращает True, если хотя бы один элемент - истина. Для пу- стой последовательности возвращает False. ascii(object) - Как repr(), возвращает строку, содержащую представление объекта, но заме- няет не-ASCII символы на экранированные последовательности. bin(x) - Преобразование целого числа в двоичную строку. callable(x) - Возвращает True для объекта, поддерживающего вызов (как функции). chr(x) - Возвращает односимвольную строку, код символа которой равен x. classmethod(x) - Представляет указанную функцию методом класса. compile(source, filename, mode, flags=0, dont_inherit=False) - Компиляция в программный код, который впоследствии может выполниться функцией eval или exec. Строка не долж- на содержать символов возврата каретки или нулевые байты. delattr(object, name) - Удаляет атрибут с именем ‘name’. dir([object]) - Список имен объекта, а если объект не указан, список имен в текущей ло- кальной области видимости. divmod(a, b) - Возвращает частное и остаток от деления a на b. enumerate(iterable, start=0) - Возвращает итератор, при каждом проходе предоставляю- щем кортеж из номера и соответствующего члена последовательности. eval(expression, globals=None, locals=None) - Выполняет строку программного кода. exec(object[, globals[, locals]]) - Выполняет программный код на Python. filter(function, iterable) - Возвращает итератор из тех элементов, для которых function воз- вращает истину. format(value[,format_spec]) - Форматирование (обычно форматирование строки ). getattr(object, name ,[default]) - извлекает атрибут объекта или default. globals() - Словарь глобальных имен. 9.2. Другие встроенные функции 28 Самоучитель Python, Выпуск 0.2 hasattr(object, name) - Имеет ли объект атрибут с именем ‘name’. hash(x) - Возвращает хеш указанного объекта. help([object]) - Вызов встроенной справочной системы. hex(х) - Преобразование целого числа в шестнадцатеричную строку. id(object) - Возвращает “адрес” объекта. Это целое число, которое гарантированно будет уникальным и постоянным для данного объекта в течение срока его существования. input([prompt]) - Возвращает введенную пользователем строку. Prompt - подсказка поль- зователю. isinstance(object, ClassInfo) - Истина, если объект является экземпляром ClassInfo или его подклассом. Если объект не является объектом данного типа, функция всегда возвращает ложь. issubclass(класс, ClassInfo) - Истина, если класс является подклассом ClassInfo. Класс счи- тается подклассом себя. iter(x) - Возвращает объект итератора. len(x) - Возвращает число элементов в указанном объекте. locals() - Словарь локальных имен. map(function, iterator) - Итератор, получившийся после применения к каждому элементу последовательности функции function. max(iter, [args ...] * [, key]) - Максимальный элемент последовательности. min(iter, [args ...] * [, key]) - Минимальный элемент последовательности. next(x) - Возвращает следующий элемент итератора. oct(х) - Преобразование целого числа в восьмеричную строку. open(file, mode=’r’, buffering=None, encoding=None, errors=None, newline=None, closefd=True) - Открывает файл и возвращает соответствующий поток. ord(с) - Код символа. pow(x, y[, r]) - ( x ** y ) % r. reversed(object) - Итератор из развернутого объекта. repr(obj) - Представление объекта. print([object, ...], *, sep=” ”, end=’\n’, file=sys.stdout) - Печать. property(fget=None, fset=None, fdel=None, doc=None) round(X [, N]) - Округление до N знаков после запятой. setattr(объект, имя, значение) - Устанавливает атрибут объекта. sorted(iterable[, key][, reverse]) - Отсортированный список. staticmethod(function) - Статический метод для функции. |