2016-08-20 7 views
0

저는 파이썬과 프로그래밍에 완전히 익숙하지 만 좀 더 실제적인 접근 방식을 사용하여 그것을 배우려고합니다.함수 이름을 포함하는 목록을 만드는 방법은 무엇입니까?

내가하려는 것은 다른 단위를 변환하는 연습입니다. 파운드 -> kg, 피트 -> 미터 등

내가 다른 단위 쌍에 대한 모든 기능을 정의 :

def kg_to_g(value):  
    return round(value*1000.0,2) 
def g_to_kg(value):  
    return round(value/1000.0,2) 
def inch_to_cm(value): 
    return round(value*2.54,2) 
def cm_to_inch(value): 
    return round(value/2.54,2) 
def ft_to_cm(value):  
    return round(value*30.48,2) 

을하고 이러한 기능의 이름 목록을 만들어 :

unit_list = ['kg_to_g','g_to_kg','inch_to_cm','cm_to_inch', 
     'ft_to_cm','cm_to_ft','yard_to_m','m_to_yard', 
     'mile_to_km','km_to_mile','oz_to_g','g_to_oz', 
     'pound_to_kg','kg_to_pound','stone_to_kg','kg_to_stone', 
     'pint_to_l','l_to_pint','quart_to_l','l_to_quart', 
     'gal_to_l','l_to_gal','bar_to_l','l_to_bar'] 

이 프로그램은 무작위로 (예 : 134.23) 단위 쌍 (예 : kg-> 파운드)와 값을 선택해야하며, 사용자는 이러한 값을 변환해야합니다.

def input_handler(answer): 
    if answer == random_unit(ranval): 
     label2.set_text("Correct!") 
    else: 
     label2.set_text("Wrong!") 

불행하게도 그런 식으로 프로그램은 '아무튼 : 사용자가 대답을 입력하면 그것이 정답이나 오답 인 경우

random_unit = random.choice(unit_list) 
lower = 0.1001 
upper = 2000.1001 
range_width = upper - lower 
ranval = round(random.random() * range_width + lower, 2) 

, 프로그램은 함수에 의해 정의 계산으로 답을 비교하고 사용자를 말해야한다 t 작업, 그리고 codesculptor (codesculptor.org)는

TypeError: 'str' object is not callable 

누군가가 코드에 어떤 문제가 있는지 나에게 설명하고 일을 해결하기 위해 무언가를 제안 시겠어요 오류가 반환 전자 문제.

+1

'random_unit = random.choice (unit_list)'다음에'random_unit = globals() [random_unit]를 추가하십시오. –

+0

'random_unit = random.choice (unit_list)':이 줄은'random_unit'에'unit_list' ('str'의 목록)의 무작위 항목을 할당합니다. 그런 다음'random_unit (ranval)'을 호출하여 함수처럼'str'을 사용합니다 (호출 가능 함수는 함수의 또 다른 이름입니다). – kjaquier

답변

0

함수 이름을 따옴표로 묶었으므로 문자열이되었습니다.

은 당신의 목록을 변경

:

unit_list = [kg_to_g, g_to_kg, inch_to_cm, cm_to_inch, 
     ft_to_cm, cm_to_ft, yard_to_m, m_to_yard, 
     mile_to_km, km_to_mile, oz_to_g, g_to_oz, 
     pound_to_kg, kg_to_pound, stone_to_kg, kg_to_stone, 
     pint_to_l, l_to_pint, quart_to_l, l_to_quart, 
     gal_to_l, l_to_gal, bar_to_l, l_to_bar] 

그리고 지금은 다음과 같이 호출 할 수있는 기능의 목록입니다 unit_list[0](34) 예를 들어,.

이제 random_unit(ranval)은 예외를 throw해서는 안됩니다.

플로트 (if answer == random_unit(ranval))를 비교하면 문제가 발생할 가능성이 높습니다. 이유에 대한 자세한 설명은 Is floating point math broken?을 참조하십시오.

반올림함에 따라 문제가 없어 질 수도 있지만이 사실을 알고 자신의 코드에서 처리해야한다는 점을 이해하는 것이 좋습니다.

+0

'getattr'은 여기에 필요하지 않습니까? – Ejaz

+0

@ PEJK 아니요, 함수가 목록에 하드 코딩 된 경우가 아닙니다. 변수에 함수의 이름이 있고 그것을 호출하고 싶다면, 그렇습니다.'getattr()'은 여러분의 친구입니다,하지만 여기서는 필요 없습니다. 목록이 정의되면 요소는 함수 자체에 대한 참조입니다. – SiHa

+0

이 솔루션은 나를 위해 일했습니다! 고맙습니다! 내 잘못은 내가 단위 쌍 목록을 만든 후에 내 단위 쌍 함수를 정의했다는 것인데, 그 함수가 정의되지 않았다는 오류가 발생했다. –

-1

나는 이것이 당신이 요구하는 것이라고 생각합니다. 당신은 당신은 다음 목록에서 각 항목을 호출하고 그것을 매개 변수를 제공 할 수 있습니다이

unit_list = [kg_to_g, g_to_kg, inch_to_cm, cm_to_inch, ft_to_cm] 

같은 목록의 기능을 저장할 수 있어야하며 다음과 같은 예를 들어, 함수를 실행해야합니다

unit_list[0](value) 
관련 문제