2014년 1월 24일 금요일

로어(Lore) 모음

(Lore) : 출처를 알 수 없는 이야기, 믿기 힘들지만 설득력 있는 이야기, 도시 전설


가끔씩 귀에서 '삐 -' 하는 고음의 소리가 들린다
병원에서 환자들이 죽을 때 듣는 소리와 비슷하다고 한다.
이 소리는 전생에 자기 연인이 죽을 때 난 소리라고 한다.


사람의 몸에있는 뼈의 갯수는 총 206개 라고한다.
그런데 아기의 뼈 갯수는 총 305개라고 한다 .
사람이 성장하면 몸 속의 뼈가 합치거나 사라지면서
206개가 남는다는 뜻이다.


어느 동남아 국가의 이야기
2명의 청년이 오토바이를 타고 달리고 있었다.
그 앞에 철근을 가득 실은 트럭이 가고 있었다.
그 트럭에서 철근이 두 청년을 향해 떨어졌고
그 철근은 두 청년의 가슴을 관통했다.
그들은 그대로 병원으로 옮겨져 철근을 빼고 살아남았다고 한다.
가슴에 수술 자국은 남았지만 그들은 지금까지도 건강하게 살고 있다고 한다.


산에서는 사람의 이름을 함부로 부르면 안된다고 한다 .
6.25전쟁이 끝난 줄 모르고 산에 계속 숨어있던 사람들은
대부분 오인받아 죽었다고 한다.
그 산에 숨어 있던 사람들이 자기 이름을 듣고 은신처에서 나가면 죽창에 찔려 죽었다고 한다.
그래서 산에서 이름을 잘못 부르면 어딘가로 계속 끌려간다고 한다.


사람이 불에 타 죽을 때의 냄새를 맡은 사람은
즉시 심리치료사에게 가야 한다.
그렇지 않으면 사람이 불에 탈 때의 냄새와 비슷한 것
예를 들자면 고기가 타는 냄새 등을 맡을 때마다
미쳐버린다고 한다.


사람이 물에 빠져 죽으면 시체가 썩어 주변의 물이 오염된다.
그리고 그 물은 정화장으로 들어가서 깨끗하게 정화되어 나온다.
그러니까 지금 당신이 마시는 물이나 씻을 때 사용한 물이
누군가 죽어서 썩어가고 있던 물일지도 모른다.


사람이 죽으면 약 30초간 청력이 남아 있어서
이때 '잘 가라' 혹은 '좋은 곳으로 가라' 같은 말을 해주면 좋다고 한다.
하지만 만약 '넌 아직 죽지 않았어' 라고 말한다면 어떻게 될까?


사람의 팔을 자르면 엄청난 고통이 밀려온다.
고통이라는 자극을 뇌로 올려보냈기 때문에 오는 것이다.
하지만 팔을 엄청나게 빠른 속도로 자른다면
자극이 뇌로 올라갈 시간이 없어서 아무렇지도 않다고 한다.


사람이
'자살하고 싶다' 혹은 '죽고싶다'라는 생각을 하게 되는 건
10살 때부터라고 한다.


프랑스 남부 캄브레에는 깨끗한 물이 샘솟는 우물이 있었다.
수량도 풍부해서 마을 사람들은 그것을 오랜 세월 매우 편리하게 사용했다.
1862년, 갑자기 물이 말라 버려서 사람들이 우물 바닥에 내려갔더니
수맥은커녕 물이 흐른 흔적도 보이지 않았다.
다만 돌로 된 바닥이 모습이 드러내고 있었을 뿐이다.
대체 마을 사람들은 그동안 무엇을 마셨던 걸까?


집에 있는 거울은 굉장히 위험한 무기가 될 수 있다.
매일매일 거울을 바라보면서
'당신은 누구십니까?' 하고 불규칙한 간격으로 10번을 물어보라.
그렇게 며칠이 지나면 스스로가 누구인지를 잊어버리게 된다.
일종의 게슈탈트붕괴현상으로, 스스로의 자아가 파괴되어 버리는 것이다.
실제로 나치가 유태인을 대상으로 이런 실험을 했고
결과는 성공적이었다고 한다.


컴퓨터에
'자살해라'라는 문구를 눈에 띄지 않을만큼 빠른 속도로 계속해서 보내게 되면
사람은 5분 안에 무의식적으로 자살하게 된다.
마이크로소프트사는 이걸 이용해 지구 인류의 절반을 없앨 수 있지만
이런 일을 하려면 슈퍼컴퓨터 수백대가 필요하기 때문에 하지 않는다고 한다.


18세기, 오스트리아에서 카뮈라는 여자가 아이를 잉태했지만 상대 남자가 실종되었다.
여자는 남자가 돌아올 때까지 아이를 낳지 않겠다고 결심했다.
그 후 수십년이 지나도 남자는 돌아오지 않았다.
아이를 낳지 않은 그녀의 배는 끝없이 부풀어 올랐다,
끝내 남자는 돌아오지 않았고, 까뮈는 그대로 죽어버렸다.
그리고, 그녀의 배에선 노인의 시체가 나왔다고 한다.


아일랜드에 사는 크리스라는 남자는 자신이 죄수로 나오는 악몽에 시달렸다.
정신과 의사에게 상담도 받았지만, 악몽은 계속 그를 괴롭혔다.
그런데 이 남자는 실제로 조지라는 이름의 죄수였고, 크리스라는 건 꿈속의 그였다.
조지는 감옥에서 생을 마감할 때까지 자신이 크리스라고 믿었다.
당신은 지금, 정말로 깨어있는 겁니까?


