앞서 말했듯이 추상화는 복잡한 기능을 사용자 API에서 숨기고 간단하게 표현하는 것이다.
이에 변수와 함수가 대표적인 추상화의 방법이라 소개했었다! 차근차근 천천히 알아보자
변수
x = 7
x = x + 1
x = 9
파이썬에서 = 의 의미는 우리가 수학적으로 알고있는 등호와 많이 다르다.
등호라 불리는 = 기호는 파이썬에서는 지정연산자(assignment operator)라고 불린다.
즉, 어떠한 변수에 어떠한 값을 지정해준다 생각하면 된다...!
위의 코드블럭에서 내가 같은 변수 x에 다른 값들을 차례차례 할당해 주었다.
과연... 정말 같은 x 일까?
사용자의 입장
같은 x에 다른 값이 업데이트 되는 거 아니야!
메모리에서의 입장
변수가 저장된 위치가 달라진다. 새로운 값을 가르키기 때문이다!
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("------------------")
위의 코드가 실행되는 순서를 알아보면,
print( 9+ square(4) )
print( 9+ 16 )
print( 25 )
>>> 25
### Return문의 역할
#기능을 수행한 뒤 값을 돌려주는 것
#함수를 즉시 종료시키는 것
위의 두가지 역할이 있다.
일반적으로 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 문은 함수의 실행을 종료시킴과 동시에 함수가 있던 자리에 리턴 값을 놓고 사라진다.(호랑이는 죽어서 가죽을 남기고 함수는 죽어서 리턴을 남긴다)
함수 심화
1. 변수에 함수를 할당 할 수 있다고?!
가능하다! 함수는 기능을 추상화 한 것이고, 변수는 값을 추상화 한 것이기 때문에 함수가 return문을 가지고 있다면, 그 값을, 아니라면 그 기능을 변수에 할당한다.
def allocatedfunction():
print("this function is allocated to the variable")
f1 = allocatedfunction() # >>> this function is allocated to the variable
f2 = allocatedfunction
f1 # 아무것도 안돼용
f2() # >>> this function is allocated to the variable
f1과 f2의 차이엔 함수 할당 시 ( )에 있다.
f1의 경우는 할당시 함수를 실행시켜버렸기 때문에 print 함수가 실행돼서 콘솔에 출력되고 f1에는 None이 할당된다.
f2의 경우는 함수를 할당만 하고 실행시키지 않았기 때문에 f2()로 함수를 호출해서 print 함수가 실행된다.
즉!! 함수를 할당시에 ()의 유무에 따라 아주우우우 큰 차이가 있으니 주의하자!
2. 파라미터에 기본값을 설정할 수 있으면 얼마나 좋을까?
이것도 가능하다! 바로 옵셔널 파라미터(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
를 보게 될 것이다...
Syntactic Sugar
갑자기 왜 영어냐고? 나도 모른다. 이렇게 배웠다. 앙 개꿀! 이런 느낌인 것 같다.
# 다음 두 줄은 같다!
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
축약 연산자...? 정도로 배웠던 거 같은데 기초 연산자 같은 경우는 이런 식으로 줄여 사용할 수 있다.
Scope(범위)
범위라 하면 어떤 걸 말하는 걸까?
프로그래밍에서는 변수가 어느 정도까지 영향력을 미칠 수 있는가 정도로 이해된다.
1. 로컬 변수 : 함수 내부에서 정의한 변수로 변수가 유효한 범위는 함수 내부
def myf():
x = 3
print(x)
myf() # 3
print(x) # NameError : name ' x ' is not defined
변수 x는 myf 함수 내부에서 정의되었기 때문에 함수 밖에서 호출시 undefined 에러가 발생하게 된다.
2. 글로벌 변수 : 함수 외부에서 정의한 변수로 변수를 모든 범위에서 사용할 수 있음
x = 2
def myf():
x = 3
print(x)
myf() #3
print(x) #2
어라. 근데 조금 이상하지 않나? 분명 함수 내부에서 x를 변경했는데 함수를 호출해서 x를 출력했을 때의 값과 print 함수를 이용해 x를 출력했을 때 값이 다르다.
로컬 스코프 내부에서 변수에 값을 할당한 것은 글로벌 스코프에 영향을 주지 않는다!
즉 --- 글로별 변수 x와 로컬 변수 x는 다른 것임!!
바꾸려면, global 키워드를 사용하면 되는데, 스코프 개념을 해치는 방법이므로 비추천한다.
x = 2 def my(): x = x + 1 print(x) my()
예를 들어 이 코드는 에러를 발생시킨다.
일단 함수는 로컬 변수를 먼저 살펴본 뒤에 그 변수가 없다면(같은 이름의) 전역 변수를 찾는다.
위의 코드에서 x = x + 1 부분에서 로컬 변수로 x를 선언했기 때문에 아직 어떤 값이 없는 x에 1을 더한 샘이
되버린다.
따라서 에러가 발생한다.
x = 2 def my(): print(x) my()
반대로 위의 코드는 에러를 발생시키지 않는다. 이유는 위에 적어놨다!
**파라미터도 로컬 변수다.
상수(Constant)
파이썬에서 JS처럼 상수의 개념이 크지 않다.
프로그램을 실행하는 관점에서는 상수와 변수가 아무 차이가 없다.
하지만!!
협업을 하는 부분에서 다른 개발자들과의 약속이기 때문에 지켜줘야 함!
개발자들과의 약속 == 코드스타일
파이썬은 pep8이란 코드스타일이 존재한다.
나중에 한 번 이에 대해서도 다루어 보겠다!
참조 : https://www.python.org/dev/peps/pep-0008
넉두리... 내일부터 이제 진짜 근무 시작이다..! 잘 할 수 있을까! 내 선임은 엄청 일 잘하고 똑똑하고
착한 사람인 거 같던데... 피해 안가게 공부에 지장안가는 선에서 최대한 열심히 노력해야겠다...
물론 간부는 모르게 ㅋㅎㅋㅎ
2021-09-06
'Language > Python' 카테고리의 다른 글
5. 파이썬 for 문 (0) | 2021.09.12 |
---|---|
4. 파이썬 리스트 (0) | 2021.09.10 |
3. 파이썬 제어문 (0) | 2021.09.07 |
1. 파이썬 자료형 (2) | 2021.09.05 |
0. 파이썬 기초 (0) | 2021.09.04 |