복잡한 기능을 사용자 API에서 숨기고 간단하게 표현하는 것이다.
x = 7
x = x + 1
x = 9
= : 지정연산자 ( assignment operator )
메모리에서의 입장
변수가 저장된 위치가 달라진다. 새로운 값을 가르키기 때문이다!
x = 7
print(id(x)) # 9468448
x = 8
print(id(x)) # 9468480
함수는 순서지향 프로그래밍이든, 객체지향 프로그래밍이든 많이 사용되는 추상화 기법 중 하나이다.
def square(x):
return x * x
print("------------------")
print(square(3) + square(4))
print("------------------")
기능을 수행한 뒤 값을 돌려주는 것
함수를 즉시 종료시키는 것
일반적으로 return문이 없는 함수는 함수가 실행되고 난 뒤 그 자리에 None이 남는다.
def print_sq(x):
print(x*x)
def get_sq(x):
return x*x
print_sq(3) # console [ 3 ]
get_sq(3) # console [ ]
print(get_sq(3)) # console [ 3 ]
print(print_sq(3)) # console [ 3 ]
# [ None ]
print 함수는 console에 값을 나타나게 해준다.
return 문은 함수의 실행을 종료시킴과 동시에 함수가 있던 자리에 리턴 값을 놓고 사라진다.
함수가 return문을 가지고 있다면, 그 값을, 아니라면 그 기능을 변수에 할당한다.
def allocatedfunction():
print("this function is allocated to the variable")
f1 = allocatedfunction() # >>> this function is allocated to the variable
f2 = allocatedfunction
f1() # Not work
f2() # >>> this function is allocated to the variable
f1의 경우는 할당시 함수를 실행시켜버렸기 때문에 print 함수가 실행돼서 콘솔에 출력되고 f1에는 None이 할당된다.
f2의 경우는 함수를 할당만 하고 실행시키지 않았기 때문에 f2()로 함수를 호출해서 print 함수가 실행된다.
옵셔널 파라미터 (Optional Parameter)라는 것을 이용
def myself(name, age, nationality="한국"):
print(f"내 이름은 {name}")
print(f"나이는 {age}살")
print(f"국적은 {nationality}")
myself("반영환", 1, "미국") # 옵셔널 파라미터를 제공하는 경우
print()
myself("반영환", 1) # 옵셔널 파라미터를 제공하지 않는 경우
>>> 내 이름은 반영환
>>> 나이는 1살
>>> 국적은 미국
-----------------------------
>>> 내 이름은 반영환
>>> 나이는 1살
>>> 국적은 한국
주의!
옵셔널 파라미터는 꼭 일반 파라미터보다 뒤에 있어야 한다!
중간에 위치하는 경우
File "myself.py", line 1 def myself(name, nationality = "한국", age):
^ SyntaxError: non-default argument follows default argument
x = x + 1
x += 1
x = x + 2
x += 2
x = x * 2
x *= 2
x = x - 3
x -= 3
x = x / 2
x /= 2
x = x % 7
x %= 7
변수가 어느 정도까지 영향력을 미칠 수 있는가?
def myf():
x = 3
print(x)
myf() # 3
print(x) # NameError : name ' x ' is not defined
변수 x는 myf 함수 내부에서 정의되었기 때문에 함수 밖에서 호출시 undefined 에러가 발생하게 된다.
x = 2
def myf():
x = 3
print(x)
myf() #3
print(x) #2
로컬 스코프 내부에서 변수에 값을 할당한 것은 글로벌 스코프에 영향을 주지 않는다.
바꾸려면, global 키워드를 사용하면 되는데, 스코프 개념을 해치는 방법이므로 비추천한다.
x = 2
def my():
x = x + 1
print(x)
my()
이 코드는 에러를 발생시킨다.
일단 함수는 로컬 변수를 먼저 살펴본 뒤에 그 변수가 없다면(같은 이름의) 전역 변수를 찾는다.
위의 코드에서 x = x + 1 부분에서 로컬 변수로 x를 선언했기 때문에 아직 어떤 값이 없는 x에 1을 더한 것이기에 에러가 발생한다.
파라미터도 로컬 변수다.
파이썬에서 JS처럼 상수의 개념이 크지 않다.
프로그램을 실행하는 관점에서는 상수와 변수가 아무 차이가 없다.
개발자들과의 약속 == 코드스타일
파이썬은 pep8이란 코드스타일이 존재한다.
참조 : https://www.python.org/dev/peps/pep-0008
2021-09-06