6. 제어문과 함수 기초




1 파이썬 제어문


1-1 들여쓰기와 제어문

  • 파이썬은 들여쓰기를 강제하여 코드의 가독성을 높인다.
  • 가장 바깥쪽의 코드는 반드시 1열에 시작한다.
  • 블록 내부에 있는 statement들은 동일한 열에 위치해야 한다.
  • 블록의 끝은 들여쓰기가 끝나는 부분으로 간주된다.
    • python에는 {, }, begin, end 등의 키워드가 존재하지 않는다.
  • 들여쓰기를 할 때에는 탭과 공백을 섞어 쓰지 않는다.
In [1]:
a = 1 # 성공
 a = 1 # 실패
  File "<ipython-input-1-0453a5e2fe16>", line 2
    a = 1 # 실패
    ^
IndentationError: unexpected indent
In [2]:
if a > 1:
    print('big')
     print('really?')
  File "<ipython-input-2-c77db9f95c1e>", 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 [3]:
score = 90
if score >= 90:
    print('Congratulations!!! ')
Congratulations!!! 
In [4]:
a = 10
if a > 5:
    print('Big')
else:
    print('Small')
Big
  • statement가 1개인 경우 조건식과 한 줄에 위치 가능 (추천하지는 않음)
In [5]:
a = 10
if a > 5: print('Big')
else: print('Small')
Big
In [6]:
n = -2
if n > 0:
    print('Positive')
elif n < 0:
    print('Negative')
else:
    print('Zero')
Negative
In [7]:
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 [8]:
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 [9]:
a = ['cat', 'cow', 'tiger']
for x in a:
    print(len(x), x)
3 cat
3 cow
5 tiger
In [12]:
for x in [1,2,3]:
    print(x, end=" ")
1 2 3 
In [1]:
print(range(10))

print(list(range(10)))

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

print('done')
0 1 2 3 4 5 6 7 8 9 else block
done
  • break에 의하여 루프를 빠져나가면 else 블록도 수행되지 않는다.
In [25]:
for x in range(10):
    break
    print(x, end=" ")
else:
    print('else block')
    
print('done')
done
  • for 루프의 중첩
In [26]:
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

In [1]:
for x in range(2, 4):
    for y in range(2, 10):
        print("{0} * {1} = {2}".format(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 [27]:
count = 1
while count < 11:
    print(count)
    count = count + 1
1
2
3
4
5
6
7
8
9
10
In [28]:
sum = 0
a = 0
while a < 10:
    a = a + 1
    sum = sum + a
print(sum)
55
In [29]:
x = 0
while x < 10:
    print(x, end=" ")
    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 [30]:
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 [31]:
c = add(10, 30)
print(c)
40
  • 함수 이름에 저장된 레퍼런스를 다른 변수에 할당하여 그 변수를 이용한 함수 호출 가능
In [32]:
f = add
print(f(4, 5))

print(f)

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

print(simple())
None
  • 함수에서 다른 함수 호출 가능
In [34]:
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 [35]:
def minus(a, b):
    return a - b
print(minus(a=12, b=20))
print(minus(b=20, a=12))
-8
-8
  • 인자의 디폴트 값을 지정할 수 있다.
In [36]:
def incr(x, y=1):
    return x + y

print(incr(5))

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

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

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

  • 파이썬에서는 모든 객체는 동적으로 (실행시간에) 그 타입이 결정된다.
    • 함수 인자는 함수가 호출되는 순간 해당 인자에 전달되는 객체에 따라 그 타입이 결정된다.
    • 함수 몸체 내에서 사용되는 여러 가지 연산자들은 함수 호출시에 결정된 객체 타입에 맞게 실행된다.
In [38]:
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 [39]:
def sum(N):
    if N == 1:           # 종결 조건
        return 1         # 종결 조건이 만족할 때의 반환 값
    return N + sum(N-1)  # 재귀 호출

print(sum(10))
55

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