플그래밍/파이써언

더 깔끔하고 효율적인 파이썬 코드를 위한 10가지 비법

훗티v 2025. 3. 11. 22:21
반응형

파이썬은 오늘날 가장 인기 있는 프로그래밍 언어 중 하나이며, 단순함과 다재다능함으로 잘 알려져 있습니다. 초보자든 숙련된 개발자든, 파이썬의 숨겨진 보석들을 마스터하면 코딩 효율성을 크게 향상시킬 수 있습니다. 더 깔끔하고 효율적인 코드를 작성하는 데 도움이 될 10가지 파이썬 팁과 트릭을 소개합니다.

 

1. 한 줄로 변수 교환하기

두 값을 교환하기 위해 임시 변수를 사용하는 대신, 다음의 간단한 트릭을 사용하세요:

a, b = 15, 25
a, b = b, a
print(a, b) # 출력: 25 15

 

추가 설명:

  • 이 코드는 파이썬에서 변수 값을 교환하는 효율적인 방법을 보여줍니다.
  • 일반적으로 변수 값을 교환하려면 임시 변수가 필요하지만, 파이썬에서는 튜플 언패킹을 사용하여 한 줄로 이를 수행할 수 있습니다.
  • a, b = b, a 이코드는, 오른쪽에 있는 b, a의 값을 튜플로 묶어서 왼쪽에 있는 a, b에 튜플형태로 언패킹하여 값을 넣어주는 방법입니다.
  • 이 방식은 코드를 더 간결하고 읽기 쉽게 만들어줍니다.

 

2. 더 깔끔한 코드를 위해 리스트 컴프리헨션 사용하기

리스트 컴프리헨션은 리스트를 생성하는 간결한 방법을 제공합니다.

squares = [x**2 for x in range(5)] 
print(squares) # 출력: [0, 1, 4, 9, 16]

 

추가 설명:

  • 리스트 컴프리헨션이란?
    • 리스트 컴프리헨션은 반복문과 조건문을 사용하여 새로운 리스트를 생성하는 파이썬의 강력한 기능입니다.
    • 일반적인 반복문보다 코드를 훨씬 더 간결하고 읽기 쉽게 만들어줍니다.
  • 코드 분석:
    • [x**2 for x in range(5)] 이 코드는 range(5) (0부터 4까지의 숫자)의 각 요소 x에 대해 x**2 (x의 제곱)을 계산하고, 그 결과를 새로운 리스트에 담습니다.
    • 결과적으로 squares 리스트는 0부터 4까지의 제곱 값들을 포함하게 됩니다.
  • 장점:
    • 코드의 가독성을 높여줍니다.
    • 일반적인 반복문보다 실행 속도가 빠를 수 있습니다.
    • 복잡한 리스트 생성 작업을 간단하게 처리할 수 있습니다.
  • 활용 예시:
    • 짝수만 포함하는 리스트 생성: [x for x in range(20) if x % 2 == 0]
    • 문자열 리스트의 각 문자열 길이를 담은 리스트 생성: [len(s) for s in ["apple", "banana", "cherry"]]

리스트 컴프리헨션을 사용하면 반복문을 사용하는 것보다 훨씬 더 간결하고 효율적인 코드를 작성할 수 있습니다.

 

 

3. 딕셔너리 간편하게 병합하기 (파이썬 3.9 이상)

파이썬 3.9 이상에서는 | 연산자를 사용하여 딕셔너리를 병합할 수 있습니다.

fruit_prices = {"apple": 1000, "banana": 500}
vegetable_prices = {"carrot": 800, "banana": 600}
total_prices = fruit_prices | vegetable_prices
print(total_prices) # 출력: {'apple': 1000, 'banana': 600, 'carrot': 800}

 

