[ 파이썬 시작하기 ]
▶ 파이썬을 설치한다는 것은?
일종의 번역팩을 설치한다고 생각하면 됨
컴퓨터는 101010001 과 같은 언어만 알아듣기에 파이썬 문법으로 된 것을
101010001로 변환해줄 수 있도록번역 패키지를 설치하는 것
▶ VSCode에서 파이썬 파일 실행하기
- 파이썬 확장자(.py)를 붙여 파일을 만든다
- 인터프립터를 파이썬으로 바꿈
- 오른쪽 클릭하여 터미널에서 파이썬 실행 클릭 혹은 터미널에 python 파일명쳐도 실행됨
▶ 파이썬 문법에 시작하기 앞서
파이썬은 매우 직관적인 언어이고, 할 수 있는 것이 많음
하지만 개발자들도 모든 문법을 기억하기란 쉽지 않기에 배우는 것 외에 필요한것은 구글링해서 찾아보면 됨
[ 변수 선언과 자료형 ]
▶ 변수 선언
변수이름 = 값
출력할때는 print()를 사용
a = 3 # 3을 a에 넣음
print(a)
b = a # a에 들어 있는 값인 3을 b에 넣음
print(b)
a = 5 # a에 5라는 새로운 값을 넣음
print(a, b) # 5 3
▶ 숫자형 자료형
'자료형'이란 프로그래밍을 할때 쓰이는 숫자, 문자열 등 자료 형태로 사용하는 모든것을 뜻함
다양한 형태의 숫자를 쓸 수 있음
a = 5
b = 4.8
숫자 간에는 사칙연산이 가능함. 몫과 나머지도 구할 수 있음
a = 7
b = 2
a+b # 9
a-b # 5
a*b # 14
a/b # 3.5
a//b # 3, 몫
a%b # 1, 나머지
a**b # 49, 거듭제곱
a+3*b # 13, 여러 연산을 한 줄에 할 경우 사칙연산의 순서대로!
(a+3)*b # 20, 소괄호를 이용해서 먼저 계산할 부분을 표시해줄 수 있음!
변수에 저장된 값에 연산을 한 후 다시 그 값을 같은 변수에 저장할 수 있음
a = 5
a = a + 3 # 5에 3을 더한 값을 다시 a에 저장
print(a) # 8
a += 3 # 줄여 쓸 수도 있음. 같은 의미!
▶ Bool 자료형
참/거짓을 나타내는 불(Boolean)자료형이 있음
x = True # 참
y = False # 거짓
z = true # name 'true' is not defined, 에러
True = 1 # 에러
- 소문자로 쓰면 자료형으로 인식하지 않고 변수명이라 생각해 에러가 남
- True/False는 변수명으로 쓸 수 없음
보통 '비교연산자'의 결과로 나타내기 위해 쓰임
4 > 2 # True 크다
5 < 1 # False 작다
6 >= 5 # True 크거나 같다
4 <= 4 # True 작거나 같다
3 == 5 # False 같다
4 != 7 # True 같지 않다
Bool자료형에는 논리연산자를 이용할 수 있음
a = 4 > 2 # True
not a # False NOT 연산자로 참을 거짓으로, 거짓을 참으로 바꿔줌
a and b # False AND 연산자로 모두 참이어야 참을 반환
a or b # True OR 연산자로 둘 중 하나만 참이면 참
[ 문자열 다루기 ]
▶ 문자열
/문자열 기초/
파이썬에서는 '글'도 데이터로 사용할수 있음. 이것을 '문자열'이라고 함
# 작은 따옴표 또는 큰 따옴표. 둘 다 같음
a = "aa"
b = 'aa'
따옴표로 감싸지 않으면 변수이름을 뜻하기 때문에 꼭 구분해서 써야함
a = 1
b = "a"
c = a
print(a, b, c) # 1 "a" 1
문자열에 따옴표를 포함해야할 때
print("I'm happy :)")
/문자열 연산/
문자열 간의 더하기는 두 문자열을 이어붙인 문자열을 반환함
first_name = "Harry"
last_name = "Potter"
first_name + last_name # HarryPotter
first_name + " " + last_name # Harry Potter
a = "3"
b = "5"
a + b # 35
문자열과 정수를 더하면 에러
a = "3"
a + 5 # 문자열과 숫자형은 더할 수 없어서 에러!
문자열의 길이는 len()함수를 써서 구할수 있음
print(len("abcde")) # 5
print(len("Hello, Sparta!")) # 14
print(len("안녕하세요.")) # 6
그 외에도 다양한 기능을 쓸 수 있음
특정 자료형 뒤에 .을 붙이고 쓰는 내장 함수들을 '메소드(method)'라고 함
- 모든 알파벳을 대문자/ 소문자로 바꾸기
sentence = 'Python is FUN!'
sentence.upper() # PYTHON IS FUN!
sentence.lower() # python is fun!
- 특정 문자를 기준으로 문자열 나누기
# 이메일 주소에서 도메인 'gmail'만 추출
myemail = 'test@gmail.com'
result = myemail.split('@') # ['test','gmail.com'] ('리스트'자료형)
result[0] # test (리스트의 첫번째 요소)
result[1] # gmail.com (리스트의 두 번째 요소
result2 = result[1].split('.') # ['gmail','com']
result2[0] # gmail -> 알고 싶었던 것
result2[1] # com
# 한 줄로 한 번에!
myemail.split('@')[1].split('.')[0]
- 특정 문자를 다른 문자로 바꾸기
txt = '서울시-마포구-망원동'
print(txt.replace('-', '>')) # '서울시>마포구>망원동'
/인덱싱과 슬라이싱/
문자열은 '문자들의 모임'이기 때문에 그 일부를 따로 떼어 부르는 방법이 있음
한 글자 씩 부를 때는 몇 번째인지 '인덱스'를 넣어 불러서 '인덱싱'이라고 함
f="abcdefghijklmnopqrstuvwxyz"
f[1] # b 파이썬은 숫자를 0부터 셈
문자열의 일부를 잘라낼 때는 '슬라이싱'이라고 함
f[4:15] # efghijklmno f[4]부터 f[15] 전까지, 총 15-4=11개!
f[8:] # ijklmnopqrstuvwxyz f[8]부터 끝까지, 앞의 8개 빼고!
f[:7] # abcdefg 시작부터 f[7] 전까지, 앞의 7개!
f[:] # abcdefghijklmnopqrstuvwxyz 처음부터 끝까지
특정 문자열로 자르고 싶을때 split('문자열')을 활용함
myemail = 'abc@sparta.co'
domain = myemail.split('@')[1].split('.')[0]
print(domain)
[ 리스트와 딕셔너리 ]
▶ 리스트(list)
/리스트 기초/
순서가 있는, 다른 자료형들의 모임
a = [1, 5, 2]
b = [3, "a", 6, 1]
c = []
d = list()
e = [1, 2, 4, [2, 3, 4]]
리스트 길이도 len()함수를 사용해서 잴 수 있음
a = [1, 5, 2]
print(len(a)) # 3
b = [1, 3, [2, 0], 1]
print(len(b)) # 4
순서가 있기 때문에, 문자열에서처럼 인덱싱과 슬라이싱을 사용할 수 있음
a = [1, 3, 2, 4]
print(a[3]) # 4
print(a[1:3]) # [3, 2]
print(a[-1]) # 4 (맨 마지막 것)
리스트의 요소가 리스트라면 중첩해서
a = [1, 2, [2, 3], 0]
print(a[2]) # [2, 3]
print(a[2][0]) # 2
/리스트의 더 많은 기능들/
- 덧붙이기
a = [1, 2, 3]
a.append(5)
print(a) # [1, 2, 3, 5]
a.append([1, 2])
print(a) # [1, 2, 3, 5, [1, 2]]
# 더하기 연산과 비교!
a += [2, 7]
print(a) # [1, 2, 3, 5, [1, 2], 2, 7]
- 정렬하기
a = [2, 5, 3]
a.sort()
print(a) # [2, 3, 5]
a.sort(reverse=True)
print(a) # [5, 3, 2]
- 요소가 리스트 안에 있는지 알아보기
a = [2, 1, 4, "2", 6]
print(1 in a) # True
print("1" in a) # False
print(0 not in a) # True
▶ 딕셔너리(dictionary)
/딕셔너리 기초/
딕셔너리는 키(key)와 밸류(value)의 쌍으로 이루어진 자료의 모임
person = {"name":"Bob", "age": 21}
print(person["name"])
딕셔너리를 만드는 데는 여러가지 방법을 쓸 수 있음
a = {"one":1, "two":2}
# 빈 딕셔너리 만들기
a = {}
a = dict()
딕셔너리의 요소에는 순서가 없기 때문에 인덱싱을 사용할 수 없음
person = {"name":"Bob", "age": 21}
print(person[0]) # 0이라는 key가 없으므로 KeyError 발생!
딕셔너리의 값을 업데이트하거나 새로운 쌍의 자료를 넣을 수 있음
person = {"name":"Bob", "age": 21}
person["name"] = "Robert"
print(person) # {'name': 'Robert', 'age': 21}
person["height"] = 174.8
print(person) # {'name': 'Robert', 'age': 21, 'height': 174.8}
딕셔너리의 밸류로는 아무 자료형이나 쓸 수 있음(즉 다른 딕셔너리를 넣을 수도 있음)
person = {"name":"Alice", "age": 16, "scores": {"math": 81, "science": 92, "Korean": 84}}
print(person["scores"]) # {'math': 81, 'science': 92, 'Korean': 84}
print(person["scores"]["science"]) # 92
/딕셔너리의 더 많은 기능들/
- 딕셔너리 안에 해당 키가 존재하는지 알고 싶을 때는 in을 사용
person = {"name":"Bob", "age": 21}
print("name" in person) # True
print("email" in person) # False
print("phone" not in person) # True
▶ 리스트와 딕셔너리의 조합
딕셔너리는 리스트와 함게 쓰여 자료를 정리하는데 쓰일 수 있음
people = [{'name': 'bob', 'age': 20}, {'name': 'carry', 'age': 38}]
# people[0]['name']의 값은? 'bob'
# people[1]['name']의 값은? 'carry'
person = {'name': 'john', 'age': 7}
people.append(person)
# people의 값은? [{'name':'bob','age':20}, {'name':'carry','age':38}, {'name':'john','age':7}]
# people[2]['name']의 값은? 'john'
[ 조건문 ]
▶ if문
조건을 만족했을 때만 특정 코드를 실행하도록 하는 문법
조건에는 불 자료형이 들어감
파이썬은 어디까지 구문에 포함되는지를 들여쓰기로 구분하기 때문에 들여쓰기가 아주 중요함
if 조건:
조건이 True일때 실행될 코드
예시
money = 2000
if money > 3800:
print("택시 타자!")
else:
print("걸어가자...")
▶ else와 elif
조건이 만족하지 않을때 다른 코드를 실행하고 싶을때 쓰는 문법
elif는 다양한 조건을 판단할때 사용하면 좋음
if 조건1:
조건1만 만족했을때 실행될 코드
elif 조건2:
조건2만 만족했을때 실행될 코드
else:
조건1과 조건2가 둘다 만족되지 않을때 실행될 코드
예시
age = 27
if age < 20:
print("청소년입니다.")
elif age < 65:
print("성인입니다.")
else:
print("무료로 이용하세요!")
[ 반복문 ]
▶ for문
임무를 한번에 묶어서 반복 실행시키도록 하는 문법
for 변수 in 반복값or리스트or튜플:
반복적으로 실행될 코드
예시
fruits = ['사과', '배', '감', '귤']
for fruit in fruits:
print(fruit)
- in 뒤에 존재하는 리스트 순서를 한번씩 대입하면서 변수에 넣어줌
- 처음에는 사과를 fruit 변수에 넣어 print 출력
- 두번째 배를 fruit 변수에 넣어 print 출력
- 반복
- 마지막으로 귤까지 출력되면 반복문에서 빠져 나오게 됨
▶ enumerate, break
enumerate()는 파이썬 내장함수
for 문의 in 뒷부분을 enumerate() 함수로 한번 감싸주면
인덱스(index)와 원소를 동시에 접근하면서 루프를 돌릴 수 있음
만약 인덱스를 0이 아니라 1로 시작하고 싶다면
eumerate()함수를 호출할때 start 인자에 시작하고 싶은 숫자를 넘기면 됨
for i, fruit in enumerate(fruits):
print(i,fruit)
# 0 사과
# ...
# 3 귤
for i, fruit in enumerate(fruits, start=1):
print(i,fruit)
# 1 사과
# ...
# 4 귤
break는 반복문에서 제어흐름을 벗어나기 위해 사용함
즉, 루프를 완전히 중단하는 것
continue와 다른점은 break는 제어흐름을 중단하고 빠져나오지만,
continue는 제어 흐름(반복)을 유지한 상태에서 코드의 실행만 건너뛰는 역할을 함
- break: 제어흐름 중단
- continue: 제어흐름은 유지, 코드 실행만 건너뜀
for i, fruit in enumerate(fruits):
print(i, fruit)
if i == 2:
break
# 0 사과
# 1 배
# 2 감
[ 함수 ]
▶ 함수 사용 방법
함수는 반복적으로 사용하는 코드들에 이름을 붙여놓은 것
def hello():
print("안녕!")
print("또 만나요!")
hello()
조건문에 넣을 값을 바꿔가면서 결과를 확인할때 쓰면 편함
def bus_rate(age):
if age > 65:
print("무료로 이용하세요")
elif age > 20:
print("성인입니다.")
else:
print("청소년입니다")
bus_rate(27)
bus_rate(10)
bus_rate(72)
단순한 출력 뿐만 아니라 결과 값을 돌려주도록 함수를 만들수도 있음(return)
def bus_fee(age):
if age > 65:
return 0
elif age > 20:
return 1200
else:
return 0
money = bus_fee(28)
print(money)
[ 튜플, 집합 ]
▶ 튜플(tuple)
튜플은 리스트와 비슷하지만 불변인 자료형
리스트와 같이 순서가 존재
a = (1,2,3)
print(a[0])
a = (1,2,3)
a[0] = 99 # 이러한 작업이 불가능함
튜플은 딕셔너리 대신 리스트와 튜플로 딕셔너리 '비슷하게' 만들어 사용해야 할때 많이 쓰임
a_dict = [('bob','24'),('john','29'),('smith','30')]
▶ 집합(set)
집합은 말 그대로 '집합'을 구현하는 방법
장점으로 중복이 제거됨
a = [1,2,3,4,5,3,4,2,1,2,4,2,3,1,4,1,5,1]
a_set = set(a)
print(a_set) #{1, 2, 3, 4, 5}
교집합/ 합집합/ 차집합도 구할 수 있음
a = set(['사과','감','수박','참외','딸기'])
b = set(['사과','멜론','청포도','토마토','참외'])
print(a & b) # 교집합, {'참외', '사과'}
print(a | b) # 합집합, {'참외', '수박', '감', '멜론', '청포도', '토마토', '사과', '딸기'}
[ f-string ]
▶ 변수로 더 직관적인 문자열 만들기
f를 앞에 붙여준 다음에 문자열을 쓰면 f-string이 됨
예시
scores = [
{'name':'영수','score':70},
{'name':'영희','score':65},
{'name':'기찬','score':75},
{'name':'희수','score':23},
{'name':'서경','score':99},
{'name':'미주','score':100},
{'name':'병태','score':32}
]
라는 정보가 있는데
for s in scores:
name = s['name']
score = str(s['score'])
print(name+'는 '+score+'점 입니다')
로 출력할수도 있음
for s in scores:
name = s['name']
score = str(s['score'])
print(f'{name}은 {score}점입니다')
f-string을 이용하면 훨씬 간단하게 가능함
[ 예외처리 ]
▶ try - except문
에러가 있어도 건너뛰게 할수 있는 방법
하지만 실제 프로젝트에 남용하는것은 금물! 어디서 에러가 났는지 알수가 없음
예시
people = [
{'name': 'bob', 'age': 20},
{'name': 'carry', 'age': 38},
{'name': 'john', 'age': 7},
{'name': 'smith', 'age': 17},
{'name': 'ben', 'age': 27},
{'name': 'bobby'},
{'name': 'red', 'age': 32},
{'name': 'queen', 'age': 25}
]
for person in people:
if person['age'] > 20:
print (person['name'])
20세보다 큰 나이가 많은 사람을 출력하려고 하는데 데이터 하나가 잘못 들어감(bobby의 age 데이터가 없음)
for person in people:
try:
if person['age'] > 20:
print (person['name'])
except:
name = person['name']
print(f'{name} - 에러입니다')
try except 구문을 이용하면 에러를 넘길 수 있음
[ 파일 불러오기 ]
from 파일명 import *
파이썬파일 상단에 입력. 파일은 불러오고 싶은 파일명을 넣어주면 됨
예시
# main_func.py
def say_hi():
print('안녕!')
복잡한 함수를 넣어놓는 파일
# main_test.py
from main_func import *
say_hi()
뼈대가 되는 파일
파일에 함수로 만들지 않았어도 다른 파일에서 함수를 갖다가 쓰기 때문에 오류가 발생하지 않고 잘 돌아감
[ 한줄의 마법 ]
▶ if문 - 삼향연산자
항이 3개라 삼항연산자라고 부름
(참일때 값) if (조건) else (거짓일때 값)
예시
num = 3
if num%2 == 0:
result = "짝수"
else:
result = "홀수"
print(f"{num}은 {result}입니다.")
if-else문을 이용해 조건에 따라 다른값을 변수에 저장하는 것을
num = 3
result = "짝수" if num%2 == 0 else "홀수"
print(f"{num}은 {result}입니다.")
한줄에 적을 수 있음
▶ for문 - 한방에 쓰기
예시
a_list = [1, 3, 2, 5, 1, 2]
b_list = []
for a in a_list:
b_list.append(a*2)
print(b_list)
a_list의 각 요소에 2를 곱한 새로운 리스트를 만드는 것을
a_list = [1, 3, 2, 5, 1, 2]
b_list = [a*2 for a in a_list]
print(b_list)
한번에 쓸 수 있음
[ map, filter, lambda식 ]
▶ map, 리스트의 모든 원소를 조작
예시
people = [
{'name': 'bob', 'age': 20},
{'name': 'carry', 'age': 38},
{'name': 'john', 'age': 7},
{'name': 'smith', 'age': 17},
{'name': 'ben', 'age': 27},
{'name': 'bobby', 'age': 57},
{'name': 'red', 'age': 32},
{'name': 'queen', 'age': 25}
]
def check_adult(person):
if person['age'] > 20:
return '성인'
else:
return '청소년'
result = map(check_adult, people)
print(list(result))
1차 조작
people를 하나하나 돌면서 check_adult에 넣고 그 결과값을 result넣음
그 후 result를 리스트로 묶고 출력
def check_adult(person):
return '성인' if person['age'] > 20 else '청소년'
result = map(check_adult, people)
print(list(result))
2차 조작
성인이라고 하자 만약에 person에 age가 20보다 크면, 아니면 청소년으로 리턴하자
result = map(lambda x: ('성인' if x['age'] > 20 else '청소년'), people)
print(list(result))
people를 하나씩 돌며 x에 넣을껀데 x는 저 조건식을 돌아 age가 20보다 크면 성인을 아니면 청소년을 리턴
x는 변수로 마음대로 변경할 수 있음 하지만 보통 x라고 많이 씀
3차 조작
▶ filter, 리스트의 모든 원소 중 특별한 것만 뽑기
result = filter(lambda x: x['age'] > 20, people)
print(list(result))
people를 하나씩 돌며 x에 넣을껀데 x에 age가 20보다 큰것만 result에 넣음
[ 함수의 매개변수 ]
def cal(a, b):
return a + 2 * b
print(cal(3, 5)) #13
print(cal(5, 3)) #11
print(cal(a=3, b=5)) #13
print(cal(b=5, a=3)) #13
함수에 인수를 넣을때 어떤 매개변수에 어떤 값을 넣을지 정해줄 수 있음
def cal(a, b):
return a + 2 * b
print(cal(3, 5)) #13
print(cal(5, 3)) #11
print(cal(a=3, b=5)) #13
print(cal(b=5, a=3)) #13
특정 매개변수에 디폴트 값을 지정해줄 수 있음
def call_names(*args):
for name in args:
print(f'{name}야 밥먹어라~')
call_names('철수','영수','희재')
#철수야 밥먹어라~
#영수야 밥먹어라~
#희재야 밥먹어라~
입력값의 개수를 지정하지 않고 모두 받는 방법
- 여러개의 인수를 하나의 매개변수로 받을때 관례적으로 args라는 이름을 사용(arguments라는 뜻)
def get_kwargs(**kwargs):
print(kwargs)
get_kwargs(name='bob')
get_kwargs(name='john', age='27')
키워드 인수를 여러 개 받는 방법(딕셔너리로 나옴)
댓글