2014-01-02 5 views
0

Приветствия Pythonic world. День 5 обучения Python, и я борюсь с функциями, которые вызывают другие функции. Это будет просто для некоторых людей ...Python 3.3: Функции, вызывающие другие функции

В этом коде:

def powers_of_x(x): 
    print ('Powers Function with ', x, ' entered:') 
    for n in range (-3, 4, 1): 
     print ('power of ', n, "= ", x**n) 
    return 'First one ended (using variables with defined range)' 

def powers_of_9(): 
    print ("Powers function for 9 is:") 
    powers_of_x(9) 
    return 'Second one ended (no passed variable here)' 

def combined(): 
    x = int(input('Enter value to start:')) 
    print ('First, run powers_of_x function for entered value of: ', x) 
    powers_of_x(x) 
    print ('Second, run powers_of_9 function for powers of 9:') 
    powers_of_9() 
    return 'All now finished.' 

Первая функция powers_of_x(x) отлично работает на своей собственной. Так же и второй, powers_of_9(). В обоих случаях появляется напечатанное сообщение return.

Но когда они вызывается третьей функцией combined(), окончательное сообщение return от каждого («Первый конец ...» и «Второй завершено ...») не печатается. Почему нет? «Все готово» появляется, как и должно быть. Благодарим за любые исправления.

[Отредактировано] Извините, но я не могу сказать это хорошо. Мой вопрос заключался в том, почему текст «First one закончился ...» и «Second one закончился ...» появляются, когда первые две функции запускаются отдельно, но не при выполнении функции combined(). Является ли это особенностью return? Если это так, я буду придерживаться использования print.

+0

FYI, возвращаемые значения, как правило, не заключены в скобки в коде Python. Чаще всего писать 'return 'some string'', чем' return (' some string ') '. – senshin

+0

@senshin Спасибо за это - скобки теперь удалены. –

ответ

2

Вопрос: почему мой первый вопрос закончился, когда первые две функции запускаются отдельно, но не при выполнении функции comb().

Похоже, что вы запускаете свой код в интерактивном приглашении (либо в IDLE, либо в командной строке). В интерактивном приглашении, когда вы запускаете функцию, и не присвойте свое возвращаемое значение чему-либо, возвращаемое значение будет напечатано на экране. Если вы присваиваете его возвращаемое значение переменной или если функция не является верхним уровнем, возвращаемое значение не выводится на экран. Например:

>>> def foo(): 
    return 3 

>>> def bar(): 
    foo() 

>>> foo()  # not assigned to anything -> prints return value to output 
3 
>>> bar()  # not top-level -> doesn't print return value to output 
>>> x = foo() # assigned to x -> doesn't print return value to output 

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

Powers function for 9 is: 
Powers Function with 9 entered: 
power of -3 = 0.0013717421124828533 
power of -2 = 0.
power of -1 = 0.1111111111111111 
power of 0 = 1 
power of 1 = 9 
power of 2 = 81 
power of 3 = 729 

Как вы можете видеть, возвращаемое значение powers_of_9 не печатается.

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

def add(x, y): 
    return x+y 

def print_two_plus_three(): 
    result = add(2, 3) 
    print(result) 

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


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

def powers_of_x(x): 
    print('Powers function with', x, 'entered:') 
    for n in range(-3, 4, 1): 
     print('power of', n, '=', x**n) 
    print('First one ended (using variables with defined range)') 

def powers_of_9(): 
    print('Powers function for 9 is:') 
    powers_of_x(9) 
    print('Second one ended (no passed variable here)') 

def combined(): 
    x = int(input('Enter value to start: ')) 
    print('First, run powers_of_x function for entered value of:', x) 
    powers_of_x(x) 
    print('Second, run powers_of_9 function for powers of 9:') 
    powers_of_9() 
    print('All now finished') 
  • Когда вы пишете print('abc', 'def', 'ghi'), напечатанная строка abc def ghi. То есть каждый аргумент для печати разделяется пробелом. Вы можете изменить это поведение, написав, например. print('abc', 'def', 'ghi', sep='X'), где аргумент ключевого слова sep указывает, какую строку следует использовать для разделения аргументов. Как вы могли догадаться, это печатает abcXdefXghi.
  • Как я уже отмечал, считается плохим стилем для скобок return значений (если вы, конечно, не возвращаете кортеж).
  • Также считается плохим стилем, чтобы помещать пробел между именем функции и списком аргументов. т.е. использовать print('foo'), а не print ('foo').
  • Приятно помещать пробел в конце аргумента в input(), чтобы вводимые значения были отделены от приглашения ввода.
+0

Благодарим вас за конструктивную критику. Очень признателен. Только один вопрос: при запуске коды выше, последний выход три линии: 'Первого один закончился (с использованием переменных с определенным диапазоном) второго закончился (не передаются переменными здесь) Теперь все finished' Других слов , 'First one finished' печатается дважды (один раз после запуска первой функции, затем снова до завершения второй функции). Почему это? –

+0

@ShaneMHewitt Давайте посмотрим на последовательность вызовов функций, которые происходят. Сначала мы начнем с вызова 'объединены', чтобы все это произошло. В строке 3' объединенного' мы называем 'powers_of_x', и поэтому функция запускается и заканчивается печатью« Первый один закончен ... »один раз. Как только это будет сделано, мы придем вернемся к 'объединению'. В строке 5' объединены', мы вызываем 'powers_of_9', поэтому мы входим в это.' powers_of_9' вызывает 'powers_of_x', поэтому мы запускаем эту забаву ction _again_, что означает, что мы печатаем «Первый закончен ...» _again_. (cont ...) – senshin

+0

@ShaneMHewitt (cont ...) Только один раз 'powers_of_x' делается, мы возвращаемся в' powers_of_9' и печатаем «Второй закончен ...». И, конечно же, как только «powers_of_9» будет завершен, мы снова вернемся к «комбинированным» и закончим печать «Все готово». Если вы смущены тем, как это работает, попробуйте выполнить код за строкой и выпишите, что каждая строка делает вручную (т. Е. Притворяется интерпретатором Python). – senshin

1

Потому что они возвращаются, а не печатаются. Они возвращают строку, но в сочетании() эти строки ничем не назначены.

Вы могли бы сказать:

my_string = powers_of_x(9) 
print(my_string) 

Или просто:

print(powers_of_x(9)) 
4

Вы игнорируете возвращаемые значения своих функций. Если вы хотите распечатать их, добавьте print():

print(powers_of_x(x)) 

и т.д.

Тем не менее, казалось бы, более логично было бы просто изменить return заявления print().

+0

Вывод первых двух функций отлично печатается. Это текст, следующий за командами «return», которые не печатаются при вызове из третьей функции. Я просто изменил три оператора возврата для печати, и я получаю «необработанные синтаксические ошибки». –

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