Очень плохо сформулирован вопрос, но, проблема, судя по всему, в том, что у вас функции вызываются, когда вы пытаетесь указать их в качестве значения словаря.
Допустим, у вас есть функция, которая что-то печатает на экран:
def func():
print('Hello World!')
В данном случае func
— будет ссылкой на функцию, а func()
— ее непосредственным вызовом. То есть func
вы можете передать как аргумент в другую функцию, чтобы позже вызвать (func()
) ее там, например:
def func():
print('Hello World!')
def print_hello_world(function):
function()
print_hello_world(func)
Выхлоп:
Hello World!
Поэтому важно уметь отличать ссылку на функцию от ее вызова.
Вам, очевидно, в качестве значения словаря нужна именно ссылка на функцию. Но вы вместо этого просто вызываете ее.
По аналогии с предыдущим примером:
my_dict = {'key': func()}
Здесь вы вызываете функцию, она печатает текст, но в качестве значения ключа 'key'
вы получите None
, то есть {'key': None}
, потому что функция func
ничего не возвращает.
Если бы она была записана как-то так, то есть, возвращала бы результат:
def func():
return 'Hello World!'
my_dict = {'key': func()}
То в my_dict
записался бы только результат работы функции, то есть {'key': 'Hello World!'}
Поэтому вам нужно указать именно ссылку на функцию:
my_dict = {'key': func}
И тогда вы сможете обращаться к ней по ключу 'key'
и вызывать вот так:
my_dict['key']()
Теперь перейдем к вашей функции p
:
def p(k , a):
print (k,' ', a)
Ее запись и вызов с передачей аргументов будет выглядеть так:
my_dict = {'key': p}
my_dict['key'](k ='jo', a = 'non')
Если вам нужно заранее задать аргументы прямо в словаре, то здесь стоит воспользоваться lambda
-выражением:
my_dict = {'key': lambda: p(k ='jo', a = 'non')}
my_dict['key']()
Результат будет тот же самый. Просто вы фактически оставите в словаре ссылку на функцию, которая при вызове, вызовет вашу функцию с передачей ей указанных параметров