По моему пониманию, присваивание s = "Hello"; должен только присваивать значение «Hello» для s, но операция не должна возвращать какое-либо значение.
blockquote>Ваше понимание на 100% неверно. Можете ли вы объяснить, почему вы верите в эту ложную вещь?
Какова аргументация, позволяющая присваивать операторам присваивания значение?
blockquote>Во-первых, назначение не дают значения. Выражение присваивания создает значение. Выражение присваивания является юридическим заявлением; существует только несколько выражений, которые являются юридическими утверждениями в C #: примеры построения экземпляра, приращения, декремента, вызова и присваивания могут использоваться там, где ожидается утверждение.
В C # существует только один вид выражения который не производит какую-то ценность, а именно, обращение к тому, что набирается как возвращающее пустоту. Каждое другое выражение выражает значение или переменную или ссылку или доступ к свойствам или доступ к событиям и т. Д.
Обратите внимание, что все выражения, которые являются законными как утверждения, являются полезными для их побочных эффектов . Это ключевое понимание здесь, и я думаю, возможно, причиной вашей интуиции, что назначения должны быть утверждениями, а не выражениями. В идеале у нас будет ровно один побочный эффект для каждого утверждения и никаких побочных эффектов в выражении. Он является немного странным, что побочный код может использоваться в контексте выражения вообще.
Обоснование возможности этой функции состоит в том, что (1) это часто удобно и (2) является идиоматическим в языках типа C.
Можно заметить, что вопрос был умолял: почему этот идиоматический язык на языках C-типа?
Вы должны были бы спросить Денниса Ритчи, но я предполагаю, что задание почти всегда оставляет значение, которое было просто присвоенный в регистре. C - это очень «близкий к машине» вид языка. Это кажется правдоподобным и в соответствии с дизайном C, что есть языковая функция, которая в основном означает «продолжайте использовать значение, которое я только что назначил». Очень легко написать генератор кода для этой функции; вы просто продолжаете использовать регистр, который сохранил значение, которое было назначено.
Вы можете сделать это с помощью getattr
:
def my_func(df, pandas_stat):
for col in df.columns:
print(getattr(df[col], pandas_stat)()) # the empty parenthesis
# are required to call
# the method
df_max = my_func(df, "max")