Common errors
1)
What’s wrong about this?
1
2
3
def f(n):
return n + 1
print(f(10))
indentation : block을 맞춰줘야함
print(f)가 f(n)에 포함되는 것으로 잘못 해석됨!
1
2
3
def f(n):
return n + 1
print(f(10))
2)
What’s wrong about this?
1
2
3
4
5
6
7
def f(n):
if n % 2 == 0:
print(’even’)
return n**2
else:
print(’odd’)
return n + 1
indentation
return n+1이 else:에 포함되지 않는것으로 잘못 해석됨
1
2
3
4
5
6
7
def f(n):
if n % 2 == 0:
print(’even’)
return n**2
else:
print(’odd’)
return n + 1
Variables
Variables store values Variables are created by assignments or parameter passing When created outside of a function, it is store in a global environment When created within a function, it is stored in a local environment When a function is called in a recursive way, each call create its own local variable
Variable definition
1
2
3
def g():
print(’local(g) n =’, n)
g()
Error NameError: name ’n’ is not defined
Variable must be defined before its use
Each function call can create a new variable
1
2
3
4
5
n = 10 # global assignment
def f(n): # parameter passing
print(n)
def g():
n = 20 # local assignment
Variables revisied
Local variable definition
1
2
3
4
5
6
n = 10
def g():
n = 20
print('local(g) n =', n)
g()
print('global n =', n)
local(g) n = 20 global n = 10
No change in global variable n
Within the function g(), n refers to only the local variable
Function and return
이 함수가 하는 일은?
1
2
3
4
5
def f(n):
tmp = 0
for i in range(2**25):
tmp = tmp + 1
return n + 1
tmp는 하나씩 증가하다가 2**5 값이 됨 근데 return으로는 원래 받아뒀던 n에 1을 더한 값을 반환함..?
f(3)을 출력하면 4가 나오는데 시간이 조금 걸림 왜 오래 걸리지? 그동안 상관없는 tmp 계산하느라..!
1
2
3
4
5
def f(n):
tmp = 0
for i in range(2**25):
tmp = tmp + 1
return n + 1
이런식으로 return indent를 하나 더 들여쓰자 결과값이 바로 나옴! 반복문을 돌지 않고 바로 n+1을 계산해서 return 되기 때무니당
The value of a function computation is computed as soon as it reaches return
recursive function call
Recursive call creates local variable at each call
1
2
def f(n):
return n * f(n-1)
factorial 계산은 아니고 무한정 반복하는건 맞음
f(5) -> n = 5 f(4) -> n = 4 f(3) -> n = 3 …
언제까지?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# f(5) 결과
---------------------------------------------------------------------------
RecursionError Traceback (most recent call last)
<ipython-input-18-786fe69aba34> in <module>()
----> 1 f(5)
<ipython-input-17-53accd7039bf> in f(n)
1 def f(n):
----> 2 return n * f(n-1)
... last 1 frames repeated, from the frame below ...
<ipython-input-17-53accd7039bf> in f(n)
1 def f(n):
----> 2 return n * f(n-1)
RecursionError: maximum recursion depth exceeded
RecursionError뜸! 무한히 반복해 봤더니 에러가 났다고! error가 나지 않으려면 n값이 0이 되면 return을 하라고 명시해줘야함
1
2
3
4
5
def f(n):
if n==0:
return 1
else:
return n * f(n-1)
f(5)는 120
Boolean expression
True와 False는 Boolean 값
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
>>> type(True)
bool
>>> type(False)
bool
n = 6
print(n % 4 == 0)
False
print(n % 2 == 0)
True
print (n != 2)
True
print (n <> 2) #<> : 다르다
True
print (n <= 6)
True
print (2 < n < 10) #n은 2보다 크고 10보다 작은가
True
boolean 연산 (AND, OR, NOT)
2 나누어 떨어지고 3으로 나누어 떨어지면 6의 배수다
1 2 3 4 5 n = 4944 if n % 2 == 0 and n % 3 == 0: print(n, 'is a multiple of 6') else: print(n, 'is not a multiple of 6')4966 is a multiple of 6
Iteration
There are many iteration statements
for iterates on sequence value types (list, tuple, set, …)
while iterates if boolean value is True
while
1
2
3
4
n = 0
while n < 10:
n = n + 1
print (n)
10
n은 원래 0으로 시작해서 10보다 작은 동안 반복 n이 10이 되면 n+1을 실행하지 않고 print됨 ==> n 출력
1
2
3
4
5
n = 0
while n < 10:
print('n =', n)
n = n + 1
print (n)
n = 0 n = 1 n = 2 n = 3 n = 4 n = 5 n = 6 n = 7 n = 8 n = 9 10
class
1
2
3
4
5
class Foo:
def __init__(self):
self.bar = 0
x = Foo()
print(type(x))
1
<class '__main__.Foo'>
1
2
3
4
5
class Korea:
def __init__(self):
self.bar = 0
x = Korea()
print(type(x))
1
<class '__main__.Korea'>
class를 만든거시다 ‘ㅅ’
1
2
3
4
5
6
class Korea:
def __init__(self):
self.bar = 100
x = Korea()
print(x.bar)
print(type(x))
1
2
100
<class '__main__.Korea'>
우앙 100을 넣었더니 100이 출력되어따
Exercise
1)
1
2
3
4
5
def f(n):
if n % 2 == 0:
return ’even’
else:
return ’odd’
if indent가 안맞음!
2)
1
2
3
4
5
6
7
8
def f(n):
for i in range(n):
if n % 2 == 0:
return n
else:
return n
print('strange')
f(10)
10
1
2
3
4
5
6
7
8
def f(n):
for i in range(n):
if n % 2 == 0:
return n
else:
return n
print('strange')
f(0)
strange
range(0)에 대해서는 대응시킬 수 있는 값이 없음
1
2
3
4
5
6
7
8
9
10
>>> range(0)
range(0, 0)
>>> list(range(0))
[]
>>> for i in range(0):
print(i)
# 아무것도 출력되지 않음
>>> for i in range(2,2):
print(i)
# 아무것도 출력되지 않음
3)
1
2
3
4
5
6
7
def f(n):
i = 2
while i < n and n % i != 0:
i = i + 1
return n >= 2 and i >= n
for i in range(10):
print(i,f(i))
0 False 1 False 2 True 3 True 4 False 5 True 6 False 7 True 8 False 9 False
boolean 과 boolean을 and 하면 결과값 boolean 소수 판별 sequence
1
2
3
4
5
6
7
8
def f(n):
i = 2
while i < n and n % i != 0:
i = i + 1
return n >= 2 and i >= n
for i in range(100):
if f(i):
print(i)
2 3 5 7 11 13 17 19 23 29 31 …샬라샬라
n이 0인 경우라면 2보다 작아서 소수가 아님 1인 경우도 마찬가지 2가 들어가면 2보다 크거나 같고 and 2보다 크거나 같아서 소수 4이 들어가면 2보다 크고 나머지가 0이 되버린 바람에 i를 증가 시키지 않고 (i는 2) i는 4보다 크거나 같지 않기 때문에 소수가 아님
이걸 오또케 생각해내징..
Wrap-up
- Python manages variable scope
- return statement stops execution of function computation and returns the given value as the result
- while repeats its block by computing a condition
- class creates a new data type