Eat Study Love

먹고 공부하고 사랑하라

SW 만학도/Python

Review 1 - Python programming basics

eatplaylove 2024. 7. 1. 16:50

프로그래밍은 안 쓰다 보면 까먹는다. 더군다나 전공자가 아니면 정말 1~2주만 정신 놓고 있다가 복귀했을 때 굉장히 기초적인 코딩도 손에 잡히지 않는 것을 쉽게 체감할 수 있다.

 

그리하야 시작된 Review 프로젝트

 

Review인 만큼 전반적으로 개념을 빠르게 복기하고,

 

실습에 시간을 좀 더 할애해보자!

 

1. Abstraction

 

우리는 코딩을 할 때, HW 구조를 알 필요가 없다. ex) 마우스 벤더, HDD용량, 컴퓨터 벤더 등..

 

그 이유는 OS(widows, Linux, MacOS)라는 것이 HW와 SW를 이어주는 매개체 역할을 해주어 Interface 와 Implementation 영역을 나누어 주기 때문이다.

 

그러나 우리에겐 OS라는 것도 너무 Low Level의 영역이라 OS를 이해하고 코딩을 하는 것도 어렵다.

 

그리하여 한 단계 더 추가된 Abstraction인 Python Interpreter를 사용하는 것이다.

 

Interpreter를 사용하면 우리의 OS의 특징을 알지 않아도 일단은 코딩을 자유롭게 할 수 있다.

 

다만, 저명한 프로그래머가 되기 위해선 가능한 Deep하게 Low Level 영역을 이해할 수 있어야 한다.

 

2. Basics

 

Primitive Expression(기초 표현)

- 기초 연산 : **(제곱), //(몫), %(나머지) 등이 있다.

- Types : int - 정수, float - 유리수, int - float? -> float

 

Call Expression(함수 표현)

- max, and, or 등

 

함수를 만들 때 이름규칙

 

위 사항들을 지켜야 Variable을 생성할 수 있다. 그리고 내부적으로 이미 만들어 놓은 이름은 Variable로 만들 수 없다(ex) True, False, if 등..)

 

= : assign , == : 같다라는 것. 구분 必

 

3. Memory Model

 

Value가 Memory에 저장되고, 그 Memory 주소가 Variable에 할당되는 과정을 도식화 한 것이다.

 

다시 말해, Variable에 Value가 직접적으로 저장되는 것이 아니고 Variable은 Memory주소를 갖게 되는 것

 

파이썬은 쓸 모 없이 놀고 있는 Value에 대한 Memory는 삭제해서 Memory 관리를 시행한다.

 

4. Functions

 

- Built in function 외에 우리가 필요한 함수구현이 필요하다.

def convert_to_fahrenheit(celsius):
    return celsius*9/5 +32
convert_to_fahrenheit(10)
50.0

- Indentation으로 코딩 시 구분 필요!

- 함수를 하나 만들어 놓으면 나중에 이걸 재사용할 수 있어서 좋다.

 

 

파이썬 함수선언의 기본적인 골자는 위와 같다. Function header 부분에 함수의 Interface를 잘 입력해주고, Function body 부분에 기능 Implementation을 해준다.

 

Local Variables(함수 안에서 선언된 Variables)

- 함수가 생기면서 태어났다가 함수가 끝나면서 같이 죽는다.

x = 100
def convert_to_celsius(fahrenheit):
    a= 5/9
    b = 32
    return (a*(fahrenheit-b))
convert_to_celsius(50)

- 여기서 Global variable x는 끝까지 100이라는 값으로 살아있지만, a,b,는 def convert_to_celsius가 끝나면 죽는다.

 

 

- Python은 variable이 생성될 때 그에 맞는 namespace를 만드는데, 해당 variable이 다른 namespace에 있는 variable과 이름이 같아도 일단 Python은 현재 namespace에 있는 variable을 우선시 한다. 즉,

 

x = 100
def convert_to_celsius(fahrenheit):
    x= 5/9
    b = 32
    print(b)
    return (x*(fahrenheit-b))

 

x=100이라고 globally 선언이 되었어도, 일단 def 안에서 x는 5/9라고 생각한다.

 

5. Memory Models for Function Calls(째끔 짜치는 부분, 이해 필요!)

 

 

doubling 이라는 함수를 예로 들면, 일단 함수가 한 번 실행되었을 때는 namespace가 더 이상 global이 아닌 doubling이라는 함수의 namespace로 scope이 바뀌게 된다. 그래서 함수를 실행할 땐, global x가 아닌 parameter x를 갖고 계산을 하게 되는 것

 

최종적으로,

 

 

함수가 끝나면서 Return Value인 20을 Global namespace의 x에 assign 하면서 나머지 doubling 함수는 Memory 공간에서 사라진다.

 

※ 참고로, 같은 value에 대해서 global / local namespace에서 assign이 들어가면 같은 Memory 공간을 사용한다.

(ex: global / local 모두 10이라는 값을 가르키는 parameter가 있으면 10이라는 value에 해당하는 memory공간을 여러 개 만드는 것이 아니고 한 memory에 여러 variable들이 화살표를 날리는 꼴)

 

※ 참고로, 함수 실행중에 local namespace에서 찾을 수 없는 variable은 함수를 call 했던 global namespace까지 뒤져서 찾아보고 있으면 그 값을 가져다 쓰고, 여기 마저도 없으면 error 발생이다.

 

x = 100
def convert_to_celsius(fahrenheit):
#     x= 5/9
    b = 32
    return (x*(fahrenheit-b))
print(convert_to_celsius(50))
-->
1800

 

6. Function Design

 

 

기본적으로 Essay를 쓰듯이, 함수의 목적이 무엇이며 어떻게 구성할 것인지 계획이 필요하다는 것이다.

이름은 간결하면서 명료하게 쓰고, Parameter의 type과 개수를 적절히 정하고, Body에 적절한 알고리즘을 적어야하며 끝으로 함수를 test 할 수 있는 case를 여러 개 마련해 놓아야 한다.

 

ex: 사실 함수 중간 중간에 복잡한 case의 경우 주석으로 comment를 적어주는 것도 권장된다.

def days_difference(day1:int,day2:int) -> int: # C programming에선 in/output data type 쓰는 것이 must라서 써주는 것을 추천
    return abs(day1-day2) 

x,y = 13,15
days_difference(x,y)

 

- E. O. D -