언어/파이썬

    [Effective Python] BETTER WAY 13 - 슬라이싱보다는 나머지를 모두 잡아내는 언패킹을 사용하라

    기본 언패킹의 한계점은 언패킹할 시퀀스의 길이를 미리 알고 있어야 한다는 것이다. 따라서 보통 파이썬을 처음하는 사람들은 다음과 같은 코드를 작성한다. car_ages = [0, 9, 4, 8, 7, 20, 19, 1, 6, 15] car_ages_descending = sorted(car_ages, reverse=True) oldest = car_ages_descending[0] second_oldest = car_ages_descending[1] others = car_ages_descending[2:] 인덱스와 슬라이싱을 사용한 방법으로 시각적으로 잡음이 많으면서 인덱스로 인한 오류가 발생하기 쉽다. 이런 상황을 위해 파이썬에서는 별표 식을 사용해 모든 값을 담는 언패킹을 할 수 있도록 지원한다. ..

    [Effective Python] BETTER WAY 10 - 대입식을 사용해 반복을 피하라

    1. 대입식 대입식은 영어로 assignment expression이며 왈러스 연산자(walrus operator)라고도 부른다. 이 대입식은 파이썬 언어에서 고질적인 중복 문제를 해결하고자 파이썬 3.8에서 새롭게 도입된 구문이다. 일반 대입문은 a = b라고 쓰며 'a 이퀄(equal) b'라고 읽지만, 왈러스 연산자는 a := b라고 쓰며 'a 왈러스 b'라고 읽는다. 대입식은 대입문이 쓰일 수 없는 위치에서 변수에 값을 대입할 수 있으므로 유용하다. 예를 들어 if 문의 조건식 안에서 대입식을 쓸 수 있다. 대입식의 값은 왈러스 연산자 왼쪽에 있는 식별자에 대입된 값으로 평가된다. 2. 예제 2-1. 레모네이드 다음은 주스 바에서 사용할 신선한 과일 바구니를 관리하는 예제이다. fresh_frui..

    [Effective Python] BETTER WAY 9 - for나 while 루프 뒤에 else 블록을 사용하지 말라

    파이썬에서는 대부분의 다른 프로그래밍 언어와 달리 루프에 else 블록을 추가할 수 있다. for i in range(3): print('Loop', i) else: print('Else block!') >>> Loop 0 Loop 1 Loop 2 Else block! else 블록은 루프 안에서 break 문을 사용하면 실행되지 않는 방식으로 진행된다. for i in range(3): print('Loop', i) if i == 1: break else: print('Else block!') >>> Loop 0 Loop 1 일반적으로 비슷한 try/except/else와 같은 구문에서는 else가 '처리할 예외가 없는 경우에 이 블록을 실행하라'는 뜻이다. 따라서 가독성 측면에서 명확하지 않기 때문에..

    [Effective Python] BETTER WAY 7 - range보다는 enumerate를 사용하라

    1. range 보통 루프가 필요할 때 range를 많이 사용한다. flavor_list = ['바닐라', '초콜릿', '피칸', '딸기'] for flavor in range(len(flavor_list)): flavor = flavor_list[i] print(f'{i + 1}: {flavor}') >>> 1: 바닐라 2: 초콜릿 3: 피칸 4: 딸기 위 코드는 다소 투박해 보인다. list의 길이를 알아야 하고, 인덱스를 사용해 배열 원소에 접근해야 한다. 2. enumerate enemerate는 이터레이터를 지연 계산 제너레이터(lazy generator)로 감싼다. enumerate는 루프 인덱스와 이터레이터의 다음 값으로 이뤄진 쌍을 넘겨준다(yield). enumerate가 넘겨주는 각 상..

    [Effective Python] BETTER WAY 6 - 인덱스를 사용하는 대신 대입을 사용해 데이터를 언패킹해라

    1. 인덱스 사용 vs 언패킹 튜플에 있는 값을 접근할 때 다음과 같이 인덱스를 사용할 수 있다. item = ('호박엿', '식혜') first = item[0] second = item[1] print(first, '&', second) >>> 호박엿 & 식혜 다만, 여러줄로 이루어져 있어 복잡하다. 그래서 다음의 코드처럼 언패킹을 사용하면 한 문장 안에서 여러 값을 대입할 수 있다. item = ('호박엿', '식혜') first, second = item # 언패킹 print(first, '&', second) 2. for 문에서의 활용 또한, 언패킹은 for 루프에서 쓸모가 있다. 다음은 기존 코드이다. snacks = [('베이컨', 350), ('도넛', 240), ('머핀', 190)] f..

    [Effective Python] BETTER WAY 5 - 복잡한 식을 쓰는 대신 도우미 함수를 작성하라

    1. 복잡한 식 사용 파이썬은 문법이 간결하여 상당한 로직이 들어가는 식도 한 줄로 매우 쉽게 작성할 수 있다. 다음은 URL의 질의 문자열을 구문 분석하는 예제이다. from urllib.parse import parse_qs my_values = parse_qs('빨강=5&파랑=0&초록=', keep_blank_values=True) print(repr(my_values)) >>> {"빨강": ['5'], '파랑': ['0'], '초록':['']} get 메서드를 활용하면 상황에 따라 다른 값이 반환된다. print('빨강:', my_values.get('빨강')) print('초록:', my_values.get('초록')) print('투명도:', my_values.get('투명도')) >>> 빨강..

    [Effective Python] BETTER WAY 4 - C 스타일 형식 문자열을 str.format과 쓰기보다는 f-문자열을 통한 인터폴레이션을 사용하라

    1. 개요 다음과 같이 파이썬 코드에서는 문자열을 많이 쓴다. 1) 사용자 인터페이스 또는 명령줄 유틸리티에 메시지 표시 2) 파일과 소켓에 데이터 쓰기 3) 어떤 일이 잘못되었는지 Exception에 자세히 기록 4) 디버깅 형식화(formatting)는 미리 정의된 문자열에 데이터 값을 끼워 넣어서 사람이 보기 좋은 문자열로 저장하는 과정이고 파이썬에서는 4가지 방식이 있다. 하지만 한 가지 방법을 제외하면 나머지는 모두 심각한 단점이 있으므로 이를 이해하고 피해야한다. 2. % 형식화 연산자 사용 파이썬에서 문자열을 형식화하는 가장 일반적인 방법이다. a = 0b10111011 b = 0xc5f print('이진수: %d, 십육진수: %d' % (a, b)) >>> 이진수: 187, 십육진수: 31..

    [Effective Python] BETTER WAY 3 - bytes와 str의 차이를 알아두라

    1. 개요 파이썬에서는 문자열 데이터의 시퀀스를 표현하는 두 가지 타입이 있음 -> bytes와 str 2. 차이 bytes는 다음과 같이 부호가 없는 8바이트 데이터가 그대로 들어간다. a = b'h\x65llo' print(list(a)) print(a) >>> [104, 101, 108, 108, 111] b'hello' str은 문자를 표현하는 유니코드 코드 포인트가 들어 있다. a = 'a\u0300 propos' print(list(a)) print(a) >>> ['a', '`', ' ', 'p', 'r', 'o', 'p', 'o', 's'] à propos 3. Tip 3-1. 타입 변환 함수 작성하기 처리할 입력이 원하는 문자 시퀀스를 반환하도록 함수를 작성한다. def to_str(by..