2016-12-07 5 views
1

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

import random 

def make_s(): 
    result = '' 

    V = make_v 
    C = make_c 
    P = make_p 
    B = make_b 

    structs = ['VPCVBCC', 'VCVVC', 'VVPCC', 'VCVBCC', 'VPCCVBC', 'VCVCC', 'VPCBC', \ 
      'VVPCVBCC', 'VCVC', 'VPCVVBC'] 

    struct = random.choice(structs) 

    for elem in struct: 
     /* Call function defined above and add the result to the result string */ 
     result += elem() 

    return result 

Каков наилучший способ сделать это?

Большое спасибо :)

+1

Использование 'dict' вместо' list' может быть проще реализация –

ответ

4

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

import random 

def make_s(): 
    result = '' 

    # Here we have a mapping between the characters you see, 
    # and the functions you want to call. 
    my_funcs = {"V": make_v, 
       "C": make_c, 
       "P": make_p, 
       "B": make_b} 

    structs = ['VPCVBCC', 'VCVVC', 'VVPCC', 'VCVBCC', 'VPCCVBC', 'VCVCC', 'VPCBC', \ 
      'VVPCVBCC', 'VCVC', 'VPCVVBC'] 

    struct = random.choice(structs) 

    for elem in struct: 
     # Lookup the function in your dictionary 
     func_to_call = my_funcs[elem] 
     # And call it! 
     result += func_to_call() 

    return result 
+0

Brilliant, thanks :) – ggordon

+0

Часто бывает сложно попытаться выяснить (в коде), какое имя переменной назначено для какой функции. Превращение символа '' V '' в 'какой бы объект мой переменный «V» указывал на «обычно хаки» и его можно избежать так же, как это. – turbulencetoo

+1

Вы можете сохранить несколько шагов, выполнив 'my_funcs = {'V': make_v(), 'C': make_c(), 'P': make_p(), 'B': make_b()}', тогда это просто 'for elem in struct: result + = my_funcs [elem]' –

2

Подобный подход с использованием словаря для отображения символов на вызовы функций, немного более кратким, используя список понимание & Строка join функции:

import random 
def make_s(): 
    fDict = {'V': make_v(), 'C': make_c(), 'P': make_p(), 'B': make_b()} 
    structs = ['VPCVBCC', 'VCVVC', 'VVPCC', 'VCVBCC', 'VPCCVBC', 'VCVCC', 'VPCBC', \ 
      'VVPCVBCC', 'VCVC', 'VPCVVBC'] 
    struct = random.choice(structs) 
    return ''.join([fDict[elem] for elem in struct]) 
+0

Спасибо, должен был указать, что функция производит разные выходные данные каждый раз, когда она запускается, поэтому выше метод работает лучше – ggordon

+0

Ahhh Возможно, я немного зашел слишком далеко :) Пересмотрен, чтобы изолировать 'random.choice (structs) 'так что это не часть понимания (хотя я не думаю, что это влияет на вывод), и я думаю, что это должно быть функционально таким же, как и другой ответ. В противном случае, не уверен, какое различие вы делаете о «разной производительности каждый раз, когда он запускается». ура –

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