«Я составляю список функций в python, но когда я запускаю программу, все функции в списке вызываются автоматически».
«Я пробовал это на python 3.7.3, и ту же концепцию я пробовал и на C++, но и там он делает то же самое».
def a():
print ('a')
def b():
print('b')
def c():
print('c')
def d():
print('d')
aa=[a(),b(),c(),d()]
print(aa[1])
«Я ожидаю, что вывод aa[1] будет «b», но при выводе вызываются все функции, и он дает вывод а б с г Никто "
поменяй print(#)
на return #
Здесь вы явно вызываете все свои функции: aa=[a(),b(),c(),d()]
.
Ваши функции являются запускаются, хотя и не автоматически; вы явно вызываете их в выражении, определяющем aa
. Проблема в том, что вы путаете стандартный вывод со значением вызова функции.
Обратитесь за помощью к этому прекрасному блогу отлаживать. Также попробуйте поработать с учебником по вызовам функций. Это должно помочь прояснить пару ваших проблем и уменьшить путаницу до одного или двух моментов, с которыми вы можете справиться.
ваши функции ничего не возвращают. Они только печатают письмо и возвращают None.
использовать
def a():
print ('a')
return 'a'
...
вместо
Вы явно вызвали все функции, когда писали [а(), б(), с(), г()] так что все они работают (в данном случае печать письма) - это действительно ожидаемый результат. Я считаю, что вы хотите сначала собрать вызываемые объекты в списке не звоня им. Если вы хотите, чтобы желаемая функция из этого списка выполнялась путем индексации, вы можете сделать это, вызвав ее только после этого.
Например,
def a():
print ('a')
def b():
print('b')
def c():
print('c')
def d():
print('d')
# placeholder for the functions
funcs = [a, b, c, d]
Затем вы можете вызвать любую из функций путем индексации:
# call any of them by indexing whenever you feel like it.
funcs[1]()
Output: b
Используйте return
вместо print
. Когда вы создаете свой список aa
, каждый элемент вызывается немедленно, потому что вы написали ()
после каждого элемента, поэтому каждый оператор печати запускается по мере создания вашего списка. Кроме того, когда функция явно не возвращает значение, она возвращает None
. Когда вы print(aa[1])
, вы затем печатаете возвращаемое значение b(), которое равно None. Таким образом, вы получаете:
a # because it's printed in a()
b # because it's printed in b()
c # because it's printed in c()
d # because it's printed in d()
None # because it's returned from b()
Если вы используете return
вместо print
в каждой функции, каждый элемент списка будет содержать значение вернулся для каждой функции (ваш список фактически станет aa = ['a', 'b', 'c', 'd']
). Затем, когда вы затем print(aa[1])
, вы напечатаете значение aa
в позиции 1, что будет 'b'
.
def a():
return 'a'
def b():
return 'b'
def c():
return 'c'
def d():
return 'd'
aa=[a(),b(),c(),d()]
print(aa[1])
В качестве альтернативы, если вы хотите сохранить свои операторы печати в каждой функции, вы можете создать свой список с использованная литература для каждой функции вместо вызова каждой функции, а затем запустить результат:
def a():
print ('a')
def b():
print('b')
def c():
print('c')
def d():
print('d')
aa=[a,b,c,d]
print(aa[1]())
Ставя ()
после aa[1]
, вы говорите, попробуйте запустить все, что возвращается из aa[1]
. Поскольку aa[1]
содержит ссылка для функции b
, вы фактически вызываете b()
в этот момент, который затем запускает ваш оператор print('b')
.
ваши функции ничего не возвращают.