추가 설명:

  • | 연산자란?
    • 파이썬 3.9부터 도입된 | 연산자는 두 딕셔너리를 병합하는 새로운 방법입니다.
    • 이 연산자는 두 딕셔너리의 키-값 쌍을 결합하여 새로운 딕셔너리를 생성합니다.
  • 코드 분석:
    • dict1 | dict2는 dict1과 dict2의 내용을 병합합니다.
    • 만약 두 딕셔너리에 동일한 키가 있다면, dict2의 값이 우선됩니다. 위의 예제에서 'b'키의 값은 dict2의 3으로 나타납니다.
    • 결과적으로 merged 딕셔너리는 dict1과 dict2의 모든 키-값 쌍을 포함하게 됩니다.
  • 장점:
    • 코드를 간결하고 가독성 있게 만들어줍니다.
    • 딕셔너리 병합 작업을 더 효율적으로 수행할 수 있습니다.
  • 이전 버전과의 차이:
    • 파이썬 3.9 이전 버전에서는 update() 메서드나 ** 연산자를 사용하여 딕셔너리를 병합해야 했습니다.
    • update()메서드는 기존 딕셔너리 자체를 변경시키고, **연산자는 새로운 딕셔너리를 만드는 방법입니다. |연산자는 새로운 딕셔너리를 생성하는 방법입니다.
  • 활용 예시:
    • 설정 파일들을 병합하여 최종 설정을 생성하는 경우
    • 여러 데이터 소스에서 가져온 데이터를 하나의 딕셔너리로 결합하는 경우

 

4. 인덱스와 값을 얻기 위해 enumerate 사용하기

카운터 변수를 사용하는 대신, enumerate를 사용하여 인덱스와 함께 반복하세요.

fruits = ["apple", "banana", "cherry"] 
for index, fruit in enumerate(fruits): 
	print(index, fruit)

 

추가 설명:

  • enumerate 함수란?
    • enumerate 함수는 반복 가능한 객체(리스트, 튜플 등)를 입력받아 인덱스와 값을 튜플 형태로 반환하는 내장 함수입니다.
    • 반복문 내에서 요소의 인덱스가 필요한 경우, 별도의 카운터 변수 없이 enumerate를 사용하면 코드를 간결하게 만들 수 있습니다.
  • 코드 분석:
    • enumerate(fruits)는 fruits 리스트의 각 요소에 대해 (인덱스, 값) 형태의 튜플을 생성합니다.
    • for index, fruit in enumerate(fruits):는 이 튜플을 언패킹하여 index 변수에 인덱스를, fruit 변수에 값을 할당합니다.
    • print(index, fruit)는 각 요소의 인덱스와 값을 출력합니다.
  • 장점:
    • 코드를 더 간결하고 가독성 있게 만들어줍니다.
    • 인덱스를 추적하기 위해 별도의 카운터 변수를 사용할 필요가 없습니다.
    • 반복문 내에서 인덱스를 사용하는 일반적인 패턴을 단순화합니다.
  • 활용 예시:
    • 리스트의 특정 인덱스에 있는 요소를 수정하거나 접근해야 하는 경우
    • 반복문 내에서 요소의 순서를 추적해야 하는 경우
    • 특정 조건에 맞는 요소의 인덱스를 찾아야 하는 경우
  • 시작 인덱스 변경:
    • enumerate 함수는 시작 인덱스를 변경할 수 있는 선택적인 start 매개변수를 제공합니다.
    • 예를 들어, enumerate(fruits, start=1)을 사용하면 인덱스가 1부터 시작됩니다.

 

5. 여러 리스트를 반복하기 위해 zip() 사용하기

zip()은 여러 리스트를 동시에 반복할 수 있게 해줍니다.

names = ["Alice", "Bob", "Charlie"] 
ages = [25, 30, 35] 
for name, age in zip(names, ages): 
	print(f"{name}은 {age}살입니다.")

 

