IT/CS50x 2023

CS50x 2023 - Lecture 6 - Python

민트컨디션 2023. 12. 26. 19:34
  • 파이썬은 컴파일러로 실행되는 C와는 대조적으로 인터프리터(Interpreter)로 실행된다. 컴파일러는 전체 소스 코드를 한 번에 번역하여 실행 파일로 만드는 반면, 인터프리터는 소스 코드를 한 줄씩 읽어들여 번역하고 즉시 실행한다는 차이가 있다. 그래서 파이썬을 돌릴때는 C에서의 '> make 파일명' 처럼 별도의 컴파일을 하지 않아도 된다. 

Python과 C의 소소한(하지만 강력한) 문법적 차이들:

  • 파이썬에서의 데이터 타입에는 bool, float, int, str 등이 있으며, C에서 사용되었던 long, double등은 없다. 통일해서 쓴다.
  • printf 대신 print를 쓰며, print 구문에 parameter를 dynamic하게 받는 syntax는 다음과 같다.
    > printf(f"hello, {parameter}")
  • print를 할 때 자동으로 new line(\n)이 생성된다. print 구문마다 '\n'을 같이 넣어줘야 했던 C와는 다른점이다. new line을 생성하지 않고 붙여서 print하고 싶다면 print('프린트 하고 싶은 내용', end = "") 처럼 써줘서 프린트문 뒤에 아무것도(\n 도) 안붙일거라고 명시해줘야 한다.
  • print("프린트 하고 싶은 내용" * 4) 이런식으로 string에 곱하기 연산을 하여 해당 갯수만큼 프린트할 수도 있다.
  • input 값은 기본적으로 string으로 인식된다.
  • 코드라인 끝마다 세미콜론(;)을 안붙여도 되나, 대신 들여쓰기를 해야된다.
  • python은 list를 지원하기 때문에,
    > if/for word in words: 
    ...와 같이 어떤 요소(word)가 리스트(words)에 존재하는지의 여부를 쉬운 syntax로 확인할 수 있다. 요소 하나하나 iterate하여 비교해야하는 C와 크게 다른점이다.
  • range()가 사용가능한데, 가령 range(3) = [0,1,2] 이다.
  •  else if 대신 elif 라고 표현한다.
  • counter = count + 1 를 표현할 때 'counter += 1' 는 사용할 수 있으나 'counter ++'는 파이썬에서 지원하지 않아 못쓴다.
  • infinite loop은 While True: 절로 표현한다. While True: 밑으로 무한으로 실행하는 부분을 넣으면 된다.

 

Object-oriented programming (객체지향 프로그래밍)

  • 객체지향 프로그래밍에서는 소프트웨어를 객체(Object)로 구성하며, 객체는 데이터와 해당 데이터를 처리하는 메서드(Method)로 구성된 하나의 단위이다.
    가령, string 이란 데이터 타입이 C에서는 그러한 타입의 데이터만 갖고 있게 되지만, python에서는 그 데이터 뿐만 아니라 데이터 타입 자체에 built-in functionality가 있는것이다. s란 스트링에 대하여 s.lower()를 하면 s를 모두 소문자로 변환시킨다던가. 여기서 lower가 built-in functionality고, 이런식으로 data type에 built in function들이 뭐뭐있는지 다 볼려면 docs.python.org/3/library에서 모두 확인이 가능하다.

객체지향 프로그래밍의 주요 특징:

  1. 캡슐화(Encapsulation): 객체는 데이터와 그 데이터를 처리하는 메서드를 하나의 단위로 묶음으로써 외부에서의 접근을 제어하고, 데이터 보호 및 안정성을 높인다. 데이터 성격에 맞지 않는 function이나 method를 쓸 확률이 줄어든다.
  2. 상속성(Inheritance): 이미 존재하는 클래스(부모 클래스)를 기반으로 새로운 클래스(자식 클래스)를 만들어 기존 클래스의 특징과 기능을 재사용할 수 있으며, 이를 통해 코드의 재사용성과 유지보수성을 향상시킨다. 함수안에 함수를 넣는등의 양상이다.
  3. 다형성(Polymorphism): 같은 이름의 메서드가 서로 다른 객체에서 다르게 동작하도록 하는 특성으로, 코드의 유연성을 높이고, 각 객체의 특징에 따라 적절한 메서드가 호출된다.

 

meow.py

meow.py 예제에서는 파이썬의 객체지향 프로그래밍적 특성을 살려 코드 구성을 일반적으로 어떻게 가져가면 좋을지 보여준다.

위의 코드에서, 1~3번에서 main function을 정의하고, 6~7번에서 meow function을 정의한 뒤, 10번에서 1~3번에서 정의한 main function을 호출하고 있다.

이 때, 파이썬 세션은 1~9번줄까지 거쳐오며 main function, meow function의 정의를 알게 되었기 때문에 10번줄의 main function을 문제없이 실행할 수 있는것이다.

