Effective Python Item 10. 왈러스 연산자를 이용해 반복을 피하라

    들어가기 전

     


    요약

    • 왈러스 연산자를 사용해서 대입식 중복을 줄일 수 있음.
    • 왈러스 연산자는 값을 대입 → 식평가 순서로 처리됨.
    • 왈러스 연산자를 이용해 중복 제거, 무한 루프(While문) 등을 가독성 있게 처리할 수 있음. 

     


    Item10. 왈러스 연산자를 사용해 반복을 피하라. 

    왈러스 연산자는 '대입식'이라고도 불린다. 

    if (a:=1) > 1:
    	pass

    왈러스 연산자는 위처럼 사용하고, 다음 순서로 처리된다.

    1. 변수에 값을 대입
    2. 대입된 값을 이용해 식을 평가 

     


    코드1. 대입식으로 코드 개선

    fresh_fruits = {
        '사과': 10,
        '바나나': 8,
        '레몬': 5
    }
    
    # count가 If 절에서만 사용되는데, 굳이 밖에 선언될 필요는 없음.
    count = fresh_fruits.get('레몬', 0)
    if count:
        make_lemonade(count)
    else:
        out_of_stock()

    위 코드의 문제점은 다음과 같다. 

    1. if 절에서만 사용되는 count가 넓은 범위에 선언됨. 
    2. count를 두 번 사용함. 

    이런 이유 때문에 코드의 가독성이 상대적으로 떨어지고, 중요하지 않은 변수 count가 중요한 것처럼 보인다는 문제가 있다. 왈러스 연산자를 이용해 이 코드를 개선해 볼 수 있다.

    fresh_fruits = {
        '사과': 10,
        '바나나': 8,
        '레몬': 5
    }
    
    # count가 If 절에서만 사용되는데, 굳이 밖에 선언될 필요는 없음.
    # 왈러스 연산자를 이용해 개선할 수 있음.
    if count := fresh_fruits.get('레몬', 0):
        make_lemonade(count)
    else:
        out_of_stock()

    왈러스 연산자를 이용해 count 변수를 if 절에서 선언하고 사용하도록 한다. 왈러스 연산자를 이용해 앞에서 언급했던 두 가지 문제 모두 개선했다. 

     


    코드2. 무한루프 → 왈러스 연산자로 개선

    # 무한 루프를 돌게 하고, 무한 루프를 끝내는 방법이 Break 밖에 없음.
    # 잡음이 발생할 수 있는데, 이것을 왈러스 연산자로 개선할 수 있음.
    bottles1 = []
    while True:
        fresh_fruit = pick_fruit()
        if not fresh_fruit:
            break
    
        for fruit, count in fresh_fruit.items():
            batch = make_juice(fruit, count)
            bottles1.extend(batch)

    다음 코드는 한 가지 문제점이 있다.

    1. While True를 이용해 무한 루프를 돌고 있다. 무한 루프는 자칫잘못하면 프로그램이 죽게 하는 문제가 될 수 있다.

    pick_fruit()의 반환 결과에 따라 루프가 종료되는데, 왈러스 연산자를 이용해 이 코드의 가독성을 더 확보해 볼 수 있다.

    # 무한 루프를 돌게 하고, 무한 루프를 끝내는 방법이 Break 밖에 없음.
    # 잡음이 발생할 수 있는데, 이것을 왈러스 연산자로 개선할 수 있음.
    # -> 왈러스 연산자를 이용하면 이 부분을 더 읽기 쉬워진다.
    bottles = []
    while fresh_fruit := pick_fruit():
        for fruit, count in fresh_fruit.items():
            batch = make_juice(fruit, count)
            bottles.extend(batch)

    이제 이 코드는 더 이상 무한루프를 돌지도 않고, 코드의 길이도 짧아졌다. 게다가 왈러스 연산자를 사용해서 While문의 종료조건 또한 더 명확하게 바뀌었다. (fresh_fruit가 있을 때만 처리). 무한 루프를 어쩔 수 없이 사용해야하는 경우라면, 왈러스 연산자를 이용할 수 있는지 검토해보는 것도 좋은 방안이 될 것이다.

    댓글

    Designed by JB FACTORY