Study

[혼자 공부하는 파이썬] Chapter04 반복문 - 4.문자열, 리스트, 딕셔너리와 관련된 기본 함수

이웃비 2021. 4. 7. 01:36

 

리스트 뒤집기: reversed()

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

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

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

'''
첫 번째 반복문: 6
첫 번째 반복문: 5
첫 번째 반복문: 4
첫 번째 반복문: 3
첫 번째 반복문: 2
첫 번째 반복문: 1
'''

이렇게 하면 두 번째 반복문은 출력되지 않는다. 이는 reversed() 함수의 결과가 제너레이터이기 떄문이다. 두번째 반복문도 나오게 하고 싶다면 다음과 같이 for구문 내부에 reversed() 함수를 곧바로 넣어서 사용한다

numbers = [1, 2, 3, 4, 5, 6]

for i in reversed(numbers): # 필요한 시점에 reversed() 함수를 사용한다
    print("첫 번째 반복문: {}".format(i))

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

'''
첫 번째 반복문: 6
첫 번째 반복문: 5
첫 번째 반복문: 4
첫 번째 반복문: 3
첫 번째 반복문: 2
첫 번째 반복문: 1
두 번째 반복문: 6
두 번째 반복문: 5
두 번째 반복문: 4
두 번째 반복문: 3
두 번째 반복문: 2
두 번째 반복문: 1
'''

 

** 확장 슬라이싱

numbers = [1, 2, 3, 4, 5, 6]

print(numbers) # [1, 2, 3, 4, 5, 6]

print(numbers[::-1]) # [6, 5, 4, 3, 2, 1]

-> [::-1]은 비파괴적 코드이므로 numbers에는 영향이 없다. 

 

현재 인덱스가 몇 번째인지 확인하기: enumerate()

## enumerate() 함수와 리스트

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

# 단순 출력
print(example_list) # ['요소A', '요소B', '요소C']
print()

# enumerate() 함수를 적용
print(enumerate(example_list)) # <enumerate object at 0x0000026F588F9780>
print()

# list() 함수로 강제 변환
print(list(enumerate(example_list))) # [(0, '요소A'), (1, '요소B'), (2, '요소C')]
print()

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

'''
0번째 요소는 요소A입니다.
1번째 요소는 요소B입니다.
2번째 요소는 요소C입니다.
'''

 

딕셔너리로 쉽게 반복문 작성하기: items()

example_dictionary = {
    "키A": "값A",
    "키B": "값B",
    "키C": "값C", # 이렇게 끝내도 에러 안나나봄
}

# 딕셔너리의 items() 함수 결과 출력
print(example_dictionary.items()) # dict_items([('키A', '값A'), ('키B', '값B'), ('키C', '값C')])

# for 반복문과 items() 함수 조합해서 사용
for key, element in example_dictionary.items(): # key, element 말고 num, value이런식으로 써도 똑같이 나옴
    print("dictionary[{}] = {}".format(key, element))

'''
dictionary[키A] = 값A
dictionary[키B] = 값B
dictionary[키C] = 값C
'''

 

리스트 안에 for문 사용하기: 리스트 내포

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

# 리스트 안에 for문 사용하기

array = [i * i for i in range(0, 20, 2)]
# range(0, 20, 2)요소를 i라고 할때 i * i 로 리스트를 재조합해 주세요 라는 뜻
print(array) # [0, 4, 16, 36, 64, 100, 144, 196, 256, 324]

 

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

array = ["사과", "자두", "초콜릿", "바나나", "체리"]
output = [fruit for fruit in array if fruit != "초콜릿"]
# array의 요소를 fruit이라고 할 때 초콜릿이 아닌 fruit으로 리스트를 재조합해 주세요

print(output) # ['사과', '자두', '바나나', '체리']

 

 구문 내부에 여러 줄 문자열을 사용했을 떄의 문제점 

## 조건문과 여러 줄 문자열(1)

# 변수를 선언합니다
number = int(input("정수 입력> "))

