1일차 - 2/6
코딩을 제일 빨리 배우는 방법 : 남 하는 것 따라 하면서 어떻게든 내가 만들고 싶은 것을 만들어 보는 것
파이썬부터 시작해서 입문 강의 - 일주일도 안 걸릴 듯
1. 코딩에 필요한 준비물 : 컴퓨터
- 어떤 컴퓨터든 상관 없으나 개발을 할 거면 맥북 추천(운영체제 때문)
: 유닉스가 개발환경 세팅, 새로운 개발 도구를 사용하기에 편하다
2. 개발 환경 세팅
http://repl.it : 클라우드 기반 코딩 플랫폼 -> 개발 환경 설치를 하지 않아도 이 웹사이트에서 코딩 가능
1. 시작
print("Hello World!")
Hello World!
2. 변수
x = 1
y = 2
print(x)
print(y)
z = "안녕"
print(z)
1
2
안녕
3. 타입 : 문자, 숫자, boolen
- 숫자
: 정수, 소수 둘 다 지원, 기본적인 사칙연산 지원
x = 1
y = 2
z = 1.2
print(x + y)
print(x - y)
print(x * y)
print(x % y)
print(x ** y)
print(x % y) #mod
: 순서대로 더하기, 빼기, 곱하기, 나누기, 제곱, 나머지
- 문자
: "" 또는 ''
x = "hello"
y = 'bye'
print(x)
print(y)
hello
bye
: 둘 다 나옴
여러 라인을 동시에 : """
x = "hello"
y = 'bye'
z = """
안녕하세요
aSpring입니다
"""
print(x)
print(y)
print(z)
hello
bye
안녕하세요
aSpring입니다
print("안녕" + " 잘 지내니")
안녕 잘 지내니
-> 문자끼리 +로 연결 가능
print("안녕" + "너 혹시 몇 살이니?" + 4)
문자와 숫자를 + 로 연결하려니 에러 -> 같은 형태 끼리만 가능!
-> 숫자를 문자형으로 바꿔주기 : 캐스팅한다 -> str(4)
-> 숫자 4가 아니라 문자 4가 됨
print("안녕" + "너 혹시 몇 살이니?" + str(4))
안녕 너 혹시 몇 살이니? 4
print(3 + 4)
7
x = 4 #숫자 타압
y = "4" #문자열 타입
print(x + y)
역시 에러가 남
같은 타입으로 캐스팅 해주기
1) 숫자 x를 문자형으로 캐스팅
x = 4 #숫자 타압
y = "4" #문자열 타입
print(str(x) + y)
44
2) 문자열 y를 숫자로 캐스팅
x = 4 #숫자 타압
y = "4" #문자열 타입
print(x + int(y))
8
- boolean
: True, False
# 불리안 : boolean
x = True
y = False
print(x)
print(y)
True
False
4. 조건문 : if, if ~ else, if ~ elif
1) 2가 1보다 크면 Hello라고 출력하라
if 2 > 1:
print("Hello")
Hello
-> 조건이 참이므로 Hello가 출력됨
2) 1이 2보다 크면 Hello라고 출력하라
if 1 > 2:
print("Hello")
-> 조건이 False이므로 Hello가 출력되지 않음
3) 1이 2보다 크지 않으면 Hello를 출력하라 : not 사용
if not 1 > 2:
print("Hello")
Hello
4) 여러가지 조건을 줄 수 있다 : and, or
if 1 > 0 and 2 > 1 :
print("Hello")
Hello
-> and : 둘 다 참이므로 Hello 출력
if 0 > 0 and 2 > 1 :
print("Hello")
-> and : 두 조건 중 하나만 참이므로 아무 것도 출력되지 않음
if 0 > 0 or 2 > 1 :
print("Hello")
Hello
-> or : 둘 중에 하나만 참이어도 Hello가 출력 된다
x = 3
if x > 2 :
print("Hello")
Hello
변수 x의 값이 5보다 크면 Hello를, 그렇지 않으면 Hi를 출력하라
x = 3
if x > 5 :
print("Hello")
else : print("Hi")
Hi
변수 x의 값이 5보다 크면 Hello를, x의 값이 3이면 Bye를, 그 외에는 Hi를 출력하라
x = 3
if x > 5 :
print("Hello")
elif x == 3:
print("Bye")
else :
print("Hi")
Bye
-> 위에서 부터 순서대로 계산하므로
-> 가장 먼저 변수 x가 5보다 큰지 보고, True면 Hello 출력, 그렇지 않으면 x가 3과 같은지 보고 True면 Bye출력, 그렇지 않으면 Hi 출력
x = 3
if x > 0 :
print("Hello")
elif x == 3:
print("Bye")
else :
print("Hi")
Hello
-> if, elif의 조건에 모두 해당하지만, 위에서 부터 계산
-> if에 먼저 걸려서 결과는 Bye가 출력됨
5. 함수
- 반복되는 코드를 그룹으로 모아놓은 것
1)
print("철수 : 안녕? 넌 몇 살이니?")
print("영희 : 나? 나는 20")
print("철수 : 안녕? 넌 몇 살이니?")
print("영희 : 나? 나는 20")
print("철수 : 안녕? 넌 몇 살이니?")
print("영희 : 나? 나는 20")
print("철수 : 안녕? 넌 몇 살이니?")
print("영희 : 나? 나는 20")
print("철수 : 안녕? 넌 몇 살이니?")
print("영희 : 나? 나는 20")
철수 : 안녕? 넌 몇 살이니?
영희 : 나? 나는 20
철수 : 안녕? 넌 몇 살이니?
영희 : 나? 나는 20
철수 : 안녕? 넌 몇 살이니?
영희 : 나? 나는 20
철수 : 안녕? 넌 몇 살이니?
영희 : 나? 나는 20
-> 복사 붙여넣기 해서 같은 코드를 반복해줄 수 있지만 번거럽고 코드가 더러워짐
-> 그룹으로 모아서 간단하게 사용해보자
def 함수이름():
반복할 내용
def chat() :
print("철수 : 안녕? 넌 몇 살이니?")
print("영희 : 나? 나는 20")
chat()
철수 : 안녕? 넌 몇 살이니?
영희 : 나? 나는 20
def chat() :
print("철수 : 안녕? 넌 몇 살이니?")
print("영희 : 나? 나는 20")
chat()
chat()
chat()
chat()
철수 : 안녕? 넌 몇 살이니?
영희 : 나? 나는 20
철수 : 안녕? 넌 몇 살이니?
영희 : 나? 나는 20
철수 : 안녕? 넌 몇 살이니?
영희 : 나? 나는 20
-> 그런데, 만약 내가 철수, 영희가 아닌 다른 이름 : 으로 하고 싶으면
-> 함수가 인자(parameter, argument)를 받아오게 하면 된다
def 변수명(인자, 인자 .. ) :
반복할 내용
def chat(name1, name2) :
print("%s : 안녕? 넌 몇 살이니?" % name1)
print("%s : 나? 나는 20" % name2)
chat("알렉스", "윤하")
알렉스 : 안녕? 넌 몇 살이니?
윤하 : 나? 나는 20
-> chat이라는 함수에 name1, name2 라는 두 개의 인자를 받아오기로 했으니
-> chat(인자1, 인자2) 넣어 줘야 함
-> %s : 인자로 문자형을 넣겠다는 의미
알렉스와 윤하의 대화가 아니라 철수와 영희의 대화로 바꾸어 주고 나이도 인자로 받아 오기
def chat(name1, name2, age) :
print("%s : 안녕? 넌 몇 살이니?" % name1)
print("%s : 나? 나는 %d" % (name2, age))
chat("알렉스", "윤하", 10)
chat("철수 ", "영희", 30)
알렉스 : 안녕? 넌 몇 살이니?
윤하 : 나? 나는 10
철수 : 안녕? 넌 몇 살이니?
영희 : 나? 나는 30
-> 인자를 3개 받아 오는데
-> %d의 의미 : 인자로 숫자를 넣겠다는 의미
def chat(name1, name2) :
print(name1 + " : 안녕? 넌 몇 살이니?")
print(name2 + " : 나? 나는 20")
chat("알렉스", "윤하")
chat("aSpring", "로니")
알렉스 : 안녕? 넌 몇 살이니?
윤하 : 나? 나는 20
aSpring : 안녕? 넌 몇 살이니?
로니 : 나? 나는 20
이렇게는 쓰면 안되는 건가?
2)
a = 1
b = 2
c = a + b
x = 1
y = 2
z = x + y
-> 변수 이름은 a, b, c에서 x, y, z로 달라지지만 결국 값을 구하는 식은 두 값을 해주는 것으로 동일
-> 이런식으로 반복되는 것도 함수로 만들어 줄 수 있음
def dsum(a, b) : #함수 dsum은 a와 b라는 인자를 가짐
result = a + b
return result #result라는 function을 실행시키면 줘라
d = dsum(1, 2)
print(d)
3
-> dsum을 호출하면 결과 값 result를 return시킴
-> 변수 d = 함수dsum(인자 1, 2) -> result = 1 + 2 = 3
-> print(변수 d) = print(함수dsum(1, 2) = print(result) = print(3)
def dsum(a, b) : #함수 dsum은 a와 b라는 인자를 가짐
result = a + b
return result #result라는 function을 실행시키면 줘라
d = dsum(2, 4)
print(d)
6
def dsum(a, b) : #함수 dsum은 a와 b라는 인자를 가짐
result = a + b
print(result)
d = dsum(2, 4)
print(d)
6
None
-> return문이 없음
-> 6은 print(result)의 결과이고
-> None은 변수 d(dsum(2, 4))를 print(d)한 것 -> dsum(2, 4)를 d에 집어넣는데 return문이 없어서 받아온 것이 없으므로 d에는 아무 것도 담기지 않음
def dsum(a, b) : #함수 dsum은 a와 b라는 인자를 가짐
result = a + b
return result
d = dsum(2, 4)
print(d)
6. 복습 - 문제 해결해 보기
문제 :
함수 sayHello에 먼저 이름과 나이를 받고,
나이가 10살 미만이면 "안녕"이라고 말해라
나이가 10살에서 20살 사이면 "안녕하세요"라고 말해라
나이가 그 외이면 "안녕하십니까"라고 말해라
def sayHello(name, age) :
if age < 10 :
print("안녕, " + name)
elif age <= 20 and age >= 20 :
print("안녕하세요, " + name)
else :
print("안녕하십니까, " + name)
sayHello("로닝구", 1)
sayHello("알렉스", 20)
sayHello("aSpring", 30)
안녕, 로닝구
안녕하세요, 알렉스
안녕하십니까, aSpring
7. 주석 : #
# 함수 sayHello에 먼저 이름과 나이를 받고,
# 나이가 10살 미만이면 "안녕"이라고 말해라
# 나이가 10살에서 20살 사이면 "안녕하세요"라고 말해라
# 나이가 그 외이면 "안녕하십니까"라고 말해라
def sayHello(name, age) :
if age < 10 :
print("안녕, " + name)
elif age <= 20 and age >= 20 :
print("안녕하세요, " + name)
else :
print("안녕하십니까, " + name)
sayHello("로닝구", 1)
sayHello("알렉스", 20)
sayHello("aSpring", 30)
8. 반복문 : for, while
print("철수 : 안녕 영희야 뭐해?")
print("영희 : 안녕 철수야 그냥 있어.")
철수 : 안녕 영희야 뭐해?
영희 : 안녕 철수야, 그냥 있어.
-> 이 문장을 10번 20번 반복하고 싶으면 계속 복사해서 쓰거나, 함수를 만들어서 쓸 수 있겠으나 횟수가 많아지면 번거로움 -> 반복문 사용
1) for
# for, while
for i in range(10) :
print("철수 : 안녕 영희야 뭐해?")
print("영희 : 안녕 철수야 그냥 있어.")
철수 : 안녕 영희야 뭐해?
영희 : 안녕 철수야, 그냥 있어.
철수 : 안녕 영희야 뭐해?
영희 : 안녕 철수야, 그냥 있어.
철수 : 안녕 영희야 뭐해?
영희 : 안녕 철수야, 그냥 있어.
철수 : 안녕 영희야 뭐해?
영희 : 안녕 철수야, 그냥 있어.
철수 : 안녕 영희야 뭐해?
영희 : 안녕 철수야, 그냥 있어.
철수 : 안녕 영희야 뭐해?
영희 : 안녕 철수야, 그냥 있어.
철수 : 안녕 영희야 뭐해?
영희 : 안녕 철수야, 그냥 있어.
철수 : 안녕 영희야 뭐해?
영희 : 안녕 철수야, 그냥 있어.
철수 : 안녕 영희야 뭐해?
영희 : 안녕 철수야, 그냥 있어.
철수 : 안녕 영희야 뭐해?
영희 : 안녕 철수야, 그냥 있어.
-> 10번 반복해서 나옴
-> for i in range(10) : i라는 변수가 0에서 9까지 변하면서 총 10 번 아래 문장 반복
-> 변수 i가 어떻게 변하는지도 같이 출력해서 확인!(10번 반복은 너무 기니까 편의상 3으로)
# for, while
for i in range(3) :
print(i)
print("철수 : 안녕 영희야 뭐해?")
print("영희 : 안녕 철수야 그냥 있어.")
0
철수 : 안녕 영희야 뭐해?
영희 : 안녕 철수야, 그냥 있어.
1
철수 : 안녕 영희야 뭐해?
영희 : 안녕 철수야, 그냥 있어.
2
철수 : 안녕 영희야 뭐해?
영희 : 안녕 철수야, 그냥 있어.
-> i가 0, 1, 2가 되면서 총 3번 문장을 반복 함
-> 프로그램에서는 모든 숫자가 1이 아닌 0부터 시작함
2) while : for문과 다르게 조건을 지정할 수 있음
# for, while
i = 0
while i < 3 : #i가 3보다 작을 때 아래 문장 실행
print(i)
print("철수 : 안녕 영희야 뭐해?")
print("영희 : 안녕 철수야 그냥 있어.")
i = i + 1 #0 -> 1 -> 2 : 결국은 3번 반복
print() #결과 보기 편하게 개행
for i in range(3) :
print(i)
print("철수 : 안녕 영희야 뭐해?")
print("영희 : 안녕 철수야 그냥 있어.")
-> while로 구현할 수 있는 것은 for로 구현할 수 있고 그 반대의 경우도 마찬가지
-> 경우에 따라서 더 간편한 걸로 사용하면 된다
-> 그러나 while이 더 편한 경우 : 무한루프를 돌려야 할 때
while True :
-> while True인 동안 반복하라 -> 무한으로 돌라는 말
-> 앞에서처럼 while i < 3과 같은 조건이 있을 때는 실행 문장에 i = i+1이 있어서 i가 3보다 작으면 실행이 되니, 언젠가는 조건에 벗어나는 때가 생겨 반복이 종료됨 -> 그러나 while True:의 경우 while 조건에 변수가 없으니 계속 True 상태 -> 즉, 변할 변수가 없음 ->무한으로 계속 돔
무한 루프를 끝내는 방법 : break, continue
4) break : 루프를 돌다가 중간에 끝내고 싶을 때
# for, while
i = 0
while True :
print(i)
print("철수 : 안녕 영희야 뭐해?")
print("영희 : 안녕 철수야 그냥 있어.")
i = i + 1
if i > 2:
break
0
철수 : 안녕 영희야 뭐해?
영희 : 안녕 철수야, 그냥 있어.
1
철수 : 안녕 영희야 뭐해?
영희 : 안녕 철수야, 그냥 있어.
2
철수 : 안녕 영희야 뭐해?
영희 : 안녕 철수야, 그냥 있어.
-> 기본적으로 무한루프를 돌지만 조건을 걸어서 언제 종료시켜줄 지 알려줌 : i가 2보다 크면 종료
-> for에도 적용시켜보기
# for, while
for i in range(100) :
print(i)
print("철수 : 안녕 영희야 뭐해?")
print("영희 : 안녕 철수야 그냥 있어.")
if i > 2:
break
0
철수 : 안녕 영희야 뭐해?
영희 : 안녕 철수야, 그냥 있어.
1
철수 : 안녕 영희야 뭐해?
영희 : 안녕 철수야, 그냥 있어.
2
철수 : 안녕 영희야 뭐해?
영희 : 안녕 철수야, 그냥 있어.
-> for가 기본적으로 100번 돌게 되어있지만 조건을 걸고(i가 2보다 크면), 종료되도록 함
5) continue : continue 아래의 문장은 실행하지 않고 다시 위로 올라감
# for, while
for i in range(3) :
print(i)
print("철수 : 안녕 영희야 뭐해?")
print("영희 : 안녕 철수야 그냥 있어.")
print("로닝구 : 안녕 철수와 영희야!")
0
철수 : 안녕 영희야 뭐해?
영희 : 안녕 철수야, 그냥 있어.
로닝구 : 안녕 철수와 영희야!
1
철수 : 안녕 영희야 뭐해?
영희 : 안녕 철수야, 그냥 있어.
로닝구 : 안녕 철수와 영희야!
2
철수 : 안녕 영희야 뭐해?
영희 : 안녕 철수야, 그냥 있어.
로닝구 : 안녕 철수와 영희야!
# for, while
for i in range(3) :
print(i)
print("철수 : 안녕 영희야 뭐해?")
print("영희 : 안녕 철수야 그냥 있어.")
continue
print("로닝구 : 안녕 철수와 영희야!")
0
철수 : 안녕 영희야 뭐해?
영희 : 안녕 철수야, 그냥 있어.
1
철수 : 안녕 영희야 뭐해?
영희 : 안녕 철수야, 그냥 있어.
2
철수 : 안녕 영희야 뭐해?
영희 : 안녕 철수야, 그냥 있어.
-> continue 아래의 print("로닝구 : 안녕 철수와 영희야!")는 실행하지 않고 print(i)로 다시 올라가버림
-> 특이한 조건에서 특정 부분은 빼고 실행시키고 싶을 때 사용
for i in range(3) :
print(i)
print("철수 : 안녕 영희야 뭐해?")
print("영희 : 안녕 철수야 그냥 있어.")
if i == 1 : #i가 1일 때는 로닝구가 철수와 영희에게 말을 안걸었으면 좋겠음
continue #i가 1일 때는 아래 문장은 건너뛰고 print(i)로 가버림
print("로닝구 : 안녕 철수와 영희야!")
0
철수 : 안녕 영희야 뭐해?
영희 : 안녕 철수야, 그냥 있어.
로닝구 : 안녕 철수와 영희야!
1
철수 : 안녕 영희야 뭐해?
영희 : 안녕 철수야, 그냥 있어.
2
철수 : 안녕 영희야 뭐해?
영희 : 안녕 철수야, 그냥 있어.
로닝구 : 안녕 철수와 영희야!
--> i가 1일 때는 contiunue 아래의 문장(로닝구의 말)은 무시하고 지나가버림 ㅜㅜ
2/7 - 2일차(37:19~)
9. 자료구조 : 리스트, 튜플, 딕셔너리
1) 리스트
x = list()
y = []
print(x)
print(y)
[]
[]
-> x = list()와 y = [] 둘 다 동일
-> list() : 엘리먼트 여러 개를 그루핑 할 때 사용
x = [1, 2, 3, 4]
y = ["hello", "world"]
z = ["hello", 1, 2, 3]
print(x)
print(y)
print(z)
print(x+y)
x = [1, 2, 3, 4]
# 0 1 2 3 번째
print(x[0])
print(x[3])
1
4
list에 있는 엘리먼트를 바꿔치기 할 수도 있다.
x = [1, 2, 3, 4]
# 0 1 2 3 번째
x[3] = 10
print(x)
[1, 2, 3, 10]
x = [1, 2, 3, 4]
print(x[4])
길이
x = [1, 2, 3, 4]
num_elements = len(x)
print(num_elements)
4
정렬
x = [4, 2, 3, 1]
y = sorted(x)
print(y)
[1, 2, 3, 4]
list가 숫자로 이루어져 있을 때,
x = [4, 2, 3, 1]
z = sum(x)
print(z)
10
반복문과 list 같이 사용해 보기
x = [4, 2, 3, 1]
for n in x:
print(n)
4
2
3
1
-> list의 elements를 n에 하나씩 넣어가면서 보여달라
for가 돌면서 n에 4 > 2 > 3 > 1 이렇게 순서대로 들어가고 print(n)이라고 했으니까 출력
x = [4, 2, 3, 1]
y = ["hello", "there"]
for c in y:
print(c)
hello
there
list에서 어떤 한 element가 어느 위치에 있는지 찾고싶을 때
x = [4, 2, 3, 1]
y = ["hello", "there"]
print(x.index(3))
print(y.index("hello"))
2
0
-> list에 없는 element를 찾아달라고 하면 에러가 난다
x = [4, 2, 3, 1]
y = ["hello", "there"]
print(x.index(10))
list에 엘리먼트가 있는지 없는지를 알고싶다(위치는 궁금하지X)
-> hello가 y 안에 있는가?
x = [4, 2, 3, 1]
y = ["hello", "there"]
print("hello" in y)
True
x = [4, 2, 3, 1]
y = ["hello", "there"]
print("bye" in y)
False
조건문과 같이 써보기
x = [4, 2, 3, 1]
y = ["hello", "there"]
if "hello" in y :
print("hello가 있어요")
hello가 있어요
x = [4, 2, 3, 1]
y = ["hello", "there"]
if "hello" in x :
print("hello가 있어요")
-> x안에 hello가 없으므로 나오지 않음
2) 튜플
x = tuple()
y = ()
print(x)
print(y)
()
()
-> 둘 다 괄호가 출력됨! 동일
-> 리스트에서 쓸 수있는 function들은 튜플에서도 사용 가능
x = (1, 2, 3)
y = ('a', 'b', 'c')
z = (1, "hello", "there")
print(x + y)
print('a' in y)
print(z.index(1))
(1, 2, 3, 'a', 'b', 'c')
True
0
튜플과 리스트의 가장 큰 차이점
- 튜플에서는 Assignmnet가 안 됨
- Assignment : 튜플 안의 값을 업데이트 하는 것
x = (1, 2, 3)
y = ('a', 'b', 'c')
z = (1, "hello", "there")
x[0] = 10
-> 튜플은 elements 안에 있는 것을 한 번 만들면 바꾸지 못한다
-> mutable vs immutable
가변 불변
-> list는 mutable : 가변, 값을 바꿀 수 있고
-> 튜플은 immutable : 불변, 값을 바꿀 수 없음
3) 딕셔너리 : 리스트, 튜플과 조금 다른데, 딕셔너리는 key와 value로 이루어져 있는 자료구조
x = dict()
y = {}
print(x)
print(y)
{}
{}
x = {
"name" : "로닝구",
"age" : 1
}
print(x)
print(x["name"]) #x라는 딕셔너리의 name이라는 key에 들어있는 value값이 뭔지
print(x["age"]) #x라는 딕셔너리의 age라는 key에 들어있는 value값이 뭔지
{'name' : '로닝구', 'age' : 1}
로닝구
1
-> key는 name, value는 로닝구
-> key는 age, value는 1
key값에는 불변하는 값들만 들어갈 수 있음 -> 문자열이나 숫자 같은!!
방금 배운 리스트는 "가변"(mutable)이니까 딕셔너리의 Key로 쓸 수 없다.
x = {
0 : "aSpring",
1 : "Hello",
"age" : 20
}
print(x[0]) #x라는 딕셔너리의 name이라는 key에 들어있는 value값이 뭔지
print(x[1]) #x라는 딕셔너리의 age라는 key에 들어있는 value값이 뭔지
print(x["age"])
aSpring
Hello
20
-> 이렇게 여러가지 타입을 넣을 수 있다.
key value
0 aSpring
1 Hello
age 20
리스트와 마찬가지로 딕셔너리에 어떤 키가 있는지 볼 수 있음
x = {
0 : "aSpring",
1 : "Hello",
"age" : 20
}
print("age" in x) #age라는 키가 x에 있는가? True
print("name" in x) #name이라는 키가 x에 있는가? False
True
False
딕셔너리에서 유용한 함수
- keys
x = {
0 : "aSpring",
1 : "Hello",
"age" : 20
}
print(x.keys()) #x의 모든 key를 보여달라
dict_keys([0, 1, 'age'])
- values
x = {
0 : "aSpring",
1 : "Hello",
"age" : 20
}
print(x.values())
dict_values(['aSpring', 'Hello', 20)
x = {
0 : "aSpring",
1 : "Hello",
"age" : 20
}
for key in x :
print(key)
0
1
age
-> x에 있는 key들을 돌려가면서 보여달라
x = {
0 : "aSpring",
1 : "Hello",
"age" : 20
}
for key in x :
print(key) # x의 key값들을 돌려가면서 보여달라
print(x[key]) # 각 key값들의 value값을 보여달라
x = {
0 : "aSpring",
1 : "Hello",
"age" : 20
}
for key in x :
print("key : " + str(key)) # x의 key값들을 돌려가면서 보여달라
print("value : " + str(x[key])) # 각 key값들의 value값을 보여달라
key : 0
value : aSpring
key : 1
value : Hello
key : age
value : 20
딕셔너리도 assignment가능
- 안에 있는 key, value의 값 변경
x = {
0 : "aSpring",
1 : "Hello",
"age" : 20
}
x[0] = "봄"
print(x)
{0: '봄', 1: 'Hello', 'age': 20}
x = {
0 : "aSpring",
1 : "Hello",
"age" : 20
}
x[0] = "봄"
print(x)
x["school"] = "한빛"
print(x)
{0: '봄', 1: 'Hello', 'age': 20, 'school': '한빛'}
-> school이라는 key가 새로 생기고 value값으로는 '한빛'을 가짐
-> 딕셔너리는 원래 있는 값을 바꾸거나 새로운 값을 넣을 수 있음
4. 실습
# <과일 숫자 세는 프로그램 만들기>
# 과일 fruit이라는 리스트에 사과, 사과, 바나나, 바나나, 딸기, 키위, 복숭아, 복숭아, 복숭아가 들어있다
# 이 리스트 안에 각 과일이 몇개씩 들어있는지 알 수 있는 프로그램 짜보기
일단 fruit 리스트
fruit = ["사과", "사과", "바나나", "바나나", "딸기", "키위", "복숭아", "복숭아", "복숭아"]
for f in fruit :
print(f)
사과
사과
바나나
바나나
딸기
키위
복숭아
복숭아
복숭아
-> f에 순서대로 사과, 사과, 바나나.. 가 들어감
딕셔너리를 이용할 것
- 먼저 d라는 딕셔녀리에 f라는 key가 있는지를 볼 것
# <과일 숫자 세는 프로그램 만들기>
# 과일 fruit이라는 리스트에 사과, 사과, 바나나, 바나나, 딸기, 키위, 복숭아, 복숭아, 복숭아가 들어있다
# 이 리스트 안에 각 과일이 몇개씩 들어있는지 알 수 있는 프로그램 짜보기
fruit = ["사과", "사과", "바나나", "바나나", "딸기", "키위", "복숭아", "복숭아", "복숭아"]
d = {}
for f in fruit :
if f in d : #사과라는 key가 d라는 딕셔너리에 들어있는가?
d[f] = d[f] + 1 #d["사과"] -> 사과라는 키의 value값에 + 1을 해주어라
else : #사과라는 key가 d에 없으면
d[f] = 1 #d["사과"] = 1 -> 딕셔너리 d에 "사과"라는 키를 넣고, key"사과"의 value값은 1로 하라
print(d)
2/8 - 3일차(1:00:34 ~ )
1. 클래스와 오브젝트
- 빵 만드는 빵 틀 : 클래스
- 이 틀로 찍어낸 빵 : 오브젝트 == 인스턴스
- 클래스 : 함수와 변수들의 합, 모아놓은 것
- 오브젝트 : 클래스를 이용해 만들어낸 물체
class Person:
def say_hello(self): #이 함수는 인자 self 하나를 가진다
print("안녕!")
p = Person()
p.say_hello()
안녕!
-> self는 무엇일까?
class Person:
name = "로니"
def say_hello(self): #이 함수는 인자 self 하나를 가진다
print("안녕! 나는 " + self.name)
p = Person()
p.say_hello()
안녕! 나는 로니
-> self : 만들어진 물체(p)에 변수(name)를 활용해야 할 때 사용
-> 만약 Person 을 여러 개를 만들고싶으면
class Person:
name = "로니"
def say_hello(self): #이 함수는 인자 self 하나를 가진다
print("안녕! 나는 " + self.name)
ronnie = Person()
michael = Person()
jenny = Person()
ronnie.say_hello()
michael.say_hello()
jenny.say_hello()
안녕! 나는 로니
안녕! 나는 로니
안녕! 나는 로니
-> 이렇게 ronnie, michael, jenny를 만들었는데 모두 다 자기를 로니라고 얘기함..
-> 이럴 때 name 변수를 "로니"로 고정 시키지 않고 오브젝트를 만들때 새로 이름을 짓고 싶다는 말
-> init(initialize) 함수 사용 : __init__
class Person:
def __init__(self, name):
self.name = name
def say_hello(self): #이 함수는 인자 self 하나를 가진다
print("안녕! 나는 " + self.name)
ronnie = Person("로니")
michael = Person("마이클")
jenny = Person("제니")
ronnie.say_hello()
michael.say_hello()
jenny.say_hello()
안녕! 나는 로니
안녕! 나는 마이클
안녕! 나는 제니
class Person:
def __init__(self, name):
self.name = name
def say_hello(self, to_name): #이 함수는 인자 self 하나를 가진다
print("안녕! " + to_name + ", 나는 " + self.name)
ronnie = Person("로니")
michael = Person("마이클")
jenny = Person("제니")
ronnie.say_hello("철수")
michael.say_hello("영희")
jenny.say_hello("미지")
안녕! 철수, 나는 로니
안녕! 영희, 나는 마이클
안녕! 미지, 나는 제니
-> init : Person이라는 Object를 만들 때, name이라는 인자를 받아서 name이라는 변수 안에 넣어라.
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def say_hello(self, to_name): #이 함수는 인자 self 하나를 가진다
print("안녕! " + to_name + ", 나는 " + self.name)
def introduce(self) :
print("내 이름은 " + self.name + " 그리고 나는 " + str(self.age) + "살이야")
ronnie = Person("로니", 1)
ronnie.introduce()
내 이름은 로니 그리고 나는 1살이야
2. 상속
- 공통된 클래스가 하나 있고, 그 밑에 여러가지 세부 클래스를 만들고 싶을 때
- 현재 Person이라는 클래스가 있고, 경찰, 프로그래머라는 클래스를 만들고 싶음
- 경찰과 프로그래머라는 클래스는 서로 할 수 있는 일이 다르나 둘 다 사람이 할 수 있는 일은 모두 할 수 있어야 함
로니는 무직 -> 그냥 1살인 사람
제니는 22살의 경찰
마이클은 21살의 프로그래머
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def say_hello(self, to_name): #이 함수는 인자 self 하나를 가진다
print("안녕! " + to_name + ", 나는 " + self.name)
def introduce(self) :
print("내 이름은 " + self.name + " 그리고 나는 " + str(self.age) + "살이야")
class Police(Person) : #경찰이라는 클래스는 사람이라는 클래스를 상속받는다.
def arrest(self, to_arrest) : #경찰은 체포를 할 수 있다
print("넌 체포됐다, " + to_arrest)
class Programmer(Person) :
def program(self, to_program) :
print("다음엔 뭘 만들지? 아 이걸 만들어야겠다: " + to_program)
ronnie = Person("로니", 1)
jenny = Police("제니", 22)
michael = Programmer("마이클", 21)
ronnie.introduce()
jenny.arrest("로닝구") #jenny는 Police라는 클래스의 오브젝트인데, Person 클래스를 상속받았으므로 introduce()라는 함수도 사용 가능
michael.program("펠렛 구매 프로그램")
jenny.introduce()
michael.introduce()
내 이름은 제니 그리고 나는 22살이야
-> 제니는 Person 클래스의 객체가 아닌 Police의 객체이지만, Police 클래스는 Person 클래스를 상속 받았으므로 Person 클래스의 모든 함수 사용 가능 -> 즉, introduce() 사용 가능!
상속을 받지 않았다고 치면
class Police :
def __init__(self, name, age):
self.name = name
self.age = age
def say_hello(self, to_name): #이 함수는 인자 self 하나를 가진다
print("안녕! " + to_name + ", 나는 " + self.name)
def introduce(self) :
print("내 이름은 " + self.name + " 그리고 나는 " + str(self.age) + "살이야")
def arrest(self, to_arrest) :
print("넌 체포됐다, " + to_arrest)
사용하고 싶은 함수를 모두 Police 클래스에 넣어주어야 함
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def say_hello(self, to_name): #이 함수는 인자 self 하나를 가진다
print("안녕! " + to_name + ", 나는 " + self.name)
def introduce(self) :
print("내 이름은 " + self.name + " 그리고 나는 " + str(self.age) + "살이야")
class Police(Person) :
def arrest(self, to_arrest) : #경찰은 체포를 할 수 있는데(arrest), 체포를 할 때 누구를 체포하는지(to_arrest) 말할 수 있다
print("넌 체포됐다, " + to_arrest)
class Programmer(Person) :
def program(self, to_program) :
print("다음엔 뭘 만들지? 아 이걸 만들어야겠다: " + to_program)
ronnie = Person("로니", 1)
jenny = Police("제니", 22)
michael = Programmer("마이클", 21)
ronnie.introduce()
jenny.introduce()
michael.introduce()
jenny.arrest("로닝구")
michael.program("펠렛 구매 프로그램")
내 이름은 로니 그리고 나는 1살이야
내 이름은 제니 그리고 나는 22살이야
내 이름은 마이클 그리고 나는 21살이야
넌 체포됐다, 로닝구
다음엔 뭘 만들지? 아 이걸 만들어야겠다: 펠렛 구매 프로그램
-> 마이클도 Person 클래스를 상속받았으므로 introduce() 사용 가능
로니에게 arrest를 하도록 해보면?
ronnie.arrest("aSpring")
로니는 무직! 그냥 Person이므로 arrest 할 수 없음
2/10(월) - 3일차 : 패키지, 모듈
3. 패키지 : 어떤 기능들을 구현하는 모듈들의 합 -> 다른 곳에서는 라이브러리라고 함
ex) 날씨 정보를 알아보는 패키지, 위치 정보를 알아보는 패키지
- 패키지 == 모듈1 + 모듈2
- 내가 날씨 정보를 알아보는 패키지를 만들었는데, 다른 개발자들도 어떤 프로그램을 구현하기 위해 날씨 정보를 알아보는 패키지(코드)가 필요할 수도 있다 -> 내가 이미 써놓은 코드를 그대로 갖다쓸 수 있도록 패키지화 해서 공개
- 내 회사에서 서비스를 10개를 한다 -> 두 번째 서비스에서도 날씨 정보를 필요로 한다 하면, 앞에서 만들어 놓았던 패키지를 그대로 갖다 사용할 수 있음
4. 모듈 : 코드가 들어있는 파일 -> 이 코드가 모여서 어떤 한 기능을 구현함
(코드를 잘 모아서 기능 하나를 잘 구현한 파일)
main.py
#animal package
#dog, cat modules
#dog, cat modules can say "hi" 를 만들 것
-> Folder 만들기 : 여기서 폴더의 이름이 곧 '패키지의 이름'
-> 이 폴더 안에 모듈들을 만들어줄 것(dog.py, cat.py) -> 그런데 여기서 animal이라는 폴더를 패키지라고
말을 하고 싶으면 특별한 파일을 만들어주어야 한다. '__init__.py'
dog.py
class Dog :
def hi(self) : #hi라는 function
print("bark!") #개가 안녕하는 소리
cat.py
class Cat :
def hi(self) : #hi라는 function
print("meow!") #고양이가 안녕하는 소리
__init__.py
: animal 패키지가 어떤 모듈들의 합인지 이 파일 안에 넣어주어야 함 - 모듈 불러와야 함
from .cat import Cat # . <-이 폴더에 있는 cat.py라는 파일에서 Cat이라는 클래스를 갖고와줘 : 모듈을 불러오는 방법
from .dog import Dog # . <- 현재 폴더에 있는 dog.py라는 파일에서 Dog라는 클래스를 갖고와줘
또는
from .cat import * #라고 하면 cat 모듈에 있는 모든 코드를 다 불러온다
from .dog import *
다시 main.py
from animal import dog # animal 패키지에서 dog라는 모듈을 갖고와줘
from animal import cat # animal 패키지에서 cat라는 모듈을 갖고와줘
#dog라는 모듈 -> Dog라는 클래스가 들어있는데 한 번 사용해보자
d = dog.Dog() #dog라는 모듈 안에서 Dog라는 클래스를 instance로 만듦
d.hi()
c = cat.Cat()
c.hi()
bark!
meow!
-> 여기서 dog.Dog(), cat.Cat()이 반복되므로
#animal package
#dog, cat modules
#dog, cat modules can say "hi"
from animal import dog # animal 패키지에서 dog라는 모듈을 갖고와줘
from animal import cat # animal 패키지에서 cat라는 모듈을 갖고와줘
from animal import * #animal 패키지가 갖고 있는 모듈을 다 불러와라
d = Dog()
c = Cat()
d.hi()
c.hi()
이렇게 쓸 수도 있다.
==> 패키지 : 내가 쓴 코드를 다른 사람들한테 공유하고싶거나, 코드를 좀 더 잘 정리하기 위해 모듈화를 하는 것
이 개념을 이용해서 다른 사람의 코드를 우리가 쓸 수 있다.
https://geopy.readthedocs.io/en/stable/
- GeoPy라는 패키지 -> 바로 샘플로 직행
- geopy라는 패키지 안에 있는 geocoders라는 모듈에서 Nominatim이라는 클래스를 가지고 오고, 주소를 입력하면 위도, 경도를 알려주는 프로그램인 듯!
<패키지 설치>
- 패키지 설치 방법 : 네모(Packages) 클릭 > geopy 검색 > 가장 위의 geopy 클릭 > + 버튼 클릭
> 설치 완료 > main.py에 가서 코드 복사 붙여넣기
- 코드는 원래 복사 붙여넣기를 하는 것이다!
main.py
from geopy.geocoders import Nominatim
geolocator = Nominatim(user_agent="specify_your_app_name_here")
location = geolocator.geocode("175 5th Avenue NYC")
의문
1 : 나는 패키지를 처음 설치 해봐서.. 패키지만 설치한다고 해서 되는게 아니고 직접 코드를 복사 붙여넣기를 또 해주어야 하는구나! 그러면 설치한건 패키지 전체이고 그 속 내용을 사용.. 하는건가?
2 : 어제부터 VSCode를 배우는데 거기서도 이런 식으로 다운로드를 받고 사용할 수 있는지 나중에 한 번 해봐야겠다.
from geopy.geocoders import Nominatim
#geopy라는 패키지에서 geocoders라는 모듈 안에 있는 Nominatim이라는 클래스를 가지고 온 것으로 아래와 동일하다
from animal.dog import Dog
# from animal import dog # animal 패키지에서 dog라는 모듈을 갖고와줘
# from animal import cat # animal 패키지에서 cat라는 모듈을 갖고와줘
# from animal import * #animal 패키지가 갖고 있는 모듈을 다 불러와라
from geopy.geocoders import Nominatim
geolocator = Nominatim(user_agent="Ronnie") #앱 이름 입력하라는 듯 - 나는 앱은 없고 연습용으로 쓰니까 로니로 입력해줌
location = geolocator.geocode("175 5th Avenue NYC") # ()안에 미국 주소가 들어있는 듯 하고 location을 잡아주는 것 같은데 뭔지 잘 모르니까 print해보기
print(location)
주소가 출력됨
우리나라 주소도 검색을 해보자! -> 실제로 집 주소를 적어봤는데 프라이버시 보호를 위해 번지, 도로명, 도시, 국가라고 표시함
# from animal import dog # animal 패키지에서 dog라는 모듈을 갖고와줘
# from animal import cat # animal 패키지에서 cat라는 모듈을 갖고와줘
# from animal import * #animal 패키지가 갖고 있는 모듈을 다 불러와라
from geopy.geocoders import Nominatim
geolocator = Nominatim(user_agent="Ronnie") #앱 이름 입력하라는 듯 - 나는 앱은 없고 연습용으로 쓰니까 로니로 입력해줌
location = geolocator.geocode("번지, 도로명, 도시, 국가") # ()안에 미국 주소가 들어있는 듯 하고 location을 잡아주는 것 같은데 뭔지 잘 모르니까 print해보기
print(location)
--> 다른 사람이 써놓은 코드를 ! 패키지를 그냥 다운로드 받아서 function을 사용
이 부분 말고 필요한 부분들.. 아까 봤던 다른 부분들(위도, 경도 등)도 가져올 수 있음
우리가 방금 출력한 것은 location에 담기는 게 뭔지 확인하려고 location을 출력한 것
다른 것들도 써보자.
print(location.address)
print(location)과 동일한 결과
print(location.latitude)
print(location.longitude)
print(location.raw)
우리가 이때까지 한 것
- 개발환경 설정, 변수, 타입, 조건문, 함수, 반복문, 리스트, 튜플, 딕셔너리, 클래스, 오브젝트, 패키지, 모듈
- 이정도면 충분히 실생활에 필요한 자동화 스크립트는 구현할 실력이 된 것!
- 기초 완료!!
배운 코드를 실생활에 접목 시키기
<코드 써서 핸드폰에 문자 보내기>
알아야 할 두가지 개념 :
1. 라이브러리 == 다른 개발자가 자기 패키지를 공개해 놓은것
2. API : 서비스 제공자가 개발자들이 코드를 통해 데이터를 가져갈 수 있도록 만들어놓은 길 같은 것
ex) 날씨를 가져오고 싶다
-> 1) 기상청 홈페이지 : 지금 날씨 정보를 보는 것
-> 2) 기상청 API 이용 : 기상청 홈페이지에 가지 않고, 코드를 통해서 날씨 정보를 가져올 수 있음
그래서 오늘 우리는 문자를 보낼 수 있게 해주는 API, 라이브러리를 이용해서 문자를 보내볼 것
1. https://twilio.com 가입
15불 만큼의 문자를 공짜로 보낼 수 있게 됐다.
Get a trial phone number 클릭 > 공짜로 문자를 보낼 수 있는 번호를 줌 > Choose this Number 클릭
할당받은 번호는 나중에 써야하니까 따로 복사해서 저장해놓기!
우리가 보통 어떤 웹사이트를 이용하려면 회원가입을 하고 로그인을 해야 한다.
그리고 로그인을 할 때 id, pw를 입력해야 한다. API를 이용할 때도 마찬가지로 id, pw 역할을 하는 것이 필요
- id : ACCOUNT SID
- pw : AUTH TOKEN
--> 이것들은 소중한 개인정보이기 때문에 자기만 볼 수 있도록 다른 곳에 저장!
여기까지 했으면 문자 메시지를 보낼 준비 완료
코드를 쓰자!
2. twilio 라이브러리를 써야 하므로 설치
- Packages > twilio 검색 > Twilio API client ~~~~ 선택 > + 눌러 설치
코드 복사 붙여넣기!
account_sid = os.environ['TWILIO_ACCOUNT_SID']
auth_token = os.environ['TWILIO_AUTH_TOKEN']
'' 안에는 아까 발급받은 것 넣어주기
body="Join Earth's mightiest heroes. Like Kevin Bacon.",
from_='+15017122661',
to='+15558675310'
body : 문자메세지 내용
from : 발신인 -> 우리가 발급받았던 번호 넣어주기
to : 수신인 번호 -> 내 한국 휴대폰 번호 +8210 ~~~ 적어줘서 내 폰으로 문자가 오는지 확인해보기
그런 다음 run을 누르면 메세지 일련번호가 뜨고 폰에 문자가 온다
---> 그러나 나는 SID 에러가 뜸!
... 문자 보내기는 못해보고 끝
복습 - 스스로 풀어보기!!!!!!
# <과일 숫자 세는 프로그램 만들기>
# 과일 fruit이라는 리스트에 사과, 사과, 바나나, 바나나, 딸기, 키위, 복숭아, 복숭아, 복숭아가 들어있다
# 이 리스트 안에 각 과일이 몇개씩 들어있는지 알 수 있는 프로그램 짜보기
'프로그래밍 > 파이썬' 카테고리의 다른 글
[파이썬] 2일차 (0) | 2021.02.10 |
---|---|
[파이썬] 1일차 - 개발환경 설정, 기초 (0) | 2021.02.09 |