반복문: while과 for문

반복문: while

숫자 1에서 5까지 실행하는 간단한 반복문을 구현해보자.

풀이

i = 1

while(i<6):
    print(i)
    i = i+1

출력

1
2
3
4
5

중단하기: break

다음 예제는 input()함수로 키보드에서 한 라인을 읽은 후 첫 번째 문자를 대문자로 출력한다. 그리고 문자 q를 읿력하면 반복문을 종료한다.

while True:
    stuff = input("String to capitalize [type q to quit]: ")
    if stuff == "q":
        break
    print(stuff.capitalize())

출력

String to capitalize [type q to quit]: test
Test
String to capitalize [type q to quit]: hey, it works Hey, it works
Hey, it works hey, it works
String to capitalize [type q to quit]: q

건너뛰기: continue

  • 반복문을 중단하고 싶지 않지만 여러 이유로 건너뛰어야 할 때 사용. 인위적으로 건너뛰는 예제를 한 번 살펴보자.

정수가 홀수일 때는 그 수의 제곱을 출력하고, 짝수일 때는 다음 반복으로 건너뛴다. 이전과 같이 q를 입력하면 반복문을 종료한다.

코드

while True:
    value = input("Integer, please [q to quit]: ")
    if value == 'q':   # 종료
        break
    number = int(value)
    if number % 2 == 0:   # 짝수
        continue
    print(number, "squared is", number*number)

출력
Integer, please [q to quit]: 1
1 squared is 1
Integer, please [q to quit]: 5
5 squared is 25
Integer, please [q to quit]: 7
7 squared is 49
Integer, please [q to quit]: 4
Integer, please [q to quit]: 3
3 squared is 9
Integer, please [q to quit]: 2
Integer, please [q to quit]: q

break 확인 후 else 확인

예제를 통해 확인

코드

numbers = [1, 3, 5]
position = 0
while position < len(numbers):
    number = numbers[position]
    if number % 2 == 0:
        print('Find even number', number)
        break
    position += 1
else: # break 문이 호출되지 않은 경우
    print('No even number found')

출력
No even number found

순회하기: for와 in

while문으로 문자열에 있는 문자를 다음과 같은 방법으로 차례로 출력 가능

word = 'thud'
offset = 0
while offset < len(word):
    print(word[offset])
    offset += 1

좀 더 파이써닉한 방법은 다음 코드.

word = 'thud'
for letter in word:
    print(letter)

두 코드 다 출력은 다음과 같다

t
h
u
d

숫자 시퀀스 생성하기: range()

range()함수는 range(start,stop,step)형식 사용. 슬라이스와 사용법이 브슷. start를 생략하면 범위는 0에서 시작. stop은 꼭 입력해야함. 슬라이스와 마찬가지로 범위의 끝은 stop의 바로 직전 값. step의 기본값은 1. step 값을 -1로 지정하면 끝에서부터 거꾸로 진행 가능.

  1. range()로 리스트 [0, 1, 2]만들기.
  2. 거꾸로 진행하는 2에서 0의 리스트 만들기.
  3. 0에서 10까지 2씩 진행하는 짝수 리스트 만들기.
  4. 0에서 10까지 홀수 리스트 만들기.

연습 문제

  1. for문으로 리스트[3,2,1,0]를 출력해보자

문제풀이
range를 활용해서 3에서 0까지 거꾸로 읽어나가면 될듯.

리스트와 튜플

리스트

  • 순서를 가지는 객체들의 집합.

  • 시퀀스 자료형으로 시퀀스 연산 가능
    시퀀스 연산: 인덱싱, 슬라이싱, 연결, 반복, len, in, not in

  • 변경 가능(mutable) 자료형. 항목의 추가, 벼경, 삭제 모두 가능

    빨간색 글씨는 잘못된 표기로 인한 error.

항목 변경 및 슬라이스를 이용한 치환

항목의 변경

슬라이스를 이용한 치환

