Как «стянуть» последовательность букв в одну букву?
Здравствуйте! Нужна программа, которая принимает на вход строку s и «стягивает» последовательности одинаковых букв типа:
aaabcc —> abc
abcd —> abcd
aAaaabbccdcc —> aAabcdc.
Сам пытался написать вот так, но не понимаю, почему на этапе удаления объекта из списка выскакивает ошибка:
s = input() letters = [] for num, letter in enumerate(s): letters.append(letter) if letters[num-1] == letters[num]: letters.remove(letter)
Ошибка такая:
if letters[num-1] == letters[num]: IndexError: list index out of range
- Вопрос задан более трёх лет назад
- 209 просмотров
1 комментарий
Простой 1 комментарий
IDLE
IDLE — это интегрированная среда разработки и обучения Python.
У IDLE следующие особенности:
- реализован на 100% чистом Python с использованием набора инструментов графического интерфейса пользователя tkinter
- кросс-платформенный: работает практически одинаково в Windows, Unix и macOS
- окно оболочки Python (интерактивный интерпретатор) с раскрашиванием ввода, вывода кода и сообщений об ошибках
- многооконный текстовый редактор с несколькими отменами, раскрашиванием Python, интеллектуальным отступом, подсказками при вызове, автозавершением и другими функциями
- поиск в любом окне, замена в окнах редактора и поиск в нескольких файлах (grep)
- отладчик с постоянными точками останова, пошаговым выполнением и просмотром глобальных и локальных пространств имён
- настройки, браузеры и другие диалоги
Меню
У IDLE два основных типа окон: окно оболочки и окно редактора. Одновременно можно создать несколько окон редактора. В Windows и Linux у каждого есть собственное верхнее меню. Каждое меню, задокументированное ниже, указывает, с каким типом окна оно связано.
Окна вывода, такие как Edit => Find в файлах, являются подтипом окна редактора. В настоящее время они имеют одно и то же верхнее меню, но другой заголовок по умолчанию и контекстное меню.
В macOS есть одно меню приложений. Он динамически изменяется в соответствии с выбранным в данный момент окном. В нем есть меню IDLE, а некоторые описанные ниже элементы, перемещены в соответствии с рекомендациями Apple.
Меню «File» (оболочка и редактор)
New File Создаёт новое окно редактирования файла. Open… Открывает существующий файл с помощью диалогового окна «Open». Recent Files Открывает список последних файлов. Нажмите один раз, чтобы открыть его. Open Module… Открывает существующий модуль (ищет sys.path). Class Browser Показывает функции, классы и методы в текущем файле редактора в формате древовидной структуры. В оболочке сначала открыть модуль. Path Browser Показывает каталоги, модули, функции, классы и методы sys.path в виде древовидной структуры. Save Сохраняет текущее окно в связанный файл, если он есть. Измененные окна с момента открытия или последнего сохранения, содержат * перед и после заголовка окна. Если нет связанного файла, вместо него выполняет «Save As». Save As… Сохраняет текущее окно с помощью диалогового окна «Save As». Сохраненный файл становится новым связанным файлом для окна. Save Copy As… Сохраняет текущее окно в другой файл без изменения связанного файла. Print Window Распечатывает текущее окно на принтере по умолчанию. Close Закрывает текущее окно (предложит сохранить, если оно не сохранено). Exit Закрывает все окна и выходит из IDLE (предложит сохранить несохраненные окна).
Меню «Edit» (Оболочка и Редактор)
Undo Отменяет последнее изменение в текущем окне. Максимально может быть отменено 1000 изменений. Redo Повторяет последнее отмененное изменение в текущем окне. Cut Копирует выделение в общесистемный буфер обмена; затем удаляет выделение. Copy Копирует выделение в общесистемный буфер обмена. Paste Вставляет содержимое общесистемного буфера обмена в текущее окно.
Функции буфера обмена также доступны в контекстных меню.
Select All Выделяет все содержимое текущего окна. Find… Открывает диалоговое окно поиска с множеством параметров Find Again Повторяет последний поиск, если он есть. Find Selection Поиск текущей выбранной строки, если она есть. Find in Files… Открывает диалоговое окно поиска файлов. Помещает результаты в новое окно вывода. Replace… Открывает диалоговое окно поиска и замены. Go to Line Перемещает курсор в начало запрошенной строки, и выполняет отображение строки. Запрос после конца файла перемещается в конец. Снимает выделение, и обновляет статус строки и столбца. Show Completions Открывает прокручиваемый список, позволяющий выбрать существующие имена. См. Завершения в разделе «Редактирование и навигация» ниже. Expand Word Расширяет введенный вами префикс, чтобы он соответствовал полному слову в том же окне; повторяет, чтобы получить другое расширение. Show call tip После незакрытой скобки для функции открывает маленькое окно с подсказками параметров функции. См. Подсказки по вызову в разделе редактирования и навигации ниже. Show surrounding parens Подсвечивает окружающие скобки.
Меню «Format» (только окно редактора)
Indent Region Сдвигает выделенные строки вправо на ширину отступа (по умолчанию 4 пробела). Dedent Region Сдвигает выделенные строки влево на ширину отступа (по умолчанию 4 пробела). Comment Out Region Вставляет ## перед выделенными строками. Uncomment Region Удалить ведущие # или ## из выбранных строк. Tabify Region Превращает ведущие пробелы в табы. (Примечание: мы рекомендуем использовать 4 пробела для отступа кода Python.) Untabify Region Превращает все табы в правильное количество пробелов. Toggle Tabs Открывает диалоговое окно для переключения между отступами с пробелами и табуляциями. New Indent Width Открывает диалоговое окно для изменения ширины отступа. По умолчанию в Python сообществе принято 4 пробела. Format Paragraph Переформатирует текущий абзац, разделенный пустой строкой, в блоке комментариев или многострочной строки или выделенной строки в строке. Все строки в абзаце будут отформатированы так, чтобы было меньше N столбцов, где N по умолчанию равно 72. Strip trailing whitespace Удаляет завершающий пробел и другие пробельные символы после последнего непробельного символа строки, применяя str.rstrip к каждой строке включая строки в многострочных строках. За исключением окон оболочки удаляет лишние символы новой строки в конце файла.
Меню «Run» (только окно редактора)
Run Module Выполняет Проверку модуля . Если ошибки нет, перезапускает оболочку, чтобы очистить среду, затем запускает модуль. Вывод отображается в Shell окне. Обратите внимание, что для вывода требуется использование print или write . Когда выполнение завершено, оболочка сохраняет фокус и отображает подсказку. На этом этапе можно в интерактивном режиме исследовать результат выполнения. Это похоже на выполнение файла с python -i file из командной строки. Run… Customized То же, что и Запуск модуля , но запускает модуль с измененными настройками. Аргументы командной строки расширяют sys.argv , как если бы он был передан в командной строке. Модуль можно запустить в Shell без перезагрузки. Check Module Переформатирует синтаксис модуля, открытого в данный момент в окне Editor. Если модуль не был сохранен IDLE либо предложит пользователю сохранить, либо автосохранение, выбранное на вкладке «General» диалогового окна «Settings». Если есть синтаксическая ошибка, примерное местонахождение указано в Editor окне. Python Shell Открывает или активирует Python окно Shell.
Меню «Shell» (только окно оболочки)
View Last Restart Прокручивает окно оболочки до последнего перезапуска Shell. Restart Shell Перезапускает оболочку, чтобы очистить среду и сбросить отображение и обработку исключений. Previous History Циклический просмотр более ранних команд в истории, которые соответствуют текущей записи. Next History Циклический просмотр более поздних команд в истории, которые соответствуют текущей записи. Interrupt Execution Останавливает работающую программу.
Меню «Debug» (только окно оболочки)
Go to File/Line Перейти на текущую строку с курсором и строку выше для имени файла и номера строки. Если он найден, открывает файл, если он ещё не открыт, далее отображает строку. Используйте для просмотра исходных строк, на которые есть ссылки в трассировке исключений и строки, найденные функцией «Find in Files». Также доступно в контекстном меню окна Shell и окна Output. Debugger (toggle) При активации будет выполняться код, введенный в оболочке или запущенный из редактора под отладчиком. В редакторе точки останова могут быть установлены с учётом контекста меню. Данная функция все ещё не завершена и несколько экспериментальна. Stack Viewer Показывает трассировку стека последнего исключения в виджете дерева, с доступом к локальным и глобальным. Stack Viewer Включает автоматическое открытие средства просмотра стека при необработанном исключении.
Меню «Options» (оболочка и редактор)
Configure IDLE Открывает диалоговое окно конфигурации и изменяет настройки для следующего: шрифты, отступы, сочетания клавиш, цветовые темы текста, окна запуска и размер, дополнительные источники справки и расширения. В macOS открывает файл диалоговое окно Preferences, выбрав Preferences в приложении меню. Подробнее см. Настройку предпочтений в разделе «Справка и настройки».
Большинство параметров конфигурации применяются ко всем окнам или ко всем будущим окнам. Пункты опций ниже применимы только к активному окну.
Show/Hide Code Context (Editor Window only) Открывает панель в верхней части окна редактирования, показывающая контекст блока кода, который прокручивается над верхней частью окна. См. Контекст кода в разделе «Редактирование и навигация» далее. Show/Hide Line Numbers (Editor Window only) Открывает столбец слева от окна редактирования, в котором отображается число каждой строки текста. По умолчанию выключено, это можно изменить в файле предпочтения (см. Настройка предпочтений ). Zoom/Restore Height Переключает окно между нормальным размером и максимальной высотой. Начальный размер по умолчанию 40 строк по 80 символов, если не изменено на вкладке «General» Configure диалогового окна IDLE. Максимальная высота экрана определяется мгновенное развертывание окна при первом увеличении экрана. Изменение настроек экрана может сделать сохраненную высоту недействительной. Данный переключатель имеет никакого эффекта, когда окно развернуто.
Меню «Window» (оболочка и редактор)
Перечисляет имена всех открытых окон; выбрать один, чтобы вывести его на передний план (при необходимости деиконизируя его).
Меню «Help» (Shell и Editor)
About IDLE Показывает версию, авторские права, лицензию, благодарности и многое другое. IDLE Help Показывает данный документ IDLE с подробным описанием опций меню, базового редактирования, навигации и другие советы. Python Docs Предоставляет доступ к локальной документации Python, если она установлена, или запускает браузер открыв сайт с актуальной документацией по Python. Turtle Demo Запускает демонстрационный модуль черепахи с примером кода Python и рисунками черепахи.
Здесь можно добавить дополнительные источники справки с помощью диалогового окна «Configure IDLE» на вкладке «General». Дополнительные сведения о пунктах меню «Help» см. в подразделе Справка ниже.
Контекстные меню
Открывает контекстное меню, щелкнув правой кнопкой мыши в окне (удерживая нажатой клавишу Control в macOS). У контекстного меню есть стандартные функции буфера обмена и в меню «Edit».
Cut Копирует выделение в общесистемный буфер обмена; затем удаляет выделение. Copy Копирует выделение в общесистемный буфер обмена. Paste Вставляет содержимое общесистемного буфера обмена в текущем окне.
У окон редактора также есть функции точек останова. Строки с установленной точкой останова помечаются специальным образом. Точки останова действуют только при работе под отладчиком. Точки останова для файла сохраняются в пользовательском каталоге .idlerc .
Set Breakpoint Устанавливает точку останова на текущей строке. Clear Breakpoint Очищает точку останова на данной строке.
Окна Shell и Output также содержат следующее:
Go to file/line То же, что и в меню отладки.
Окно Shell также содержит средство сжатия вывода, рассмотренное в подразделе Окно оболочки Python далее.
Squeeze Если курсор находится над строкой вывода, вставляет весь вывод между кодом выше и подсказкой ниже до метки «Squeezed text».
Редактирование и навигация
Окна редактора
IDLE может открывать окна редактора при запуске, в зависимости от настроек и способа запуска IDLE. После этого используйте меню «File». Для данного файла может быть только одно открытое окно редактора.
Строка заголовка содержит имя файла, полный путь и версию Python и IDLE, в которых запущено окно. Строка состояния содержит номер строки («Ln») и номер столбца («Col»). Номера строк начинаются с 1; номера столбцов с 0.
IDLE предполагает, что файлы с известным расширением .py* содержат код Python, а другие файлы — нет. Выполняет код Python с помощью меню «Run».
Привязки клавиш
В этом разделе «C» относится к клавише Control в Windows и Unix и клавише Command в macOS.
- Backspace удаляет слева; Del удаляет вправо
- C-Backspace удаляет слово слева; C-Del удаляет слово справа
- Клавиши со стрелками и Page Up / Page Down для перемещения
- C-LeftArrow и C-RightArrow перемещаются по словам
- Home / End переходит к началу/концу строки
- C-Home / C-End переходит к началу/концу файла
- Некоторые полезные привязки Emacs унаследованы от Tcl/Tk:
- C-a начало строки
- C-e конец строки
- Строка уничтожения C-k (но не помещается в буфер обмена)
- C-l центральное окно вокруг точки вставки
- C-b переходит на один символ назад без удаления (обычно для этого также можно использовать клавишу курсора)
- C-f переходит на один символ вперед без удаления (обычно для этого также можно использовать клавишу курсора)
- C-p переходит на одну строку вверх (обычно для этого также можно использовать клавишу курсора)
- C-d удаляет следующий символ
Стандартные сочетания клавиш (например, C-c для копирования и C-v для вставки) могут работать. Привязки клавиш выбираются в диалоговом окне «Configure IDLE».
Автоматический отступ
После оператора открытия блока следующая строка имеет отступ в 4 пробела (в окне Python Shell на один таб). После определённых ключевых слов (break, return и т. д.) следующая строка содержит отступ. В начальном отступе Backspace удаляет до 4 пробелов, если они есть. Tab вставляет пробелы (в окне Python Shell один таб), количество зависит от ширины отступа. В настоящее время табы ограничены четырьмя пробелами из-за ограничений Tcl/Tk.
См. также команды indent/dedent области на странице Меню форматирования .
Завершения
Завершения предоставляются, когда они запрошены и доступны для имён модулей, атрибутов классов, функций или имён файлов. Каждый запрашиваемый метод отображает поле завершения с существующими именами. (Исключение см. ниже для заполнения табов.) Для любого поля изменяет заполняемое имя и элемент, выделенный в поле, введя и удалив символы; нажав клавиши Up , Down , PageUp , PageDown , Home и End ; и одним щелчком внутри поля. Закрывает окно клавишами Escape , Enter и двойными клавишами Tab или щелчками за пределами поля. Двойной щелчок внутри поля выбирает и закрывает.
Один из способов открыть поле — ввести ключевой символ и подождать заранее заданный интервал. По умолчанию — 2 секунды; настройте его в диалоге настроек. (Чтобы предотвратить автоматические всплывающие окна, устанавливает задержку на большое количество миллисекунд, например 100000000.) Для импортированных имён модулей или атрибутов класса или функции введите «.». Для имён файлов в корневом каталоге введите os.sep или os.altsep сразу после открывающей кавычки. (В Windows можно сначала указать диск.) Переходит в подкаталоги, введя имя каталога и разделитель.
Вместо того чтобы ждать или после закрытия окна, немедленно открывает окно завершения с помощью команды «Show Completions» в меню «Edit». Горячая клавиша по умолчанию — C-space . Если перед открытием коробки ввести префикс для нужного имени, первое совпадение или близкое совпадение становится видимым. Результат такой же, как если бы кто-то ввел префикс после отображения окна. Показывает завершения после того, как кавычка завершает имена файлов в текущем каталоге, а не в корневом каталоге.
Нажатие Tab после префикса обычно имеет тот же эффект, что и «Show Completions». (Без префикса он — отступ.) Однако, если есть только одно совпадение с префиксом, это совпадение немедленно добавляется в текст редактора, не открывая поле.
Вызов «Show Completions» или нажатие Tab после префикса вне строки и без предшествующего «.». открывает поле с ключевыми словами, встроенными именами и доступными именами на уровне модуля.
При редактировании кода в редакторе (в отличие от Shell) увеличивает доступные имена на уровне модулей, запустив свой код и не перезапуская Shell после него. Это особенно полезно после добавления импорта в начало файла. Это также увеличивает количество возможных завершений атрибутов.
Поля завершения изначально исключают имена, начинающиеся с «_» или, для модулей, не включенные в «__all__». Доступ к скрытым именам можно получить, набрав «_» после «.» либо до, либо после открытия поля.
Подсказки
Подсказка отображается автоматически при вводе ( после имени доступной функции. Выражение имени функции может включать точки и нижние индексы. Подсказка остаётся до тех пор, пока по ней не будет нажат щелчок, курсор не будет перемещен за пределы области аргумента или не будет введено ) . Всякий раз, когда курсор находится в части аргумента определения, выберите «Edit» и «Show Call Tip» в меню или введите его ярлык, чтобы отобразить подсказку.
Подсказка состоит из сигнатуры функции и строки документации до первой пустой строки последней или до пятой непустой строки. (Некоторые встроенные функции не имеют доступной сигнатуры.) «/» или «*» в сигнатуре указывает, что предшествующие или последующие аргументы передаются только по положению или имени (ключевому слову). Детали могут быть изменены.
В Shell доступные функции зависят от того, какие модули были импортированы в пользовательский процесс, в том числе импортированные самим Idle, и какие определения были запущены с момента последнего перезапуска.
Например, перезапустите Shell и введите itertools.count( . Подсказка появляется, потому что Idle импортирует itertools в пользовательский процесс для собственного использования. (Это может измениться.) Введите turtle.write( , и ничего не появится. Простой сам по себе не импортирует turtle. Вход в меню и ярлык тоже ничего не делают. Введите import turtle . После этого turtle.write( отобразит всплывающую подсказку.
В редакторе операторы импорта не действуют до тех пор, пока файл не будет запущен. Может потребоваться запустить файл после написания операторов импорта, после добавления определений функций или после открытия существующего файла.
Контекст кода
В окне содержащем код Python редактора, можно переключать контекст кода, чтобы отобразить или скрыть панель в верхней части окна. При отображении данная панель замораживает начальные строки для блочного кода, например начинающиеся с ключевых слов class , def или if , которые в противном случае прокручивались бы вне поля зрения. Размер панели будет увеличиваться и уменьшаться по мере необходимости, чтобы отображать все текущие уровни контекста, вплоть до максимального количества строк, определённого в диалоговом окне «Configure IDLE» (которое по умолчанию равно 15). Если текущих строк контекста нет, а функция включена, будет отображаться одна пустая строка. Щелчок по строке в контекстной панели переместит эту строку в верхнюю часть редактора.
Цвета текста и фона контекстной панели можно настроить на вкладке «Highlights» в диалоговом окне «Configure IDLE».
Окно Shell Python
С оболочкой IDLE можно вводить, редактировать и вызывать завершенные операторы. Большинство консолей и терминалов одновременно работают только с одной физической строкой.
Когда кто-то вставляет код в Shell, он не компилируется и, возможно, не выполняется до тех пор, пока не будет найден Return . Сначала можно отредактировать вставленный код. Если вставить в Shell более одного оператора, результатом будет SyntaxError , когда несколько операторов скомпилированы, как если бы они были одним.
Функции редактирования, описанные в предыдущих подразделах, работают при интерактивном вводе кода. Окно оболочки IDLE также реагирует на следующие клавиши.
- C-c прерывает выполнение команды
- C-d отправляет конец файла; закрывает окно, если введено в приглашении >>>
- Alt-/ (Расширенное слово) также удобен для сокращения набора текста История команд
- Alt-p извлекает предыдущую команду, соответствующую тому, что вы набрали. В macOS используйте C-p .
- Alt-n получает следующее. В macOS используйте C-n .
- Return во время любой предыдущей команды извлекает эту команду.
Цвета текста
В Idle по умолчанию текст отображается черным цветом на белом фоне, но при этом текст окрашивается в специальные цвета. Для оболочки это вывод оболочки, ошибка оболочки, вывод пользователя и ошибка пользователя. Для кода Python в командной строке или в редакторе это ключевые слова, имена встроенных классов и функций, имена после class и def , строки и комментарии. Для любого текстового окна это курсор (если присутствует), найденный текст (если возможно) и выделенный текст.
Раскрашивание текста выполняется в фоновом режиме, поэтому иногда виден неокрашенный текст. Чтобы изменить цветовую схему, используйте вкладку Highlighting диалогового окна Configure IDLE. Отметка строк точки останова отладчика в редакторе и текста во всплывающих окнах и диалогах не настраивается пользователем.
Запуск и выполнение кода
При запуске с параметром -s IDLE выполнит файл, на который ссылаются переменные среды IDLESTARTUP или PYTHONSTARTUP . IDLE сначала проверяет IDLESTARTUP ; если присутствует IDLESTARTUP , запускается указанный файл. Если IDLESTARTUP отсутствует, IDLE проверяет наличие PYTHONSTARTUP . Файлы, на которые ссылаются данные переменные среды, являются удобными местами для хранения часто используемых из оболочки IDLE функций, или для выполнения операторов импорта для импорта общих модулей.
Кроме того, Tk также загружает файл запуска, если он присутствует. Обратите внимание, что файл Tk загружается безоговорочно. Данный дополнительный файл имеет номер .Idle.py и ищется в домашнем каталоге пользователя. Операторы в этом файле будут выполняться в пространстве имён Tk, поэтому данный файл не подходит для импорта функций, которые будут использоваться из оболочки Python IDLE.
Использование командной строки
idle.py [-c command] [-d] [-e] [-h] [-i] [-r file] [-s] [-t title] [-] [arg] . -c command запустить команду в окне оболочки -d включить отладчик и открыть окно оболочки -e открыть окно редактора -h распечатать справочное сообщение с допустимыми комбинациями и выйти -i открыть окно оболочки -r file запустить файл в окне оболочки -s сначала запустится $IDLESTARTUP или $PYTHONSTARTUP в окне оболочки -t title установить заголовок окна оболочки - запустить stdin в оболочке (- должен быть последним параметром перед аргументами)
Если есть аргументы:
- Если используется — , -c или r , все аргументы помещаются в sys.argv[1. ] , а sys.argv[0] устанавливается в » , ‘-c’ или ‘-r’ . Окно редактора не открывается, даже если это установлено по умолчанию в диалоговом окне «Options».
- В противном случае аргументы — это файлы, открытые для редактирования, а sys.argv отражает аргументы, переданные самой IDLE.
Ошибка запуска
IDLE использует сокет для связи между процессом пользовательского интерфейса IDLE и процессом выполнения пользовательского кода. Соединение должно устанавливаться при каждом запуске или перезапуске Shell. (Последнее обозначено разделительной линией с надписью «RESTART»). Если пользовательскому процессу не удается подключиться к процессу пользовательского интерфейса, он отображает окно ошибки Tk с сообщением «невозможно подключиться (cannot connect)», которое направляет пользователя сюда. Затем он выходит.
Распространенной причиной сбоя является написанный пользователем файл с тем же именем, что и у модуля стандартной библиотеки, например random.py и tkinter.py. Когда такой файл находится в том же каталоге, что и файл, который должен быть запущен, IDLE не может импортировать файл stdlib. Текущее исправление заключается в переименовании файла пользователя.
Хотя реже, чем в прошлом, антивирусная программа или брандмауэр могут прервать соединение. Если программу нельзя научить разрешать соединение, то для работы IDLE её необходимо отключить. Безопасно разрешать это внутреннее соединение, потому что никакие данные не видны на внешних портах. Аналогичной проблемой является неправильная конфигурация сети, которая блокирует соединения.
Проблемы с установкой Python иногда останавливают IDLE: несколько версий могут конфликтовать, или для одной установки может потребоваться доступ администратора. Если кто-то отменяет конфликт или не может или не хочет работать от имени администратора, проще всего полностью удалить Python и начать заново.
Зомби процесс pythonw.exe может быть проблемой. В Windows используйте диспетчер задач, чтобы проверить его и остановить, если он есть. Иногда перезагрузка, инициированная сбоем программы или прерыванием клавиатуры (control-C), может не подключиться. Закрытие окна ошибки или использование «Restart Shell» в меню «Shell» может решить временную проблему.
При первом запуске IDLE пытается прочитать файлы конфигурации пользователя в ~/.idlerc/ (~ — домашний каталог). В случае возникновения проблемы должно появиться сообщение об ошибке. Не говоря уже о случайных сбоях диска, этого можно избежать, никогда не редактируйте файлы вручную. Вместо этого используйте диалоговое окно конфигурации в разделе «Options». Если в файле конфигурации пользователя есть ошибка, лучшим решением может быть его удаление и запуск диалога настроек заново.
Если IDLE завершается без сообщения и не был запущен из консоли, попробуйте запустить его из консоли или терминала ( python -m idlelib ) и посмотрите, не приведёт ли это к появлению сообщения об ошибке.
Запуск пользовательского кода
За редкими исключениями, результат выполнения кода Python с помощью IDLE должен быть таким же, как и при выполнении того же кода методом по умолчанию, непосредственно с помощью Python в текстовой системной консоли или окне терминала. Однако другой интерфейс и работа иногда влияют на видимые результаты. Например, sys.modules начинается с большего количества записей, а threading.activeCount() возвращает 2 вместо 1.
По умолчанию IDLE запускает пользовательский код в отдельном процессе ОС, а не в процессе пользовательского интерфейса, который запускает оболочку и редактор. В процессе выполнения он заменяет sys.stdin , sys.stdout и sys.stderr объектами, которые получают ввод и отправляют вывод в окно Shell. Исходные значения, хранящиеся в sys.__stdin__ , sys.__stdout__ и sys.__stderr__ , не изменяются, но могут быть None .
Когда Shell получает фокус, он управляет клавиатурой и экраном. Обычно это прозрачно, но обращающиеся напрямую к клавиатуре и экрану функции, работать не будут. К ним относятся специфичные для системы функции, которые определяют, была ли нажата клавиша, и если да, то какая.
Стандартные замены потоков IDLE не наследуются подпроцессами, созданными в процессе выполнения, будь то непосредственно пользовательский код или модули, такие как multiprocessing. Если такой подпроцесс использует input из sys.stdin или print или write в sys.stdout или sys.stderr, IDLE следует запустить в окне командной строки. Затем вторичный подпроцесс будет присоединен к этому окну для ввода и вывода.
Код IDLE, работающий в процессе выполнения, добавляет фреймы в стек вызовов, которых в противном случае там не было бы. IDLE переносит sys.getrecursionlimit и sys.setrecursionlimit , чтобы уменьшить влияние дополнительных фреймов стека.
Если sys сбрасывается кодом пользователя, например, importlib.reload(sys) , изменения IDLE теряются, а ввод с клавиатуры и вывод на экран не будут работать правильно.
Когда пользовательский код вызывает SystemExit либо напрямую, либо путём вызова sys.exit, IDLE вместо выхода возвращается к приглашению оболочки.
Пользовательский вывод в Shell
Когда программа выводит текст, результат определяется соответствующим устройством вывода. Когда IDLE выполняет пользовательский код, sys.stdout и sys.stderr подключаются к области отображения оболочки IDLE. Некоторые из его функций унаследованы от базового виджета Tk Text. Другие являются запрограммированными дополнениями. Там, где это важно, Shell предназначена для разработки, а не для производственного запуска.
Например, Shell никогда не выбрасывает выходные данные. Программа, которая отправляет неограниченный вывод в Shell, в конечном итоге заполнит память, что приведёт к ошибке памяти. Напротив, некоторые системные текстовые окна сохраняют только последние n строк вывода. Консоль Windows, например, сохраняет настраиваемое пользователем от 1 до 9999 строк, по умолчанию 300.
Виджет Tk Text и, следовательно, оболочка IDLE отображает символы (кодовые точки) в подмножестве Юникод BMP (Basic Multilingual Plane). Какие символы отображаются с правильным глифом, а какие с замещающим полем, зависит от операционной системы и установленных шрифтов. Символы табуляции заставляют следующий текст начинаться после следующей позиции табуляции. (Они встречаются каждые 8 «символов»). Символы новой строки заставляют следующий текст появляться на новой строке. Другие управляющие символы игнорируются или отображаются как пробел, прямоугольник или что-то ещё, в зависимости от операционной системы и шрифта. (Перемещение текстового курсора по такому выводу с помощью клавиш со стрелками может привести к неожиданному поведению пробелов.)
>>> s = 'a\tb\a\x02>\r>\bc\nd' # Ввод 22 символа. >>> len(s) 14 >>> s # Показывает repr(s) 'a\tb\x07\x08c\nd' >>> print(s, end='') # Показывает как есть # Результат зависит от операционной системы и шрифта. Проверьте это.
Функция repr используется для интерактивного отображения значений выражений. Она возвращает измененную версию входной строки, в которой управляющие коды, некоторые кодовые точки BMP и все кодовые точки, отличные от BMP, заменены управляющими кодами. Как показано выше, она позволяет идентифицировать символы в строке независимо от того, как они отображаются.
Нормальный вывод и вывод ошибок обычно хранятся отдельно (в отдельных строках) от ввода кода и друг от друга. Каждый из них получает разные цвета подсветки.
Для трассировки SyntaxError обычная отметка «^» в месте обнаружения ошибки заменяется выделением текста цветом ошибки. Когда запускаемый из файла код, вызывает другие исключения, можно щелкнуть правой кнопкой мыши строку трассировки, чтобы перейти к соответствующей строке в IDLE редакторе. Файл будет открыт при необходимости.
В Shell есть специальное средство для сжатия строк вывода до метки «Squeezed text». Это делается автоматически для вывода на N строк (N = 50 по умолчанию). N можно изменить в разделе PyShell на странице «General» диалогового окна «Settings». Вывод с меньшим количеством строк можно сжать, щелкнув правой кнопкой мыши на выводе. Это могут быть полезные строки, достаточно длинные, чтобы замедлить прокрутку.
Сжатый вывод расширяется на месте двойным щелчком метки. Его также можно отправить в буфер обмена или отдельное окно просмотра, щелкнув метку правой кнопкой мыши.
Разработка tkinter приложений
IDLE намеренно отличается от стандартного Python, чтобы облегчить разработку программ tkinter. Введите import tkinter as tk; root = tk.Tk() в стандартном Python, и ничего не появится. Введите то же самое в IDLE, и появится окно tk. В стандартном Python нужно также ввести root.update() , чтобы увидеть окно. IDLE делает то же самое в фоновом режиме примерно 20 раз в секунду, т. е. примерно каждые 50 миллисекунд. Затем наберите b = tk.Button(root, text=’button’); b.pack() . Опять же, в стандартном Python ничего не меняется, пока не будет root.update() .
Большинство программ tkinter запускают root.mainloop() , который обычно не возвращается, пока приложение tk не будет уничтожено. Если программа запускается с python -i или из редактора IDLE, приглашение оболочки >>> не появляется до тех пор, пока не вернется mainloop() , после чего взаимодействовать не с чем.
При запуске tkinter программы из редактора IDLE можно закомментировать вызов mainloop. Затем вы сразу же получаете приглашение оболочки и можете взаимодействовать с живым приложением. Просто нужно не забыть снова включить вызов mainloop при работе в стандартном Python.
Запуск без подпроцесса
По умолчанию IDLE выполняет пользовательский код в отдельном подпроцессе через сокет, который использует внутренний петлевой (loopback) интерфейс. Это соединение не видно извне, и данные не отправляются и не принимаются из Интернета. Если программное обеспечение брандмауэра все равно жалуется, вы можете игнорировать его.
Если попытка установить подключение к сокету не удалась, Idle уведомит вас об этом. Такие сбои иногда носят временный характер, но если они сохраняются, проблема может заключаться либо в брандмауэре, блокирующем соединение, либо в неправильной настройке системы. Пока проблема не устранена, можно запускать Idle с опцией командной строки -n .
Если IDLE запущен с параметром командной строки -n , он будет работать в одном процессе и не будет создавать подпроцесс, который запускает сервер выполнения RPC Python. Это может быть полезно, если Python не может создать подпроцесс или RPC интерфейс сокета на вашей платформе. Однако в этом режиме пользовательский код не изолирован от самого IDLE. Кроме того, среда не перезапускается, когда выбрано «Run/Run Module» (F5). Если ваш код был изменён, вы должны reload() затронутые модули и повторно импортировать любые определённые элементы (например, из foo import baz), чтобы изменения вступили в силу. По этим причинам предпочтительнее запускать IDLE с подпроцессом по умолчанию, если это вообще возможно.
Не рекомендуется, начиная с версии 3.4.
Помощь и предпочтения
Источники помощи
Пункт меню «Help» «IDLE Help» отображает отформатированную html-версию главы IDLE Справочника по библиотеке. Результат в текстовом окне tkinter, доступном только для чтения, близок к тому, что можно увидеть в браузере. Перемещайтесь по тексту с помощью колесика мыши, полосы прокрутки или клавиш со стрелками вверх и вниз, удерживая их нажатыми. Или нажмите кнопку TOC (Оглавление) и выбрать заголовок раздела в открывшемся окне.
Пункт меню справки «Python Docs» открывает обширные источники справки, включая учебные пособия, доступные по адресу docs.python.org/x.y , где «x.y» — это текущая версия Python. Если в вашей системе есть автономная копия документов (это может быть вариант установки), вместо этого будет открыта она.
Выбранные URL-адреса могут быть добавлены или удалены из меню справки в любое время с помощью табы «General» диалогового окна «Configure IDLE».
Установка предпочтений
Параметры шрифта, подсветка, клавиши и общие параметры можно изменить с помощью пункта «Configure IDLE» в меню «Option». Пользовательские настройки, отличные от настроек по умолчанию, сохраняются в каталоге .idlerc в домашнем каталоге пользователя. Проблемы, вызванные плохими файлами конфигурации пользователя, решаются путём редактирования или удаления одного или нескольких файлов в .idlerc .
На вкладке «Font» см. пример текста, в котором показано влияние начертания и размера шрифта на несколько символов на разных языках. Отредактируйте образец, чтобы добавить других символов, представляющих личный интерес. Используйте образец для выбора моноширинных шрифтов. Если у определённых символов есть проблемы в Shell или редакторе, добавьте их в начало образца и попробуйте изменить сначала размер, а затем шрифт.
На вкладке «Highlights and Keys» выберите встроенную или пользовательскую цветовую тему и множество клавиш. Чтобы использовать более новую встроенную цветовую тему или набор клавиш со старыми IDLE, сохранить их как новую пользовательскую тему или набор клавиш, и они будут доступны для более старых IDLE.
IDLE на macOS
В разделе «System Preferences: Dock» можно установить «Prefer tabs when opening documents» на «Always». Данный параметр несовместим с инфраструктурой графического интерфейса пользователя tk/tkinter, используемой IDLE, и нарушает некоторые функции IDLE.
Расширения
IDLE содержит средство расширения. Настройки для расширений можно изменить на вкладке «Extensions» диалогового окна настроек. Дополнительную информацию смотрите в начале файла config-extensions.def в каталоге idlelib. Единственным текущим расширением по умолчанию является zzdummy, пример также используется для тестирования.
IDLE automatically squeezes large amount of lines
I’ve been working on a chatbot in IDLE using python. On my laptop everything works fine but on my desktop IDLE automatically squeezes the text ♂️ This is what it looks like in IDLE. The text that’s being squeezed are just empty lines. I’ve embedded the code I used to print out the empty lines below. print(«\n» * 150) Does anyone know how to disable it?
asked Jan 8, 2019 at 5:50
21 1 1 gold badge 1 1 silver badge 2 2 bronze badges2 Answers 2
This is a new feature, still being refined. To disable, go to Options => Configure IDLE => General tab => Shell preferences => Auto-Squeeze min lines [50] and change 50 to a large count.
Double click the label to expand in place. Right click for other options.
answered Jan 8, 2019 at 19:33
Terry Jan Reedy Terry Jan Reedy
18.6k 3 3 gold badges 41 41 silver badges 54 54 bronze badgesWould be nice to disable with -1 instead of entering large count. I don’t like this feature, personal opinion.
Топ-5 ошибок при объявлении функций в Python
Функции являются критическим компонентом в любом программном проекте. Написанные должным образом, они представляют собой практичный способ написания читаемого и поддерживаемого кода. Однако, если функции определены неверно, код становится трудно читаемым и плохо поддерживаемым в долгосрочной перспективе — даже если предположить, что вы пишете код для одного и того же проекта, потому что программистам свойственно забывать написанное ими ранее.
Учитывая важность функций в программировании, я бы хотел разобрать наиболее распространённые ошибки при объявлении функций в Python. Зная эти подводные камни, вы легко сможете не только реализовать соответствующие рекомендации, но и сделать код более читаемым и поддерживаемым.
1. Неподходящие имена функций
Проблема выбрать имя возникает не только в те моменты, когда вы заводите ребёнка или питомца. Вы можете не согласиться, но как для программиста это станет непростой задачей на протяжении всей вашей карьеры. Трудности возникают из-за стандартов при составлении имён: они должны быть уникальны, информативны и единообразны.
Уникальность
Это очень прямолинейное требование. Как и в любых других объектах Python, имена используются для идентификации функций. При объявлении функций с одинаковыми именами Python IDE (интегрированная среда разработки, например, PyCharm или Visual Studio Code) пожалуется на совпадение, или последняя объявленная функция выйдет победителем. Объявим две функции say_hello , и, как видите, при вызове функции получим вторую:
>>> # определяем функцию
>>> def say_hello():
. print('say hello, first function')
.
>>> # определяем функцию с таким же именем
>>> def say_hello():
. print('say hello, second function')
.
>>> say_hello()
say hello, second functionИмена функций должны быть уникальны.
Информативность
Функции пишутся для выполнения определённых операций, и их имена должны отражать их обязанности. Если имена ясно не отражают обязанности функций, становится сложно понимать не только программы, написанные другими людьми, но даже собственный код, написанный в прошлом месяце. Быть информативным значит быть конкретным и точным при назначении функций. Рассмотрим следующие примеры:
>>> # имя слишком общее и неконкретное
>>> def do_something():
. print("do something")
.
>>> # более конкретное имя
>>> def say_hi():
. print("say hi")
.
>>> # неточно описывает функцию
>>> def process_numbers(number1, number2):
. result = number1 * number2
. return result
.
>>> # более точно описывает функцию
>>> def multiply_numbers(number1, number2):
. result = number1 * number2
. return result
.Имена функций должны быть информативны.
Единообразие
Программирование на Python стимулирует модальность, что подразумевает группировку связанных классов и функций в модули. Внутри модулей и между ними стоит именовать функции единообразно. То есть использовать одни и те же условные обозначения для определённых видов объектов и операций. Рассмотрим следующие простые примеры. Первые три функции выполняют схожие операции, поэтому я использовал одинаковый формат: глагол + подчёркивание + числа. В пользовательском классе Mask структура имён двух функций promotion_price и sales_price одинакова: в первой части определена характеристика цены, а во второй суть возвращаемого значения (то есть цена, выраженная в виде числа с плавающей точкой).
>>> # функции, выполняющие схожие операции
>>> def multiply_numbers(number1, number2):
. return number1 * number2
.
>>> def add_numbers(number1, number2):
. return number1 + number2
.
>>> def divide_numbers(number1, number2):
. return number1 / number2
.
>>> # определяем пользовательский класс
>>> class Mask:
. def __init__(self, price):
. self.price = price
.
. # две функции, возвращающие два вида цен
. def promotion_price(self):
. return self.price * 0.9
.
. def sales_price(self):
. return self.price * 0.75
.Имена функций должны быть единообразны.
2. Разнородные обязанности и чрезмерная длина
Другую распространённую ошибку допускают даже опытные программисты, если пренебрегают рефакторингом кода, — это слишком большое количество разнородных обязанностей у конкретной функции. С точки зрения обязанностей в идеале у функции должна быть одна задача, которую легко понять из имени функции.
Одним из распространённых сопутствующих признаков того, что у функции слишком много разнородных обязанностей, является её чрезмерная длина, следовательно, подобные функции довольно трудно читать и проводить отладку при возникновении ошибок.
Сравним два гипотетических примера. Используем популярную библиотеку pandas для обработки нормальных данных, полученных в ходе эксперимента. Для каждого субъекта у нас есть четыре сессии данных в формате CSV. Мы можем написать функцию process_physio_data , включающую в себя все три этапа обработки данных. Но из-за сложности данных функция будет содержать более 100 строк кода!
>>> import pandas as pd
>>>
>>> def process_physio_data(subject_id):
. # первый этап - чтение связанных файлов
. df0 = pd.read_csv(f'_v1.csv')
. df1 = pd.read_csv(f'_v2.csv')
. df2 = pd.read_csv(f'_v3.csv')
. df3 = pd.read_csv(f'_v4.csv')
. # завершение первого этапа
.
. # второй этап - процедуры очистки
. #
. # обработка четырёх DataFrames
. # здесь 50 строк кода
. # генерация большого DataFrame
. #
. # завершение второго этапа
. big_df = pd.DataFrame()
.
. # третий этап - некоторые сложные вычисления
. #
. # обработка большого DataFrames
. # здесь 50 строк кода
. # генерация маленького DataFrame
. #
. # завершение третьего этапа
. small_df = pd.DataFrame()
.
. return small_df
.Вместо этого стоит написать функции, более точно отражающие этапы обработки данных. Во фрагменте ниже мы создали три функции, ответственные за три этапа обработки данных. Отметим, что у каждой функции есть только одна обязанность. Обновлённая функция process_physio_data меньше и понятнее, её единственной обязанностью является предоставление конвейера для обработки нормальных данных. Благодаря рефакторингу общая читаемость кода значительно улучшилась.
>>> import pandas as pd
>>>
>>> # вспомогательная функция, читающая данные
>>> def read_physio_data(subject_id):
. df0 = pd.read_csv(f'_v1.csv')
. df1 = pd.read_csv(f'_v2.csv')
. df2 = pd.read_csv(f'_v3.csv')
. df3 = pd.read_csv(f'_v4.csv')
. return [df0, df1, df2, df3]
.
>>> # вспомогательная функция, очищающая данные
>>> def clean_physio_data(dfs):
. # all the 50 lines of code for data clean up
. big_df = pd.DataFrame()
. return big_df
.
>>> # вспомогательная функция, вычисляющая данные
>>> def calculate_physio_data(df):
. # all the 50 lines of code for data calculation
. small_df = pd.DataFrame()
. return small_df
.
>>> # обновлённая функция
>>> def process_physio_data(subject_id):
. # первый этап - чтение
. dfs = read_physio_data(subject_id)
. # второй этап - очистка
. big_df = clean_physio_data(dfs)
. # третий этап - вычисление
. small_df = calculate_physio_data(big_df)
.
. return small_df
.3. Отсутствие документации
В долгосрочной перспективе эта ошибка чрезвычайно неприятна. На первый взгляд кажется нормальным, что ваш код всё ещё работает, как должен, даже без документации. Например, если вы работаете над одним проектом на протяжении нескольких недель, вы прекрасно знаете, чем занимается каждая функция. Однако если вам нужно повторно обратиться к коду для обновлений, как много времени вам потребуется, чтобы разобраться в том, что вы сделали? Для меня этот урок оказался весьма болезненным, возможно, у вас тоже есть подобный опыт.
Отсутствие документации может стать серьёзной проблемой при работе в команде, где люди обмениваются API, или при создании библиотек с открытым исходным кодом. При использовании функций, написанных другими людьми, мы не знаем конкретных операций внутри функций. Однако достаточно просто прочесть документацию, чтобы знать, как вызывать функцию и её ожидаемое значение. Возможно ли вообразить, чтобы ни у одной библиотеки или фреймворка, с которыми вы работаете, не было бы документации?
Я не говорю, что необходимо писать пространные строки документации. Я убеждён, что вам не придётся писать слишком много документации при следовании стандартам именования функций: использовании уникальных, информативных и единообразных имён, предоставлении одной обязанности для каждой функции и сохранении приемлемой длины функций. Тем не менее при работе в большой команде или в сообществе разработчиков ПО с открытым исходным кодом вам стоит следовать стандартным соглашениям по документации для общего удобства.
Я не буду углубляться здесь в эту тему, но вот подробная статья, посвящённая написанию удобных строк документации в Python.
4. Некорректное использование значений по умолчанию
При написании функций Python позволяет задавать значения по умолчанию для конкретных аргументов, эта фича также есть во многих встроенных функциях. Рассмотрим пример ниже. Создадим список объектов, используя функцию range() , синтаксис которой выглядит так: range(start, stop, step) . По умолчанию аргумент step использует 1. Однако мы можем задать значение этому аргументу (скажем, 2 ):
>>> # функция range, использующая значение step по умолчанию
>>> list(range(5, 15))
[5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
>>> # зададим step значение 2
>>> list(range(5, 15, 2))
[5, 7, 9, 11, 13]Однако всё усложняется при написании функций, использующих значения по умолчанию с изменяемыми типами данных. В Python такие объекты, как списки, словари и наборы, могут быть изменены после создания, это и есть изменяемые типы данных. Рассмотрим следующий тривиальный пример использования значений по умолчанию с изменяемыми аргументами функции:
>>> # определяем функцию, включающую значение по умолчанию для
>>> # списка
>>> def append_score(score, scores=[]):
. scores.append(score)
. print(scores)
.
>>> append_score(98)
[98]
>>> append_score(92, [100, 95])
[100, 95, 92]
>>> append_score(94)
[98, 94]Когда мы пытаемся добавить значение 98 в конец списка, видим ожидаемый результат, потому что не указан аргумент scores и используется пустой список. Когда мы добавляем 92 к списку [100, 95] , результат также соответствует ожиданиям: [100, 95, 92] . Однако при попытке добавить значение 94 , некоторые ожидают увидеть [94] , но результат иной. Почему так происходит?
Всё потому, что функции в Python рассматриваются как регулярные объекты. Подразумевается, что при определении функции создаётся объект, включающий в себя переменные по умолчанию. Давайте рассмотрим на примере:
>>> # обновленная функция для отображения id аргумента scores
>>> def append_score(score, scores=[]):
. scores.append(score)
. print(f'scores: & id: ')
.
>>> append_score.__defaults__
([],)
>>> id(append_score.__defaults__[0])
4650019968
>>> append_score(95)
scores: [95] & id: 4650019968
>>> append_score(98)
scores: [95, 98] & id: 4650019968Мы модифицировали функцию, чтобы она выводила адрес памяти для списка scores . Как видите, перед вызовом функции мы можем проверить значения аргумента по умолчанию и его адрес памяти, обратившись к атрибуту __default__ . После того, как функция была вызвана дважды, был обновлён один и тот же объект list с тем же адресом памяти.
Как же правильно задавать значения по умолчанию? Необходимо использовать None в качестве значения по умолчанию для изменяемых типов данных, чтобы при объявлении функции не создавался изменяемый объект; его можно создать уже при вызове функции. Подробнее это видно во фрагменте ниже, теперь всё работает как ожидалось:
>>> # используем None в качестве значения по умолчанию
>>> def append_score(score, scores=None):
. if not scores:
. scores = []
. scores.append(score)
. print(scores)
.
>>> append_score(98)
[98]
>>> append_score(92, [100, 95])
[100, 95, 92]
>>> append_score(94)
[94]5. Злоупотребление *args и **kargs
Python позволяет писать гибкие функции, поддерживая переменное количество аргументов. Вам наверняка встречались *args и **kargs в документации некоторых библиотек. По сути *args относится к неопределённому количеству позиционных аргументов, а **kargs — к неопределённому количеству именованных аргументов.
В Python позиционными называются аргументы, передаваемые на основе их позиций, а именованными — аргументы, передаваемые на основе заданных ключевых слов. Рассмотрим простой пример:
>>> # функция, включающая и позиционные, и именованные аргументы
>>> def add_numbers(num0, num1, num2=2, num3=3):
. outcome = num0 + num1 + num2 + num3
. print(f"num0=, num1=, num2=, num3=")
. return outcome
.
>>> add_numbers(0, 1)
num0=0, num1=1, num2=2, num3=3
6
>>> add_numbers(0, 1, num3=4, num2=5)
num0=0, num1=1, num2=5, num3=4
10В функции add_numbers , num0 и num1 — позиционные аргументы, а num2 и num3 — именованные. Стоит помнить, что вы можете менять порядок именованных аргументов, но не позиционных и именованных. Сделаем ещё шаг и посмотрим, как работают *args и **kargs . Лучше всего, конечно, изучить на примере. Обратите внимание на две вещи:
- Переменное число позиционных аргументов обрабатывается как кортеж, следовательно, его можно распаковать, используя одну звёздочку — *.
- Переменное число именованных аргументов обрабатывается как словарь, следовательно, его можно распаковать, используя две звёздочки — **.
>>> # функция с *args
>>> def show_numbers(*numbers):
. print(f'type: ')
. print(f'list from *args: ')
.
>>> show_numbers(1, 2, 3)
type:
list from *args: (1, 2, 3)
>>>
>>> # функция с **kargs
>>> def show_scores(**scores):
. print(f'type: ')
. print(f'list from **kargs: ')
.
>>> show_scores(a=1, b=2, c=3)
type:
list from **kargs:Доступность *args и **kargs позволяет писать более гибкие функции, однако злоупотребление ими может привести к путанице. Выше я упоминал об использовании библиотеки pandas для манипуляций с данными и о функции read_csv , читающей CSV-файлы. А знаете, сколько аргументов может принимать эта функция? Заглянем в документацию:
pandas.read_csv(filepath_or_buffer: Union[str, pathlib.Path, IO[~AnyStr]], sep=',', delimiter=None, header='infer', names=None, index_col=None, usecols=None, squeeze=False, prefix=None, mangle_dupe_cols=True, dtype=None, engine=None, converters=None, true_values=None, false_values=None, skipinitialspace=False, skiprows=None, skipfooter=0, nrows=None, na_values=None, keep_default_na=True, na_filter=True, verbose=False, skip_blank_lines=True, parse_dates=False, infer_datetime_format=False, keep_date_col=False, date_parser=None, dayfirst=False, cache_dates=True, iterator=False, chunksize=None, compression='infer', thousands=None, decimal: str = '.', lineterminator=None, quotechar='"', quoting=0, doublequote=True, escapechar=None, comment=None, encoding=None, dialect=None, error_bad_lines=True, warn_bad_lines=True, delim_whitespace=False, low_memory=True, memory_map=False, float_precision=None)Их 49: 1 позиционный и 48 именованных аргументов. Теоретически, список можно сократить:
pandas.read_csv(filepath_or_buffer: Union[str, pathlib.Path, IO[~AnyStr]], **kargs)Однако при реальной разработке всё равно придётся распаковывать **kargs и выяснять, как правильно читать CSV-файл. Почему же опытные разработчики Python согласились перечислять все эти именованные аргументы? Потому что они прекрасно понимают следующий принцип:
Использование **kargs может сэкономить нам немного времени при написании первой строки объявления функции, однако код становится менее явным. То же справедливо и для *args . Как упоминалось выше, при работе в среде совместного использования кода всегда стоит стремиться к ясному и понятному коду. Поэтому по возможности стоит избегать использования *args и **kargs для написания более явно заданного кода.
Заключение
В этой статье мы разобрали пять распространённых ошибок в Python. Даже если у вас есть собственный стиль написания кода, эти ошибки могут сделать ваш код трудно читаемым и плохо поддерживаемым в долгосрочной перспективе. Поэтому, насколько это возможно, стоит стремиться способствовать читаемости кода и удобству совместного использования.
- Как найти выход из лабиринта с помощью Python
- 10 самых продуктивных техник для работы с файлами в Python
- Суть 4 хитроумных концепций Python для новичков