Чем доходность и доходность отличаются друг от друга? - PullRequest
0 голосов
/ 22 октября 2019

Я часто сталкивался с этим термином, что эта функция что-то дает или эта функция что-то возвращает. Я пытаюсь понять это и прочитать несколько статей на Python. Затем я столкнулся с тем же утверждением в c ++, которое гласит:

некоторые выражения дают объекты, но возвращают их как r-значения, а не l-значения.

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

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

Ответы [ 2 ]

1 голос
/ 22 октября 2019

В Python yield используется для генерации . Например:

def func():
    i =0
    while True:
        i += 1
        yield i

Если я правильно помню Python, это должно позволить этой функции в основном приостанавливать выполнение и вызываться снова и снова. Это может генерировать некоторую последовательность, например {0,1,2,3...}.

. С другой стороны, return просто возвращает одно значение и завершает выполнение:

def func():
    i =0
    while True:
        i += 1
        return i

Это всегда должно возвращать 0,поскольку функция полностью завершает выполнение, поэтому i каждый раз выходит из области видимости.


С другой стороны, C ++ не имеет прямого реального эквивалента yield, насколько я знаю (кромепо-видимому, в новом C ++ 20 , который добавляет эквивалент), где он имеет эквивалент (во всех версиях) здесь return. Это, конечно, называется return.

Тем не менее, C ++ может достичь чего-то похожего на наш пример выхода, используя статические переменные :

int func() {
    static i = 0;
    return i++;
}

Однако,это не означает, что статические переменные являются заменой yield в C ++. Просто в этом (и, возможно, в другом) примере (-ах) вы можете добиться того же в C ++ со статическими переменными.


Итак, return завершает выполнение функциина обоих языках, тогда как yield позволяет функции сортировать выполнение резюме. Не существует реального эквивалента для yield Python в C ++, по крайней мере, до C ++ 20 .

0 голосов
/ 22 октября 2019

Вы когда-нибудь пытались перебрать всю базу данных объектов? Это то, что я попробовал в первый раз, и это быстро заняло все 16 ГБ памяти и остановило мою систему. Вот почему существуют генераторы - загружать данные по мере необходимости, а не все сразу (и, возможно, несколько других применений). Попробуйте прочитать этот пост, в нем есть несколько примеров и мы рассмотрим его подробнее.

...