슬라이스를 이용한 삭제와 삽입

슬라이스를 이용한 삭제

슬라이스를 이용한 삽입

리스트의 메서드

함수설명
append(x)리스트의 마지막에 x를 추가
insert(i, x)리스트 인덱스 i 위치에 x를 추가
reverse()리스트를 역순으로 뒤집음
sort()리스트 요소를 순서대로 정렬
remove(i)리스트 인덱스 i에 있는 요소를 제거
extend(l)리스트 마지막에 리스트 l을 추가
index(x)인덱스 내에 x가 있으면 인덱스값을 반환. 없으면 -1
count(x)리스트 내에 x가 몇 개 있는지 그 개수를 반환

리스트를 Stack과 Queue로 사용하기

StackQueue
구조LIFO(Last In First Out)FIFO(First In First Out)
설명마지막으로 저장한 데이터가 처음으로 읽힘처음으로 저장한 데이터가 처음으로 읽힘
메서드push, popenqueue, dequeue
유즈케이스함수 호출 기록을 stack으로 저장, 웹브라우저 방문기록(뒤로가기) 및 실행취소, 미로찾기 알고리즘맛집 예약 및 티케팅 등의 예약 시스템, OS 프로세스 스케쥴링 시스템(priority queue), 프린터 인쇄 대기목록

출처

리스트를 Stack으로 사용하기
리스트의 append와 pop메서드를 이용하여 스택을 구현할 수 있다.

리스트를 Queue로 사용하기
리스트의 append와 po메서드를 이용하여 스택을 구현할 수 있다.

sort 메서드의 활용

sort 메서드의 reverse를 True로 설정하면 역순으로 정렬할 수 있다.

키 값 기반의 사용자 정의 정렬

세트(Set)

  • 순서가 없고 중복이 없는 객체들의 집합(non sequence). {}기호로 정의
    len(), in, not in 정도만 활용 가능

  • 수정이 가능한(mutable) 자료형

  • 수학의 집합을 표현할 때 사용한다.

    세트의 메서드

    메서드설명
    add(X)세트에 x를 추가
    remove(x)세트에 x를 제거. x가 세트에 없으면 오류 발생
    discard(x)세트에 x를 제거. x가 세트에 없으면 무시
    update({set})세트에 여러개의 값을 추가
    clear()세트를 비움

    세트의 교집합, 합집합, 차집합

    연산자메서드
    교집합(set)a & ba.intersection(b)
    합집합(set)a | ba.union(b)
    차집합(set)a - ba.difference(b)
    모집합(bool)a.issuperset(b)
    부분집합(bool)a.issubset(b)

튜플(Tuple)

  • 리스트와 거의 비슷하지만 다름: 시퀀스 자료형
    • 튜플은 ()기호로 생성하며 그 값을 바꿀 수 없다(immutable).
    • 하나의 요소만을 가질 때는 요소 뒤에 컴마(,)를 반드시 붙임.
    • 괄호를 생략해도 튜플로 인식.

Packing과 Unpacking

  • Packing: 나열된 객체를 Tuple로 저장하는 것.
  • Unpacking: 튜플, 리스트 안의 객체를 변수로 할당하는 것.

확장 unpacking

  • Unpacking 시 왼쪽 변수가 부족한 경우, 에러가 발생한다(ValueError).
  • 확장 Unpacking에서는 왼쪽 변수가 적은 경우에도 적용할 수 있다 (*).

사전(dict)

  • 순서를 가지지 않는 객체의 집합

  • key 기반으로 값을 저장하고 참조하는 매핑형 자료형

  • 시퀀스 자료형이 아니므로 len(), in, not in 정도만 가능

    다양한 사전 생성 방법

    사전의 키(key)

  • 사전의 키는 해싱해야 하기 때문에 수정 불가능한 객체여야 한다.
    ex) bool, 수치형(int, float, complex), str, tuple

    • 해싱: 수많은 데이터를 테이블 형식에 대응(mapping)시켜 저장할수 있도록 만든
      데이터 관리 기법. 데이터들을 저장하고 찾을때 hash function을 통해 데이터를 효과적으로 저장하고 가져올 수 있음. 해시 이해를 위한 링크

