6. 제어문과 함수 기초




1 파이썬 제어문


1-1 들여쓰기와 제어문

  • 파이썬은 들여쓰기를 강제하여 코드의 가독성을 높인다.
  • 가장 바깥쪽의 코드는 반드시 1열에 시작한다.
  • 블록 내부에 있는 statement들은 동일한 열에 위치해야 한다.
  • 블록의 끝은 들여쓰기가 끝나는 부분으로 간주된다.
    • python에는 {, }, begin, end 등의 키워드가 존재하지 않는다.
  • 들여쓰기를 할 때에는 탭과 공백을 섞어 쓰지 않는다.
In [160]:
a = 1 # 성공
 a = 1 # 실패
  File "<ipython-input-160-0453a5e2fe16>", line 2
    a = 1 # 실패
    ^
IndentationError: unexpected indent
In [161]:
if a > 1:
    print 'big'
     print 'really?'
  File "<ipython-input-161-96672a766929>", line 3
    print 'really?'
    ^
IndentationError: unexpected indent

1-2 if문

  • if문의 형식

if 조건식1:

  statements

elif 조건식2:

  statements

elif 조건식3:

  statements

else:

  statements

  • 조건식이나 else 다음에 콜론(:) 표기 필요
  • 들여쓰기(indentation)를 잘 지켜야 함
In [153]:
score = 90
if score >= 90:
    print 'Congratulations!!! '
Congratulations!!! 
In [61]:
a = 10
if a > 5:
    print 'Big'
else:
    print 'Small'
Big
  • statement가 1개인 경우 조건식과 한 줄에 위치 가능 (추천하지는 않음)
In [155]:
a = 10
if a > 5: print 'Big'
else: print 'Small'
Big
In [156]:
n = -2
if n > 0:
    print 'Positive'
elif n < 0:
    print 'Negative'
else:
    print 'Zero'
Negative
In [65]:
order = 'spagetti'

if order == 'spam':
    price = 500
elif order == 'ham':
    price = 700
elif order == 'egg':
    price = 300
elif order == 'spagetti':
    price = 900
    
print price
900
  • 위 코드와 동일한 dictionary 자료구조를 사용한 코드
In [66]:
order = 'spagetti'
menu = {'spam':500, 'ham':700, 'egg':300, 'spagetti':900}
price = menu[order]
print price
900

1-3 for문

for <타겟> in <컨테이너 객체>:

  statements

else:

  statements

In [168]:
a = ['cat', 'cow', 'tiger']
for x in a:
    print len(x), x
3 cat
3 cow
5 tiger
In [169]:
for x in [1,2,3]:
    print x,
1 2 3
In [172]:
print range(10)

for x in range(10):
    print x,
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
0 1 2 3 4 5 6 7 8 9
In [174]:
sum = 0
for x in range(1, 11):
    sum = sum + x
    
print sum
55
In [1]:
prod = 1
for x in range(1, 11):
    prod = prod * x
    
print prod
3628800
  • enumerate() 내장 함수: 컨테이너 객체가 지닌 각 요소값뿐만 아니라 인덱스 값도 함께 반환한다.
In [67]:
l = ['cat', 'dog', 'bird', 'pig']
for k, animal in enumerate(l):
    print k, animal
0 cat
1 dog
2 bird
3 pig
In [68]:
t = ('cat', 'dog', 'bird', 'pig')
for k, animal in enumerate(t):
    print k, animal
0 cat
1 dog
2 bird
3 pig
In [71]:
d = {'c':'cat', 'd':'dog', 'b':'bird', 'p':'pig'}
for k, key in enumerate(d):
    print k, key, d[key]
0 p pig
1 c cat
2 b bird
3 d dog
  • break: 루프를 빠져나간다.
In [176]:
for x in range(10):
    if x > 3: 
        break
    print x
    
print 'done'
0
1
2
3
done
  • continue: 루프 블록 내의 continue 이후 부분은 수행하지 않고 루프의 시작부분으로 이동한다.
In [2]:
for x in range(10):
    if x < 8:
        continue
    print x
    
print 'done'
8
9
done
  • else: 루프가 break에 의한 중단 없이 정상적으로 모두 수행되면 else 블록이 수행된다.
In [73]:
for x in range(10):
    print x,          # 콤마(,) 때문에 줄이 바뀌지 않는다.
else:
    print 'else block'

print 'done'
0 1 2 3 4 5 6 7 8 9 else block
done
  • break에 의하여 루프를 빠져나가면 else 블록도 수행되지 않는다.
In [179]:
for x in range(10):
    break
    print x,
