본문 바로가기
Programming/Python

11. 문자열, 리스트, 딕셔너리와 관련된 기본 함수

by IT learning 2021. 3. 16.
728x90

오늘은 문자열과 리스트 , 딕셔너리와 관련된 기본 함수를 알아볼 예정이다.

 

이 내용은 파이썬만의 고유한 기능들이라고 할 수 있을 정도로, 다른 언어에서는 보기 힘든 형태의 기능들이다.

그래서 알아두면 좋고, 뭐 이번에 배우고 잊어도 왠만한 코드를 작성하는데 문제가 없다.

그래도 이왕하는거 알아두는게 좋지 않겠는가?

 

리스트에 적용할 수 있는 기본 함수 : min(), max(), sum()

위 3개의 함수는 리스트를 매개변수로 넣어 사용하는 매우 기본적인 함수이다.

# 리스트에 적용할 수 있는 기본 함수 : min(), max(), sum()

numbers = [10,20,2,500,30]

print(min(numbers))    # 최솟값을 찾아 출력
print(max(numbers))    # 최댓값을 찾아 출력
print(sum(numbers))    # 모든 수를 더해 출력

먼저 min() 함수는, 리스트의 존재하는 것들 중에서 최솟값을 찾아 출력해주는 함수이다.

두번째로 max() 함수는, 리스트에서 최댓값을 찾아 출력해주는 함수이다.

마지막으로 sum()함수는, 리스트에 있는 모든 수를 더해 출력해주는 함수이다.

위 코드의 출력결과이다.

 

reversed() 함수로 리스트 뒤집기

리스트에서 요소의 순서를 뒤집고 싶을 때는 reversed() 함수를 사용한다.

# reversed() 함수

# 리스트를 선언하고 뒤집습니다.
list_a = [1,2,3,4,5]
list_reversed = reversed(list_a)

# 출력합니다.
print("# reversed 함수")
print("reversed(list_a) : ", list_reversed)
print("list(reversed(list_a)) : ", list(list_reversed))
print()

# 반복문을 적용합니다.
print("# reversed() 함수와 반복문")
print("for i in reversed(list_a) : ")
for i in reversed(list_a) :
    print("-", i)
    
# 확장 슬라이싱
# 비파괴적 코드이다.
print(list_a[::-1])

먼저 리스트를 선언한 후 reversed()함수로 뒤집는다.

그리고 뒤집은 수를 출력할수 있다.

 

또, 반복문으로 출력하는 코드가 나오게 되는데, 반복문에서의 출력을 애초에 reversed로 설정해놓고 반복문을 돌려도 가능하다. 

 

마지막으로 확장 슬라이싱이라는 코드가 나오게 되는데, reversed()와 같은 결과이지만, 비파괴적 코드로 원 리스트는 변경되어있지 않다.

기본 리스트를 바꾸지 않고 출력할 때 유용할 듯 싶다.

위 코드의 출력결과이다.

중간에 출력이 리스트 형식으로 되어있지 않고, 이상한 코드가 나오는 문장이 있다.

이 문장은 이터레이터인데, 글 뒤쪽에 설명하겠다.

 

그렇다면 이 코드는 어떻게 출력이 될까?

temp = reversed([1,2,3,4,5])

for i in temp :
	print("첫 번째 반복문 : {}".format(i))
    
for i in temp :
	print("두 번째 반복문 : {}".format(i))

이 코드는 첫 번째 반복문 부분만 실행된다.

엥? 왜 그럴까? 아니 같은 temp를 두번 실행한것 뿐인데 말이다.

이는 reversed() 함수의 결과가 제네레이터이기 때문이다. 제네레이터는 파이썬의 특별한 기능이다.

일단은 reversed() 함수와 반복문을 조합할때는 함수의 결과를 여러 번 활용하지 않고 다음과 같이 for 구문 내부에 reversed() 함수를 곧바로 넣어서 사용한다 라고 기억 해주자.

 