마르세유에 있는 한 교회에는 [악마를 가둔 상자]가 있었다고 한다.
상자를 흔들면 덜컹덜컹하고 나무 구슬 같은 게 안에 들어 있는 듯한 소리를 냈다고 한다.
1988년, 미국 TV 방송국 리포터가 거기에 방문했을 때 교회 허가도 받지 않고
자기 마음대로 상자를 열어버린 일이 있다.
하지만 상자 안에는 아무 것도 발견되지 않았다.


미국의 헤비메탈 밴드 머쉬룸헤드의 노래 중 'Kill Tomorrow'라는 노래가 있다.
이 노래의 뮤직비디오는 어느 한 폐가에서 촬영했다고 한다.
그래서인지 뮤직비디오가 시작될 때에 아기의 웃음소리 같은 것이 나는데
이것은 악기로 낸 소리가 아니라고 한다.
아마 그것은 그 곳에 상주하는 '사람이 아닌 어느 것'의 소리가 아닐까?


1922년, 멕시코의 석기시대 유적에서 총탄과 총살된 석기시대 사람의 뼈가 출토되었다.
다음 해, 발견자는 취미로 가지고 있던 석궁에 맞아 숨졌다.
발견한 뼈에 난 구멍과 같이 이마에 화살을 맞았다.
현재, 출토된 석기 시대 사람의 사인은 둔기에 의한 것이라 알려져 있다.


1960년, 미국 노스캐롤라이나 지방에서 한 여성이
외계인에게 납치됐다가 돌아왔다고 주장했다.
그녀의 몸에는 별 이상이 없었다.
이후 그녀는 임신을 하고 파수(양수가 터짐)까지 있었으나
아무 것도 태어나지 않았다.


1902년 9월 3일, 야마가타현의 한 마을에서 사내 아이가 태어났다.
조산부와 그 어머니는, 아이를 보자마자 오른쪽 눈을 붕대로 감싸 숨겼다.
그 남자는 40살이 되어 죽을 때까지 붕대를 풀지 않았다.
결국 그 사람의 오른쪽 눈이 어땠는지 아는 사람은 아무도 없었다.


연인을 살해하고 호수에 버린 남자가 있었다.
그는 차를 타고 집에 가던 중 악취를 맡았다.
악취를 따라가 보니 트렁크 안에 시체가 들어 있었다.
남자는 시체를 다시 호수에 버렸다.
그러자 이번엔 시체가 자택에 가 있었다.
이에 남자는 공포를 느껴 살인을 자백했다.
그런데 호수 관리인에 따르면 남자는 처음 시체를 버린 날에만 호수에 왔다고 한다.
남자는 꿈이라도 꾼 것일까? 그렇지 않으면...

2014년 1월 23일 목요일

20140123 Summer Challenge 1회차 아마추어급 -종합 4위


금메달 한개로 종합4위

하계 올림픽(Summer Challenge) 오프닝


Future Classic Diskman lv.12 One False Step


Future Classic Diskman lv.11 The Warehouse


Future Classic Diskman lv.10 Unmerciful Virus


Future Classic Diskman lv.9 War and No Peace



Future Classic Diskman lv.8 The Big Surprise


Future Classic Diskman lv.7 Mazed Out


Future Classic Diskman lv.6 Court Rooms


Future Classic Diskman lv.5 Double the trouble


Future Classic Diskman lv.4 Praying Mantis


Future Classic Diskman lv.3 Fortuitous Rooms



2014년 1월 20일 월요일

해커스토익 20140120 RC


1. University students constantly ______ to meet an institution's academic standards and as a result, are often under great pressure to compete.

(A)offer (B)exclaim (C)strive (D)cope

institution 기관, 협회, 부처, 학회
academic 학문적인, 학업의, 학구적인, 이론적인, 아카데믹
exclaim 외치다, 감탄하다
strive 노력하다, 애쓰다, 분투하다
cope 코프, -을 코프로 덮다.
constantly 계속, 끊임없이

2. Mobile Phone Works is an aggressive company that wants a larger share of the smartphone market; to be ______, at least 60 percent of it.

(A)precise (B)preciseness (C)precision (D)precisely

aggressive 공격적인, 적극적인, 과감한
 영)having or showing determination and energetic pursuit of your ends
 assume the aggressive 공격을 하다, 싸움을 걸다
precise 정확한, 엄밀한  영)sharply exact or accurate or delimited
 to be precise 엄밀하게 말하면

3. A brochure of the city states that the bicycle trail is located on a gentle ______ and should be easy for even novice riders to negotiate.

(A)slump (B)incline (C)notch (D)channel

brochure 소책자, 안내서, 브로셔
  영)a small book usually having a paper cover
novice 풋내기, 미숙자, 초심자
  영)someone who has entered a religious order but has not taken final vows
negotiate 협상하다, 협의하다, 합의하다, 빠져나가다, 극복하다
  영)discuss the terms of an arrangement
slump 푹 쓰러지다, 쿵 떨어짐, 불황
  영)a noticeable deterioration in performance or quality
incline 경향이 있다, 생각, -하고 싶어지다, 기울다, 유혹
   영)an elevated geological formation
 incline one's ear 호의를 갖고 듣다, 귀를 기울이다.  
notch 벤 자리, 단계, V자형의 새김  영)a V-shaped indentation
 take a person down a notch 남의 콧대를 꺽다.
