Как использовать цикл для создания функций?питон - PullRequest
0 голосов
/ 30 января 2019

Мне нужно создать несколько функций, используя цикл for, чтобы у меня были похожие функции с разными именами.

rss = ['food', 'wood', 'stone', 'iron', 'gold']

for resource in rss:
    def resource(account):
        with open('accountdetails.py', 'r') as file:
            accdets = json.load(file)
        rss_value = accdets[account][resource]
        print(rss_value)

food('account_3')

Этот код не работает, но я ожидал, что он создаст 5 различных функций, и [resource] будет заменено в зависимости от того, какая функция вызывается.Вместо этого я получаю NameError: name 'food' is not defined

1 Ответ

0 голосов
/ 30 января 2019

Вы не можете создавать такие функции, как эта, но вы можете повторно использовать ту же функцию и просто предоставить «имя ресурса» в качестве дополнительного ввода:

def resource(account, res):
    """Prints the resource 'res' from acccount 'account'"""
    with open('accountdetails.py', 'r') as file:
        accdets = json.load(file)
    rss_value = accdets[account][res]
    print(rss_value)


rss = ['food', 'wood', 'stone', 'iron', 'gold']
for what in rss:
    resource("account_3", what) # this will print it 

Недостаток:

  • вы загружаете файл 5 раз
  • вы создаете JSON 5 раз

Было бы лучше сделать загрузку и создание объекта только один раз:

# not sure if it warrants its own function
def print_resource(data, account, res):
    print(data[account][res]) 

# load json from file and create object from it 
with open('accountdetails.py', 'r') as file:
    accdets = json.load(file)

rss = ['food', 'wood', 'stone', 'iron', 'gold']
for what in rss:
    print_resource(accdets, "account_3", what)   
...