2

파이썬 구문에 익숙하지 않다, 변수 match이 기능에 for 표현 안에서 발견 된 문자열에 복용하는 방법을 누군가가 나에게 설명 할 수 있는지 궁금 해서요 :이 과제에서 쉼표는 무엇입니까?

def find_project(project_name):  
    projects = get_projects()  
    try: 
     match, = (proj for proj in projects if proj["name"].strip() == project_name) 
     return match 
    except ValueError: 
     return None 

답변

5

파이썬은 당신이 할당 할 수 있습니다 둘 이상의 변수에 일단이 같은

a, b = 1, 2 

이것에 오른쪽 튜플 1, 2 각 요소를 튜플 할당 a, b의 좌측을 처리하고 할당하는 것이다 작동 방식 그것 . 튜플은 하나 개의 요소가있을 수 있기 때문에

, 다음도 작동합니다

a, = 1, 

여러 과제의 오른쪽은 튜플 일 필요는 없습니다. 요소의 수가 일치하지 않는 경우

a, b, c = "three little pigs".split() 

:

a, b, c = "oh", "no" 

을 ... 당신이 ValueError을 얻을 모든 반복자는 긴 양쪽에있는 요소의 수와 동일 할 것 :

ValueError: not enough values to unpack (expected 3, got 2) 

함께 위의 모든 퍼팅, 다음, 함수 :

def find_project(project_name):  
    projects = get_projects()  
    try: 
     match, = (proj for proj in projects if proj["name"].strip() == project_name) 
     return match 
    except ValueError: 
     return None 

generator expression

(proj for proj in projects if proj["name"].strip() == project_name) 

이상 반복 ... ... 그 결과는 하나 개의 요소가있는 경우에 그 match 요소를 할당한다. 그렇지 않은 경우 ValueError이 발생하고 except 절에 걸리면 할당이 수행되지 않고 None이 반환됩니다.

두 가지 참고 사항 :

  1. 쉼표 , 코드를 읽을 때 놓치기 쉽습니다. 다른 방법으로는 왼쪽에 목록 구문을 사용하는 것입니다.

    [match] = (proj for proj in projects if proj["name"].strip() == project_name) 
    

    ... 같은 효과가 있습니다.

  2. 오른쪽이 발전기 표현 (또는 iterator의 다른 종류), 대신 기본 값으로 next() 사용할 수 있습니다 : 더 짧고 읽을 수

    def find_project(project_name):  
        projects = get_projects()  
        it = (proj for proj in projects if proj["name"].strip() == project_name) 
        return next(it, None) 
    

    이 ....