Lecture 6
이번 강의에서는 Python을 통한 일반적인 프로그래밍 내용에 대한 학습을 하였다.
이전의 html과 css에 대한 내용을 한번 되짚고,
위의 예제에서는 python을 통해 이미지크기를 재조정하는 코드이다. 아직까지는 체감하기 힘들 수 있지만 확실히 C나 Java보다는 쉬운것을 알 수 있다.
재조정을 한 화면이다.
이번에는 Scratch와 Python을 비교한다.
변수 설정 시 변수의 타입은 결정하지 않아도 된다는 점과 더이상 semicolon(;)이 필요없다는 것을 알 수 있다.
증가식도 거의 비슷하지만 마찬가지로 semicolon이 없다.
if-elif-else문의 경우 훨씬 간결해진 것을 알 수 있다. 괄호는 모두 사라지고 colon(:)으로 대체가 되며 들여쓰기만으로 logic의 구조를 결정한다.
While문도 비슷한 형태로 변형이 된 것을 알 수 있다.
For문도 굉장히 간결해 진것을 볼 수 있다.
Python에서의 데이터 타입은 위와 같으며 C와 크게 다른 것은 string에 해당하는 str이 실제로 존재하는 타입이다.
그리고 추가적으로 제공이 되는 타입들에 대한 목록도 위와 같다.
C에서 #include <cs50.h>와 같이 라이브러리를 가져왔다면 python에서는 위와 같이 해당 라이브러리에 원하는 함수만 가져올 수도 있다.
C에서 make hello로 먼저 컴파일을 하고 ./hello와 같이 실행하였는데 python에서는 간결하게 위처럼 바로 진행할 수 있게 된다.
원래대로라면 sourcecode에서 compiler를 통해 machinecode로 변환을 진행하는 형태였다면 python에서는 위와 같은 형태로 변환이 진행된다. 0과 1로 이루어진 machinecode로 바꿔주는 대신 interpreter로 전환하고 위와 같은 단계들을 거치기 때문에 C보다는 실행속도가 떨어진다.
이번엔 string0.py에서 get_string을 통해 이름을 입력받아 hello, [name]과 같이 출력하는 코드인데 확실히 C보다 짧은 것을 알 수 있다. 그리고 print를 사용할 때 print(f"hello, {s}")와 같은 형태로도 사용이 가능하며 앞의 f는 format을 의미한다.
이번에 ints.py에서는 4칙연산(+modulo)를 시험하는데 굉장히 간결하고 위에서 본 형식을 사용하는데 {}안에서 바로 연산이 되는 것도 알 수 있다. 게다가 데이터타입을 정하지 않아도 되는 장점을 가지고 있었는데 int로 나누기를 하여도 알아서 소수점을 반환하는 것을 알 수 있다. 추가적으로 //라는 연산자는 몫을 구하는 역할을 한다.
floats.py에서는 나눗셈에 대해서만 시험해보는데 역시 마찬가지로 결과는 잘 나타나며 {z:.2f}의 내용에서 볼 수 있듯 소수점 2번째짜리까지 구할 수도 있으며 더 원한다면 숫자만 변경하면 된다. C에서 보았던 소수점 50번째자리까지 받을 때 여전히 쓰레기값으로 차서 출력되는 것을 알 수 있는데 이는 python에서도 해결되지 않는 메모리문제라고 한다.
이번에는 overflow.py를 가지고 C에서 진행했던 것을 재현해보는데 재밌는 차이점이 나온다. C와 같은 경우 2 billion(cf. 4 bytes)정도의 숫자에서 overflow가 일어나는 반면 python에서는 훨씬 큰 수에서 overflow가 일어난다. 이는 기본 4 byte보다 더 크게 메모리를 잡아두기 때문이라고 한다.
다음은 answer.py에서 입력을 받아 y나 n에 따라 각각의 결과를 출력하는 코드이다.
cough1.py에서는 for문을 통해 간단하게 cough를 3번 출력하고,
cough3.py에서는 좀 더 깔끔하게 구조화하여 만드는 모습이다. 밑의 if __name__ == "__main__"구문은 그 뒤의 main함수가 호출되었을 때만 작동한다. import될 시에는 작동하지 않도록 막아준다.
그 후 positive.py를 통해 양수만 입력받아 값을 출력하는 코드이며 구조가 약간 비효율적이라고 보일 수 있지만 python의 경우 사람이 이해하기 쉬운 pythonic code를 지향하며 이 것이 가장 큰 특징이라고 할 수 있다.
pythonic code의 특징을 하나 더 보여주는 예시로 capitalize2.py인데 s에 이름을 입력받아 string으로 저장하고 각 문자들을 대문자화 한다. 여기서 for문을 보면 for c in s:라는 굉장히 간결한 형식으로 쓰인 것을 알 수 있다. 게다가 print구문에서 end=""라는 argument를 발견할 수 있는데 이는 값을 출력하고 \n 대신 추가되는 문자를 결정하는 것이다. 이런 argument들을 결정하기 좋도록 짜여져 있기 때문에 해당 인자들을 알기 위해서는 구글에서 maunal을 찾기만 하면 된다.
다음은 argv를 다루는 argv0.py이며 이전에 C에서는 ./arv0 Brian 과 같이 두개의 단어가 있으면 당연히 두번째 요소가 argv[1]인 것을 알았는데 python에서는 python argv0.py Brian과 같이 3개의 단어가 있음에도 3번째 요소가 argv[1]으로 인식되는 것을 알 수 있다. 이는 argv[0]가 파일명으로 인식하기 때문임을 알 수 있다.
swap.py에서는 데이터 값을 교환하기 위해 필요했던 tmp가 전혀 필요없는 것을 보여주는 예시이다.
list.py에서는 입력받은 숫자들을 중복되지 않게 저장하여 출력하는 것이며 if - not과 if - not in - 처럼 사람의 언어와 비슷하게 간단히 표현이 가능한 것을 볼 수 있다.
다음 예시는 struct0.py로 python에서는 list를 받을 때 초기화는 students = []와 같이 한다. 또한 dict type을 통해 구조화가 가능한데 student = {"name": name, "dorm": dorm}과 같이 key:value로 간단하게 연결이 가능하다. list에 append 함수를 통해 간단히 요소들을 추가할 수 있는 것도 확인하였다.
마지막으로 마리오 게임을 예시로 사용하여 각 구조체를 print하는 코드들을 짜보는 시간을 가졌다. 위에서 ?박스들이 연속적으로 붙어있을 때 이를 프로그래밍하면,
위와 같이 간단하게 구현이 가능하고,
저런 모습의 구조물은 #문자를 통해 대체가 되는데,
이런 식으로 표현이 된다.
비슷하지만 좀 더 두꺼운 구조물은 volunteer를 받아 진행하는데
코드를 짤 때 막히더라도 저번의 duck을 두고 차근차근 설명을 하게 하는 모습이다. 굉장히 인상적이 었으며 실패를 두려워하는 국내 교육환경과 다름에 감탄하였다.
마침내 이중 for문을 활용하여 성공하는 모습이다.
간단히 초반부에 진행한 이미지파일 크기재조정 코드를 보며 하나씩 설명하는 모습이다. argv의 length가 4개가 되지 않으면 동작하지 않는 것으로 보아 python에서는 argc라는 개념은 없는 것인가 추측하게 된다.
인자로는 filename, n(배율), infile(대상), outfile(출력)이 되며 원본대상에 가로&세로배율을 적용하여 출력으로 크기가 재조정된 파일을 얻어내게 된다.
마지막 실험으로는 dictionary.py로 text파일을 불러와서 오타가 있는지 여부를 확인하고 이를 C로 짠 코드와 속도를 비교하는 것이었다.
검사결과는 같지만, python은 1.55초가 걸린 반면 C는 0.9초로 거의 2배정도 차이가 나는 것을 확인할 수 있다.
이번 강의에서는 Python을 통한 일반적인 프로그래밍 내용에 대한 학습을 하였다.
이전의 html과 css에 대한 내용을 한번 되짚고,
위의 예제에서는 python을 통해 이미지크기를 재조정하는 코드이다. 아직까지는 체감하기 힘들 수 있지만 확실히 C나 Java보다는 쉬운것을 알 수 있다.
재조정을 한 화면이다.
이번에는 Scratch와 Python을 비교한다.
변수 설정 시 변수의 타입은 결정하지 않아도 된다는 점과 더이상 semicolon(;)이 필요없다는 것을 알 수 있다.
증가식도 거의 비슷하지만 마찬가지로 semicolon이 없다.
if-elif-else문의 경우 훨씬 간결해진 것을 알 수 있다. 괄호는 모두 사라지고 colon(:)으로 대체가 되며 들여쓰기만으로 logic의 구조를 결정한다.
While문도 비슷한 형태로 변형이 된 것을 알 수 있다.
For문도 굉장히 간결해 진것을 볼 수 있다.
Python에서의 데이터 타입은 위와 같으며 C와 크게 다른 것은 string에 해당하는 str이 실제로 존재하는 타입이다.
그리고 추가적으로 제공이 되는 타입들에 대한 목록도 위와 같다.
C에서 #include <cs50.h>와 같이 라이브러리를 가져왔다면 python에서는 위와 같이 해당 라이브러리에 원하는 함수만 가져올 수도 있다.
C에서 make hello로 먼저 컴파일을 하고 ./hello와 같이 실행하였는데 python에서는 간결하게 위처럼 바로 진행할 수 있게 된다.
원래대로라면 sourcecode에서 compiler를 통해 machinecode로 변환을 진행하는 형태였다면 python에서는 위와 같은 형태로 변환이 진행된다. 0과 1로 이루어진 machinecode로 바꿔주는 대신 interpreter로 전환하고 위와 같은 단계들을 거치기 때문에 C보다는 실행속도가 떨어진다.
이번엔 string0.py에서 get_string을 통해 이름을 입력받아 hello, [name]과 같이 출력하는 코드인데 확실히 C보다 짧은 것을 알 수 있다. 그리고 print를 사용할 때 print(f"hello, {s}")와 같은 형태로도 사용이 가능하며 앞의 f는 format을 의미한다.
이번에 ints.py에서는 4칙연산(+modulo)를 시험하는데 굉장히 간결하고 위에서 본 형식을 사용하는데 {}안에서 바로 연산이 되는 것도 알 수 있다. 게다가 데이터타입을 정하지 않아도 되는 장점을 가지고 있었는데 int로 나누기를 하여도 알아서 소수점을 반환하는 것을 알 수 있다. 추가적으로 //라는 연산자는 몫을 구하는 역할을 한다.
floats.py에서는 나눗셈에 대해서만 시험해보는데 역시 마찬가지로 결과는 잘 나타나며 {z:.2f}의 내용에서 볼 수 있듯 소수점 2번째짜리까지 구할 수도 있으며 더 원한다면 숫자만 변경하면 된다. C에서 보았던 소수점 50번째자리까지 받을 때 여전히 쓰레기값으로 차서 출력되는 것을 알 수 있는데 이는 python에서도 해결되지 않는 메모리문제라고 한다.
이번에는 overflow.py를 가지고 C에서 진행했던 것을 재현해보는데 재밌는 차이점이 나온다. C와 같은 경우 2 billion(cf. 4 bytes)정도의 숫자에서 overflow가 일어나는 반면 python에서는 훨씬 큰 수에서 overflow가 일어난다. 이는 기본 4 byte보다 더 크게 메모리를 잡아두기 때문이라고 한다.
다음은 answer.py에서 입력을 받아 y나 n에 따라 각각의 결과를 출력하는 코드이다.
cough1.py에서는 for문을 통해 간단하게 cough를 3번 출력하고,
cough3.py에서는 좀 더 깔끔하게 구조화하여 만드는 모습이다. 밑의 if __name__ == "__main__"구문은 그 뒤의 main함수가 호출되었을 때만 작동한다. import될 시에는 작동하지 않도록 막아준다.
그 후 positive.py를 통해 양수만 입력받아 값을 출력하는 코드이며 구조가 약간 비효율적이라고 보일 수 있지만 python의 경우 사람이 이해하기 쉬운 pythonic code를 지향하며 이 것이 가장 큰 특징이라고 할 수 있다.
pythonic code의 특징을 하나 더 보여주는 예시로 capitalize2.py인데 s에 이름을 입력받아 string으로 저장하고 각 문자들을 대문자화 한다. 여기서 for문을 보면 for c in s:라는 굉장히 간결한 형식으로 쓰인 것을 알 수 있다. 게다가 print구문에서 end=""라는 argument를 발견할 수 있는데 이는 값을 출력하고 \n 대신 추가되는 문자를 결정하는 것이다. 이런 argument들을 결정하기 좋도록 짜여져 있기 때문에 해당 인자들을 알기 위해서는 구글에서 maunal을 찾기만 하면 된다.
다음은 argv를 다루는 argv0.py이며 이전에 C에서는 ./arv0 Brian 과 같이 두개의 단어가 있으면 당연히 두번째 요소가 argv[1]인 것을 알았는데 python에서는 python argv0.py Brian과 같이 3개의 단어가 있음에도 3번째 요소가 argv[1]으로 인식되는 것을 알 수 있다. 이는 argv[0]가 파일명으로 인식하기 때문임을 알 수 있다.
swap.py에서는 데이터 값을 교환하기 위해 필요했던 tmp가 전혀 필요없는 것을 보여주는 예시이다.
list.py에서는 입력받은 숫자들을 중복되지 않게 저장하여 출력하는 것이며 if - not과 if - not in - 처럼 사람의 언어와 비슷하게 간단히 표현이 가능한 것을 볼 수 있다.
다음 예시는 struct0.py로 python에서는 list를 받을 때 초기화는 students = []와 같이 한다. 또한 dict type을 통해 구조화가 가능한데 student = {"name": name, "dorm": dorm}과 같이 key:value로 간단하게 연결이 가능하다. list에 append 함수를 통해 간단히 요소들을 추가할 수 있는 것도 확인하였다.
마지막으로 마리오 게임을 예시로 사용하여 각 구조체를 print하는 코드들을 짜보는 시간을 가졌다. 위에서 ?박스들이 연속적으로 붙어있을 때 이를 프로그래밍하면,
위와 같이 간단하게 구현이 가능하고,
저런 모습의 구조물은 #문자를 통해 대체가 되는데,
이런 식으로 표현이 된다.
비슷하지만 좀 더 두꺼운 구조물은 volunteer를 받아 진행하는데
코드를 짤 때 막히더라도 저번의 duck을 두고 차근차근 설명을 하게 하는 모습이다. 굉장히 인상적이 었으며 실패를 두려워하는 국내 교육환경과 다름에 감탄하였다.
마침내 이중 for문을 활용하여 성공하는 모습이다.
간단히 초반부에 진행한 이미지파일 크기재조정 코드를 보며 하나씩 설명하는 모습이다. argv의 length가 4개가 되지 않으면 동작하지 않는 것으로 보아 python에서는 argc라는 개념은 없는 것인가 추측하게 된다.
인자로는 filename, n(배율), infile(대상), outfile(출력)이 되며 원본대상에 가로&세로배율을 적용하여 출력으로 크기가 재조정된 파일을 얻어내게 된다.
마지막 실험으로는 dictionary.py로 text파일을 불러와서 오타가 있는지 여부를 확인하고 이를 C로 짠 코드와 속도를 비교하는 것이었다.
검사결과는 같지만, python은 1.55초가 걸린 반면 C는 0.9초로 거의 2배정도 차이가 나는 것을 확인할 수 있다.
댓글
댓글 쓰기