# if 조건으로 홀수 짝수를 구분합니다.
if number % 2 == 0:
    print("""
    입력한 문자열은 {}입니다.
    {}는(은) 짝수입니다""".format(number, number))

else:
    print("""
    입력한 문자열은 {}입니다.
    {}는(은) 홀수입니다.""".format(number, number))

''' 결과 : 

    입력한 문자열은 10입니다.
    10는(은) 짝수입니다
-> 예상치 못한 들여쓰기가 들어가게 됨
'''
# 변수를 선언합니다
number = int(input("정수 입력> "))

# if 조건문으로 홀수 짝수를 구분합니다
if number % 2 == 0:
    print("""입력한 문자열은 {}입니다.
{}는(은) 짝수입니다""".format(number, number))
else:
    print("""입력한 문자열은 {}입니다.
{}는(은) 홀수입니다.""".format(number, number))

'''
정수 입력> 5 
입력한 문자열은 5입니다.
5는(은) 홀수입니다.
-> 원하는 결과기는 하지만 코드가 보기 이상함
'''

 

해결방안

## 해결방법 1

#괄호로 문자열 연결하기

# 변수 선언
test = (
    "이렇게 입력해도 "
    "하나의 문자열로 연결되어 "
    "생성됩니다"
)

print("test : ", test)
print("type(test) : ", type(test))

'''
결과 : 
test :  이렇게 입력해도 하나의 문자열로 연결되어 생성됩니다
type(test) :  <class 'str'>
'''

## 해결방법 2

# 여러 줄 문자열과 if 구문을 조합했을 떄의 문제 해결(1)

number = int(input("정수 입력> "))

if number % 2 == 0:
    print((
        "입력한 문자열은 {}입니다. \n"
        "{}는(은) 짝수입니다"
    ).format(number, number))
else:
    print((
        "입력한 문자열은 {}입니다. \n"
        "{}는(은) 홀수입니다."
    ).format(number, number))

'''
결과 : 
정수 입력> 3
입력한 문자열은 3입니다. 
3는(은) 홀수입니다.
'''

## 해결발법 3

# 문자열의 join() 함수 사용하기

# join : 문자열.join(문자열로 구성된 리스트)

num = int(input("정수 입력> "))

if num % 2 == 0:
    print("\n".join([
        "입력한 문자열은 {}입니다",
        "{}는(은) 짝수입니다"
    ]).format(num, num))
else:
    print("\n".join([
        "입력한 문자열은 {}입니다",
        "{}는(은) 홀수입니다"
    ]).format(num, num))

'''
결과 : 
정수 입력> 1
입력한 문자열은 1입니다
1는(은) 홀수입니다
'''

 

이터레이터

 

이터러블 :  for 반복자 in 반복할 수 있는 것 -> 이 '반복할 수 있는 것' 이 이터러블

이터레이터 : 이터러블 중에서 next()함수를 적용해 하나하나 꺼낼 수 있는 요소

## reversed() 함수와 이터레이터

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

print("reversed_number : ", r_num)
print(next(r_num))
print(next(r_num))
print(next(r_num))
print(next(r_num))
print(next(r_num))

'''
결과 : 
reversed_number :  <list_reverseiterator object at 0x00000171244FFFD0>
6
5
4
3
2
'''

그냥 r_num을 출력했을때, list_reverseiterator의 주소를 출력한 이유 : reversed()함수의 리턴값이 'reversediterator', 즉 이터레이터이기 때문

왜 이터레이터를 리턴하는가? 1만개의 요소가 들어있는 리스트를 복제한 뒤 뒤집어서 리턴하는 것보다 기존에 있는 리스트를 활용해서 작업하는 것이 훨씬 효율적이기 때문

이터레이터를 꺼내는 방법 : 위처럼 next()함수로 내부의 요소를 하나하나 꺼내면 됨

다른 방법으로 for반복문을 사용하면 됨. for반복문의 매개변수에 넣으면 반복할때마다 next()함수를 사용해서 요소를 하나하나 꺼내줌

 

 

 


출처 : 윤인성혼자 공부하는 파이썬, 한빛미디어, 2021