Почему выходные данные этого псевдокода отличаются в Python и C ++? - PullRequest
0 голосов
/ 05 ноября 2019

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


Вот код C ++, который выдает ошибку: (Пожалуйста, сначала проверьте вывод ниже)

#include<iostream>

int doMath(int a, int b){
    return a+b;
}

int doMath(int c, int d){
    return c*d;
}

int main(){
    std::cout<<doMath(3,4);
    return 0;
}

Вывод:

В функции 'int doMath (int, int)':

ошибка: переопределение 'int doMath (int, int)' в строке 9

note: 'int doMath (int, int)'ранее определено в строке 5

=== Ошибка сборки: 1 ошибка (-ей), 0 предупреждение (-я) (0 минут (-ов), 0 секунд (-ов)) ===


А вот эквивалентный код Python: (сначала проверьте вывод ниже)

def doMath(a,b):
    return a+b

def doMath(c,d):
    return c*d

def main():
    print(doMath(3,4))

if __name__ == "__main__": main()

Вывод:

12

Процесс завершен с кодом выхода 0


Так почему же Python выбирает определение второй по порядку функции doMath() на своемсвоя? Как он мог решить сам, что я хочу второе определение, а не первое ?? Почему он допускает несколько определений под одним и тем же именем и одним и тем же количеством параметров ???


Или, точнее, возможно, вопрос может быть, почему мы не можем скомпилировать код Python, как мыможет в C ++ (по крайней мере, не в PyCharm или нескольких других, которых я знаю)? Потому что, если бы мы могли, он сначала скомпилировал бы и определил, что под одним именем есть два определения функций с одинаковым количеством параметров и, таким образом, он вообще не запускается. То же, что старомодный C.

Ответы [ 2 ]

1 голос
/ 05 ноября 2019

Python - это язык на основе скриптов, что означает, что компиляция не происходит, просто этот код выполняется в реальном времени. Когда вы «определяете» функцию в Python, ее можно рассматривать как назначение функции имени. Когда вы хотите вызвать эту функцию, вы вызываете функцию, хранящуюся в этом имени. Если вы переопределите эту функцию, вы перезапишите это имя. Это отличается от C ++, где код компилируется заранее. C ++ компилирует все функции одновременно, что означает, что второе объявление doMath приведет к неоднозначным вызовам. Python, с другой стороны, объявляет функции по мере продвижения. Если вы переназначите doMath, скрипт просто вызовет его самое последнее определение. Чтобы ответить на ваш вопрос «Почему?»: Ну, это просто, как Python был разработан для работы. У этого дизайна есть много преимуществ, например, если вы хотите изменить поведение функции в зависимости от контекста. У Python также есть недостатки, такие как необходимость в интерпретаторе для запуска (потому что, как вы упомянули, мы не можем скомпилировать Python). Если вам нужно то же поведение, что и в «старомодном C», используйте C. Разные языки имеют разные особенности, которые могут лучше работать в разных приложениях.

1 голос
/ 05 ноября 2019

Это очень разные языки, поэтому они ведут себя по-разному.

В Python нет перегрузки функций, поэтому второе определение просто перезаписывает первое.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...