이처럼 실제로 그 파이썬 파일이 뭘 하고 싶은지를 담은 main function을 코드의 상단에 두고, 그 function의 내용이 어떻게 정의되는지는 코드의 하단에 배치하여 코드의 전반적인 가독성을 높이는게 파이썬 프로그래밍에서 권장되는 코드구조이다.

 

 

mario.py

사용자로부터 자연수를 입력받아 그 숫자만큼 #을 출력하는 파이썬 코드를 아래처럼 짤 수 있다.

3~6에서 get_height 함수를 활용하여 받은 자연수만큼 #을 출력하는 main function을 정의하고 있으며,

9~14번째 줄에서는 위의 main function에서 쓰이는 get_height function을 정의하고 있다. 파이썬에서는 C와 달리 do while 문법이 없는데, 이 function에서 while True:와 if ~ : break 구문을 활용한것처럼 구현할 수 있다. (if절을 충족하면 while문을 break하는것) 이 함수에서 파이썬의 또다른 특징을 볼 수 있는데, 바로 11번에서 정의한 n이 while문 안에서 정의되었음에도 불구하고 while문 밖인 14번에서 return이 가능하다는 것이다. 파이썬에서는 이처럼 정의된 variable을 정의된 구역 밖에서도 차후에 불러올 수 있다.

 

참고로 굳이 while문을 break하지 않고, 조건을 충족하면 바로 n을 return하도록 아래처럼 코드를 간소화시킬수도 있다. 

 

또한, try: ~ except 구문을 써서 예상되는 에러 발생시 에러메세지를 그대로 내보내는 대신 유저에게 좀더 user friendly한 에러메세지를 내보낼 수도 있다.

 

 

get_height 함수를 실행하여 user에게 자연수를 입력하도록 프롬프트를 띄울 때, 유저가 integer가 아닌 string 등을 입력시키면 ValueError가 지저분하게 나온다. 그것을 위의 코드처럼 try: ~ except를 활용하여 except 부분에서 Value Error의 경우 Not an integer라고 friendly한 메세지를 프린트하도록 할 수 있다.

 

 

Scores.py

3개의 점수에 대한 평균을 낼 때, 위의 3번째 줄처럼 len함수를 써서 리스트 안의 갯수만큼 총합을 나누는 함수를 만들 수 있다.

이렇게 고정된 숫자를 쓰지 않고 아래처럼 dynamic하게 정수를 받아서 빈 list에 append하는 식으로 리스트를 만들 수 도 있다.

3번 줄에서 빈 list를 만들고, 4번 줄에서부터의 for문이 숫자 3개까지 들어가는 리스트를 채우게끔 하고 있다.

6번째 줄은 scores += [score] 로 대체할 수 있다. 똑같이 list를 append하는 신택스이다.

 

 

Greet.py

argv라는 명령인수를 활용하여 아래 prompt 처럼 python ~.py 뒤에 아무것도 입력하지 않으면 else문이, 인수를 이어 입력하면 그 인수와 함께 스트링이 출력되도록 할 수 있다. 3번째 줄의 조건절에 들어가는 len(argv)는 말그대로 명령인수의 길이인데, greet.py 가 첫번째 명령인수이므로 len(argv)는 기본적으로 1이다. 그런데 그 뒤에 David를 붙였으므로 2가 되는것이다. 이 컨셉을 이용하여 파이썬 파일 실행 시 뒤에 명령인수를 바로 이어 입력하여 그것을 코드 안에서 활용하도록 할 수 있다.

 

argv는 명령인수를 리스트의 형태로 받는다.

그래서 아래처럼 for loop을 활용할 수 있고, argv에 대해 [0:] 와 같은 list slice도 가능하다.

가령, 위 코드라인의 3번째 줄에서 in argv 대신 in argv[0:]로 수정한다면, prompt에서 첫번째 인수인 greet.py는 빼고 출력될 것이다.

 

Exit Status

C의 잔재라고 할 수 있는데, sys 라이브러리에서는 exit status를 저장할 수 있게 해준다. 

밑의 프롬프트에서처럼 echo $? 명령어로 바로 전에 실행된 명령의 exit status를 확인할 수 있다.

 

phoonbook.py

{} 모양 괄호를 사용하여 dictionary를 만들 수 있다.

1~4번에서 정의하는 people 이라는 dictionary는 key로 Carter, David을 갖고 있으며, 각각의 전화번호를 value로 갖고 있다.

6번에서 Name을 인풋으로 받고, 7~8번의 if절에서 people 딕셔너리의 키값 중에서 name을 찾는다. 그리고 해당 키값의 value(=전화번호)를 출력하는 것이다.

 

swap.py

파이썬에서는 5번째 줄처럼 변수간의 값을 쉽게 swap할 수 있다.