추가 설명:

  • zip() 함수란?
    • zip() 함수는 여러 개의 반복 가능한 객체(리스트, 튜플 등)를 입력받아 각 객체의 동일한 인덱스에 있는 요소들을 묶어 튜플 형태로 반환하는 내장 함수입니다.
    • 여러 리스트를 동시에 순회하면서 동일한 인덱스의 요소들을 함께 처리해야 할 때 유용하게 사용됩니다.
  • 코드 분석:
    • zip(names, ages)는 names 리스트와 ages 리스트의 각 요소를 짝지어 ("Alice", 25), ("Bob", 30), ("Charlie", 35)와 같은 튜플을 생성합니다.
    • for name, age in zip(names, ages):는 이 튜플을 언패킹하여 name 변수에 이름을, age 변수에 나이를 할당합니다.
    • print(f"{name}은 {age}살입니다.")는 각 이름과 나이를 포맷팅하여 출력합니다.
  • 장점:
    • 여러 리스트를 동시에 반복하는 코드를 간결하고 가독성 있게 만들어줍니다.
    • 동일한 인덱스의 요소들을 함께 처리하는 작업을 효율적으로 수행할 수 있습니다.
  • 주의사항:
    • zip() 함수는 입력받은 반복 가능한 객체 중 가장 짧은 객체의 길이에 맞춰 반복합니다. 즉, 길이가 다른 리스트를 zip()으로 묶으면 짧은 리스트의 길이까지만 반복됩니다.
  • 활용 예시:
    • 두 개의 리스트에서 각각 이름과 점수를 가져와 학생들의 정보를 출력하는 경우
    • 여러 개의 데이터 열을 동시에 처리하여 분석하는 경우
    • 두 개의 리스트에서 각각 키와 값을 가져와 딕셔너리를 생성하는 경우

 

6. 집합을 사용하여 고유한 요소 얻기

리스트를 집합으로 변환하여 중복을 쉽게 제거하세요.

nums = [1, 2, 2, 3, 4, 4, 5] 
unique_nums = list(set(nums)) 
print(unique_nums) # 출력: [1, 2, 3, 4, 5]

 

추가 설명:

  • set이란?
    • set은 파이썬의 내장 자료형 중 하나로, 순서가 없고 중복된 요소를 허용하지 않는 컬렉션입니다.
    • 집합 연산(합집합, 교집합, 차집합 등)을 효율적으로 수행할 수 있습니다.
  • 코드 분석:
    • set(nums)는 nums 리스트를 집합으로 변환합니다. 집합은 중복된 요소를 허용하지 않으므로, 중복된 요소는 자동으로 제거됩니다.
    • list(set(nums))는 집합을 다시 리스트로 변환합니다. 이렇게 하면 중복이 제거된 고유한 요소들로 구성된 리스트를 얻을 수 있습니다.
    • print(unique_nums)는 중복이 제거된 리스트를 출력합니다.
  • 장점:
    • 중복 요소를 제거하는 코드를 매우 간결하게 작성할 수 있습니다.
    • 대량의 데이터에서 중복 요소를 제거하는 작업을 효율적으로 수행할 수 있습니다.
  • 주의사항:
    • 집합은 순서가 없으므로, 원래 리스트의 요소 순서가 유지되지 않습니다. 순서가 중요한 경우에는 다른 방법을 사용해야 합니다.
    • 집합은 해시 가능한(hashable) 요소만 포함할 수 있습니다. 리스트나 딕셔너리처럼 변경 가능한(mutable) 객체는 집합의 요소가 될 수 없습니다.
  • 활용 예시:
    • 데이터 분석에서 중복된 데이터를 제거해야 하는 경우
    • 웹 크롤링에서 중복된 URL을 제거해야 하는 경우
    • 사용자 입력에서 중복된 값을 제거해야 하는 경우

 

7. get()을 사용하여 딕셔너리에서 없는 키 처리하기

딕셔너리에 키가 존재하는지 확인하는 대신, get()을 사용하세요.

my_dict = {"name": "Alice", "age": 25} 
print(my_dict.get("name")) # 출력: Alice 
print(my_dict.get("address", "Not Found")) # 출력: Not Found

 

