Разница между методами Python, которые могут создавать новую переменную или нет

#python

#python

Вопрос:

Некоторым методам не нужно создавать новую переменную, т.е. lists.reverse() работает следующим образом:

 lists = [123, 456, 789]
lists.reverse()
print(lists)
  

этот метод делает себя обратным (без новой переменной).
Почему существуют разные способы создания переменной в Python?
Некоторые случаи, которые похожи на variable.method().method2().method3() , печатаются непрерывно, но type(variable) и print() таковыми не являются. Почему мы не можем печатать как variable.print() или variable.type() ?
Есть ли какие-либо философские причины для Python?

Комментарии:

1. Просто потому, что Python разработан таким образом. И, кстати, цепочка методов не считается лучшей практикой в Python, поскольку это снижает читаемость и усложняет отступ.

2. Как правило, методы, которые изменяют значение на месте, не возвращают результат. В некоторых случаях может быть встроен возвращающий результат. Например, reversed(seq) который не изменяет seq , но возвращает результат (фактически итератор, который вам нужно преобразовать в желаемый тип, например result = list(reversed(seq)) ).

Ответ №1:

Вас может смутить разница между функцией и методом, а также три разных назначения для них. Как бы мне не нравилось использовать SO в учебных целях, эти проблемы могут быть трудны для понимания из другой документации. Вы можете достаточно легко найти функцию против метода — как только вы узнаете, что это (немного) отдельная проблема.

Ваш первый вопрос касается системного дизайна. Python просто облегчает то, что хотят сделать программисты, и это различие является общим для многих (большинства?) языков программирования, поскольку ASM и FORTRAN вылезли из двоичных пулов слизи в те дни, когда динозавры бродили по земле.

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

(1) Обработайте эти данные — возьмите заданные данные и измените их, переставьте, что угодно, что нужно сделать — но мне не нужна предыдущая версия, только улучшенная версия, поэтому просто поместите новый материал туда, где был старый материал. Это используется почти исключительно, когда обрабатывается одна переменная; обычно мы не берем четыре отдельные переменные и не изменяем каждую из них. В этом случае мы поместили бы их все в список и изменили список (одну переменную). reverse относится к этому классу.

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

(2) Скажите мне что-нибудь интересное — возьмите данные и извлеките некоторую информацию. Однако мне понадобятся оригиналы, поэтому оставьте их в покое. Если мне нужно запомнить это классное новое понимание, я помещу его в свою собственную переменную. Это функция, которая возвращает значение. sqrt является одной из таких функций.

(3) Взаимодействовать с внешним миром — вводить или выводить данные постоянно. Для вывода ничего в программе не меняется; мы можем представить данные в удобном для чтения формате, но мы ничего не меняем внутренне. print есть такая функция.


Большая часть этого решения также зависит от предназначения функции: является ли это «глагольной» функцией (что-то делать) или функцией существительного / атрибута (посмотрите на эти данные и скажите мне, что вы видите)?


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

Ответ №2:

Смотрите документацию:

reverse() Метод изменяет последовательность на месте для экономии места при переворачивании большой последовательности. Чтобы напомнить пользователям, что он работает с побочным эффектом, он не возвращает обратную последовательность.