enumerate() 함수와 반복문 조합하기

다음과 같은 리스트가 있다고 가정 해보자.

example_list = ["요소A", "요소B","요소C"]

다음과 같은 결과를 출력하고 싶다면, 어떻게 하면 될까?

0번째 요소는 요소A입니다.
1번째 요소는 요소B입니다.
2번째 요소는 요소C입니다.
# enumerate() 함수와 리스트
# 변수를 선언합니다.
example_list = ["요소A", "요소B", "요소C"]

# 그냥 출력
print("# 단순출력")
print(example_list)
print()

# enumerate() 함수를 적용해 출력
print("# enumerate() 함수를 적용해 출력")
print(enumerate(example_list))
print()

# list() 함수로 강제 변환해 출력
print("# list() 함수로 강제 변환해 출력")
print(list(enumerate(example_list)))
print()

# 곧바로 출력되지 않고, 이상한 문구로 나오는 결과를 볼수 있다.
# 이는 이터레이터 때문인데, 추후에 더 자세히 나온다.

# for 반복문과 enumerate() 함수 조합해서 사용하기
print("# for 반복문과 enumerate() 함수 조합해서 사용하기")
for i, value in enumerate(example_list) :
    print("{}번째 요소는 {}입니다.".format(i,value))

코드는 단순출력, 함수 활용하여 출력, 강제변환, for 문 활용 출력이 존재한다.

먼저 단순 출력은, 말 그대로 리스트의 요소를 출력하게 된다.

함수 활용하여 출력은, enumerate() 함수를 사용하여 출력하게 된다. 하지만 이상한 문구만 뜨게 되는데, 이는 아까 reversed() 함수에서 나왔던 이터레이터주소값이 나오게 된다. 이 또한 뒷 글에서 설명한다.

마지막 for반복문을 활용한 출력은, for 문에 enumerate() 함수를 돌리면 된다.

format() 함수로 현 i의 숫자와, value를 출력하면, 우리가 원하는 문장의 출력본이 나오게 된다.

위 코드의 출력결과이다.

딕셔너리의 items() 함수와 반복문 조합하기

딕셔너리는 items() 함수를 사용하면 키와 값을 조합해서 쉽게 반복문을 작성할 수 있다.

# 딕셔너리의 items() 함수와 반복문

example_dic = {
    "키A": "값A",
    "키B": "값B",
    "키C": "값C",
}

# 딕셔너리의 items() 함수 결과
print("# 딕셔너리의 items() 함수 결과")
print("items() : ", example_dic.items())
print()

# for 반복문과 items() 함수 조합해서 사용
print("# for 반복문과 items() 함수 조합해서 사용")

for key, element in example_dic.items() :
    print("dic[{}] = {}".format(key,element))

위 코드를 살펴보자면, 먼저 딕셔너리가 선언되고, 안에 요소들이 추가됐다.

먼저 items() 함수에 아무런 매개변수를 넣지않고 출력하게 되면, 딕셔너리에 존재하는 각 요소들이 다 나오게 된다.

for문과 items()함수를 조합해서 사용하게 될 경우, 아까 enumerate()함수에서 사용했듯이, 각 키의 값들이 하나씩 출력된다.

위 코드의 출력결과이다.

리스트 내포

보통 프로그램을 만들 때, 반복문을 사용해 리스트를 재조합하는 경우가 많다.

예를 들어,

# 반복문을 사용한 리스트 생성
array = []

for i in range(0,20,2) :
    array.append(i * i)
    
print(array)

이러한 코드만 봐도, 새로운 array 리스트에 0부터 20 사이를 2씩 띄어서 나온 수를 제곱하려는 코드도 이렇게 작성이 된다.

 

그런데, 이 코드를 한 줄로 작성할 수 있는 방법은 없는걸까?

# 리스트 안에 for 문 사용하기
array = [i * i for i in range(0,20,2)]
# 파이썬만이 한 줄로 작성이 가능하다.
# 이 구문을 리스트 내포(list comprehensions)라고 부른다.