추가 설명:

  • get() 메서드란?
    • get() 메서드는 딕셔너리에서 특정 키에 해당하는 값을 가져오는 메서드입니다.
    • 만약 키가 딕셔너리에 존재하지 않으면, 기본값을 반환하거나 None을 반환합니다.
  • 코드 분석:
    • my_dict.get("name")은 my_dict 딕셔너리에서 "name" 키에 해당하는 값을 가져옵니다. "name" 키가 존재하므로 "Alice"가 출력됩니다.
    • my_dict.get("address", "Not Found")는 my_dict 딕셔너리에서 "address" 키에 해당하는 값을 가져옵니다. "address" 키가 존재하지 않으므로, 기본값인 "Not Found"가 출력됩니다.
    • get() 메서드의 두 번째 인자는 기본값입니다. 키가 존재하지 않을 때 반환할 값을 지정할 수 있습니다. 두번째 인자를 생략하면 None이 반환됩니다.
  • 장점:
    • 딕셔너리에서 없는 키를 처리하는 코드를 간결하고 가독성 있게 만들어줍니다.
    • KeyError 예외 처리를 위한 추가적인 코드를 작성할 필요가 없습니다.
    • 코드의 안정성을 높여줍니다.
  • in 키워드와의 비교:
    • in 키워드는 딕셔너리에 특정 키가 존재하는지 여부를 확인하는 데 사용됩니다.
    • get() 메서드는 키의 존재 여부를 확인하고 값을 가져오는 작업을 동시에 수행합니다.
    • 만약 키의 존재 여부만 확인하고 싶다면 in 키워드를 사용하고, 키의 값을 가져오고 싶다면 get() 메서드를 사용하는 것이 좋습니다.
  • 활용 예시:
    • 사용자 설정에서 특정 설정 값이 존재하는지 확인하고, 존재하지 않으면 기본 설정을 사용하는 경우
    • API 응답에서 특정 필드가 존재하는지 확인하고, 존재하지 않으면 기본값을 사용하는 경우
    • 데이터 분석에서 특정 열이 존재하는지 확인하고, 존재하지 않으면 기본값을 사용하는 경우

 

8. 한 줄 if-else 문

파이썬은 한 줄로 조건식을 작성할 수 있습니다.

age = 20 status = "Adult" if age >= 18 else "Minor" 
rint(status) # 출력: Adult

 

추가 설명:

  • 삼항 연산자 (Conditional Expression) 이란?
    • 파이썬의 삼항 연산자는 조건에 따라 값을 선택하는 간결한 방법을 제공합니다.
    • value_if_true if condition else value_if_false 형태를 가집니다.
    • condition이 참이면 value_if_true가 반환되고, 거짓이면 value_if_false가 반환됩니다.
  • 코드 분석:
    • age = 20은 age 변수에 20을 할당합니다.
    • status = "Adult" if age >= 18 else "Minor"는 age가 18 이상인지 확인합니다.
    • age가 18 이상이므로 "Adult"가 status 변수에 할당됩니다.
    • print(status)는 status 변수의 값을 출력합니다.
  • 장점:
    • 코드를 간결하게 만들어줍니다.
    • 간단한 조건 분기를 처리하는 데 유용합니다.
    • 가독성을 높여주는 경우가 많습니다.
  • 주의사항:
    • 너무 복잡한 조건은 한 줄로 표현하기 어려울 수 있으며, 오히려 가독성을 떨어뜨릴 수 있습니다.
    • 간단한 조건에만 사용하는 것이 좋습니다.
    • 너무 많은 삼항연산자 중첩은 피해야 합니다.
  • 활용 예시:
    • 변수의 값을 조건에 따라 초기화하는 경우
    • 함수의 반환 값을 조건에 따라 결정하는 경우
    • 출력 메시지를 조건에 따라 다르게 표시하는 경우

 

9. 논리 연산을 위해 any()와 all() 사용하기

이 함수들은 리스트의 조건을 쉽게 확인할 수 있게 해줍니다.

nums = [0, 1, 2, 3] 
print(any(nums)) # 출력: True (하나 이상의 요소가 0이 아니므로) 
print(all(nums)) # 출력: False (리스트에 0이 있으므로)

 

