반복과 제어

이성주 (c) 2015


In [18]:
# 3버전 스타일 print 함수 사용
from __future__ import print_function

for


In [31]:
print([1,2,3])


[1, 2, 3]

In [17]:
for n in [1,2,3]:
    print(n)


1
2
3

들여쓰기는 문법


In [30]:
for n in [1,2,3]:
    print(n)
     print(n)


  File "<ipython-input-30-8cede2355cac>", line 3
    print(n)
    ^
IndentationError: unexpected indent

In [12]:
for key in {'name': '이성주', 'email':'seongjoo@codebasic'}:
    print(key)


name
email

In [20]:
profile = {'name': '이성주', 'email':'seongjoo@codebasic'}
profile.items()


Out[20]:
[('name', '\xec\x9d\xb4\xec\x84\xb1\xec\xa3\xbc'),
 ('email', 'seongjoo@codebasic')]

In [19]:
for key, value in profile.items():
    print(key, value)


name 이성주
email seongjoo@codebasic

In [18]:
for c in 'python':
    print(c, end=':::')


p:::y:::t:::h:::o:::n:::

들여쓰기와 스코프


In [2]:
nums_square = []
for n in [1,2,3,4,5]:
    nums_square.append(n**2)
print(nums_square)


[1, 4, 9, 16, 25]

내장리스트 (list comprehension)

리스트 내에서 반복문 실행


In [ ]:
nums_square = [n**2 for n in [1,2,3,4,5]]
print(nums_square)

숫자 리스트 생성 함수


In [7]:
range(10)


Out[7]:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

In [3]:
# 3 버전
list(range(10))


Out[3]:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

In [8]:
range(2,11)


Out[8]:
[2, 3, 4, 5, 6, 7, 8, 9, 10]

In [9]:
range(1,11,2)


Out[9]:
[1, 3, 5, 7, 9]

특정 횟수 반복


In [5]:
for x in range(3):
    print('참 잘했어요!')


참 잘했어요!
참 잘했어요!
참 잘했어요!

인덱스가 필요한 경우


In [27]:
it = enumerate('abc')
it.next()


Out[27]:
(0, 'a')

In [28]:
it.next()


Out[28]:
(1, 'b')

In [6]:
for i, x in enumerate(range(3)):
    print i+1, '참 잘했어요!'


1 참 잘했어요!
2 참 잘했어요!
3 참 잘했어요!

In [28]:
profile = {'name':'이성주', 'email': 'seongjoo@codebasic.co'}
for k,v in profile.items():
    print(k,v)


name 이성주
email seongjoo@codebasic.co

while


In [20]:
x=1
while x < 3:
    print(x)
    x += 1


1
2

In [14]:
isTrueLove = True
while isTrueLove:
    print("I love you")
    break


I love you

도전과제

포커 카드는 52장이다. 각 카드는 문양(suit)와 숫자(rank)로 이루어진다. 문양은 Diamond, Heart, Spade, Clover 4 종류이고, 숫자는 2, 3, … , 9, 10, J, Q, K, A의 13개의 값이다. 52장의 포커 카드를 생성해 변수 deck에 저장하시오.

예: ‘Diamond 3’, ‘Heart Q’

a. 각 포커 카드의 정보를 문자열 형태로 저장하시오.

b. 각 포커 카드 정보를 리스트 자료 구조로 저장하시오. 예: [‘Diamond’, 3], [‘Heart’, ‘Q’]

c. 한 줄의 구문으로 전체 포커 카드를 생성하시오.

d. 같은 문양은 같은 줄로 출력해 총 네 줄로 전체 카드를 출력하시오.


In [30]:
# 52장 카드 덱 생성
suits = ['Heart', 'Diamond', 'Clover', 'Spade']
ranks = range(2,11)+['J', 'Q', 'K', 'A']
deck = []
for s in suits:
    for r in ranks:
        card = s + str(r)
        deck.append(card)

# 각 문양별로 한 줄씩 출력
previous_suit = ''
for card in deck:
    # 카드의 문양을 뽑는다.
    suit = card[0]
    # 같은 문양이면 같은 줄로 출력
    if suit == 'H':
        suit_collection[0].append(card)
    elif suit == 'D':
        suit_collection[1].append(card)
    elif suit == 'C':
        suit_collection[2].append(card)
    elif suit == 'S':
        suit_collection[3].append(card)
    else:
        print('그런 문양은 없어요!')
    
for suits in suit_collection:
    for card in suits:
        print(card, end=', ')
    print('\n')


Heart2, Heart3, Heart4, Heart5, Heart6, Heart7, Heart8, Heart9, Heart10, HeartJ, HeartQ, HeartK, HeartA, 

Diamond2, Diamond3, Diamond4, Diamond5, Diamond6, Diamond7, Diamond8, Diamond9, Diamond10, DiamondJ, DiamondQ, DiamondK, DiamondA, 