else:
    print 'else block'
    
print 'done'
done
  • for 루프의 중첩
In [182]:
for x in range(2, 4):
    for y in range(2, 10):
        print x, '*', y, '=', x*y
    print
2 * 2 = 4
2 * 3 = 6
2 * 4 = 8
2 * 5 = 10
2 * 6 = 12
2 * 7 = 14
2 * 8 = 16
2 * 9 = 18

3 * 2 = 6
3 * 3 = 9
3 * 4 = 12
3 * 5 = 15
3 * 6 = 18
3 * 7 = 21
3 * 8 = 24
3 * 9 = 27

1-4 while문

  • while 조건식이 만족하는 동안 while 블록내의 statements 들을 반복 수행한다.
In [183]:
count = 1
while count < 11:
    print count
    count = count + 1
1
2
3
4
5
6
7
8
9
10
In [1]:
sum = 0
a = 0
while a < 10:
    a = a + 1
    sum = sum + a
print sum
55
In [6]:
x = 0
while x < 10:
    print x,          # 콤마(,) 때문에 줄이 바뀌지 않는다.
    x = x + 1
else:
    print 'else block'

print 'done'
0 1 2 3 4 5 6 7 8 9 else block
done

2 파이썬 함수 기초


2-1. 함수의 장점 및 함수 사용법

  • 함수의 장점
    • 함수는 반복적인 코드를 없에 주어 코드의 길이를 짧게 만들어 준다.
    • 코드의 유지보수를 쉽게 만들어 준다.
In [6]:
def add(a, b):
    return a + b

print add(3, 4)

print add([1,2,3], [4,5,6])
7
[1, 2, 3, 4, 5, 6]
In [5]:
c = add(10, 30)
print c
40
  • 함수 이름에 저장된 레퍼런스를 다른 변수에 할당하여 그 변수를 이용한 함수 호출 가능
In [6]:
f = add
print f(4, 5)

print f

print f is add
9
<function add at 0x10d8916e0>
True
  • 함수의 몸체에는 최소한 한개 이상의 statement가 존재해야 함
    • 그러므로, 아무런 내용이 없는 몸체를 지닌 함수를 만들 때에는 pass 라는 키워드를 몸체에 적어주어야 함
In [8]:
def simple():
    pass

print simple()
None
  • 함수에서 다른 함수 호출 가능
In [2]:
def add(a, b):
    return a + b

def myabs(x):
    if x < 0: 
        x = -x
    return x

def addabs(a, b):
    c = add(a, b)
    return myabs(c)

print addabs(-5, -7)
12
  • 인자의 이름과 함께 인자 값을 넘겨줄 수 있다.
In [7]:
def minus(a, b):
    return a - b
print minus(a=12, b=20)
print minus(b=20, a=12)
-8
-8
  • 인자의 디폴트 값을 지정할 수 있다.
In [9]:
def incr(x, y=1):
    return x + y

print incr(5)

print incr(5, 10)
6
15
  • 두 개 이상의 값을 동시에 반환할 수 있다.
In [1]:
def calc(x, y):
    return x + y, x - y, x * y, x / y

print calc(10, 2)
(12, 8, 20, 5)

2-2 함수 호출시 동적인 자료형 결정

  • 파이썬에서는 모든 객체는 동적으로 (실행시간에) 그 타입이 결정된다.
    • 함수 인자는 함수가 호출되는 순간 해당 인자에 전달되는 객체에 따라 그 타입이 결정된다.
    • 함수 몸체 내에서 사용되는 여러 가지 연산자들은 함수 호출시에 결정된 객체 타입에 맞게 실행된다.
In [3]:
def add(a, b):
    return a + b

c = add(1, 3.4)
d = add('dynamic', 'typing')
e = add(['list'], ['and', 'list'])
print c
print d
print e
4.4
dynamictyping
['list', 'and', 'list']

2-3 재귀적 함수 호출

  • 재귀(Recursive) 함수: 함수 몸체에서 자기 자신을 호출하는 함수

    • 수학에서 점화식과 유사한 코드
    • 반드시 종결 조건 및 종결 조건이 만족할 때의 반환 값이 있어야 한다.
  • 1부터 N까지 더하는 재귀 함수

In [4]:
def sum(N):
    if N == 1:           # 종결 조건
        return 1         # 종결 조건이 만족할 때의 반환 값
    return N + sum(N-1)  # 재귀 호출

print sum(10)
55

참고 문헌: 파이썬(열혈강의)(개정판 VER.2), 이강성, FreeLec, 2005년 8월 29일