channel 채널, 경로, 해협, 통로  영)a path over which electrical signals can pass
 channel off 흐름을 바꾸다, 유용하다.


해석---

1. 대학생들은 교육기관의 학업기준을 충족시키기 위해 끊임없이 분투하고 있으며, 그 결과로, 그들은 종종 경쟁하기 위한 극심한 압박을 받고 있다.

동사 어휘 문제
'대학생들은 교육기관의 학업기준을 충족시키기 위해 끊임없이 분투하고 있다'라는 문맥이 되어야 하므로, '분두한다'라는 의미의 동사 strive가 정답이다.
offer 제안하다. exclaim 외치다. cope 대항하다.
academic standard 학업기준 pressure 압박

2. Mobile Phone Works사는 스마트폰 시장에서의 더욱 큰 점유율을 원하는 공격적인 기업이다. 더 정확히 말하자면, 그 시장의 최소 60%이다.

형용사 자리 채우기 문제
be동사 다음에 올 수 있는 것은 형용사 또는 명사이므로 형용사인 A, 명사인 B,C가 정답의 후보이다. ' 더 정확히 말하자면, 그 시장의 최소 60%이다'라는 문맥이 되어야 하므로 '정확한'이라는 뜻의 형용사인 (A)precise가 정답이다.
(B)와 (C)를 쓸 경우, 각각 '더 정확함이라면, 그 시장의 최소 60%이다', '더 정확성이자면, 그 시장의 최소 60%이다'라는 어색한 문맥이 된다. 부사(D)는 형용사 자리에 올 수 없다.

aggressive 공격적인, 적극적인 share 점유율 precision 정확

3. 그 도시의 안내책자에는 자전거 도로가 완만한 경사면에 위치해 있으며 초보 라이더들도 넘어가기 쉬울 것이라고 쓰여 있다.

명사 어휘 문제
'그 도시의 안내 책자에는 자전거 도로가 완만한 경사면에 위치해 있다고 쓰여 있다'라는 문맥이 되어야 하므로, '경사면'이라는 뜻의 명사 (B)incline이 정답이다. 참고로 (A)slump는 '급감, 폭락', (B) notch는 '급수, 표시', (D)channel은 '경로, 수로'의 의미이다.
brochure 안내 책자 trail 도로, 길 gentle 완만한, 부드러움, novice 초보의, negotiate (도로 등의 힘든 부분을) 넘다, 지나다.

파이썬 제어문 - FOR문

파이썬의 특징을 가장 잘 대변해주는 것이 바로 이 for문이다. for문은 매우 유용하고 사용할 때 문장 구조가 한눈에 들어오며 이것을 잘만 쓰면 프로그래밍이 즐겁기까지 하다.

for문의 기본구조

for 문의 기본적인 구조는 다음과 같다.
for 변수 in 리스트(또는 터플, 문자열):
    <수행할 문장1>
    <수행할 문장2>
    ...
리스트의 첫 번째 요소부터 마지막 요소까지 차례로 변수에 대입해서 <수행할 문장1>, <수행할 문장2> 등을 수행한다.

예제를 통해 for 알아보기

for문은 예제를 통해서 보는 것이 가장 알기 쉽다. 예제를 따라해 보도록 하자.
예 1) 전형적인 for문
>>> test_list = ['one', 'two', 'three'] 
>>> for i in test_list: 
...     print(i)
... 
one 
two 
three
['one', 'two', 'three']라는 리스트의 첫 번째 요소인 'one'이 먼저 i변수에 대입된 후 print(i)라는 문장을 수행한다. 다음에 'two'라는 두 번째 요소가 i변수에 대입된 후 print(i)문장을 수행하고 리스트의 마지막 요소까지 이것을 반복한다.
for문의 쓰임새를 알기 위해서 다음을 가정해 보자.
“총 5명의 학생이 시험을 보았는데 시험점수가 60점이 넘으면 합격이고 그렇지 않으면 불합격이다. 합격인지 불합격인지에 대한 결과를 보여준다.”
우선 5명의 학생의 시험성적을 리스트로 표현 해 보았다.
mark = [90, 25, 67, 45, 80]
1번 학생은 90점이고 5번 학생은 80점이다.
이런 점수를 차례로 검사해서 합격했는지 불합격했는지에 대한 통보를 해주는 프로그램을 만들어 보자. 역시 에디터로 만들어 보자.
# marks1.py
marks = [90, 25, 67, 45, 80]

number = 0 
for mark in marks: 
    number = number +1 
    if mark >= 60: 
        print("%d번 학생은 합격입니다." % number)
    else: 
        print("%d번 학생은 불합격입니다." % number)
각각의 학생에게 번호를 붙이기 위해서 number라는 변수를 이용하였다. 점수 리스트인 marks에서 차례로 점수를 꺼내어 mark라는 변수에 대입하고 for안의 문장들을 수행하게 된다. 우선 for문이 한번씩 수행될 때마다 number는 1씩 증가하고 mark가 60이상이면 합격 메시지를 출력하고 60을 넘지 않으면 불합격 메시지를 출력한다.

for와 continue

while문에서 알아보았던 continue가 for문에서도 역시 동일하게 적용이 된다. 즉, for문 안의 문장을 수행하는 도중에 continue문을 만나면 for문의 처음으로 돌아가게 된다.
위의 예제를 그대로 이용해서 60점 이상인 사람에게는 축하 메시지를 보내고 나머지 사람에게는 아무런 메시지도 전하지 않는 프로그램을 만들어 보자.
# marks2.py 
marks = [90, 25, 67, 45, 80]

number = 0 
for mark in marks: 
    number = number +1 
    if mark < 60: continue 
    print("%d번 학생 축하합니다. 합격입니다. " % number)
점수가 60점 이하인 학생일 경우에는 mark < 60이 참이 되어 continue문이 수행된다. 따라서 축하 메시지를 출력하는 부분인 print문을 수행하지 않고 for문의 첫부분으로 돌아가게 된다.

for와 range함수

for문은 range라는 숫자 리스트를 자동으로 만들어 주는 함수와 함께 사용되는 경우가 많다. 다음은 range함수의 간단한 사용법이다.
>>> a = range(10) 
>>> a 
range(0, 10)
위에서 보는 것과 같이 range(10)은 0부터 9까지의 숫자 range객체를 만들어 준다.
시작 번호와 끝 번호를 지정하려면 다음과 같이 해야 한다. 끝 번호는 포함되지 않는다.
>>> a = range(1, 11) 
>>> a 
range(1, 11)
위처럼 시작 숫자를 정해 줄 수도 있다.
for와 range를 이용하면 1부터 10까지 더하는 것을 다음과 같이 쉽게 구현할 수 있다.
예 ) 1부터 10까지의 합
>>> sum = 0 
>>> for i in range(1, 11): 
. . .     sum = sum + i 
. . . 
>>> print(sum)
55
range(1, 11)은 숫자 1부터 11까지의 숫자를 데이터로 갖는 자료형이다. 따라서 위의 예에서 i변수에 리스트의 숫자들이 하나씩 차례로 대입되면서 sum = sum + i라는 문장을 수행하게 되어 sum은 최종적으로 55가 되게 된다.
또한 우리가 앞서 살펴 보았던 60점 이상이면 합격인 예제도 range함수를 이용해서 적용시킬 수도 있다. 다음을 보자.
#marks3.py 
marks = [90, 25, 67, 45, 80]

for number in range(len(marks)): 
    if marks[number] < 60: continue 
    print("%d번 학생 축하합니다. 합격입니다." % (number+1))
len이라는 함수가 처음 나왔는데 len함수는 리스트의 요소 개수를 돌려주는 함수이다. 따라서 위에서 len(marks)는 5가 될것이고 range(len(marks))는 range(5)가 될 것이다. 따라서 number변수에는 차례로 0부터 4까지의 숫자가 대입될 것이고 makrs[number]는 차례대로 90, 25, 67, 45, 80이라는 값을 갖게 될 것이다.

다양한 for문의 사용

>>> a = [(1,2), (3,4), (5,6)] 
>>> for (first, last) in a: 
. . .     print(first + last)
. . . 
3 
7 
11
위의 예는 a리스트의 요소 값이 터플이기 때문에 각각의 요소들이 자동으로 (first, last)라는 변수에 대입되게 된다.
이것은 이미 살펴보았던 터플을 이용한 변수 값 대입방법과 매우 비슷한 경우이다.
>>> (first, last) = (1, 2)

for와 range를 이용한 구구단

for와 range함수를 이용하면 단 4줄만으로 구구단을 출력해 볼 수가 있다.
>>> for i in range(2,10): 
...     for j in range(1, 10): 
...         print(i*j, end=" ") 
...     print('') 
... 
2 4 6 8 10 12 14 16 18 
3 6 9 12 15 18 21 24 27 
4 8 12 16 20 24 28 32 36
5 10 15 20 25 30 35 40 45
6 12 18 24 30 36 42 48 54 
7 14 21 28 35 42 49 56 63 
8 16 24 32 40 48 56 64 72 
9 18 27 36 45 54 63 72 81
위의 예를 보면 for가 두 번 사용되었다. range(2, 10)은 2부터 9까지의 숫자가 차례로 i에 대입된다. i가 처음 2일 때 for 문을 만나게 된다. range(1, 10)은 1부터 10까지의 숫자가 j에 대입되고 그 다음 문장인 print(i*j)를 수행한다. 따라서 i가 2일 때 2*1, 2*2, 2*3, , , ,2*9 까지 차례로 수행되며 그 값을 출력하게 된다. 그 다음에는 i가 3일 때 역시 2일 때와 마찬가지로 수행될 것이고 i가 9일 때까지 계속 반복되게 된다.
위에서 print(i*j, end=" "), 처럼 end 파라미터를 넣어준 이유는 해당 결과값을 출력할 때 다음 줄로 넘어가지 않고 그 줄에 계속해서 출력하기 위한 것이다. 그 다음의 print('')은 2단, 3단, , 등을 구분하기 위해서 두 번째 for문이 끝나면 결과 값을 다음 줄부터 출력하게 해주는 문장이다.
지금껏 우리는 프로그램의 흐름을 제어하는 if, while, for등에 대해서 알아보았다. 독자는 while과 for를 보면서 두 가지가 아주 흡사하다는 느낌을 받았을 것이다. 실제로 for문을 쓰는 부분을 while로 바꿀 수 있는 경우가 많고 while문을 쓴 부분을 for문으로 바꾸어서 사용할 수 있는 경우가 많다.

출처 - 점프 투 파이썬

파이썬 제어문 - WHILE문

반복해서 문장을 수행해야 할 경우 while문을 사용한다.
다음은 while문의 기본 구조이다.
while <조건문>:
    <수행할 문장1>
    <수행할 문장2>
    <수행할 문장3>
    ...
조건문이 참인 동안 while문 아래의 문장들을 계속해서 수행 하게 된다.
“열 번 찍어 안 넘어 가는 나무 없다” 라는 속담을 파이썬에 적용시켜 보면 다음과 같이 될 것이다.
>>> treeHit = 0
>>> while treeHit < 10:
. . .     treeHit = treeHit +1
. . .     print("나무를 %d번 찍었습니다." % treeHit)
. . .     if treeHit == 10:
. . .         print("나무 넘어갑니다.")
. . .
나무를 1번 찍었습니다.
나무를 2번 찍었습니다.
나무를 3번 찍었습니다.
나무를 4번 찍었습니다.
나무를 5번 찍었습니다.
나무를 6번 찍었습니다.
나무를 7번 찍었습니다.
나무를 8번 찍었습니다.
나무를 9번 찍었습니다.
나무를 10번 찍었습니다.
나무 넘어갑니다.
위의 예에서 while문의 조건문은 treeHit < 10 이다. 즉 treeHit가 10보다 작은 동안에 while 문 안의 문장들을 계속 수행하게 된다. whlie문 안의 문장을 보면 제일 먼저 treeHit = treeHit + 1로 treeHit값이 계속 1씩 증가한다. 그리고 나무를 treeHit번 만큼 찍었음을 알리는 문장을 출력하고 treeHit가 10이 되면 “나무 넘어갑니다”라는 문장을 출력하고 treeHit < 10라는 조건문이 거짓이 되어 while문을 빠져 나가게 된다.
여기서 treeHit = treeHit +1은 프로그래밍을 할 때 매우 자주 쓰이는 기법으로 treeHit의 값을 1만큼씩 증가시킬 목적으로 쓰이는 것이다. 이것은 treeHit += 1처럼 쓰기도 한다.

무한루프(Loop)

이번에는 무한루프에 대해서 알아보기로 하자. 무한 루프라 함은 무한히 반복한다는 의미이다. 파이썬에서 무한루프는 while문으로 구현 할 수가 있다. 우리가 사용하는 프로그램들 중에서 이 무한루프의 개념을 사용하지 않는 프로그램은 하나도 없을 정도로 이 무한루프는 자주 사용된다. 다음은 무한루프의 기본적인 형태이다.
while 1:    
    <수행할 문장1>     
    <수행할 문장2>
    ...
while의 조건문이 "1"이므로 조건문은 항상 참이 된다. while은 조건문이 참인 동안에 while에 속해 있는 문장들을 계속해서 수행하므로 위의 예는 무한하게 while문 내의 문장들을 수행할 것이다.
다음의 예를 보자.
>>> while 1:
. . .     print("Ctrl-C를 눌러야 while문을 빠져 나갈 수 있습니다.")
. . .
Ctrl-C를 눌러야 while문을 빠져 나갈 수 있습니다.
Ctrl-C를 눌러야 while문을 빠져 나갈 수 있습니다.
Ctrl-C를 눌러야 while문을 빠져 나갈 수 있습니다.
....
위의 문장이 영원히 출력될 것이다. Ctrl-C를 눌러서 빠져 나가도록 하자. 하지만 위처럼 무한루프를 돌리는 경우는 거의 없을 것이다. 보다 실용적인 예를 들어보자.
다음을 따라해 보도록 하자.
>>> prompt = """
. . . 1. Add
. . . 2. Del
. . . 3. List
. . . 4. Quit
. . .
. . . Enter number: """
>>>
먼저 위와같이 여러줄짜리 문자열을 만든다.
>>> number = 0
>>> while number != 4:
. . .     print(prompt)
. . .     number = int(input())
. . .

1. Add
2. Del
3. List
4. Quit

Enter number:
다음에 number라는 변수에 "0"이라는 값을 먼저 대입한다. 이렇게 하는 이유는 다음에 나올 while문의 조건문이 number != 4인데 number라는 변수를 먼저 설정해 놓지 않으면 number라는 변수가 존재하지 않는다는 에러가 나기 때문이다. while문을 보면 number가 4가 아닌 동안에 prompt를 출력하게 하고 사용자로부터 입력을 받아 들인다. 위의 예는 사용자가 4라는 값을 입력하지 않으면 무한히 prompt를 출력하게 된다. 여기서 number = int(input())은 사용자의 숫자 입력을 받아들이는 것이라고만 알아두자. int나 input함수에 대한 사항은 뒤의 내장함수 부분에서 자세하게 다룰 것이다.

while문 빠져 나가기(break)

while 문은 조건문이 참인 동안 계속해서 while문 안의 내용을 수행하게 된다. 하지만 강제로 while문을 빠져나가고 싶을 때가 생기게 된다.
커피 자판기를 생각해 보자. 커피가 자판기 안에 충분하게 있을 때는 항상 “돈을 받으면 커피를 줘라” 라는 조건문을 가진 while문이 수행된다. 자판기가 제 역할을 하려면 커피의 양을 따로이 검사를 해서 커피가 다 떨어지면 while문을 멈추게 하고 “판매중지”란 문구를 자판기에 보여야 할 것이다. 이렇게 while문을 강제로 멈추게 하는 것을 가능하게 해 주는 것이 바로 break이다.
다음의 예는 위의 가정을 파이썬으로 표현해 본 것이다.
예) break의 사용
>>> coffee = 10
>>> money = 300
>>> while money:
...     print("돈을 받았으니 커피를 줍니다.")
...     coffee = coffee -1
...     print("남은 커피의 양은 %d 입니다." % coffee)
...     if not coffee:
...         print("커피가 다 떨어졌습니다. 판매를 중지합니다.")
...         break
...
money가 300으로 고정되어 있으니까 while money:에서 조건문인 money는 0이 아니기 때문에 항상 참이다. 따라서 무한 루프를 돌게 된다. 그리고 while문의 내용을 한번 수행할 때 마다 coffee = coffee - 1에 의해서 coffee의 개수가 한 개씩 줄어들게 된다. 만약 coffee가 0이 되면 if not coffee: 라는 문장에서 not coffee가 참이 되므로 if문 다음의 문장들이 수행이 되고 break가 호출되어 while문을 빠져 나가게 된다.
하지만 실제 자판기는 위처럼 작동하지는 않을 것이다. 다음은 자판기의 실제 과정과 비슷하게 만들어 본 예이다. 이해가 안 되더라도 걱정하지 말자. 아래의 예는 조금 복잡하니까 대화형 인터프리터를 이용하지 말고 에디터를 이용해서 작성해 보자.
# coffee.py

coffee = 10
while 1:
    money = int(input("돈을 넣어 주세요: "))
    if money == 300:
        print("커피를 줍니다.")
        coffee = coffee -1
    elif money > 300:
        print("거스름돈 %d를 주고 커피를 줍니다." % (money -300))
        coffee = coffee -1
    else:
        print("돈을 다시 돌려주고 커피를 주지 않습니다.")
        print("남은 커피의 양은 %d개 입니다." % coffee)
    if not coffee:
        print("커피가 다 떨어졌습니다. 판매를 중지 합니다.")
        break
위의 프로그램 소스를 따로 설명하지는 않겠다. 독자가 위의 것을 이해할 수 있다면 지금껏 알아온 if문이나 while문을 마스터 했다고 보면 된다. 다만 money = int(input(“돈을 넣어 주세요: ”))라는 문장은 사용자로부터 입력을 받는 부분이고 입력 받은 숫자를 money라는 변수에 대입하는 것이라고만 알아두자.
만약 위의 프로그램 소스를 에디터로 작성해서 실행시키는 법을 모른다면 부록의 에디터 사용법을 참고하도록 하자.

while문 조건문으로 돌아가기(continue)

while문 안의 문장을 수행할 때 어떤 조건을 검사해서 조건에 맞지 않는 경우 while문을 빠져나가는 것이 아니라 다시 while문의 맨 처음(조건문)으로 돌아가게 하고 싶을 경우가 생기게 된다. 만약 1부터 10까지의 수중에서 홀수만을 출력하는 것을 while문을 이용해서 작성한다고 생각해 보자. 어떤 방법이 좋을까?
예) continue의 사용
>>> a = 0
>>> while a < 10:
...     a = a+1
...     if a % 2 == 0: continue
...     print(a)
...
1
3
5
7
9
위의 예는 1부터 10까지의 수 중 홀수만을 출력하는 예이다. a가 10보다 작은 동안 a는 1만큼씩 계속 증가한다. if a % 2 == 0 (2로 나누었을 때 나머지가 0인 경우)이 참이 되는 경우는 a가 짝수일 때이다. 즉, a가 짝수이면 continue 문장을 수행한다. 이 continue문은 while문의 맨 처음(조건문: a<10)으로 돌아가게 하는 명령어이다. 따라서 위의 예에서 a가 짝수이면 print(a)는 수행되지 않을 것이다.

출처 : 점프 투 파이썬

파이썬 제어문 - IF문

다음과 같은 상상을 해 보자.
"돈이 있으면 택시를 타고 가고 돈이 없으면 걸어 간다."
위와 같은 상황은 우리 주변에서 언제든지 일어 날 수 있는 상황중의 하나이다. 프로그래밍이란 것도 사람이 만드는 것이라서 위와 같은 문장처럼 조건을 판단해서 그 상황에 맞게 처리해야 할 경우가 생기게 된다. 이렇듯 조건을 판단하여 해당 조건에 맞는 상황을 수행하는데 쓰이는 것이 바로 if문이다.
위와 같은 상황을 파이썬에서는 다음과 같이 만들 수 있다.
>>> money = 1
>>> if money:
...     print("택시를 타고 가라")
... else:
...     print("걸어가라")
...
택시를 타고 가라

if문의 기본 구조

다음의 구조가 if와 else를 이용한 기본적인 구조이다.
if <조건문>:
    <수행할 문장1>
    <수행할 문장2>
    ...
else:
    <수행할 문장A>
    <수행할 문장B>
    ...
조건문을 테스트 해서 참이면 if문 바로 다음의 문장들을 수행하고 조건문이 거짓이면 else문 다음의 문장들을 수행하게 된다.

들여쓰기(indentation)

if 문을 만들 때는 다음 처럼 if <조건문>: 다음의 문장부터 if문에 속하는 모든 문장들에 들여쓰기를 해 주어야 한다.
if <조건문>:
    <수행할 문장1>
    <수행할 문장2>
    <수행할 문장3>
위에서 보는 것과 같이 조건문이 참일 경우 <수행할 문장1>을 들여쓰기 하였고 <수행할 문장2><수행할 문장3>도 들여쓰기를 해 주었다. 이것은 파이썬을 처음 배우는 사람들에게 매우 혼동스러운 부분이기도 하니 여러번 연습을 해 보는 것이 좋다.
다음처럼 하면 에러가 난다.
if <조건문>:
    <수행할 문장1>
<수행할 문장2>
    <수행할 문장3>
<수행할 문장2>가 들여쓰기가 되지 않았다.
또는
if <조건문>:
    <수행할 문장1>
    <수행할 문장2>
      <수행할 문장3>
<수행할 문장3>이 들여쓰기는 되었지만 <수행할 문장1>이나 <수행할 문장2>와의 들여쓰기의 깊이가 틀리다. 즉 들여쓰기는 언제나 같은 깊이로 해 주어야 한다.
그렇다면 들여쓰기는 공백으로 하는 것이 좋을까? 아니면 탭으로 하는 것이 좋을까? 이것에 대한 논란은 파이썬을 사용하는 사람들 사이에서 아직도 계속되고 있는 것인데 탭으로 하자는 쪽, 공백으로 하자는 쪽 모두다 일치하는 내용은 단 하나, 둘을 혼용해서 쓰지 말자는 것이다. 공백으로 할 거면 항상 공백으로 하고 탭으로 할 거면 항상 탭으로 하자는 말이다. 탭이나 공백은 프로그램 소스에서 눈으로 보이는 것이 아니기 때문에 혼용해서 쓰면 에러의 원인이 되기도 한다. 주의 하도록 하자.
[참고] ':'을 잊지 말자
if(조건문) 다음에는 반드시 ':'이 오게 된다. 이것은 특별한 의미라기보다는 파이썬의 문법 구조이다. 왜 하필이면 ':'인가에 대해서 궁금하다면 파이썬을 만든 Guido에게 직접 물어보아야 할 것이다. while이나 for, def, class 에도 역시 그 문장의 끝에 ':'이 항상 들어간다. 이 ':'을 가끔 빠뜨리는 경우가 많은데 주의하도록 하자.
파이썬이 다른 언어보다 보기가 쉽고 소스코드가 간결한 이유가 바로 ':'을 사용하여 들여쓰기(indentation)를 하게끔 만들기 때문이다. 하지만 숙련된 프로그래머들이 파이썬을 접할 때 가장 혼란스러운 부분이기도 하다.
if 문을 다른 언어에서는 { } 이런 기호로 감싸지만 파이썬에서는 들여쓰기로 해결한다.

조건문이란 무엇인가?

if <조건문>에서 사용되는 조건문이란 참과 거짓을 판단하는 문장을 말한다. 자료형의 참과 거짓에 대해서는 이미 알아 보았지만 몇가지만 다시 알아보면 다음과 같은 것들이 있다.

자료형의 참과 거짓

자료형거짓
숫자30
문자열"abc"""
리스트[1,2,3][]
터플(1,2,3)()
딕셔너리{"a":"b"}{}
따라서 위의 예에서 보았던
>>> money = 1
>>> if money:
에서 조건문은 money가 되고 money는 1이기 때문에 참이 되어 if문 다음의 문장을 수행하게 되는 것이다.

비교연산자

하지만 조건판단을 하는 경우는 자료형보다는 비교 연산자(<, >, ==, !=, >=, <=)를 쓰는 경우가 훨씬 많다.
다음은 비교연산자를 잘 설명해 준다.
비교연산자설명
x < yx가 y보다 작다
x > yx가 y보다 크다
x == yx와 y가 같다
x != yx와 y가 같지 않다
x >= yx가 y보다 크거나 같다
x <= yx가 y보다 작거나 같다
예를 통해서 위의 연산자들에 대해서 알아보자.
>>> x = 3
>>> y = 2
>>> x > y
True
>>>
x에 3을 y에 2를 대입한 다음에 x > y라는 조건문을 수행하니까 True를 리턴한다. 그 이유는 x > y라는 조건문이 참이기 때문이다.
>>> x < y
False
위의 조건문은 거짓이기 때문에 False를 리턴한다.
>>> x == y
False
x와 y는 같지 않다. 따라서 위의 조건문은 거짓이다.
>>> x != y
True
x와 y는 같지 않다. 따라서 위의 조건문은 참이다.
앞의 경우를 다음처럼 바꾸어 보자.
"만약 3000원 이상의 돈을 가지고 있으면 택시를 타고 그렇지 않으면 걸어가라"
위의 상황을 다음처럼 프로그래밍 할 수 있을 것이다.
>>> money = 2000
>>> if money >= 3000:
...     print("택시를 타고 가라")
... else:
...     print("걸어가라")
...
걸어가라
>>>
money >= 3000 이란 조건문이 거짓이 되기 때문에 else문 다음의 문장을 수행하게 된다.

and, or, not

또다른 조건 판단에 쓰이는 것으로 and, or, not이란 것이 있다.
각각의 연산자는 다음처럼 동작을 한다.
연산자설명
x or yx와 y 둘중에 하나만 참이면 참이다
x and yx와 y 모두 참이어야 참이다
not xx가 거짓이면 참이다
다음의 예를 통해 위의 사항을 반영해 보도록 하자.
"돈이 3000원 이상 있거나 풀러줄 시계가 있다면 택시를 타고 그렇지 않으면 걸어가라"
>>> money = 2000
>>> watch = 1
>>> if money >= 3000 or watch:
...     print("택시를 타고 가라")
... else:
...     print("걸어가라")
...
택시를 타고 가라
>>>
money는 2000이지만 watch가 1이기 때문에 money >= 3000 or watch라는 조건문이 참이 되기 때문에 if문 다음의 문장이 수행된다.