Clover2, Clover3, Clover4, Clover5, Clover6, Clover7, Clover8, Clover9, Clover10, CloverJ, CloverQ, CloverK, CloverA, 

Spade2, Spade3, Spade4, Spade5, Spade6, Spade7, Spade8, Spade9, Spade10, SpadeJ, SpadeQ, SpadeK, SpadeA, 


In [24]:
deck = [[s,r] for s in ['Heart', 'Diamond', 'Spade', 'Clover'] for r in range(2,11)+['J','Q','K', 'A']]
len(deck)


Out[24]:
52

도전과제

6면 주사위는 1부터 6까지의 값을 갖는다. 주사위를 굴릴 때 나온 윗면의 숫자의 누적 합계를 구한다. 누적 합계가 100 이상이 될 때까지 몇 번을 던졌는지를 표시하는 프로그램을 작성한다. [a, b] 구간에서 무작위 숫자를 구하는 구문은 다음과 같다.

import random
# 0 이상 1 이하의 무작위 정수 생성
n = random.randint(0, 1) 

In [42]:
import random
total = 0
count = 0
while total < 100:
    face = random.randint(1,6)
    total += face
    count += 1

print(count)


27

제어


In [15]:
x = 10
if x < 5:
    fruit = 'banana'
else:
    fruit = 'apple'

print(fruit)


apple

In [16]:
hour = 13
greeting = 'Good'
if 5 < hour < 12:
    # 아침인사
    greeting += ' morning'
elif 12 <= hour < 18:
    greeting += ' afternoon'
else:
    greeting += ' night!'

print(greeting)


Good afternoon

In [31]:
if 'a':
    print('hi')


hi

도전과제

3-6-9 게임

1부터 시작해 1씩 숫자가 증가한다. 숫자에 3,6,9가 하나 이상 있으면 숫자 대신 '짝!'을 출력한다.

출력 예시: 1 2 짝! 4 5 짝! 7 8 짝!


In [56]:
# 숫자 생성
N = 20
for n in range(1,N):
    # 숫자에 3 또는 6 또는 9가 있는지 확인
    if '3' in str(n)or '6' in str(n)or '9' in str(n):
        print('짝!', end=' ')
        continue
    print(n, end=' ')


1 2 짝! 4 5 짝! 7 8 짝! 10 11 12 짝! 14 15 짝! 17 18 짝! 

In [48]:
False or 6


Out[48]:
6

도전과제

10 이하의 3 또는 5의 배수는 3, 5, 6, 9이다. 이 숫자들의 합은 23이다. 1000 이하 3 또는 5의 배수의 합을 구하라.


In [ ]:

도전과제

각 학생 정보는 이름, 세 과목의 점수로 이루어진다. 세 명 학생의 정보를 저장한다.

  1. 각 학생의 평균 점수를 구하라.

  2. 각 과목의 평균 점수를 구하라.


In [5]:
float(1/2)


Out[5]:
0.0

In [3]:
3/2


Out[3]:
1

In [10]:
students = [{'name': '이성주', 
             'scores': [75, 85, 92]},
            {'name': '서희정', 
             'scores': [85, 95, 99]}
           ]

# 각 학생의 평균 점수 구하기
for s in students:
    avg = float(sum(s['scores']))/len(s['scores'])
    print(s['name']+ " 평균: " + str(avg))
    
# 각 과목의 평균 점수
subjects = [[],[],[]]
for s in students:
    subjects[0].append(s['scores'][0])
    subjects[1].append(s['scores'][1])
    subjects[2].append(s['scores'][2])
    
print(subjects)
for sub in subjects:
    print(sum(sub)/len(sub))


이성주 평균: 84.0
서희정 평균: 93.0
[[75, 85], [85, 95], [92, 99]]
80
90
95

도전과제

13195를 소수 분해하면, 5, 7, 13, 29이다. 600851475143를 소수분해했을 때 가장 큰 숫자는 무엇인가?


In [ ]:

도전과제

1001, 2002, 3003과 같은 숫자를 회문 숫자 (palindromic number)라고 한다. 두 개의 두 자리 숫자의 곱으로 만들 수 있는 가장 큰 숫자는 9009 = 91 × 99이다.

두 개의 세 자리 숫자의 곱으로 만들 수 있는 가장 큰 회문 숫자를 찾아라.


In [74]:
# 일단 ... 회문 숫자를 검색하는 방법부터 마련해 보자
pn_list = []
for n1 in range(100,1000):
    for n2 in range(100, 1000):
        n = n1*n2
        # Q:회문 숫자인가?
        # A: 유한별
        n_str = str(n)
        if n_str[::-1] == n_str:
            # 회문 숫자면 추가
            pn_list.append(n)

# 추가된 회문 숫자의 최대값
print(max(pn_list))


906609

In [ ]: