조건

2017-10-25 2 views
0

내가 약에 가깝다 파이썬에서 일부 코드를 쓰고 있어요의 조합에 따라 동작을 확장 다음조건

vals = [3, 4] 
constraints = [5, 10] 

def foo(val, constraint): 
    return val <= constraint 

def bar(x, y): 
    # do stuff such as: 
    print(x, y) 

def baz(val): 
    # transform val, such as by doing: 
    new_val = (val * 20 - 5) ** 2 
    return new_val 

bar(*vals) 
if foo(vals[0], constraints[0]): 
    bar(vals[0], baz(vals[1])) 
if foo(vals[1], constraints[1]): 
    bar(baz(vals[0]), vals[1]) 
if foo(vals[0], constraints[0]) and foo(vals[1], constraints[1]): 
    bar(baz(vals[0]), baz(vals[1])) 

나는 이것이 대수 관계임을 인식, 그래서 더가 있어야 느낌 이것을 코드로 표현하는보다 간결한 방법.

은의 인덱스 0에 foo에 의해 반환 된 TrueA이며, True는 1 B입니다 인덱스에 foo에 의해 반환한다고 가정 해 봅시다. A이 참일 때 적용되는 연산은 a이고, 마찬가지로 Bb입니다. 다른 결과는 _입니다. 값들의 세트는 것이 발생하기 :

| _ | A | B | 
----------------------------- 
_ | x, y | x, y | x, y | 
    |  | ax, y | x, by | 
----------------------------- 
    | x, y | x, y | x, y | 
A | ax, y | ax, y | x, by | 
    |  |  | ax, by | 
----------------------------- 
    | x, y | x, y | x, y | 
B | x, by | ax, y | x, by | 
    |  | ax, by |  | 

간결한 (바람직하게는 일반)가 나중에 map PED 또는 반복 될 수 있도록 이들 값을 생성하는 방법이 있는가?

+0

이 문맥에서'bar'와'baz'는 무엇입니까? – James

+0

@James'bar'는 표시된 코드와 관련이없는 부작용이있는 함수입니다. 'baz'는 덧셈, 곱셈 또는 유형을 보존하는 다른 연산과 같은 입력 값의 변환입니다. – Aaron3468

답변

0

나는 당신이 "코드에서 이것을 나타낼 수있는 간결한 방법"을 원할 때 어떤 의미인지는 확실하지 않습니다. 이러한 함수를 일반화하려면 다음을 사용할 수 있습니다.

def foo(val, constraint): 
    return val <= constraint 

def bar(x, y): 
    print x, y 

def baz(val): 
    return (val * 20 - 5) ** 2 

def foobar(a, b) 
    if a <= b: 
     print a, b 

def barbaz(a, b, c) 
    if b <= c: 
     print baz(a), b 

def bazfoo(a, b, c, d) 
    if a <= b and c <= d: 
     print baz(a), baz(c) 

vals = [3, 4] 
constraints = [5, 10] 

bar(*vals) 

foobar(vals[0], constraints[0]) 
barbaz(vals[0], vals[1], constraints[1]) 
bazfoo(vals[0], constraints[0], vals[1], constraints[1]) 
+0

이 문제에 대한 매우 일반적인 해결책인지 잘 모르겠습니다. 'foobar','barbaz','bazfoo'를 만들기 위해 필요한 명시적인 코딩의 양은'if' 문을 리펙토링하는 목적을 무효로합니다. 단순화 된 버전을 생각해보십시오 : if a : f1(); if b : f2(); if a 및 b : f3()'. 이론적으로는 if : f1(); elif b : f2(); anyif : f3()'. 나는 파이썬이 이것을 할 내장 된 방법을 가지고 있는지 궁금해한다. ('if's가 더 길어질 수있는 경우가 있기 때문에) – Aaron3468

+0

@ Aaron2468 알겠습니다. 나는 그 문제를 이해하지 못한다고 생각한다. – alex