Рубрики
Без рубрики

Python Review.

Как питон, и я встретился, я собираюсь поехать в довольно длинный тангенс здесь. Первый раз, когда я пробовал … Помечено с Python, Poodsdebate.

Как питон и я встретился

Я собираюсь пойти в довольно длинный тангенс здесь. Первый раз, когда я пытался изучить программирование, мне было 10 лет и незрела на вершине плохого учителя и невероятного несчастья начиная с C ++ в JGRAP в окнах. Я наслаждался этим сначала, но после разочарования непостижимых сообщений об ошибках, мое собственное отсутствие усердие, некоторые аргументы с моим учителем о отступе и ему дают мне задания, я не заинтересовал, и никогда не смог увидеть, как калькулятор и рок Бумажные ножницы программы, которые я писал, может относиться к чему-либо практичному, я бросил.

Некоторое время спустя, вероятно, между 2 и 3 годами, я попробовал еще раз, на этот раз с Java, используя IDE Bluej. Это продолжалось еще более короткое время. На самом деле мои воспоминания немного размыты в этот период времени – я помню, как помнить, пытаясь узнать Java самостоятельно и длиться менее недели, но и тот же учитель, пытаясь научить его мне, и достаточно далеко, что мы начали работать над игрой Мы придумали названные городские войны в IDE NetBeans (но я до сих пор бросил его; мы взяли на проект исключительно в результате того, что он был чрезвычайно превышен в моих способностях и делать 90% работы, потому что я не мог понять что он делал). Я не совсем уверен, как все это подходит вместе; Там могло быть несколько дней или год разрыва между двумя набегами в Java.

Быстро вперед, когда мне 15 лет, мой старый учитель прислал мне книгу: Python программирование для абсолютного новичка Майкл Доусон. Он сказал мне, что я мог бы понравиться Python, потому что “это делает много для ты”. И вот и вот, был он прав. Вскоре я написал игру в рубанке и игру Tic Tac Toe почти полностью самостоятельно, и не слишком долго после этого, Pixeldodge, простая игра в Pygame, где игроки должны были избежать красных врагов.

Очевидно, что это не совсем неисправность языков; Мне намного старше и более зрелое было также большим фактором, как имело книгу, специально ориентированную на мой сладкий зуб игрового программирования. Но по сей день я чувствую себя чувством верности Python, поскольку это был третий язык, чтобы попытаться научить меня программировать и первым, кто преуспеет. И Питон был единственным, который пришлось сделать это почти полностью без человеческого руководства (мой учитель больше не был через мое плечо).

Режимы использования

Python – это интерактивный язык с ремним, но он проходит несколько дополнительных миль. Флаг к интерпретатору заставляет его открыть reft после выходов программы, которые я использовал для отладки по послеизбакетам (хотя полезность несколько ограничена тем, что только глобальные имена все еще входят в область охвата), а последние версии даже имеют точка останова Функция, которая позволяет вам Приостановить запущенную программу и получить интерактивную оболочку внутри него .

Тип Система

Моя единственная огромная ручка с Python – и это огромный – это полное отсутствие проверки типа. Это стоит почти столько времени и счастья, как Обработка ошибок Go до такой степени, что я больше не может поверить, что динамическое набрание не грех Отказ

Это похоже на жестокую дразнящую, что Python имеет аннотации типа, но они ничего не делают, даже во время выполнения (хотя библиотеки, такие как Pydantic используют их, это совсем не так, как будто они решают проблему).

В качестве динамического языка Python имеет отличные метапрограммирование. Все операторы используют Dunder Methods, поэтому вы можете дать поведение пользовательских типов для < / > , в Индексация, итерация (генераторы удивительны!) Вы называете его. Там в основном нет «магии», которые работает только для встроенных типов. Библиотеки, как Pydantic а также SQLalchemy Используйте эти функции для реализации невероятных вещей, таких как синтаксическая поддержка ORM-запросов и переход к проверке типа выполнения.

Class Boaterplate довольно плохо с основным способом реализации конструкторов: каждое имя атрибута должно быть записано три раза (перечислено в параметрах конструктора, а затем Self.field в организме), наследование является неприятным, если ваш подкласс требует его Собственный конструктор (вы должны вызвать метод Dunder Parent напрямую, который выглядит как взлом, и повторить весь список аргументов), и вы даже не получаете вменяемое в здравом уме. __repr__ Реализация для бесплатных - объекты будут просто печатать как по умолчанию.

К счастью, dataclasses.daclass. Приходит к спасению и вырезать всю эту котующую таблицу для двух линий. Это даже позволяет вам установить ненулевые значения поля по умолчанию без какого-либо повторения!

Я хотел бы, чтобы сообщество была лучшая работа о преподавании новичков о Dataclasses – я не знал о них, пока не использовал Python в течение 5 лет.

Обработка ошибок

