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