추가 설명:

  • any() 함수란?
    • any() 함수는 반복 가능한 객체(리스트, 튜플 등)의 요소 중 하나라도 참(True)이면 참(True)을 반환하고, 모든 요소가 거짓(False)이면 거짓(False)을 반환합니다.
    • 주로 리스트나 튜플 내에 특정 조건을 만족하는 요소가 하나라도 있는지 확인할 때 사용합니다.
  • all() 함수란?
    • all() 함수는 반복 가능한 객체의 모든 요소가 참(True)이면 참(True)을 반환하고, 하나라도 거짓(False)이면 거짓(False)을 반환합니다.
    • 주로 리스트나 튜플 내의 모든 요소가 특정 조건을 만족하는지 확인할 때 사용합니다.
  • 코드 분석:
    • any(nums)는 nums 리스트의 요소 중 하나라도 0이 아닌 값이 있는지 확인합니다. 0이 아닌 값이 있으므로 True를 반환합니다.
    • all(nums)는 nums 리스트의 모든 요소가 0이 아닌 값인지 확인합니다. 0이 포함되어 있으므로 False를 반환합니다.
    • 파이썬에서 0은 False로, 0이 아닌 모든 숫자는 True로 평가됩니다.
  • 장점:
    • 리스트나 튜플의 조건을 간결하게 확인할 수 있습니다.
    • 코드의 가독성을 높여줍니다.
    • 복잡한 조건 검사를 간단하게 처리할 수 있습니다.
  • 활용 예시:
    • 리스트에 특정 조건을 만족하는 요소가 하나라도 있는지 확인할 때
    • 리스트의 모든 요소가 특정 조건을 만족하는지 확인할 때
    • 데이터 유효성 검사에서 모든 데이터가 특정 조건을 만족하는지 확인할 때
    • 특정 조건의 만족을 빠르게 판단할 때

 

10. 문자열 포맷팅을 위해 f-문자열 사용하기

f-문자열은 문자열을 포맷팅하는 더 깔끔한 방법을 제공합니다 (파이썬 3.6 이상).

name = "Alice" age = 25 print(f"제 이름은 {name}이고 {age}살입니다.")

 

추가 설명:

  • f-문자열(f-strings)이란?
    • f-문자열은 파이썬 3.6부터 도입된 문자열 포맷팅 방법으로, 문자열 리터럴 앞에 f 또는 F를 붙여 사용합니다.
    • 문자열 내에 중괄호 {}를 사용하여 변수나 표현식을 직접 삽입할 수 있습니다.
    • 가독성이 뛰어나고 다른 문자열 포맷팅 방식보다 간결하게 코드를 작성할 수 있습니다.
  • 코드 분석:
    • name = "Alice"와 age = 25는 각각 name과 age 변수에 값을 할당합니다.
    • f"제 이름은 {name}이고 {age}살입니다."는 f-문자열을 사용하여 문자열을 생성합니다.
    • {name}과 {age}는 각각 name과 age 변수의 값으로 대체됩니다.
    • print() 함수는 생성된 문자열을 출력합니다.
  • 장점:
    • 코드를 간결하고 가독성 있게 만들어줍니다.
    • 변수나 표현식을 문자열에 직접 삽입할 수 있어 편리합니다.
    • 다른 문자열 포맷팅 방식보다 성능이 좋습니다.
    • 중괄호 안에 다양한 파이썬 표현식을 넣을수 있습니다.
  • 활용 예시:
    • 변수의 값을 문자열에 삽입하여 출력하는 경우
    • 복잡한 문자열 포맷팅을 수행하는 경우
    • 디버깅 메시지를 생성하는 경우
    • 계산 결과 값을 문자열에 포함해서 출력하는 경우
  • 기타 기능:
    • 포맷 지정자 사용: f"{value:.2f}" (소수점 두 자리까지 표시)
    • 변수 이름과 값 함께 표시: f"{name=}" (파이썬 3.8 이상)
728x90
반응형