Python использует исключения, такие как большинство динамических языков, но у него есть заметно лучшие удобства для них, чем некоторые другие (JavaScript и Julia): Иерархия исключения и несколько кроме пункты, чтобы поймать разные виды, а Наконец пункт, который выполняет на пути независимо от исключений. Наконец довольно гибкий, поскольку его можно использовать даже без каких-либо кроме пункты (это просто нужно попробовать ). Есть также бахрома еще пункт, который выполняет только если исключение не было поднято, но все еще до Наконец Отказ

Необработанная ошибка поставляется с полной трассировкой стека по умолчанию с именами файлов, именами функций, номерами строк и текстом линии для каждой кадра стека. Это может быть немного многословным, но слишком много информации лучше, чем слишком мало. У меня никогда не было лучшее время с обработкой ошибок, чем с Python.

В значительной степени моя единственная неудовлетворенность с обработкой ошибок Python в том, что NameError это подтип Исключение вместо Baseexception , что означает, что вы не можете Иметь предложение кроме того, что соответствует всем типам ошибок «нормальные», но не опечатки Отказ Это просто глупо.

Синтаксис

Синтаксис Python отлично подходит для многих причин.

  • Использует отступ для метки кода блоков. Вы всегда хотите в любом случае, чтобы идентифицировать код на языке Brace, так почему бы не просто не использовать парсеров, чтобы сказать, где заканчивается блок?

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

  • Нет комиколов и круглых скобок вокруг условий. Причина, по которой я думаю \ Продолжение линии лучше, чем запястья, это потому, что продолжение линии необходима для меньшинств строк, поэтому лучше потребуется дополнительный шум для продолжения линий, чем необходимо дополнительный шум, чтобы закончить линию. Что касается скобок вокруг условий, насколько я осознаю, что утверждаемая выгода, состоит в том, что они позволяют пособить брекеты для одноразовых блоков (как будто это даже стоит этой стоимости), но Python получил, что покрытыминовые толстой кишки Отказ

  • Английский. Логические операторы Python являются и , или и не вместо && С и Действительно . Люди читают по-английски, поэтому язык, который использует английские слова для концепций, которые легко соответствуют им, более читаем. Чем быстрее мы можем разобрать концепцию из персонажей на нашем экране, тем более эффективно мы. Особенно для цикла: то, что инопланетянин во вселенной предпочтеет читать для (пусть; i чем Для Элема в SEQ: ? Линия буквально говорит, что он делает вместо того, чтобы сделать вас из трех отдельных операторов, каждый из которых полон неанглийских символов. И если вы хотите счетчик, вы можете сделать Для I, элемент в перечере (SEQ):

Струнные буквальные сахара

Есть много удобных синтаксических сахаров, которые включают префиксные строковые литералы с буквой.

  • F-струны выбирают интерполяцию: feext {var} text '+ str (var) + «Текст» Отказ Вы можете встроить произвольные выражения внутри брекетов F-string, и они автоматически преобразуются в строки, поэтому они довольно мощные (хотя и не так мощные, как JavaScript шаблон строк Потому что вы не можете встроить петли).

  • Сырые строки позволяют вы отказаться от интерпретации эвакуационных последовательностей: R '\ N' Отказ Это чрезвычайно удобно для Regex.

  • Байты: B'Text ' делает объект байта вместо строки Unicode. Это более читаемое, чем Байты («текст») Вы должны были сделать на некоторых других языках.

Аргументы ключевых слов

Еще одна удобная функция, которая улучшает читабельность и хорошо воспроизводится с аргументами по умолчанию:

def func(arg1, arg2):
    print('arg1 is', arg1, 'and arg2 is', arg2)
func(arg2 = True, arg1 = False) # prints "arg1 is False and arg2 is True"

Аргументы ключевых слов обеспечивают преимущества словаря аргумента ( Func ({'arg2': true, 'arg1': false}) ) Без недостатков: аргументы, прикрепленные к именам параметров, заказывать незначительные, параметры все еще перечислены в функции Заголовок (вместо def func (args): ) и без синтаксического шума скобок и цитат.

Генераторы и комплекс

Генераторы и поведение – довольно нефте-пара функций с большим количеством преимуществ. Генераторы предоставляют Ленивая оценка На языке, который не имеет в противном случае, поэтому вы можете использовать генераторы для решения большой или даже бесконечной последовательности, не храня ее в памяти. Конец Эта статья Показывает отличный пример того, насколько это полезно. И они тривиальны, чтобы написать с урожай ключевое слово.

По-видимому, генераторы на самом деле могут. Вы можете поймать возвращаемое значение из доходность и использовать gen.send () на вызывающем конце для подачи его значения. Я еще не получил этого, но звучит очень круто.

Встроенные выражения и комплексные выражения являются фантастическими инновациями. Во многих отношениях они функционируют как более читаемая версия карты/фильтра (которые оба реализуются как возвратные итераторы в Python 3). Например:

l = [num*100 for num in range(10) if num % 2 == 0]

Это эквивалентно:

l = list(map(lambda num: num*100, filter(lambda num: num % 2 == 0, range(10))))

Не только понимание делает обе операции в одном, но опять же знакомые английские слова в и Если Более читаемые, чем «Список … Карта … лямбда … Фильтр … лямбда … Подожь, что это снова?». И тогда это точнее сложное стека скобок, которое вы, вероятно, вывернут первый раз и получите ошибку синтаксиса. У них также есть Преимущества производительности над картой и фильтром Отказ

Теперь список списков не так ли не редкость, но Python также имеет набор и даже справедливость словаря! Я люблю рефакторинг некоторого уродливого десятинальной блокировки, который неиспользуется последовательностью в одно утверждение, которое почти читает как английское предложение.

Операции последовательности

Python имеет отличные встроенные помощники практически всех общих операций типа последовательности:

  • Поиск последовательности: seq.index (товар) ( Пункт в SEQ Для просто булевого теста)

  • Считание вхождения: seq.count (товар)

  • Вставить в список: l.insert (индекс, элемент)

  • Удалить элемент из списка по значению: l.remove (товар)

  • Удалите элемент из списка по индексу (и верните его!): l.pop (индекс)

  • Отрицательные индексы, шаги нарезки? Ты понял. л [-2: -6: -1] (Хотя я никогда не нашел повод, чтобы использовать шаги нарезки.)

  • Обратная последовательность: обратный (SEQ) или l.reverse ()

  • Сортировать последовательность: отсортировано (SEQ) или l.sort () Чтобы сортировать список на месте

  • Найти максимальное или минимальное значение последовательности любого типа? Макс () , мин ()

Я не знаю ни одного другого языка, который имеет все это.

Параллельность

У Python имеет серьезные проблемы с параллелизмом, которые соединяют недостатки производительности интерпретации. Асинхронный IO не плохой, но вы на самом деле не может Сделайте параллельную обработку даже с собственными нитями, поскольку блокировка глобального интерпретатора позволяет одному потоку выполнить код Python одновременно. Единственный способ вокруг это – наклониться к многопроцессоре или что-то.

Смягчающие проблемы производительности, существует Pypy , альтернативный переводчик языка (стандартный, являющийся cpeython ). Pypy работает Лот быстрее – в разумном факторе статически составленных языков и Pypy-STM это попытка (я не уверен в своем текущем состоянии). Но у Pypy есть проблемы со совместимостью: это Не использует ссылку, подсчитывающий в его сборке мусора, которая может вызвать утечки ресурсов для некоторых программ, написанных для CPYthon и не может использовать определенные модули, которые фактически записываются в C (например, Pygame и Поэтому Рентпи ). Это также боль, потому что Cpython и Pypy имеют отдельные пути поиска модулей и т. Д.

Pypy также не всегда Быстрее; использует JIT Compilation вместо того, чтобы быть настоящим переводчиком, так что на коротких сценариях, которые выполняют менее чем в секунду В любом случае, это действительно может быть медленнее.

Управление ресурсами

Основное решение Python для управления ресурсами – интерфейс менеджера контекста и с Ключевое слово, которое использует это. Наиболее распространенным примером является с файлами:

with open(filename) as f:
    # Use the file
# ...

Файл автоматически закрывается, когда с Блок выходит, даже если исключение брошено.

И это не просто особый случай для встроенных типов – вы можете реализовать интерфейс на пользовательских типах или как функцию с contextlib.contextmanager Отказ

Инструмент

Есть много инструментов анализа кода, но ничего непогашенного. Есть Marpy в качестве приведенного в нанесениях решения, но те же недостатки о нем не являются частью языка. Я пробовал около 8 различных связей, все из которых были ужасны. Все они либо выходят в первую очередь шумит о том, как встроить однострочную Если Заявления – это зло, и что я должен иметь 2 пустые строки после определения класса или есть некоторые случаи, когда они настаивают на том, чтобы делать ужасные вещи, такие как переформатирование А -типные утверждения в некоторых причудливых многоуровневых скобках-фестиварах, которые почти наверняка были ошибка (это было черным, то без конфигурации). Так что, несмотря на любящие льмина, у меня до сих пор нет Python Linter, который я использую.

Документация

Python имеет отличную онлайн документацию и солидный инструмент CLI. Но документация вы получаете от Pydoc не совпадает с онлайн-документами и часто неполный. Наиболее распространенный недостаток, который я видел, не делает типы аргументов, без которого, конечно, я не знаю, как позвонить в функцию.

Stdlib и экосистема

У Python есть огромное сообщество, которое написано хорошие библиотеки для всего. Стандартная библиотека Сама настолько обширная, CSV, JSON, HTTP, TLS, Emails, Regex, Base64 и форматы архива – просто крошечная доля того, что она может выработать из коробки. Если как-то вам нужно что-то, что нет, там гарантированно будет пакет для него на Pypi Отказ

От того, что я могу сказать Питону CTYPES Модуль также достаточно эффективен при взаимодействии с CD Code без собственного привязки Python. Я не использовал его для всего серьезного, но я немного играл с ним И это выглядит удивительно.

Моего общего мнения заключается в том, что Python – отличный язык. Особенно для обучения, но ни в коем случае не только для этого. Это заслуживает его популярности … что-то я не говорю о многих других вещах.

Оригинал: “https://dev.to/yujiri8/my-review-of-python-54fk”