x in s, x not in s

더 나아가서 파이썬에서는 조금 더 재미있는 조건문들을 제공한다. 바로 다음과 같은 것들이다.
innot in
x in 리스트x not in 리스트
x in 터플x not in 터플
x in 문자열x not in 문자열
'in' 이라는 영어단어가 '~안에'라는 뜻을 가졌음을 상기해 보면 다음의 예들이 쉽게 이해가 될 것이다.
>>> 1 in [1, 2, 3]
True
>>> 1 not in [1, 2, 3]
False
위의 첫 번째 예는 “[1, 2, 3]이라는 리스트 안에 1이 있는가?” 라는 조건문이다. 1은 [1, 2, 3]안에 있으므로 참이 되어 True를 리턴한다. 두 번째 예는 "[1, 2, 3]이라는 리스트 안에 1이 없는가?" 라는 조건문이다. 1은 [1, 2, 3]안에 있으므로 거짓이 되어 False를 리턴한다.
다음은 터플과 문자열의 적용예를 보여준다.
>>> 'a' in ('a', 'b', 'c')
True
>>> 'j' not in 'python'
True
위의 것들을 이용하여 우리가 계속 사용해온 택시예제에 적용시켜 보자.
"만약 주머니에 돈이 있으면 택시를 타고, 없으면 걸어가라"
>>> pocket = ['paper', 'handphone', 'money']
>>> if 'money' in pocket:
...     print("택시를 타고 가라")
... else:
...     print("걸어가라")
...
택시를 타고 가라
>>>
['paper', 'handphone', 'money']라는 리스트에 안에 'money'가 있으므로 'money' in pocket은 참이 되어서 if문 다음의 문장이 수행되었다.

elif (다중 조건 판단)

if와 else만을 가지고서는 다양한 조건 판단을 하기가 어렵다. 다음과 같은 예만 하더라도 if와 else만으로는 조건 판단에 어려움을 겪게 된다.
"지갑에 돈이 있으면 택시를 타고, 지갑엔 돈이 없지만 시계가 있으면 택시를 타고, 돈도 없고 시계도 없으면 걸어가라“
위의 문장을 보면 조건을 판단하는 부분이 두 군데가 있다. 먼저 지갑에 돈이 있는지를 판단해야 하고 지갑에 돈이 없으면 다시 시계가 있는지를 판단한다.
if와 else만으로 위의 문장을 표현 하려면 다음과 같이 할 수 있을 것이다.
>>> pocket = ['paper', 'handphone']
>>> watch = 1
>>> if 'money' in pocket:
...     print("택시를 타고가라")
... else:
...     if watch:
...         print("택시를 타고가라")
...     else:
...         print("걸어가라")
...
택시를 타고가라
>>>
언뜻 보기에도 이해하기가 쉽지 않고 산만한 느낌이 든다. 위와 같은 점을 보완하기 위해서 파이썬에서는 다중 조건 판단을 가능하게 하는 elif라는 것을 사용한다.
위의 예를 elif를 이용하면 다음과 같이 할 수 있다.
>>> pocket = ['paper', 'handphone']
>>> watch = 1
>>> if 'money' in pocket:
...      print("택시를 타고가라")
... elif watch: 
...      print("택시를 타고가라")
... else:
...      print("걸어가라")
...
택시를 타고가라
즉, elif는 이전 <조건문>이 거짓일 때 수행되게 된다. if, elif, else의 기본 구조는 다음과 같다.
If <조건문>:
    <수행할 문장1> 
    <수행할 문장2>
    ...
elif <조건문>:
    <수행할 문장1>
    <수행할 문장2>
    ...
elif <조건문>:
    <수행할 문장1>
    <수행할 문장2>
    ...
...
else:
   <수행할 문장1>
   <수행할 문장2>
   ...
위에서 보듯이 elif는 개수에 제한 없이 사용할 수 있다. (참고: 이것은 마치 C언어의 switch문과 비슷한 것이다.)

pass의 사용

가끔 조건문을 판단하고 참 거짓에 따라 행동을 정의 할 때 아무런 일도 하지 않게끔 설정을 하고 싶을 때가 생기게 된다. 다음의 예를 보자.
"지갑에 돈이 있으면 가만히 있고 지갑에 돈이 없으면 시계를 끌러라“
위의 예를 pass를 적용해서 구현해 보자.
>>> pocket = ['paper', 'money', 'handphone']
>>> if 'money' in pocket:
...     pass 
... else:
...     print("시계를 끌른다")
...
pocket이라는 리스트 안에 'money'란 문자열이 있기 때문에 if문 다음문장인 pass가 수행되었고 아무런 결과값도 보여주지 않는 것을 확인 할 수 있다.

한줄 짜리 if문

위의 예를 보면 if문 다음의 수행할 문장이 한줄이고 else문 다음에 수행할 문장도 한줄이다. 이렇게 수행할 문장이 한줄일때 조금 더 간편한 방법이 있다. 위에서 알아본 pass를 사용한 예는 다음처럼 간략화 할 수 있다.
>>> pocket = ['paper', 'money', 'handphone']
>>> if 'money' in pocket: pass
... else: print("시계를 끌른다")
...
if문 다음의 수행할 문장을 ':'뒤에 바로 적어 주었다. else문 역시 마찬가지이다. 이렇게 하는 이유는 때때로 이렇게 하는 것이 보기에 편하게 때문이다.
출처 : 점프 투 파이썬