1. list Comprehension
리스트 컴프리헨션이란, 리스트를 생성하는 간결하고 간편한 방법 중 하나입니다. 리스트 컴프리헨션은 for 반복문을 사용하여 리스트를 생성하는 방법입니다.
리스트 컴프리헨션은 다음과 같은 형식으로 작성됩니다.
1차원 list
[expression for element in iterable if condition]
위 형식에서 expression은 반복문에서 각 원소에 대해 수행할 연산이며, element는 반복문에서 현재 처리 중인 각 원소를 가리킵니다. iterable은 반복 가능한 객체(리스트, 튜플, 문자열 등)이며, condition은 필터링 조건입니다. condition은 생략 가능합니다.
예를 들어, 0부터 9까지의 정수 중에서 짝수만을 리스트로 생성하려면 다음과 같이 리스트 컴프리헨션을 사용할 수 있습니다.
even_numbers = [num for num in range(10) if num % 2 == 0]
print(even_numbers) # [0, 2, 4, 6, 8]
위 코드에서 num은 현재 처리 중인 정수를 가리키며, num % 2 == 0은 짝수인지를 검사하는 필터링 조건입니다.
리스트 컴프리헨션은 중첩해서 사용할 수도 있습니다. 예를 들어, 0부터 9까지의 정수 중에서 각 정수의 제곱을 저장한 리스트를 생성하려면 다음과 같이 중첩된 리스트 컴프리헨션을 사용할 수 있습니다.
삼항 조건 연산자를 리스트 컴프리헨션과 함께 사용하면, 조건문에 따라 리스트의 각 요소를 다르게 생성할 수 있습니다. 다음은 삼항 조건 리스트 컴프리헨션의 예시입니다.
numbers = [1, 2, 3, 4, 5]
even_or_odd = ["even" if num % 2 == 0 else "odd" for num in numbers]
print(even_or_odd)
# ['odd', 'even', 'odd', 'even', 'odd']
위 코드에서, even_or_odd 리스트는 numbers 리스트의 각 요소가 짝수인지 홀수인지에 따라 다르게 생성됩니다.
조건문 num % 2 == 0이 참이면 "even"이 반환되고, 거짓이면 "odd"가 반환됩니다.
리스트 컴프리헨션은 numbers 리스트의 각 요소에 대해 이 조건문을 반복적으로 수행하여 even_or_odd 리스트를 생성합니다.
결과적으로 even_or_odd 리스트는 ['odd', 'even', 'odd', 'even', 'odd']와 같은 값이 됩니다.
2차원 list
2차원 리스트 컴프리헨션은 리스트 안에 또 다른 리스트를 포함한 2차원 리스트를 생성하는 방법입니다. 2차원 리스트 컴프리헨션은 다음과 같은 형식으로 작성됩니다.
[[expression for element2 in iterable2] for element1 in iterable1]
위 형식에서 expression은 2차원 리스트의 각 요소에 대해 수행할 연산이며, iterable1과 iterable2는 각각 외부 및 내부 반복문의 반복 대상이 되는 반복 가능한 객체입니다. element1과 element2는 각각 외부 및 내부 반복문에서 현재 처리 중인 원소를 가리킵니다.
예를 들어, 0부터 9까지의 정수 중에서 0부터 현재 정수까지의 값으로 이루어진 2차원 리스트를 생성하려면 다음과 같이 2차원 리스트 컴프리헨션을 사용할 수 있습니다.
two_dim_list = [[num2 for num2 in range(num1+1)] for num1 in range(10)]
print(two_dim_list)
# [
[0],
[0, 1],
[0, 1, 2],
[0, 1, 2, 3],
[0, 1, 2, 3, 4],
[0, 1, 2, 3, 4, 5],
[0, 1, 2, 3, 4, 5, 6],
[0, 1, 2, 3, 4, 5, 6, 7],
[0, 1, 2, 3, 4, 5, 6, 7, 8],
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]]
위 코드에서 첫 번째 리스트 컴프리헨션은 현재 반복 중인 정수(num1)까지의 0부터의 정수들을 리스트로 생성하며, 두 번째 리스트 컴프리헨션은 외부 리스트에 삽입될 내부 리스트를 생성합니다. 따라서 위 코드는 0부터 9까지의 정수 중에서 0부터 현재 정수까지의 값으로 이루어진 2차원 리스트를 생성합니다.
zip
- 두개의 list의 값을 병렬적으로 추출함.
>>> alist = ['a1','a2','a3']
>>> blist = ['b1','b2','b3']
>>> for a, b in zip(alist, blist):
... print(a,b)
...
a1 b1
a2 b2
a3 b3
iterable object
Python에서 iterable object(반복 가능한 객체)란, for 루프에서 사용할 수 있는 객체를 말한다. 즉, 요소들이 하나씩 차례대로 나열되어 있는 객체를 의미한다.
Python에서는 다양한 iterable object가 있다. 대표적으로는 리스트(list), 튜플(tuple), 문자열(str), 딕셔너리(dictionary), 집합(set), range 등이 있다
- 내부적 구현으로__iter__와 __next__가 사용된다.
- iter(), next() 함수로 iterable객체를 iterator object로 사용
generator
Python에서 generator(제너레이터)란, iterable object를 생성하는 함수입니다. 일반적인 함수는 값을 반환하고 종료되지만, generator 함수는 yield 키워드를 사용하여 값을 반환하고, 함수의 실행 상태를 기억한 채로 일시 중단되고, 다음에 호출되면 일시 중단된 지점부터 다시 실행됩니다. 이러한 방식으로 generator는 매우 큰 데이터 집합을 처리하면서도 매우 적은 메모리를 사용할 수 있습니다.
Python에서는 generator를 만들기 위해 함수 내에 yield 문을 사용하여 만듭니다. 예를 들어, 다음과 같은 generator 함수를 만들 수 있습니다.
def my_generator():
yield 1
yield 2
yield 3
이제 이 generator 함수는 다음과 같이 호출하여 iterable object를 생성합니다.
gen = my_generator()
이제 gen은 iterable object가 되며, 다음과 같이 for 루프와 같은 반복 구조에서 사용할 수 있습니다.
for value in gen:
print(value)
결과는 다음과 같습니다.
1
2
3
generator Comprehension
Python에서 generator comprehension(제너레이터 컴프리헨션)은 리스트 컴프리헨션과 유사한 문법을 사용하여 generator를 생성하는 방법입니다. 리스트 컴프리헨션은 리스트를 생성하는 방법이고, generator comprehension은 generator를 생성하는 방법입니다.
generator comprehension은 다음과 같은 문법을 사용합니다.
여기서 iterable은 for 루프에서 사용할 수 있는 iterable object입니다. 이 문법을 사용하여 generator를 생성할 수 있습니다. 예를 들어, 다음과 같은 generator comprehension을 사용하여 0부터 9까지의 수 중에서 짝수만 출력하는 generator를 생성할 수 있습니다.
even_numbers = (x for x in range(10) if x % 2 == 0)
이제 even_numbers는 generator가 되며, 다음과 같은 반복 구조에서 사용할 수 있습니다.
for number in even_numbers:
print(number)
결과는 다음과 같습니다.
0
2
4
6
8
generator comprehension은 리스트 컴프리헨션과 비슷한 문법을 사용하여 쉽게 generator를 생성할 수 있으며, 메모리 효율성이 좋은 generator를 생성할 수 있습니다.
Python에서 키워드 인자(Keyword Argument)란, 함수를 호출할 때 인자의 이름을 명시하여 전달하는 방식입니다. 즉, 함수를 호출할 때 인자의 순서를 지키지 않고 인자의 이름과 값을 함께 전달할 수 있는 방식입니다.
키워드 인자를 사용하면, 함수를 호출할 때 인자의 순서를 기억하지 않아도 되므로 코드를 더욱 가독성 있게 작성할 수 있습니다.
def print_info(name, age, city):
print(f"{name} is {age} years old and lives in {city}")
# 키워드 인자를 사용하여 함수 호출
print_info(name="John", age=30, city="New York")
print_info(age=25, city="London", name="Sarah")
함수를 정의할 때 키워드 인자의 디폴트 값을 설정할 수 있습니다. 디폴트 값을 설정한 인자는 함수를 호출할 때 값을 전달하지 않으면 기본값을 갖습니다.
아래는 키워드 인자의 디폴트 값을 설정한 함수의 예시입니다.
def print_info(name, age, city="Seoul"):
print(f"{name} is {age} years old and lives in {city}")
# 키워드 인자를 사용하여 함수 호출
print_info(name="John", age=30, city="New York")
print_info(age=25, name="Sarah")
위 예시에서는 print_info 함수를 정의할 때 인자 city의 디폴트 값을 "Seoul"로 설정하였습니다. 함수를 호출할 때 city 인자에 값을 전달하지 않으면 "Seoul"이 기본값으로 사용됩니다. 함수를 호출할 때 city 인자에 값을 전달하면 전달한 값이 기본값 대신 사용됩니다.
Python에서 가변인자는 함수를 호출할 때, 인자의 개수를 가변적으로 받을 수 있는 매개변수입니다. 가변인자는 *args와 **kwargs 두 가지 형태가 있습니다.
*args는 함수 호출 시, 여러 개의 인자를 하나의 튜플(tuple)로 묶어서 받을 수 있습니다. 예를 들어, 다음과 같은 함수를 만들 수 있습니다.
def my_function(*args):
for arg in args:
print(arg)
이제 my_function 함수는 인자의 개수가 가변적으로 받을 수 있습니다. 다음과 같이 함수를 호출할 수 있습니다.
my_function(1, 2, 3)
my_function('a', 'b', 'c', 'd')
이러한 호출은 다음과 같은 결과를 출력합니다.
1
2
3
a
b
c
d
**kwargs는 함수 호출 시, 여러 개의 인자를 하나의 딕셔너리(dictionary)로 묶어서 받을 수 있습니다. **kwargs는 인자 이름과 값을 쌍으로 받아서 딕셔너리로 묶습니다. 예를 들어, 다음과 같은 함수를 만들 수 있습니다.
def my_function(**kwargs):
for key, value in kwargs.items():
print(key, value)
이제 my_function 함수는 인자의 개수가 가변적으로 받을 수 있습니다. 다음과 같이 함수를 호출할 수 있습니다.
my_function(a=1, b=2, c=3)
my_function(name='John', age=30, city='New York')
이러한 호출은 다음과 같은 결과를 출력합니다.
a 1
b 2
c 3
name John
age 30
city New York
asterisk - unpacking a container
리스트, 튜플, 문자열 언패킹(unpacking): 리스트, 튜플, 문자열 등에서 값을 추출하여 변수에 할당하는 것을 말합니다. 이때 asterisk(*)를 사용합니다.
# 리스트 언패킹
my_list = [1, 2, 3, 4, 5]
a, b, *c = my_list
print(a) # 출력: 1
print(b) # 출력: 2
print(c) # 출력: [3, 4, 5]
# 튜플 언패킹
my_tuple = (1, 2, 3, 4, 5)
a, *b, c = my_tuple
print(a) # 출력: 1
print(b) # 출력: [2, 3, 4]
print(c) # 출력: 5
# 문자열 언패킹
my_string = 'Hello, World!'
a, *b, c = my_string
print(a) # 출력: H
print(b) # 출력: ['e', 'l', 'l', 'o', ',', ' ', 'W', 'o', 'r', 'l', 'd']
print(c) # 출력: !
>>> data = ([1,2],[3,4],[5,6])
>>> print(*data)
[1, 2] [3, 4] [5, 6]
일일히 unpacking 할 필요 없음.
a, b, c = data
'언어 공부 > Python' 카테고리의 다른 글
모듈, 패키지, 프로젝트 (0) | 2023.03.07 |
---|---|
파이썬에서의 객체 지향 프로그래밍 (0) | 2023.03.06 |
문자열과 함수 심화 개념 (0) | 2023.03.06 |
조건, 반복문 (0) | 2023.03.06 |
Function & Console I/O (0) | 2023.03.04 |