사전의 메서드

메서드설명
keys()사전내 키 목록을 dict_keys 객체로 반환
values()사전내 값 목록을 dict_values 객체로 반환
items()사전내 키-값 쌍을 튜플로 묶은 dict_items 객체로 반환
get(key, {, default})사전내 key에 대응하는 값을 반환. default를 지정하면 key에 대응하는 값이 없을 때 default를 반환.
del dic[kety]dic 사전 내 key에 대응하는 객체를 삭제
clear()사전을 비움.
  • dict_keys, dict_values, dict_items를 리스트로 사용하려면 list() 함수를 활용
    위의 코드와 이어짐

    사전 순회

    순차 자료형(Sequence) 내장 함수

    range

    range({start = 0}, end, {step = 1})
    start부터 end까지의 순차적 리스트를 step 간격으로 생성
    이어서

    enumerate

  • 순차 자료형에서 현재 아이템의 색인과 함께 처리하고자 할 때 흔히 사용.

연습 문제

  1. 출생년도에 대한 리스트 year_lists를 만들어보자. 출생년도를 첫 번째 요소로 하고 1년씩 증가해 다섯 번째 생일이 되는 해까지의 요소를 넣는다.
    예를 들어, 1980년에 태어났다면 리스트는 years_list = [1980, 1981, 1982, 1983, 1984, 1985]일 것이다.

풀이
아무 숫자를 이용해 리스트를 만들기.

코드

years_list = [1994, 1995, 1996, 1997, 1998]
print(years_list)

출력
[1994, 1995, 1996, 1997, 1998]

  1. years_list의 세 번째 생일은 몇 년도인가? 기억하자. 첫 해는 0살이다(오프셋 0은 출생년도).

풀이
오프셋으로 원하는 항목을 찾는 것. 3번째이지만 오프셋의 처음은 0이니 years_list[2]의 값을 얻으면 될 것.

코드

years_list = [1994, 1995, 1996, 1997, 1998]
print(years_list[2])

출력
1996

  1. years_list 중 가장 나이가 많을 때는 몇 년도인가?

풀이
리스트의 가장 마지막 값을 가져오면 된다.

코드

years_list = [1994, 1995, 1996, 1997, 1998]
print(years_list[4])

출력
1998

  1. "mozzarella","cinderella", "salmonella" 세 문자열을 요소로 갖는 things 리스트를 만들어보자.

코드

things = ["mozzarella", "cinderella", "salmonella"]
print(things)

출력
['mozzarella', 'cinderella', 'salmonella']

  1. things 리스트에서 사람 이름의 첫 글자를 대문자로 바꿔서 출력해보자. 그러면 리스트의 요소가 변경되는가?

풀이
각 요소에 있는 문자를 첫 글자가 대문자인 문자로 바꾸어서 치환.

코드

things = ["mozzarella", "cinderella", "salmonella"]
print(things)

things[0:1] = ["Mozzarella"]
things[1:2] = ["Cinderella"]
things[2:3] = ["Salmonella"]
print(things)

출력
['mozzarella', 'cinderella', 'salmonella']
['Mozzarella', 'Cinderella', 'Salmonella']         # things 리스트의 요소가 변경되었음을 확인 가능.


이 문제는 이렇게 푸는 게 아니라 이전에 배웠던 문자열 메서드를 활용하는 것이었다.
사실 문제를 처음 봤을 때 문제열 메서드가 바로 떠올라서 things.capitalize()를 활용했으나 바로 아래와 같은 에러 코드가 떠서 잘못했구나 싶었다.

Traceback (most recent call last):
  File "<input>", line 1, in <module>
AttributeError: 'list' object has no attribute 'capitalize'

