Python
integer, Float, String, Boolean
복잡한 내용은 숨기고, 주요 기능에만 신경쓰자. → 추상화
Variable, Function, Object
Variable → value를 추상화
Function → 명령을 추상화
Function
def hello(): —> 함수의 헤더
def hello():
parameter
def hello(name):
print("hello!")
print(name)
print("welcome to codeit!")
def print_sum(a,b):
print(a+b)
hello("michael")
print_sum(3,7)
Python
복사
return
def get_square(3):
return 3*3
print(get_square(3))
Python
복사
숫자형
덧셈: +
뺄셈 : -
곱셈 : *
나머지: %
거듭제곱: **
정수형 + 정수형 = 정수형
소수형 + 소수형 = 소수형
소수형 + 정수형 = 소수형
소수형 > 정수형
나눗셈 → 항상 소수형으로 return
버림 나눗셈 → // 소수부분을 버린다. 결과는 정수형
버릿 나눗셈을 할 때 둘 중 하나가 소수형이면 결과는 소수형으로 나온다.
round → 반올림, 파라미터 그냥 하나로 쓰면 정수형으로 리턴
round(3.14,1) → 첫째짜리 까지 반올림
문자열
문자열의 덧셈과 곱셈이 가능하다.
casting
print(int(3.8)) #3
print(float(3)) #3.0
print(int("2")+int("5")) #7, 문자열에서 정수형,소수형으로 자유롭게 캐스팅이 가능
print(str(2)+str(5)) #25 정수형에서 문자열로 캐스팅 가능
Python
복사
Formating
year = 2019
month = 10
day = 29
print("오늘은 " + str(year) + "년 " + str(month) + "월 " + str(day) + "일입니다.")
print("오늘은 {}년 {}월 {}일입니다.".format(year,month,day)
date_string ="오늘은 {}년 {}월 {}일입니다."
print(date_string.format(year,month,day))
num_1 = 1
num_2 = 3
print("{0} 나누기 {1}은 {2:.2f}입니다.".format(num_1,num_2,num_1/num_2))
#소수점 둘째짜리까지 표시하기
#정수로 표시하고 싶으면 .0f를 해야함
name = "최지웅"
age = 32
print("제 이름은 %s이고 %d살입니다."%(name,age))
Python
복사
Boolean
True
False
not True
not False
#비교연산자
print(2>1)
print(2<1)
prnit(3>=2)
print(2==2)
print(2!=2)
print("Hello"=="Hello")
print("Hello"!="Hello")
JavaScript
복사
type함수
어떤 자료형인지 모른다
type함수를 쓰면 어떤 함수인지 확인가능하다
print(type(3)) #int
print(type(3.0)) #float
print(type("3)) #str
print(type(hello)) #function
print(type(print)) #built_in function
JavaScript
복사
optional parameter
def myself(name,age,nationality = "한국"):
print("내 이름은 {}".format(name))
print("나이는 {}살".format(age))
print("국적은 {}살".format(nationality))
JavaScript
복사
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
Python
복사
scope
def my_function():
x=3
print(x)
my_function()
print(x) #local 변수x를 선언한거고, x를 선언한적이 없다
#x는 함수 범위에서 사용되는 local variable
def my_function():
print(x)
my_function()
print(x) #함수 밖에 정의한 변수: 글로벌 변수
#글로벌 변수는 모든 곳에서 사용가능하다. 변수 x가 유효한 범위는 프로그램 전체, 아무런 문제 없이 실행됨
x=2 #글로벌 변수
def my_function():
x=3 # 로컬변수
print(x) #로컬변수,함수에서 변수 사용시, 로컬 변수를 먼저 체크한다.
my_function()
print(x) #2 글로벌 변수
#전역변수는 함수 내에서 수정을 할 수가 없다.
파리미터도 로컬 변수이다.
def square(x):
return x*x
square(3)
Python
복사
상수
PI = 3.14 #상수
#대문자로 항상 지정해줘야한다.
보는 입장에서 달라진게 있다.
대문자로 쓰는 이유
일반변수와 상수를 구분짓기 위함
어떤게 일반변수인지, 상수인지 알아챌 수 있도록
실수를 하지 않기 위함. 상수로 정의 => 수정하지 않겠다.
Python
복사
스타일
연산자 앞에서는 한칸씩 띄워준다.
상수를 잘 정의하고
상수를 분리해서 코드를 짜자
계산은 함수로 하자. 추상화해서
파이썬 PEP8 을 따르자
화이트 스페이스
이름 규칙
모든 변수와 함수 이름은 소문자로 써 주시고, 여러 단어일 경우 _로 나눠 주세요.
# bad
someVariableName = 1
SomeVariableName = 1
def someFunctionName():
print("Hello")
# good
some_variable_name = 1
def some_function_name():
print("Hello")
Plain Text
복사
모든 상수 이름은 대문자로 써주시고, 여러 단어일 경우 _로 나눠주세요.
# bad
someConstant = 3.14
SomeConstant = 3.14
some_constant = 3.14
# good
SOME_CONSTANT = 3.14
Plain Text
복사
의미 있는 이름
# bad (의미 없는 이름)
a = 2
b = 3.14
print(b * a * a)
# good (의미 있는 이름)
radius = 2
pi = 3.14
print(pi * radius * radius)
Plain Text
복사
# bad (의미 없는 이름)def do_something():
print("Hello, world!")
# good (의미 있는 이름)def say_hello():
print("Hello, world!")
Plain Text
복사
화이트 스페이스
들여쓰기
들여쓰기는 무조건 스페이스 4개를 사용하세요.
# bad (스페이스 2개)
def do_something():
print("Hello, world!")
# bad (스페이스 8개)
i = 0
while i < 10:
print(i)
# good (스페이스 4개)
def say_hello():
print("Hello, world!")
Plain Text
복사
함수 정의
함수 정의 위아래로 빈 줄이 두 개씩 있어야 합니다. 하지만 파일의 첫 줄이 함수 정의인 경우 해당 함수 위에는 빈 줄이 없어도 됩니다.
# bad
def a():
print('a')
def b():
print('b')
def c():
print('c')
# good
def a():
print('a')
def b():
print('b')
def c();
print('c')
Plain Text
복사
괄호 안
괄호 바로 안에는 띄어쓰기를 하지 마세요.
# bad
spam( ham[ 1 ], { eggs: 2 } )
# good
spam(ham[1], {eggs: 2})
Plain Text
복사
함수 괄호
함수 이름과 괄호 사이에 띄어쓰기를 하지 마세요.
# bad
def spam (x):
print (x + 2)
spam (1)
# good
def spam(x):
print(x + 2)
spam(1)
Plain Text
복사
쉼표
쉼표 앞에는 띄어쓰기를 하지 마세요.
# bad
print(x , y)
# good
print(x, y)
Plain Text
복사
지정 연산자
지정 연산자 앞뒤로 띄어쓰기를 하나씩만 해 주세요.
# bad
x=1
x = 1
# good
x = 1
Plain Text
복사
연산자
기본적으로는 연산자 앞뒤로 띄어쓰기를 하나씩 합니다.
# bad
i=i+1
submitted +=1
# good
i = i + 1
submitted += 1
Plain Text
복사
하지만 연산의 "우선 순위"를 강조하기 위해서는, 연산자 앞뒤로 띄어쓰기를 붙이는 것을 권장합니다.
# bad
x = x * 2 - 1
hypot2 = x * x + y * y
c = (a + b) * (a - b)
# good
x = x*2 - 1
hypot2 = x*x + y*y
c = (a+b) * (a-b)
Plain Text
복사
코멘트
일반 코드와 같은 줄에 코멘트를 쓸 경우, 코멘트 앞에 띄어쓰기 최소 두 개를 해 주세요.
# bad
x = x + 1# 코멘트
# good
x = x + 1 # 코멘트
Plain Text
복사
While문
while 조건 부분: #불린 값, 명제들
수행 부분
i=1
while i<=3:
print("나는 잘생겼다!")
i+=1
Python
복사
if문
if 조건 부분:
수행 부분
if temperature <=10:
print("자켓을 입는다.")
else:
print("자켓을 입지 않는다.")
if 조건 부분:
수행 부분
elif 조건 부분:
수행 부분
elif 조건 부분
수행 부분
#조건이 맞으면 그 밑에껀 전부 무시
Python
복사
break문
만약 while문의 조건 부분과 상관 없이 반복문에서 나오고 싶으면, break문을 사용하면 됩니다.
i = 100
while True:
# i가 23의 배수면 반복문을 끝냄
if i % 23 == 0:
break
i = i + 1
print(i)
Python
복사
115
Plain Text
복사
continue문
현재 진행되고 있는 수행 부분을 중단하고 바로 조건 부분을 확인하고 싶으면 continue문을 쓰면 됩니다.
i = 0
while i < 15:
i = i + 1
# i가 홀수면 print(i) 안 하고 바로 조건 부분으로 돌아감
if i % 2 == 1:
continue
print(i)
Python
복사
2
4
6
8
10
12
14
Plain Text
복사
List
numbers = [2,3,5,7,11,13]
names = ["윤수","혜린","태호","영훈"]
print(names[1])
print(numbers[-1])
#list slicing
numbers[0:4] #index 0~3까지
numbers[:3] #index 2까지
#함수
numbers = []
print(len(numbers)) #요소의 개수
numbers.append(5) #리스트에 값 추가
numbers.append(8)
print(numbers) # [5,8]
print(len(numbers)) # 2
numbers = [2,3,5,7,11,13,17,19]
del numbers[3]
print(numbers) #3번 인덱스를 지운다
numbers.insert(4,37) #4번 index에 37을 삽입해라
#2,3,4,5,37,11,13,17,19
#정렬
numbers = [19,13,2,5,3,11,7,17]
new_list = sorted(numbers) #오름차순
new_list = sorted(numbers, reverse = True) #내림차순
print(numbers) # sorted함수는 새로운 정렬된 리스트를 만들어서 리턴한다.
numbers.sort() # return 하는게 없다. 즉, numbers를 프린트해야 정렬된 리스트가 나온다.
numbers.sort(reverse = True) #내림차순
print(numbers.sort())
print(numbers)
# sorted -> 어떤 이터러블 객체도 받을 수 있다.
# sort -> 리스트만을 위한 메소드이다
#리스트에서 값의 존재 확인하기
#어떤 값이 리스트에 있는지 확인하는 함수를 써보겠습니다.
# value가 some_list의 요소인지 확인
def in_list(some_list, value):
i = 0
while i < len(some_list):
# some_list에서 value를 찾으면 True를 리턴
if some_list[i] == value:
return True
i = i + 1
# 만약 some_list에서 value를 발견하지 못했으면 False를 리턴
return False
# 테스트
primes = [2, 3, 5, 7, 11, 13, 17, 19, 23]
print(in_list(primes, 7))
print(in_list(primes, 12))
True
False
쓰는데 아주 어렵지는 않습니다.
하지만 리스트에 값의 존재를 확인하는 것은 너무 자주 있는 일이라서
파이썬에 이미 이 기능이 내장되어 있습니다. in이라는 키워드를 쓰면 됩니다.
primes = [2, 3, 5, 7, 11, 13, 17, 19, 23]
print(7 in primes)
print(12 in primes)
True
False
거꾸로 값이 없는지 확인하려면 in 앞에 not을 붙이면 됩니다.
primes = [2, 3, 5, 7, 11, 13, 17, 19, 23]
print(7 not in primes)
print(12 not in primes)
False
True
#리스트 안의 리스트 (Nested List)
리스트 안에는 또 다른 리스트가 있을 수 있습니다. 이를 영어로 nested list라고 부릅니다.
# 세 번의 시험을 보는 수업
grades = [[62, 75, 77], [78, 81, 86], [85, 91, 89]]
# 첫 번째 학생의 성적
print(grades[0])
# 세 번째 학생의 성적
print(grades[2])
# 첫 번째 학생의 첫 번째 시험 성적
print(grades[0][0])
# 세 번째 학생의 두 번째 시험 성적
print(grades[2][1])
# 첫 번째 시험의 평균
print((grades[0][0] + grades[1][0] + grades[2][0]) / 3)
[62, 75, 77]
[85, 91, 89]
62
91
75.0
# sort 메소드
저번에 정렬된 새로운 리스트를 리턴시켜주는 sorted 함수를 보여드렸습니다.
some_list.sort()는 새로운 리스트를 생성하지 않고 some_list를 정렬된 상태로 바꿔줍니다.
numbers = [5, 3, 7, 1]
numbers.sort()
print(numbers)
[1, 3, 5, 7]
#reverse 메소드
some_list.reverse()는 some_list의 원소들을 뒤집어진 순서로 배치합니다.
numbers = [5, 3, 7, 1]
numbers.reverse()
print(numbers)
[1, 7, 3, 5]
#index 메소드
some_list.index(x)는some_list에서 x의 값을 갖고 있는 원소의 인덱스를 리턴해줍니다.
members = ["영훈", "윤수", "태호", "혜린"]
print(members.index("윤수"))
print(members.index("태호"))
1
2
#remove 메소드
some_list.remove(x)는some_list에서 첫 번째로 x의 값을 갖고 있는 원소를 삭제해줍니다.
fruits = ["딸기", "당근", "파인애플", "수박", "참외", "메론"]
fruits.remove("파인애플")
print(fruits)
['딸기', '당근', '수박', '참외', '메론']
Python
복사
For
for number in my_list:
print(number)
for i in range(3,11): #3~10까지 범위
print(i)
for i in range(10): #0~9까지 범위
print(i)
for i in range(3,17,3): # 3부터 16까지 중 간격 3 , 3,6,9,12,15
print(i)
Python
복사
Dictionary
Key - Value
my_dictionary = {
5: 25,
2: 4,
3: 9
}
my_dictionary[3] #키 3에 해당하는 value를 구하는 것
#list의 index는 정수인데 반해 dictionary의 키는 정수일 필요가 없다.
#순서의 개념이 없다.
dict[key] = value
#활용법
my_family = {
'엄마' : '김자옥',
'아빠' : '이석진',
'아들' : '이동민',
'딸' : '이지영'
}
print('성태호' in my_family.values()) # false .values() 메소드는 값을 찾아줌
for value in my_family.values():
print(value)
my_family.keys() #key값 모두 찾기
for key,value in my_family.items():
print(key,value)
Python
복사
Aliasing
x = [2,3,5,7,11]
y = x
y[2] = 4
print(x) #2,3,4,7,11
print(y) #2,3,4,7,11
x=[2,3,5,7,11]
y = list(x)
y[2] = 4
print(x)
print(y)
x = 5
y = x
y = 3
print(x)
print(y)
Python
복사
list & 문자열
alphabet_list = ['A','B','C','D','E',F','G','H','I','J']
indexing 가능
alphabet_string = 'ABCDEFGHI'
alphabet_string[0]
alphabet_string[1]
문자열도 슬라이싱 가능
문자열도 len 함수 가능
문자열은 수정이 불가능함
문자열 더하기는 문자열을 수정한 것이 아니라 새로운 문자열을 만들어낸 것이다.
Python
복사
Module
import calculator #module이다.
같은 폴더에 있는 파일만 불러올 수 있다.
caluclator안에 있는 함수들을 사용할 수 있다.
caluclator.add(2,5)
calculator.substract
import calculator as cals #module이름을 calc로 지정
calc.add(2,5)
from calculator import add,mulitply #calculator함수에서 add,multiply를 불러온다
add(2,5)
from calculator import * #calculator 모듈 내 함수를 전부 불러오기 , 함수의 출처가 불분명해진다.
Python
복사
standard library
상당 쓸법한 기능은 이미 구현되어있다.
import math
print(math.log10(100))
print(math.cos(0))
import random
random.random() # 0.0~1.0 사이의 랜덤한 함수 출력
randint 함수
randint는 두 수 사이의 어떤 랜덤한 정수를 리턴하는 함수입니다.
randint(a, b)를 하면, a ≤ N ≤ b를 만족하는 어떤 랜덤한 정수 N을 리턴하는 것이죠.
import random
print(random.randint(1, 20))
print(random.randint(1, 20))
print(random.randint(1, 20))
print(random.randint(1, 20))
print(random.randint(1, 20))
8
3
6
6
2
1 이상, 20 이하의 수 다섯 개를 출력했는데요. 보시다시피 매번 다른 랜덤한 수가 출력되었습니다. 여러분이 실행하시면 아마 또 다른 결과가 나오겠죠?
uniform 함수
uniform은 두 수 사이의 랜덤한 소수를 리턴하는 함수입니다. randint와 다른 것은 리턴하는 값이 정수가 아니라 소수라는 점입니다.
uniform(a, b)를 하면, a ≤ N ≤ b를 만족하는 어떤 랜덤한 소수 N을 리턴하는 것이죠.
import random
print(random.uniform(0, 1))
print(random.uniform(0, 1))
print(random.uniform(0, 1))
print(random.uniform(0, 1))
print(random.uniform(0, 1))
0.08811632754196952
0.599056286966887
0.03005761564442677
0.45302183459579204
0.5120418463594933
0 이상, 1 이하의 수 다섯 개를 출력했는데요. 보시다시피 매번 다른 랜덤한 수가 출력되었습니다. 여러분이 실행하시면 아마 또 다른 결과가 나오겠죠?
import os
os.getlogin() #현재 컴퓨터에 로그인된 계정을 확인할 수 있다.
os.getcwd() #현재 이 파일이 있는 폴더의 경로
Python
복사
datetime 모듈
import datetime
Plain Text
복사
스탠다드 라이브러리에 있는 datetime 모듈은 '날짜'와 '시간'을 다루기 위한 다양한 '클래스'를 갖추고 있습니다. '클래스' 개념은 아직 배우지 않았지만, 일단은 몰라도 이 모듈을 사용하는 데에는 문제 없습니다.
2020년 3월 14일을 파이썬으로 어떻게 표현할 수 있을까요? 이렇게 하면 됩니다.
pi_day = datetime.datetime(2020, 3, 14)
print(pi_day)
print(type(pi_day))
Plain Text
복사
2020-03-14 00:00:00
<class 'datetime.datetime'>
Plain Text
복사
보시다시피 시간은 자동으로 00시 00분 00초로 설정되었는데요. 우리가 시간까지도 직접 정할 수 있습니다.
pi_day = datetime.datetime(2020, 3, 14, 13, 6, 15)
print(pi_day)
print(type(pi_day))
Plain Text
복사
2020-03-14 13:06:15
<class 'datetime.datetime'>
Plain Text
복사
오늘 날짜
우리가 날짜와 시간을 정해 주는 게 아니라, 코드를 실행한 '지금 이 순간'의 날짜와 시간을 받아 오고 싶다면? 이렇게 하면 됩니다.
today = datetime.datetime.now()
print(today)
print(type(today))
Plain Text
복사
2020-04-05 17:49:12.360266
<class 'datetime.datetime'>
Plain Text
복사
timedelta
두 datetime 값 사이의 기간을 알고 싶으면, 마치 숫자 뺄셈을 하듯이 그냥 빼면 됩니다.
today = datetime.datetime.now()
pi_day = datetime.datetime(2020, 3, 14, 13, 6, 15)
print(today - pi_day)
print(type(today - pi_day))
Plain Text
복사
22 days, 4:42:57.360266
<class 'datetime.timedelta'>
Plain Text
복사
보시다시피 두 datetime 값을 빼면, timedelta라는 타입이 나오는데요. 이건 날짜 간의 차이를 나타내는 타입이라고 생각하시면 됩니다.
반대로 timedelta를 생성해서 datetime 값에 더해 줄 수도 있습니다.
today = datetime.datetime.now()
my_timedelta = datetime.timedelta(days=5, hours=3, minutes=10, seconds=50)
print(today)
print(today + my_timedelta)
Plain Text
복사
2020-04-05 17:54:24.221660
2020-04-10 21:05:14.221660
Plain Text
복사
datetime 해부하기
datetime 값에서 '연도'나 '월' 같은 값들을 추출하려면 어떻게 해야 할까요?
아주 간단합니다!
today = datetime.datetime.now()
print(today)
print(today.year) # 연도
print(today.month) # 월
print(today.day) # 일
print(today.hour) # 시
print(today.minute) # 분
print(today.second) # 초
print(today.microsecond) # 마이크로초
Plain Text
복사
2020-04-05 17:59:21.709817
2020
4
5
17
59
21
709817
Plain Text
복사
datetime 포맷팅
datetime 값을 출력하면 별로 예쁘지 않습니다. 하지만 strftime을 사용하면, 우리 입맛대로 바꿀 수 있습니다.
today = datetime.datetime.now()
print(today)
print(today.strftime("%A, %B %dth %Y"))
Plain Text
복사
2020-04-05 18:09:55.233501
Sunday, April 05th 2020
Plain Text
복사
%A, %B, %d, %Y와 같은 걸 포맷 코드라고 하는데요. 어떤 포맷 코드를 사용할지는 아래 표를 참고해 주세요.
Input
name = input("이름을 입력하세요: ") #어떤 값을 입력받을지 설명하는 용도
print(name)
x = int(input("숫자를 입력하세요: "))
print(x+5) #오류, input함수가 받는거는 항상 문자열이다.
Python
복사
파일 읽기
with open('chicken.txt','r') as f: #open함수를 쓰면 파일을 열 수 있음
#(파일 이름, r/w)
#읽어들인 파일을 f라는 변수로 선언
#파일이 같은 폴더에 있으니까 파일 이름만 쓰는게 가능함
#data/chicken.txt 라고 써야함. 경로를 알려줘야함
#type -> io.TextIOWrapper
for line in f:
print(line)
#Strip
# print문이 원래 엔터를 친다.
#텍스트 파일 출력시 나오는 엔터들을 어떻게 해결할까
strip -> 화이트스페이스를 없앤다. " ", "\t", "\n"
print(" abc def ".strip()) # abc def
for line in f:
print(line.strip())
#split
my_string = "1. 2. 3. 4. 5. 6"
print(my_string.split("."))
#split -> 특정 문자를 기준으로 잘라서 list에 넣어준다.
화이트스페이스를 기반으로 나누고 싶다면
"~~~~".split() #파라미터를 아무것도 안 넣으면 된다.
Python
복사
파일 쓰기
with open('new_file.txt','w') as f: # write, 덮어쓴다.
f.write("Hello world\n")
f.write("My name is Codeit.\n")
with open('new_file.txt','a') as f: #파일 끝에 더하고 싶을 때, append
#파일이 없으면 새로 쓰는 거고, 있으면 이어 쓰는 것
f.write("Hello world\n")
f.write("My name is Codeit.\n")
Python
복사
모듈
기능을 수정하고 시픙면 어떤 부분을 바꿔야하는지? 어느 부분이 어떤 역할을 하는지?
여러가지 기능을 정리해둔 파이썬 파일, 코드를 파일 단위로 나눈다.
게임에 있어서, (아이템, 거래 기능) 파일 하나를 모듈이라 한다. 모듈화시킨다
코드를 재사용할 수 있다.
특정 기능이 공통적으로 쓰이는 경우 -> 모듈을 사용해서 재사용가능하다.
from area import circle,square
# import area as ar
# from area import square as sq
# from area import * → 권장하지 않는다. 함수가 어디서 왔는지 알 수 없기 때문
print(circle(2))
print(dir(area)) # __builtins__ : 특수 변수, 던더(더블 언더스코어), 던더 빌트인
print(dir()) #모듈을 임포트하면, 모듈의 이름만 정의되고 함수나 변수는 정의되지 않는다.
from area import circle,square : print(dir())하면 circle,square가 뜬다.
Python
복사
네임스페이스
파일에서 정의된 모든 이름들을 의미한다.
dir함수는 파일의 네임스페이스를 return해주는 것이다.
스탠다드 라이브러리
int,float,string 같은 자료형
print, dir 같은 내장함수, 유용한 기능을 제공하는 모듈들(스탠다드 모듈)
import sys
sys.path.append(~~~경로)입력하면 실행시 모듈을 검색하는 경로를 추가해준다.
math
math는 기본적인 수학 모듈입니다. 여러 수학적인 함수를 제공해 줍니다.
import math
# 코사인 함수 (모든 삼각함수는 라디안을 사용합니다)
print(math.cos(0))
# 로그 함수
print(math.log10(100))
Python
복사
1.0
2.0
Python
복사
random
random 모듈은 랜덤 한 숫자를 생성하기 위한 다양한 함수들을 제공해 줍니다.
import random
# 랜덤한 정수 1 <= N <= 20
print(random.randint(1, 20))
# 랜덤한 소수 0 <= x <= 1
print(random.uniform(0, 1))
Python
복사
3
0.599056286966887
Python
복사
datetime
datetime 모듈은 날짜와 시간을 다루기 위한 다양한 '클래스'를 갖추고 있습니다. 클래스의 개념을 잘 모르셔도 이 모듈을 사용하는 데에는 문제없습니다.
import datetime
# 현재 시간과 날짜
today = datetime.datetime.now()
print(today)
# 출력값을 "요일, 월 일 연도"로 포매팅
print(today.strftime("%A, %B %dth %Y"))
# 특정 시간과 날짜
pi_day = datetime.datetime(2020, 3, 14, 13, 6, 15)
print(pi_day)
# 두 datetime의 차이
print(today - pi_day)
Python
복사
2020-08-26 14:09:36.361025
Wednesday, August 26th 2020
2020-03-14 13:06:15
165 days, 1:03:21.361025
Plain Text
복사
os
OS는 Operating System, 즉 운영체제의 약자입니다. os 모듈을 통해서 파이썬으로 운영체제를 조작하거나 운영체제에 대한 정보를 가져올 수 있습니다.
import os
# 현재 어떤 계정으로 로그인 돼있는지 확인
print(os.getlogin())
# 현재 파일의 디렉토리 확인
print(os.getcwd())
# 현재 프로세스 ID 확인
print(os.getpid())
Python
복사
codeit
/Users/codeit/PycharmProjects/standard_modules
2346
Plain Text
복사
os.path
os.path 모듈은 파일 경로를 다룰 때 쓰입니다.
import os.path
# 프로젝트 디렉토리 경로 '/Users/codeit/PycharmProjects/standard_modules'# 현재 파일 경로 '/Users/codeit/PycharmProjects/standard_modules/main.py'# 주어진 경로를 절대 경로로
print(os.path.abspath('..'))
# 주어진 경로를 현재 디렉토리를 기준으로 한 상대 경로로
print(os.path.relpath('/Users/codeit/PycharmProjects'))
# 주어진 경로들을 병합
print(os.path.join('/Users/codeit/PycharmProjects', 'standard_modules'))
Python
복사
/Users/codeit/PycharmProjects
..
/Users/codeit/PycharmProjects/standard_modules
Python
복사
re
프로그래밍에서 Regular Expression (RegEx, re, 한국어로는 정규 표현식)은 특정한 규칙/패턴을 가진 문자열을 표현하는 데 사용됩니다.
import re
# 알파벳으로 구성된 단어들만 매칭
pattern = re.compile('^[A-Za-z]+$')
print(pattern.match('I'))
print(pattern.match('love'))
print(pattern.match('python3'))
print()
# 숫자가 포함된 단어들만 매칭
pattern = re.compile('.*\d+')
print(pattern.match('I'))
print(pattern.match('love'))
print(pattern.match('python3'))
Python
복사
<re.Match object; span=(0, 1), match='I'>
<re.Match object; span=(0, 4), match='love'>
None
None
None
<re.Match object; span=(0, 7), match='python3'>
Python
복사
pickle
pickle 을 사용하면 파이썬 오브젝트(객체)를 바이트(byte) 형식으로 바꿔서 파일에 저장할 수 있고 저장된 오브젝트를 읽어올 수도 있습니다.
import pickle
# 딕셔너리 오브젝트
obj = {'my': 'dictionary'}
# obj를 filename.pickle 파일에 저장with open('filename.pickle', 'wb') as f:
pickle.dump(obj, f)
# filename.pickle에 있는 오브젝트를 읽어옴 with open('filename.pickle', 'rb') as f:
obj = pickle.load(f)
print(obj)
Python
복사
{'my': 'dictionary'}
Plain Text
복사
json
json 모듈은 pickle과 비슷하지만 오브젝트를 JSON 형식으로 바꿔줍니다. JSON 형식에 맞는 데이터 (기본 데이터 타입들, 리스트, 딕셔너리)만 바꿀 수 있습니다.
import json
# 딕셔너리 오브젝트
obj = {'my': 'dictionary'}
# obj를 filename.json 파일에 저장with open('filename.json', 'w') as f:
json.dump(obj, f)
# filename.json에 있는 오브젝트를 읽어옴 with open('filename.json', 'r') as f:
obj = json.load(f)
print(obj)
Python
복사
{'my': 'dictionary'}
Python
복사
copy
copy 모듈은 파이썬 오브젝트를 복사할 때 쓰입니다.
import copy
# '=' 연산자는 실제로 리스트를 복사하지 않음# 리스트를 복사하려면 슬라이싱을 사용하거나 copy.copy() 함수를 사용해야 함
a = [1, 2, 3]
b = a
c = a[:]
d = copy.copy(a)
a[0] = 4
print(a, b, c, d)
# 하지만 오브젝트 안에 오브젝트가 있는 경우 copy.copy() 함수는 가장 바깥에 있는 오브젝트만 복사함 # 오브젝트를 재귀적으로 복사하려면 copy.deepcopy() 함수를 사용해야 함
a = [[1,2,3], [4,5,6], [7,8,9]]
b = copy.copy(a)
c = copy.deepcopy(a)
a[0][0] = 4
print(a, b, c)
Python
복사
[4, 2, 3] [4, 2, 3] [1, 2, 3] [1, 2, 3]
[[4, 2, 3], [4, 5, 6], [7, 8, 9]] [[4, 2, 3], [4, 5, 6], [7, 8, 9]] [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
Python
복사
sqlite3
sqlite3 모듈을 통해 파이썬에서 SQLite 데이터베이스를 사용할 수 있습니다.
import sqlite3
# 데이터베이스 연결
conn = sqlite3.connect('example.db')
# SQL 문 실행
c = conn.cursor()
c.execute('''SELECT ... FROM ... WHERE ... ''')
# 가져온 데이터를 파이썬에서 사용
rows = c.fetchall()
for row in rows:
print(row)
# 연결 종료
conn.close()
Python
복사
스크립트 vs 모듈
스크립트는 실제로 프로그램을 작동시키는 코드를 담은, 실행 용도의 파일을 뜻합니다.
모듈은 프로그램에 필요한 변수들이나 함수들을 정의해 놓은, 임포트 용도의 파일을 뜻합니다.
우리가 이전 영상에서 봤던 면적 계산기 프로그램은 두 파일로 구성돼 있습니다.
area.py
PI = 3.14
# 원의 면적을 구해 주는 함수def circle(radius):
return PI * radius * radius
# 정사각형의 면적을 구해 주는 함수def square(length):
return length * length
Python
복사
area 파일에서는 프로그램에 필요한 함수들을 정의하기만 하고 함수들을 사용하지는 않습니다.
run.py
import area
x = float(input('원의 지름을 입력해 주세요: '))
print('지름이 {}인 원의 면적은 {}입니다.\n'.format(x, area.circle(x)))
y = float(input('정사각형의 변의 길이를 입력해 주세요: '))
print('변의 길이가 {}인 정사각형의 면적은 {}입니다.'.format(y, area.square(y)))
Python
복사
실제로 함수들을 사용하는 코드는 run 파일에 있습니다. 이 파일을 실행시키면 프로그램이 작동합니다.
따라서 area 파일은 모듈이고 run 파일은 스크립트라고 할 수 있습니다.
그런데 스크립트와 모듈은 우리가 그 안에 어떤 내용을 담을지 정한 것일 뿐 파일 자체에 특별한 차이가 있는 건 아니기 때문에 어떤 파이썬 파일이든 직접 실행할 수도 있고 다른 곳에서 불러올 수도 있습니다. 그러니까 어떤 파일은 상황에 따라 모듈이 될 수도 있고 스크립트가 될 수도 있는 거죠. 예를 들어 아래와 같은 코드를 area.py에 추가하면:
area.py
PI = 3.14
# 원의 면적을 구해 주는 함수def circle(radius):
return PI * radius * radius
# 정사각형의 면적을 구해 주는 함수def square(length):
return length * length
# circle 함수 테스트
print(circle(2) == 12.56)
print(circle(5) == 78.5)
# square 함수 테스트
print(square(2) == 4)
print(square(5) == 25)
Python
복사
area 파일을 함수들을 테스트해 주는 스크립트로 사용할 수도 있습니다.
하지만 여기서 문제가 생기는데 그건 area 모듈을 임포트해도 위 테스트 코드가 실행된다는 겁니다. 모듈을 임포트하면 모듈 안에 있는 코드가 처음부터 끝까지 모두 실행되기 때문이죠. 이 문제를 해결하기 위해서는 __name__이라는 특수 변수를 사용해야 합니다.
name 특수 변수
name 이란?
__name__은 모듈의 이름을 저장해 놓은 변수입니다.
__name__의 값은 파이썬이 알아서 정해 주는데요.
•
파일을 직접 실행하면 __name__은 __main__으로 설정됩니다
•
파일을 임포트하면 __name__은 모듈 이름으로 설정됩니다.
예를 들어 area 파일에서 __name__을 아래처럼 출력해 보면:
area.py
print(__name__)
Python
복사
area 파일을 직접 실행할 경우 __main__이라고 나오고:
__main__
Plain Text
복사
area 파일을 임포트할 경우 area라고 나오는 거죠:
area
Plain Text
복사
if __name__ == '__main__'
__name__을 사용하면 파일이 직접 실행되냐 아니면 임포트되냐에 따라서 코드의 흐름을 제어할 수 있습니다.
파일이 직접 실행될 때만 실행하고 싶은 코드는 if __name__ == '__main__'이라는 조건문 안에 넣어주면 됩니다.
area.py
PI = 3.14
# 원의 면적을 구해 주는 함수def circle(radius):
return PI * radius * radius
# 정사각형의 면적을 구해 주는 함수def square(length):
return length * length
if __name__ == '__main__':
# circle 함수 테스트
print(circle(2) == 12.56)
print(circle(5) == 78.4)
# square 함수 테스트
print(square(2) == 4)
print(square(5) == 25)
Python
복사
area 파일을 직접 실행시키면 파일의 __name__은 __main__이 되기 때문에 조건문 안에 있는 코드가 실행되지만 area 파일을 임포트하면 __name__은 area가 되기 때문에 조건문 안에 있는 코드가 실행되지 않습니다.
그럼 이제 area 파일을 모듈처럼 쓸 수도 있고 스크립트처럼 쓸 수도 있겠죠?
패키지
모듈 : 코드를 작은 단위로 나눠서 저장해놓은 파일
모듈이 엄청 많아질 수도 있다. 모듈을 한 묶음으로 묶어 놓는 것 -> 패키지
item모듈, 거래 모듈 -> 상점 패키지를 만든다.
모듈과 패키지를 사용하면 프로그램의 구성 요소를 잘 구성하고 재활용한다.
항상 패키지 안에는 init파일을 만들어줘야한다.
init양쪽에 언더스코어가 존재. init파일은 패키지를 초기화할 때 사용된다.
처음으로 패키지나 패키지 안에 있는 어떤 것들을 임포트하면 init파일이 실행된다.
init파일에서 모듈 임포트하기
import shapes #패키지만 임포트해서 모듈을 사용하려고 하면 에러가 난다.
##__init__.py
from shapes import area, volume #임포트하고 싶은 모듈만 한정적으로 임포트하면 된다.
import shapes
print(shapes.area.square(3))
print(shapes.volume.cube(2))
## 다른 경우
#__init__.py
from shapes.area import circle, square
#run.py
print(shapes.circle(3)) #shapes패키지 안에서 circle함수를 직접 가져왔기 때문에
# area를 건너뛰고, circle을 바로 사용할 수 있다.
Python
복사
init파일에서 변수 정의하기
#여러 모듈에서 변수가 필요할 때
#패키지 안에서 한 번만 정의한다.
#그러려면 shapes패키지의 __init__.py파일에 넣어주면 된다.
# 그러면 각 모듈에서 변수,객체,함수를 import를 해줘야한다.
# from shapes import PI
#from shapes.area import * #area모듈에 있는 모든 변수와 함수를 가져오라
#from shapes import * #shapes안에 있는 모듈을 다 들고와라 --> 안에 있는 모듈이 임포트 안된다.ㅠ
# 그렇게 하려면 init파일을 고쳐야한다.
# init.py
__all__ == ['area','volume']
#내용 전체를 가져오라 했을 때, 전체가 무엇인지 정의하는 것.
#import * 를 했을 때 뭘 가져오는지 정의하는 변수 = __all__
#area.py
__all__ = ['PI','cirlce']
# from shapes.area import *
Python
복사
서브패키지란?
패키지 안에는 모듈도 있을 수 있고 다른 패키지들이 있을 수도 있습니다. 우리는 패키지 안에 또 다른 패키지가 있을 때 안에 있는 패키지를 서브패키지라고 합니다.
예를 들어 우리는 mymath라는 패키지를 만들고 그 안에 shapes 패키지랑 stats라는 패키지를 넣어주었습니다. mymath 패키지의 구조는 아래와 같은데요.
mymath/
shapes/
__init__.py
area.py
volume.py
stats/
__init__.py
average.py
spread.py
Plain Text
복사
mymath/shapes/area.py
PI = 3.14
# 원의 면적을 구해 주는 함수
def circle(radius):
return PI * radius * radius
# 정사각형의 면적을 구해 주는 함수
def square(length):
return length * length
Plain Text
복사
mymath/shapes/volume.py
PI = 3.14
# 구의 부피를 구해 주는 함수def sphere(radius):
return (4/3) * PI * radius * radius * radius
# 정육면체의 부피를 구해 주는 함수def cube(length):
return length * length * length
Plain Text
복사
mymath/stats/average.py
# 데이터의 평을 구해 주는 함수def data_mean(data):
return sum(data) / len(data)
# 데이터의 중앙값을 구해 주는 함수def data_median(data):
data.sort()
n = len(data)
if n % 2 == 0:
# 데이터 개수가 짝수면 중앙에 위치한 두 값의 평군을 구함# [a, b, c, d, e, f] -> median = (c+d) / 2return (data[n/2] + data[(n/2)-1]) / 2
else:
# [a, b, c, d, e] -> median = creturn data[(n-1)/2]
Plain Text
복사
mymath/stats/spread.py
# 데이터의 범위를 구해 주는 함수def data_range(data):
return max(data) - min(data)
Plain Text
복사
따라서 shapes 패키지랑 stats 패키지는 서브패키지라고 할 수 있습니다.
서브패키지도 결국 패키지이기 때문에 우리가 지금까지 배운 임포트 방식들을 사용하면 됩니다. 그럼 모듈과 패키지 임포트를 총정리해 보겠습니다.
임포트 총정리
import ...
첫 번째 방식은 import ... 방식입니다.
run.py
# 패키지 임포트
import mymath
# 서브패키지 임포트
import mymath.shapes
# 모듈 임포트
import mymath.shapes.area
# 모듈 안에 있는 변수나 함수는 이 방식으로 임포트 할 수 없음
import mymath.shapes.area.circle # 오류
Python
복사
그냥 import 뒤에 가져오고 싶은 모듈이나 패키지를 써 주면 됩니다. 하지만 모듈 안에 있는 변수나 함수는 이 방식으로 임포트 할 수 없습니다.
그리고 (서브)패키지를 임포트할 때는 (서브)패키지 안에서 임포트하고 싶은 걸 (서브)패키지의 init 파일에 적어줘야겠죠?
from ... import ...
두 번째 방식은 from ... import ... 방식입니다.
run.py
# 패키지 안에 있는 패키지 임포트
from mymath import shapes
# 패키지 안에 있는 모듈 임포트
from mymath.shapes import area
# 모듈 안에 있는 함수 임포트
from mymath.shapes.area import circle
# import 뒤에는 . 을 쓸 수 없음
from mymath import shapes.area # 오류
Python
복사
from 뒤에는 모듈이나 패키지가 올 수 있습니다. import 뒤에는 모듈이나 패키지 안에서 가져오고 싶은 걸 써 줍니다. import 뒤에는 . 을 쓸 수 없습니다.
as 키워드
그리고 항상 임포트 문 뒤에 as 키워드를 써서 임포트하는 것의 이름을 바꿔줄 수 있습니다.
상대 경로 임포트
from mymath.shapes import area,volume #init 파일안에 있는 from을 상대경로로 바꿀 수 있음
#같은거
from mymath.shapes.area import *
from .area import *
Python
복사