프로그래밍/파이썬

[파이썬 예습] 유투브 코딩 1시간만에 배우기 - 파이썬(ft. 실리콘밸리 엔지니어)

aSpring 2021. 2. 6. 21:55
728x90
728x90


1일차 - 2/6

코딩을 제일 빨리 배우는 방법 : 남 하는 것 따라 하면서 어떻게든 내가 만들고 싶은 것을 만들어 보는 것

 

파이썬부터 시작해서 입문 강의 - 일주일도 안 걸릴 듯

 

1. 코딩에 필요한 준비물 : 컴퓨터

- 어떤 컴퓨터든 상관 없으나 개발을 할 거면 맥북 추천(운영체제 때문)

: 유닉스가 개발환경 세팅, 새로운 개발 도구를 사용하기에 편하다

 

2. 개발 환경 세팅

http://repl.it : 클라우드 기반 코딩 플랫폼 -> 개발 환경 설치를 하지 않아도 이 웹사이트에서 코딩 가능

 

The collaborative browser based IDE

Repl.it is a simple yet powerful online IDE, Editor, Compiler, Interpreter, and REPL. Code, compile, run, and host in 50+ programming languages: Clojure, Haskell, Kotlin, QBasic, Forth, LOLCODE, BrainF, Emoticon, Bloop, Unlambda, JavaScript, CoffeeScript,

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/

 

Welcome to GeoPy’s documentation! — GeoPy 2.1.0 documentation

geopy is a Python client for several popular geocoding web services. geopy makes it easy for Python developers to locate the coordinates of addresses, cities, countries, and landmarks across the globe using third-party geocoders and other data sources. geo

geopy.readthedocs.io

- 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 가입 

 

Twilio - Communication APIs for SMS, Voice, Video and Authentication

 

www.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이라는 리스트에 사과, 사과, 바나나, 바나나, 딸기, 키위, 복숭아, 복숭아, 복숭아가 들어있다

# 이 리스트 안에 각 과일이 몇개씩 들어있는지 알 수 있는 프로그램 짜보기

 

 

 

 

 

 

 

728x90
728x90

'프로그래밍 > 파이썬' 카테고리의 다른 글

[파이썬] 2일차  (0) 2021.02.10
[파이썬] 1일차 - 개발환경 설정, 기초  (0) 2021.02.09