그런데 알고보니 리스트에서 capitalize()를 활용할 때는 리스트형 변수인 things에 []를 사용해 특정 값을 지정하여야 사용이 가능한 것이다!!!!

이것을 활용한 답안은 다음과 같다.

답안

사진을 확인하면 capitalize()를 활용해 첫글자를 대문자로 바꾸었으나 things를 출력해보면 그 안의 리스트는 대문자로 변경이 되지 않음을 확인할 수 있다. 그렇다면 어떻게 해야 리스트의 요소까지 바꿀 수 있을까?

바로 바꾼 값을 다시 things라는 변수에 넣어주는 것이다.

여기서 모든 리스트를 순차적으로 바꾸기 위해서는 반복문인 for문을 이용하면 된다.

위의 사진은 for문을 이용한 출력을 보여주는 것뿐만 아니라 들여쓰기의 중요성도 역시 보여준다. print()의 위치를 잘 살펴보자.

  1. things 리스트의 치즈 요소를 모두 대문자로 바꿔서출력해보자.

코드

things = ["mozzarella", "cinderella", "salmonella"]
things = things[0].upper()
print(things)

출력
MOZZARELLA

  1. things 리스트에 질병 요소가 있다면 제거한 뒤 리스트를 출력해보자.

코드 및 출력


처음에 remove()를 활용하는 게 생각 났는데 things[2].remove()이러한 말도 안되는(...)식으로 내마음대로 작성하여서 error가 발생해 pop()을 활용하는 방도로 방향을 바꾸었다.
찾아보니 remove(), pop() 이외에도 del()을 사용하여 문제 해결할 수 있어, 아래에 해당 메서드를 활용하여 해결한 것을 올려본다.

  1. "Groucho", "Chico", "Harpo" 세 문자열 요소를 갖는 surprise 리스트를 만들어보자.
  2. surprise 리스트의 마지막 요소를 소문자로 변경하고, 단어를 뒤집은 다음에 첫 글자를 대문자로 바꿔보자.

코드 및 출력

  1. 리스트의 컴프리헨션을 이용하여 range(10)에서 짝수 리스트를 만들어보자.

코드 및 출력

  1. 줄넘기 랩 음악을 만들어보자. 일련의 두 줄 리듬을 출력한다. 프로그램의 시작 부분은 다음과 같다.
start1 = ["fee", "fie", "foe"]
rhymes = [
    ("flop", "get a mop"),
    ("fope", "turn the rope"),
    ("fa", "get your ma"),
    ("fudge", "call the judge"),
    ("fat", "pet the cat"),
    ("fog", "walk the dog"),
    ("fun", "say we're done"),    
]
start2 = "Someone better"

rhymes의 각 튜플(첫 번째, 두 번째)에서

첫 번째

  • start1의 각 문자열을 출력한다. 첫 글자를 대문자로 만들고, 각 단어 뒤에 느낌표와 공백을 출력한다.
  • 이어서 rhymes의 첫 번째 문자열의 단어 역시 첫 글자를 대문자로 만들고 느낌표를 출력한다.

두 번째

  • start2와 공백을 출력한다.
  • 두 번째 문자열과 마침표를 출력한다.

위 문제는 아직 제대로 이해하지 못했다. 복습을 통해서 배운 것들을 충분히 제대로 이해하고 다시 문제를 풀어보자!

답안 코드

start1 = ["fee", "fie", "foe"]
rhymes = [
   ("flop", "get a mop"),
   ("fope", "turn the rope"),
   ("fa", "get your ma"),
   ("fudge", "call the judge"),
   ("fat", "pet the cat"),
   ("fog", "walk the dog"),
   ("fun", "say we're done"),
]
start2 = "Someone better"
start1_caps = " ".join([word.capitalize() + "!" for word in start1])
for first, second in rhymes:
   print(f"{start1_caps}{first.capitalize()}!")
   print(f"{start2} {second}.")
profile
개발자로 시작| 공부한 것을 기록합니다.

0개의 댓글