글쓰는 개발자

파이썬 기초문법 8 - list comprehension, generator expression, all, any, set 본문

Development/Python

파이썬 기초문법 8 - list comprehension, generator expression, all, any, set

세가사 2021. 2. 15. 03:24
반응형
def printall(*args):
	print(args)

printall(1, 2.0, '3') # (1, 2.0, '3')

1. 조건식

조건문은 두 가지 상황중 하나가 사용될 때 사용된다. 그런데 두가지 값중 하나를 사용할 때는 조건식을 사용할 수 있다.

if x > 0:
	y = math.log(x)
else:
	y = float(x)

 

위와 같이 x가 0보다 크면 log를 취하고 x가 0보다 작으면 float값을 가지는 조건문을 다음과 같은 조건식으로 나타낼 수 있다.

y = math.log(x) if x > 0 else float(x)

 

2. list comprehension

리스트에 모든 값을 돌면서 같은 처리를 해주고 싶을 때 리스트 컴프리헨션을 사용한다. 예를들어 여러개의 과일 목록을 담은 리스트를 capitalize하고 싶으면 다음과 같은 문법을 사용한다.

t = ['apple', 'banana', 'tomato']
print([s.capitalize() for s in t])

 

3. generator expression

generator expression은 comprehension과 비슷하지만 [] 대신 ()를 사용한다. generator expression은 list comprehension과는 다르게 결과를 한번에 생성하지 않고 next 내장함수를 사용해 하나씩 값을 생성한다.

g = (x*2 for x in range(4))
next(g) # 0
next(g) # 2
next(g) # 4
next(g) # 6

 

또한 for문을 사용해서 자동으로 값을 출력할 수도 있다.

g = (x*2 for x in range(4))
for val in g:
    print(val)
'''
0
2
4
6
'''

 

4. any와 all

파이썬에서 bool 값들의 시퀀스를 받아서 그 중 하나라도 True이면 True를 모두 False이면 False를 반환하는 any 내장함수가 있다. 이와 반대로 all은 시퀀스 값중에 하나라도 False가 존재하면 False를 반환하고 모두 True면 True를 반환한다.

any([True, False, False]) # True
any([False, False, False]) # False
all([True, True, True]) # True
all([True, False, False]) # False

 

5. set

list에서 중복을 제거하고 싶을 때 유일한 목록으로 된 set을 사용하면 유용하다. 

t = ['apple', 'banana', 'tomato', 'apple', 'banana']
print(set(t)) # {'banana', 'tomato', 'apple'}
print(len(set(t))) # 3

 

6. Counter

리스트의 개수를 간단히 세고 싶으면 Counter 함수를 사용할 수 있다. Counter함수로 만들어진 Counter 객체는 dict처럼 키값을 사용해 값을 출력할 수 있다.

from collections import Counter
t = ['apple', 'banana', 'tomato', 'apple', 'banana']
c = Counter(t)
print(c) # Counter({'apple': 2, 'banana': 2, 'tomato': 1})
print(c['apple']) # 2

 

7. 인수를 *을 통해 튜플로 모아 처리하는 방법은 아래와 같다.

def printall(*args):
	print(args)

printall(1, 2.0, '3') # (1, 2.0, '3')

 

하지만 * 연산자는 키워드 인수를 모으지 않는다.

printall(1, 2.0, third='3') # TypeError: printall() got an unexpected keyword argument 'third'

 

키워드 인수를 모으려면 ** 연산자를 사용해야 한다.

def printall(*args, **kwargs):
	print(args, kwargs)

printall(1, 2.0, third='3') #(1, 2.0) {'third': '3'}

 

** 연산자를 사용하면 다음과 같이 dict를 사용해 class객체에 값을 쉽게 전달가능하다

class Point:
    def __init__(self, x=0, y=0):
        self.x = x
        self.y = y

    def __str__(self):
        return '({}, {})'.format(self.x, self.y)

d = dict(x=1, y=2)
p = Point(**d)
print(p) # (1, 2)
반응형