프로그래밍/PYTHON

python - Comprehension, Generator expression

aiemag 2021. 2. 11. 23:51
반응형

코드를 간결하게 작성하기 위한 python의 comprehension 문법에 대해 정리합니다.

 

comprehension은 iterable한 개체를 확장하거나 변경하는데 용이합니다.

 


Comprehension, Expression 기본

comprehension은 문법이기 때문에 실제 code를 보면서 이해하면 됩니다.

 

list를 대상으로 comprehension 문법을 적용할 때는 대괄호[]를 이용합니다.

dictionary를 대상으로 comprehension 문법을 적용할 때는 중괄호{}를 이용합니다.

 

generator도 comprehension을 적용하여 만들 수 있는데, 명칭을 generator expression이라고 하며 Expression이라고 하기도 합니다.

list를 대상으로 expression 문법을 적용할 때는 소괄호()를 이용합니다.

 

 

다음은 sample code 입니다.

 

6 line에서 list comprehension 문법을 이용하여 o_list의 내용을 제곱하여 새로운 list를 만듭니다.

 

13 line에서는 dictionary comprehension 문법을 이용하여 o_dic_key 와 o_dic_value 를 이용하여 새로운 c_dic 객체를 만듭니다.

 

21 line에서 list expression 문법을 이용하여 o_list의 내용을 제곱하여 새로운 gnerator를 만듭니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#!/usr/bin/python3
 
def print_comprehension():
    # list comprehension
    o_list = [123]
    c_list = [x*for x in o_list]
 
    print("list comprehension output : ", c_list)
 
    # dic comprehension
    o_dic_key = ["a""b""c"]
    o_dic_value = [123]
    c_dic = {k:v for k, v in zip(o_dic_key, o_dic_value)}
 
    print("dictionary comprehension output : ", c_dic)
 
 
def print_generator_expression():
    # list generator expression
    o_list = [123]
    g_exp = (x*for x in o_list)
 
    print("list generator expression output : ")
    for v in g_exp:
        print(v)
 
 
def main():
    print_comprehension()
    print_generator_expression()
 
 
if __name__ == "__main__":
    main()
cs

 

실행 결과를 보시면 원하는 결과가 나온 것을 확인할 수 있습니다.

 

 


Lazy Evaluation

 

generator expression으로 생성되는 generator는 lazy evaluation으로 동작합니다.

comprehension으로 생성되는 iterator와는 달리 즉, 실제 사용할 때 실행하게 됩니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#!/usr/bin/python3
 
def print_n_return(num):
    print('*')
 
    return num
 
 
def main():
 
    print("list comprehension")
    list_iterator = [print_n_return(x) for x in range(5)]
    for v in list_iterator:
        print(v)
 
 
    print("list generator expression")
    generator_iterator = (print_n_return(x) for x in range(5))
    for v in generator_iterator:
        print(v)
 
 
if __name__ == "__main__":
    main()
cs

실행 결과를 보시면

 

list comprehension의 경우 iterator를 생성하기 위해 data를 모두 memory에 올리기 때문에 '*'이 모두 출력되고 이후 for 문에 의해 data를 출력하게 됩니다.

 

list generator expression의 경우 실제 사용할 때 print_n_return 함수도 같이 실행되기 때문에 '*'과 data 가 나란히 출력됩니다.

 

 


Comprehension + 조건문

 

Comprehension 에서 조건문 처리입니다. 

if문, 삼항연산자 처리가 가능합니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/usr/bin/python3
 
def main():
 
    o_list = [1,2,3,4,5,6]
 
    c_list = [x*for x in o_list]
    print("comprehension list : ",c_list)
    
    c_list = [x for x in o_list if x%2==0]
    print("comprehension list with condition(if x%2==0) : ",c_list)
    
    c_list = [x*10 if x<=3 else x*100 for x in o_list]
    print("comprehension list with ternary operator(x*10 if x<=3 else x*100) : ",c_list)
 
 
if __name__ == "__main__":
    main()
cs

 

실행 결과

 

반응형