2013-07-24 2 views
-3

Мне сложно понять инструкцию return.Оператор возврата и отступ

Ниже логического теста if not test(a) является ложным (означает if test(a) is true), иначе инструкция возвращает b.

Но сразу после этого возвращается a, переписать ценный код на a, не так ли?

def proc4(a, b): 
    if not test(a): 
     b = 'udacity' 
    else: 
     return b 
    return a 
+2

Не правда ли?Не могли бы вы попытаться сделать свой вопрос яснее? – user2357112

+0

Извините, но я действительно попытался сделать свой вопрос ясным. –

+1

Я тоже смущен. Как вы думаете, «переписывается» на 'a'? Функция завершается, как только она возвращает что-либо. –

ответ

4

Это довольно распространенная проблема для людей, чтобы работать в: , что это значит, когда моя функция имеет несколько возвращения точки?

Отказ от обсуждения whether or not несколько возвратов должно быть когда-либо случалось, факт в том, что они это делают. Важно помнить следующее:

Функция закончена, как только она возвращается.

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

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

def proc4(a, b): # line 1 
    if test(a): # line 2 
     return b # line 3 
    return a  # line 4 

Теперь, что происходит, это. Скажем, что test(a) оценивает на True в строке 2. Мы вводим блок if и встречаем строку 3: return b. Функция теперь возвращает значение b туда, откуда оно было вызвано, и выполнение завершено. Строка 4 никогда не выполняется.

В качестве альтернативы, если test(a) оценено до False, тогда мы не вводим блок if. В этом случае мы пропустим строку 3 прямо к строке 4. Теперь мы выполняем строку 4 и возвращаем значение a туда, куда был вызван proc4.

* Есть некоторые утверждения потока управления, такие как finally на многих языках, что может код причины в функции, которая будет выполняться после того, как оператор возврата встречается. Для простоты и потому, что это не по теме, я не буду вдаваться в это в этом ответе. Спасибо @Racso за то, что я пропустил это!

+0

_ «На каждом современном языке программирования, с которым я знаком, как только функция попадает в точку возврата, она перестает обрабатывать» _ - Я боюсь, что вы ошибаетесь. На нескольких языках блок 'finally' оператора' Try ... Catch ... finally' выполняется, даже если была удалена обратная строка. Посмотрите http://stackoverflow.com/questions/65035/does-finally-always-execute-in-java – Racso

+0

@Racso Спасибо за то, что я пропустил это! Я отредактировал ответ. –

+0

Без проблем :) Как вы заявляете, вещь «наконец» не по теме; мое реальное намерение состояло в том, чтобы показать вам это поведение, если вы этого не знали. _PS: Это Racso, а не Rasco;) _ – Racso

3

если test(a) является False, установите b в 'udacity' и return a

Это может также быть написано как это.

def proc4(a, b): 
    if not test(a): 
     b = 'udacity' 
     return a 
    else: 
     return b 
+1

'b = 'udacity'' - это нормально. –

+1

Стоит отметить: исходный код немного глуп, поскольку локальное присвоение 'b' не имеет значения, поскольку значение никогда не используется. Целая функция может быть такой же: proc4 = lambda a, b: b if test (a) else a' –

1

Если test(a) является true, функция возвращает исходное значение параметра b.

Если test(a) is false, функция возвращает исходное значение параметра a.

Под «исходным значением» понимается значение, которое получает функция.

3

Но только после того, как он возвращает a

Не, если он уже вернулся b. После того, как встречается один оператор return, выполнение функции заканчивается и возвращается значение.

+0

Спасибо. Это имеет смысл сейчас. Я просто не мог понять первого взгляда. –

2

Ваша функция может быть более четко написано так:

def proc4(a, b): 
    if test(a): 
     return b 
    else: 
     return a 

, что поможет вам понять ли логика?

+0

Ну, да и нет. –

+0

Если вы уточните, я постараюсь помочь вам в дальнейшем .... –

+0

Спасибо, я понимаю, что моя функция яснее. Хотя, я должен понять, почему моя функция возвращает то же самое, что и ваша функция ... –

1

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

def add(x,y): 
    return x+y 
answer = add(1,1) 

Ответ будет 2. Функция делает операцию и возвращает значение, как если бы это была переменная. Функция может быть назначена переменной как значение.

Теперь на ваш вопрос: если a не соответствует действительности, b будет равно udacity, но не будет возвращен, и он будет возвращен. Осталось бы b.

+1

Довольно уверен: 'answer = 2' в конце этого небольшого фрагмента, а не' 1' ;-) –

+0

@HenryKeiter Hehe typo. – Nebraska

1

Я думаю, что вы пропустили два других важных вещей

if not test(a): 
    b = 'udacity' 
else: 
    return b 

Прежде всего, если а истинно, то ваш код устанавливает б к значению «Udacity» , но не возвращает , Вместо этого выполнение продолжается до следующего блока кода.В вашем случае

return a 

КРП - остальное взаимоисключающее, а это означает, что если один блок выполняется (как в этом условии оценивается истина), то другие будут пропускаются по умолчанию. Также изменения, которые вы делаете внутри одного блока, не будут доступны другому (ваше назначение b никогда не будет напечатано вашим другом). Когда, если оператор принимает значение ложь, делает ваш код

return b 

, который возвращает все, что находится внутри б (то же самое относится и к «возвращающие»). о возвращении заявления, первые строки this Wikipedia entry действительно полезны:

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

в вашем случае, только после того, как точек, где proc4() называются

Смежные вопросы