2016-07-17 1 views
0

저는 최근에 Python 3.5.2에서 map()을 사용하여 연습했으며, 모듈을 실행하려고했을 때 쉼표로 함수를 분리했으며 iterableSyntaxError입니다. 여기 코드는 다음과 같습니다이 조건문에 대한 구문 오류가 발생하는 이유는 무엇입니까?

eng_swe = {"merry":"god", "christmas":"jul", "and":"och", "happy":"gott", 
     "new":"nytt", "year":"år"} 

def map_translate(l): 
    """Translates English words into Swedish using the dictionary above.""" 

    return list(map(lambda x: eng_swe[x] if x in eng_swe.keys(), l)) 

내가 눈치가이 같은 조건문을 제거하는 경우 : 그것을 잘 작동하지만, 때로 믿을 목록에 항목을 추가하려고 방지 할 수있는 기능을 희생

return list(map(lambda x: eng_swe[x], l)) 

사전에 없어.

from functools import reduce 

def reduce_max_in_list(l): 
    """Returns maximum integer in list using the 'reduce' function.""" 

    return reduce(lambda x, y: x if x > y else y, l) 

예, 나는 지능형리스트보다 깨끗하게 쉽게 똑같은 일을 할 수 알고 : 나는 reduce()로 조건문을 사용하려고 할 때 다음과 같이 흥미롭게도, 어떤 문제가 아니었다 , 나는 결코 그것을 사용하지 않을지라도 적어도 map()을 올바르게 사용하는 법을 배우는 것이 내 시간으로 생각한다.

+1

삼항 연산자에는 'else'조건이 필요합니다. – pzp

답변

4

else 조항을 제공하지 않고 조건부 표현식을 사용하고 있기 때문에 SyntaxError이 표시됩니다.이 절은 필수 항목입니다. 당신의 reduce 예에서

conditional_expression ::= or_test ["if" or_test "else" expression] 
                ^^ 

당신이 결과로, 공급을 수행하고 : 조건식에 대한

The grammar (표현의 형태 즉 if 문) 항상else 절을 포함 오류는 발생하지 않습니다.

4

첫 번째 예에서는 이 아닌 경우 반환 할 대상을 지정하지 않습니다. python 이 표현식에서 아무 것도 산출 할 수 없으므로 구문 오류입니다. 예 :

a if b # SyntaxError. 
a if b else c # Ok. 

당신은 그것을 암시 적으로이 경우 None을 산출하는 것이 유용 할 수 있다고 주장 할 수도 있지만, 나는 그런 종류의 제안은 내가 않을 것 (... 지역 사회 내에서 어떤 견인을 얻을 것이라고 의심 그것을 투표하십시오 ;-)

1

코드가 SyntaxError을 발생시키는 이유에 대한 다른 설명은 완전히 정확하지만 내 답변의 목표는 "지도()를 올바르게 사용하는 방법을 배우는 것"을 목표로 돕는 것입니다.

여기서는 map을 사용하는 것이 타당하지 않습니다.

[eng_swe[x] for x in l if x in eng_swe] 

당신이 볼 수 있듯이,이지도의 표현에 굉장히 비슷 뺀 회선의 일부 : 당신이 당신의 대답에 언급 한 바와 같이 당신이 지능형리스트를 사용하면 훨씬 깨끗하다. 일반적으로 이것은 map을 잘못 사용하고 있다는 신호입니다. map(lambda...은 꽤 많은 코드 냄새입니다. (이 말은 파이썬에서 map을 열렬히지지하는 사람으로 말하고 있습니다. 많은 사람들이 결코 사용되어서는 안된다고 생각하지만, 올바르게 사용되는 한 그 사람이 아닙니다.)

map을 사용하는 좋은 예가 무엇일까? 음, 내 머리 꼭대기에서 생각할 수있는 유스 케이스 중 하나는 str의 목록을 int으로 변환하는 것입니다. 내가 파일에 저장된 데이터의 테이블을 읽고있다 예를 들어, 내가 할 수 있습니다 더 조작 또는 분석을위한 완벽한 int의의 2 차원 배열로 날 떠날 것이다

with open('my_file.txt', 'r') as f: 
    data = [map(int, line.split(' ')) for line in f] 

합니다. 무엇이 map을 코드보다 잘 사용하게 만드는 것은 내장 함수를 사용한다는 것입니다. 나는 람다를지도에서 사용되도록 명시 적으로 작성하지 않고있다. (이것은 목록 이해력을 사용해야한다는 표시이기 때문에).

코드로 다시 돌아가려면 ... 코드를 기능적으로 작성하려면 을 사용해야하며 이는 map과 마찬가지로 중요합니다. 내가 수 없습니다

map(lambda x: eng_swe[x], filter(lambda x: eng_swe.get(x), l)) 

주 내 버전에서 map(lambda... 코드 냄새 제거,하지만 적어도 나는 작은 부분으로 고장. filter은 번역 할 수있는 단어를 찾고 map은 실제 번역을 수행합니다. (이 경우에도 목록의 이해력은 아마도 더 좋을 것입니다.)이 설명이 파이썬 코드를 기능적으로 작성하려는 당신을 혼란스럽게하는 이상으로이 설명이 도움이되기를 바랍니다.

+0

감사합니다. 조건문을 사용하는 방법에 대한 가이드를 오랫동안 찾았으나 조건문을 찾을 수 없었습니다. 그러므로이 실수가있었습니다. –

관련 문제