print(array)

그 방법이 바로 리스트 내포(list comprehensions)이다.

리스트를 선언할때 대괄호 안에 for문과 조건들을 같이 한줄로 넣게 된다.

다음과 같은 형태이다.

리스트 이름  = [표현식 for 반복자 in 반복할 수 있는 것]

for 말고도 if 와 같은 조건문을 넣고도 조합이 가능하다.

# 조건을 활용한 리스트 내포
array = ["사과", "자두", "초콜릿", "바나나", "체리"]
output = [fruit for fruit in array if fruit != "초콜릿"]
# 리스트 이름 = [ 표현식 for 반복자 in 반복할 수 있는 것 if 조건문 ]
print(output)

위 코드의 조건을 살펴보면, "array 리스트 안을 돌며, 초콜릿 이라는 리스트 요소 빼고 output에 저장시켜주세요"라는 조건이다.

따라서 실행을 하면 초콜릿을 뺀 모든 요소가 output에 저장된다.

위 코드의 출력결과이다.

이터레이터

for 반복자 in 반복할 수 있는 것

반복자의 구문은 다음과 같다.

여기서 반복할 수 있는 것은 프로그래밍 용어로 이터러블이라고 한다.

즉, 이터러블은 내부에 있는 요소들을 차례차례 꺼낼 수 있는 객체를 의미한다.

리스트, 딕셔너리, 문자열 튜플 등은 모든 내부에서 요소를 차례차례 꺼낼 수 있으므로 이터러블이다.

 

이터러블 중에서 next() 함수를 적용해 하나하나 꺼낼 수 있는 요소를 이터레이터라고 하는데, 이터레이터의 예시 코드를 보겠다.

numbers = [1,2,3,4,5,6]
r_num = reversed(numbers)

print("reversed_numbers = ", r_num)
print(next(r_num))
print(next(r_num))
print(next(r_num))
print(next(r_num))
print(next(r_num))
print(next(r_num))

위에서 reversed() 함수를 사용했을때 주소가 나오던걸 기억하는가?

reversed() 함수의 리턴값이 바로 이터레이터였기 때문이었다. 한마디로 주소가 리턴됐다라는 뜻이다.

그러면 그 주소를 이용해 놀아봐야하지 않겠는가?

이와같은 이터레이터는 반복문의 매개변수로 전달할 수 있으며, 위와 같은 코드처럼 next() 함수로 내부의 요소를 하나하나 꺼낼 수 있다.

 

근데, 왜 이걸 굳이 배워야 하는걸까? 그냥 다 뒤집어서 for문 돌려 출력하면 되는거잖아?

라고할수 있겠지만..

 

그렇게 되면, 만약에 100만개의 요소가 들어있는 리스트도 싹 다 뒤집어서 일일이 출력하는게 맞을까? 아니면 위와 같이 주소만 알고 뒤집어서 주소로 출력하는게 더 이득일까? 메모리적인 요소로 따졌을때 주소로 지목하여 출력하는게 훠어어어어어얼씬 이득이다.

 

정리
enumerate() 함수
는 리스트를 매개변수로 넣을 경우 인덱스와 값을 쌍으로 사용해 반복문을 돌릴 수 있게 해주는 함수이다.
items() 함수는 키와 쌍으로 사용해 반복문을 돌릴 수 있게 해주는 딕셔너리 함수이다.
리스트 내포는 반복문과 조건문을 대괄호[] 안에 넣는 형태를 사용해서 리스트를 생성하는 파이썬의 특수한 구문이다.
728x90

'Programming > Python' 카테고리의 다른 글

13. 파이썬 - 함수의 활용  (0) 2021.03.19
12. 함수 만들기  (0) 2021.03.18
10. 반복문과 while 반복문  (0) 2021.03.14
9. 딕셔너리와 반복문  (0) 2021.03.12
8. 리스트와 반복문  (0) 2021.03.12

댓글

IT_learning's Commit