6. Python
Python Basics
Hello world
를 출력하기 위한 C코드와 python코드를 비교하면
// C
#include <stdio.h>
int main(void)
{
printf("hello, world\n");
}
# python
print("hello, world")
- Standard library를 불러들일 필요가 없다.
- Main function을 선언하지 않아도 된다.
Print
함수 끝에 줄바꿈\n
을 해주지 않아도 된다 (줄바꿈이 default).- Semicolon
;
을 적어주지 않아도 된다.
Python은 별도의 compile을 거칠 필요가 없는 interpreted language이기 때문에 위의 코드를 hello.py
로 저장하면 코드를 실행하기 위해 바로 python hello.py
command를 실행하면 된다.
Get string
사용자로부터 문자열(string)을 받기 위한 코드를 비교하면
// C
#include <cs50.h>
int main(void)
{
string answer = get_string("What's your name?\n");
printf("hello, %s\n", answer);
}
# Python
import cs50
# or
from cs50 import get_string
answer = get_string("What's your name\n")
# 입력받은 사용자의 이름은 여러방법으로 출력할 수 있다.
# 방법 1
print("hello, " + answer)
# 방법 2
print("hello,", answer)
# 방법 3
print(f"hello, {answer}")
#include
대신에import
를 사용하고 사용할 특정 함수만을 불러올 수도 있다.- Data type을 특정하지 않고 변수를 선언할 수 있다. (interpreter가 문맥에 따라 결정.)
- 방법 1: 두 개의 문자열
hello,
와answer
을+
연산자로 결합한 뒤 출력. - 방법 2: 여러개의 arguments
hello,
,answer
를 동시에 출력. 출력될 때 두 arguments 사이에 자동으로 공백이 추가된다. - 방법 3: Format string을 출력. 중괄호안의 answer는
{}
C에서의%s
와 비슷한 역할을 하며 format string을 출력하기 위해서는 괄호(
바로 뒤에f
를 적어야한다. 괄호를 적어주지 않은경우hello, {answer}
그대로 출력된다.
Increment and initialize a variable
변수를 초기화 하고 변수의 값을 1만큼 높이기 위한 코드를 비교하면
// C
int counter = 0;
counter = counter + 1;
counter += 1;
counter++;
# Python
counter = 0
counter = counter + 1
counter += 1
- 연산은 C와 동일하게 한다.
++
연산은 python에서 사용할 수 없다.
Condition
조건에 따라 결과를 다르게 출력하기 위한 코드를 비교하면
// C
if (x < y)
{
printf("x is less than y\n");
}
else if (x > y)
{
printf("x is greater than y\n");
}
else
{
printf("x is equal to y\n");
}
# Python
if x < y:
print("x is less than y")
elif x > y:
print("x is greater than y")
else:
print("x is equal to y")
- 조건을 감싸는 괄호
()
대신 조건 마지막에 colon:
을 붙여 조건을 표시하고, 조건을 만족할 때 수행할 결과는 중괄호{}
대신tab
으로 들여써서 표시한다. - 들여쓰기(indentation)가 코드의 nesting을 결정하기 때문에, C와 다르게 들여쓰기를 정확히 하는 것이 중요하다.
else if
대신에elif
를 사용한다.
Boolean expressions
// C
while (true)
{
printf("hello, world\n");
}
# Python
while True:
print("hello, world")
True
(orFalse
) 조건의 첫 글자를 대문자로 표기
Loop
// C
// while 사용
int i = 3;
while (i > 0)
{
printf("cough\n");
i--;
}
// for 사용
for (int i = 0; i < 3; i++)
{
printf("cough\n")
}
# Python
# while 사용
i = 3
while i > 0:
print("cough")
i -= 1
# for 사용: i를 0, 1, 2로 바꿔가면서 cough를 출력
for i in [0, 1, 2]:
print("cough")
# range function을 이용해서 간단하게 표기 가능
for i in range(3):
print("cough")
for
이용시 i의 증가를 list를 이용해서 표현 가능[0, 1, 2]
range
function을 이용해서 나열된 숫자를 표현할 수 있음.range(3)
과[0, 1, 2]
이 동일.
Data types in Python
코드 내에 명시하지는 않지만 python에도 data type이 존재
Data types | 설명 |
---|---|
bool | 참, 거짓 (true or false) |
float | 실수 (real numbers) |
int | 정수 (integers) |
str | 문자열 (strings) |
range | 연속한 숫자 (sequence of numbers) |
list | 연속한 가변값 (sequence of mutable values) |
tuple | 연속한 불가변값 (sequence of immutable values) |
dict | 키(key)와 대응되는 값(value)으로 이루어진 pairs의 모음 hash table과 유사 |
set | 특정값의(unique values) 모음 |
자세한 사항은 official source documentation인 docs.python.org 를 참고.
Examples
Blur an image
pset4
의 이미지를 불러와서 blur시키는 프로그램.
# PIL란 library에서 Image와 ImageFilter 함수를 불러옴
from PIL import Image, ImageFilter
# 불러온 Image의 open을 이용해서 편집할 이미지 불러오기
before = Image.open("bridge.bmp")
# before에 filter를 이용해 불러온 ImageFilter의 BLUR를 적용
after = before.filter(ImageFilter.BLUR)
# after를 out.bmp로 저장.
after.save("out.bmp")
Implement a dictionary
pset5
의 단어를 받아서 check하는 프로그램
# words라는 set을 생성
words = set()
# word를 받는 check function
def check(word):
# 받은 word를 lowercase로 만든 문자열이 words set 안에 존재하면 true를 반환
if word.lower() in words:
return True
else:
return False
# dictionary를 받는 load function
def load(dictionary):
# 받은 dictionary를 read mode로 file에 저장
file = open(dictionary, "r")
# file에 line을 한 개씩 읽어갈 때 마다 반복
for line in file:
# line의 \n으로부터 거꾸로 잘라서(rstrip) words에 add
words.add(line.rstrip("\n"))
# file을 닫음
file.close()
return True
# words의 길이를 반환하는 size function
def size():
return len(words)
# unload function
def unload():
return True
- C에 비해서 코드가 굉장히 간결해졌지만 속도를 비교해보면 굉장히 느리다.
Check multiple conditions
사용자가 입력한 값에 따라 답변을 출력하는 프로그램
글자 case에 상관 없이 Y를 입력하면 Agreed, N을 입력하면 Not agreed를 출력
from cs50 import get_string
s = get_string("Do you agree?\n")
# Y 또는 y를 입력하면 Agreed.를 출력
if s == "Y" or s == "y":
print("Agreed.")
# N 혹은 n을 입력하면 Not agreed.를 출력
else s == "N" or s == "n"
print("Not agreed.")
- C의
||
연산자 대신or
을 사용.
다음과 같이 표현할 수도 있다.
# s가 []안에 있는 값과 일치하면; Y 혹은 y이면, Agreed.를 출력
if s in ["Y", "y"]:
print("Agreed.")
# s를 lowercase로 변환한 값이 y와 일치하면 Agreed.를 출력
if s.lower() in ["y"]:
print("Agreed.")
Make function
cough를 세 번 출력하는 프로그램
# 1. cough를 세 번 출력
print("cough")
print("cough")
print("cough")
# 2. cough를 출력하는 것을 세 번 반복
for i in range(3):
print("cough")
# 3. cough를 출력하는 cough 함수를 정의해서 cough 함수를 세 번 반복
# cough를 정의하기 전에 cough함수를 사용해서 error 발생
for i in range(3):
cough()
def cough():
print("cough")
# cough 함수를 main 코드보다 위에 적거나
# main 함수를 위에 쓰고 싶다면 우선 정의한 뒤 이후에 실행해야한다.
def main():
for i in range(3):
cough()
def cough():
print("cough")
main() # main 함수 실행
# 4. cough를 n번 실행하는 함수를 정의해서 n에 3을 입력
def main():
cough(3)
def cough(n):
for i in range(n):
print("cough")
main()
def
를 이용해서 함수를 정의할 수 있다.
Positive integer를 입력받는 프로그램
def main():
i = get_positive_int()
print(i)
def get_positive_int():
while True:
n = get_int("Positive Integer:")
if n > 0:
break
return n
- Python에는 C의
do-while
이 존재하지 않는다.
최소 1번 실행한 뒤 조건을 체크하는 반복문을 만들기 위해서는while True
안에 반복하고 싶은 부분을 적어 먼저 실행한 후에 조건을 체크해서break
하는 방식을 이용한다. - C와 동일하게
break
와return
을 사용할 수 있다. - Python에서는 동일한 함수 안이라면 변수가 선언된 nesting 밖에서도 사용될 수 있다.
Print out a row, a column, a plane
행, 열, 평면을 visual적으로 출력하는 프로그램
# 1. 하나의 행 출력 "????"
# 끝에 개행 없이 문자 `?`를 네 번 입력. 마지막줄에 개행
for i in range(4):
print("?", end="")
print()
# 문자열인 '?'에 숫자를 곱해서 반복할 수도 있다
print("?" * 4)
end
는 문자열의 끝을 가리키며print
시 default값은\n
이다.end="..."
로 내가 원하는 값으로 바꿀 수 있고 아무것도 입력
# 2. 하나의 열 출력 "#"
#
#
# #룰 세 번 출력
for i in range(3):
print("#")
# 곱하기 연산 이용 (print에 의한 개행을 없애지 않으면 마지막에 빈 한줄이 생긴다)
print("#\n" * 3, end="")
# 3. 3 x 3 평면 출력 "###"
###
###
# nested loop: 개행 없이 '#' 세 번 출력 후 개행 하는 것을 세 번 반복
for i in range(3):
for j in range(3):
print("#", end="")
print()
Overflow
- python에서는 integer overflow가 일어나지 않는다.
- 숫자를 키우면 컴퓨터의 memory를 가득 채울 때 까지 계속 커진다.
- Floating-point imprecision 역시 십진수를 필요한 bits만큼 사용해서 나타낼 수 있는 library를 이용하면 방지할 수 있다.
List
list에 점수를 입력하고 평균을 구하는 프로그램
# list score 선언
score = []
# score에 점수값 추가
score.append(72)
score.append(73)
score.append(33)
# list를 선언할 때 값을 바로 초기화 할 수도 있다
score = [72, 73, 74]
# 평균 계산 (scores의 총 합을 scores의 크기로 나눔)
print(f"Average: {sum(scores) / len(scores)}")
- list는 대괄호
[]
를 이용해 선언하고 초기화한다. - list 크기는 처음 선언한 element의 개수로 정해지고 추가할 때마다 자동으로 늘어난다.
문자열 출력
# String 입력
s = get_string("Input: ")
# string 출력
print(s)
# Bracket notation 이용
for i in range(len(s)):
print(s[i], end="")
print()
# 'iterate*' over each character
# s의 각 character가 끝날 때 까지 character 출력을 반복
for c in s:
print(c, end="")
print()
- Python에서도 bracket notation을 쓸 수 있다.
- * Iterate: 동일한 행위를 반복 할 때마다 container를 구성하는 element를 하나씩 반환하는 것.
즉, string(container)을 구성하고 있는 character(element)를 순차적으로 반환하여 출력한다.
More features
Command-line argument
command-line을 받아서 출력
# command line을 받기위해 sys library의 argv를 이용
from sys import argv
# argv: list of strings
# command-line에서 받은 argv의 수만큼 argv를 출력
for i in range(len(argv)):
print(argv[i])
# iterate over the list
# list의 argument(string)이 끝날 때 까지 argument 출력을 반복
for arg in argv:
print(arg)
sys
library의argv
를 이용해서 command-line argument를 받을 수 있다.
command-line을 추가로 한 개 받지 못했을 때 error message를 출력
from sys import argv, exit
if len(argv) != 2:
print("missing command-line argument")
# error를 알리기 위해 1을 반환하고 exit. return과 같은 역할
exit(1)
print(f"hello, {argv[1]}")
# 정상 작동을 알리기 위해 0을 반환하고 exit.
exit(0)
sys
library의exit
을 이용해서return
처럼 값을 반환하고 실행을 종료할 수 있다.
Linear search
List 안의 element를 확인해서 존재 여부를 확인.
import sys
names = ["EMMA", "RODRIGO", "BRIAN", "DAVID"]
if "EMMA" in names:
print("Found")
sys.exit(0) # sys library의 exit함수 사용
print("Not found")
sys.exit(1)
- 조건을 적어주는 것 만으로 list (
names
)안의 element들을 탐색한다.
Dictionary
# dictionary인 people을 선언 및 초기화
people = {
"EMMA": "617-555-0100",
"RODRIGO": "617-555-0101",
"BRIAN": "617-555-0102"
}
if "EMMA" in people:
# Found와 EMMA의 phone number (617-555-0100) 출력
print(f"Found {people['EMMA']}")
sys.exit(0)
print("Not found")
sys.exit(1)
- Dictionary는 중괄호
{}
를 이용해서 선언하고 초기화 한다. - Dictionary는 key와 value의 한 쌍으로 이루어져 있고 Key와 value는 semicolon으로, 각 pair는 comma로 구분한다.
- Indices가 word인 array로 생각할 수 있다.
String comparison
두 개의 문자열을 입력받아 비교
s = get_string("s: ")
t = get_string("t: ")
if s == t:
print("Same")
else:
print("Different")
- Python에서는 비교 연산자
==
로 문자열을 바로 비교할 수 있다.
s = get_string("s: ")
t = s
print(f"s: {s}")
print(f"t: {t}")
- 문자열을 바로 복사하는 것도 가능하다.
Swap
x = 1
y = 2
print(f"x is {x}, y is {y}")
# swap x and y
x, y = y, x
print(f"x is {x}, y is {y}")
- Python에서는 순서를 바꿔서 대입하면 swap 할 수 있다.
Files
csv 파일을 열고 편집하는 프로그램.
# csv file을 사용하는데 도움을 주는 library
import csv
from cs50 import get_string
# phonebook.csv file을 append mode로 불러서 file에 저장
file = open("phonebook.csv", "a")
# name과 number를 사용자로부터 입력받음
name = get_string("Name: ")
number = get_string("Number: ")
# csv안의 writer를 이용해서 file로 부터 writer를 만든 뒤
writer = csv.writer(file)
# writer에 writerow를 이용해서 입력받았던 name과 number를 기재
# tuple (name, number)를 만들어서 single argument로 writerow에 전달될 수 있도록 함
writer.writerow((name, number))
file.close()
# with를 사용해서 file을 이용하는 과정을 간소화
# file close 생략 가능
with open("phonebook.csv", "a") as file:
writer = csv.writter(file)
writer.writerow((name, number))
New features
Regular Expressions
Python에는 문자열과 동일시 할 수 있는 pattern인 regular expression이 존재한다.
Regular expression에는 다음과 같은 것들이 있다.
expression | 동치 대상 |
---|---|
. |
문자 (any characters) |
.* |
0개 이상의 문자 (0 or more characters) |
.+ |
1개 이상의 문자 (1 or more characters) |
? |
선택적인 것 (something optional) |
^ |
input의 시작 (start of input) |
$ |
input의 끝 (end of input) |
예를 들어 multiple condition에서 봤던 사용자가 입력한 값에 따라 답변을 출력하는 프로그램을 다음과 같이 만들 수도 있다.
# regular expression을 위한 re library를 import
import re
from cs50 import get_string
s = get_string("Do you agree?\n")
# re.search는 뒤의 입력값 's'에 앞의 입력값 '^y(es)?$'가 있는지 확인한다
# re.IGNORANCE argument를 추가로 받으면 lettercase를 무시한다.
# 'es'가 optinal한 y; 즉 y 혹은 yes가 입력받은 s에 있으면 조건을 만족한다
# yes 앞/뒤를 ^와 $로 제한해서 uhhhm, yes 등의 답변은 조건을 만족하지 못하도록 한다
if re.search("^y(es)?$", s, re.IGNORANCE):
print ("Agreed.")
# 'o'가 optinal한 n; 즉 n 혹은 no가 입력받은 s에 있으면 조건을 만족한다
# no 앞/뒤를 ^와 $로 제한한다
elif re.search("^no?$", s, re.IGNORANCE):
print("Not agreed.")
# 두 조건 다 만족하지 못하면 아무것도 출력하지 않는다
Speech Recognition
Google에서 제공하는 speech_recognition
library를 이용해 음성을 인식해서 출력하거나 응답하는 프로그램을 만들 수 있다.
# speech_recognition library를 불러옴
import speech_recognition
recognizer = speech_recognition.Recognizer()
# 마이크를 이용해서 받은 음성을 source에 저장한 뒤
# 나중에 작성
with speech_recognition.Microphone() as source:
print("Say something!")
audio = recognizer.listen(source)
# 1. recognizer가 인식한 문자열을 출력
print("Google Speech Recognition thinks you said: ")
print(recognizer.recognize_google(audio))
# 2. 인식한 문자열에 따라 다른 대답을 출력
# recognizer가 인식한 문자열을 words에 저장
words = recognizer.recognize_google(audio)
# words에 따른 응답
if "hello" in words:
print("Hello to you too!")
elif "how are you" in words:
print("I am well, thanks!")
elif "goodbye" in words:
print("Goodbye to you too!")
else:
print("Huh?")
# 3. regular expressions를 사용해서 문자열의 일부로 사용
# recognizer가 인식한 문자열을 words에 저장
words = recognizer.recognize_google(audio)
# words가 my name is 이후에 0개 이상의 string이 나오는 형태와 일치하는지 확인
matches = re.search("my name is (.*)", words)
# 일치하면 matches의 두번째 string (이름)을 Hey에 이어서 출력
if matches:
print(f"Hey, {matches[1]}.")
else:
print("Hey you.")
참고
Python
Iteration
- 이터레이터, 이터러블, 이터레이션 by JIMIN SUN
- Iterables vs. Iterators vs. Generators by Vincent Driessen
'공부를 합니다 > 컴퓨터 공학 (Computer Science)' 카테고리의 다른 글
CS50's Web Track-1 (0) | 2020.05.10 |
---|---|
CS50's Week 8_Information (0) | 2020.05.07 |
CS50's Week 7_SQL (0) | 2020.04.22 |
CS50's Week 5_ Data Structures (0) | 2020.03.07 |
CS50's Week 2_Arrays (0) | 2020.03.06 |