Python #1
4차인재 양성사업
과학기술 빅데이터 분석가 과정 - 4주
김정훈 강사님
Python 수업은 6일간 이루어진 수업으로, 전 기간 중 단일 과목으로 가장 긴 기간 배우는 과목이다.
철저히 실습 위주로 진행되었고 매일 과제가 있었다.
그래서 다소 의식의 흐름(...)이 많이 섞여있지만 주석으로 필기해가며 저장한 python 파일에 수업 내용이 다 담겨있다.
윗 코드를 주석처리하고 또 주석처리해가며 수업을 들었기 때문에 파일이 다소 지저분하므로
우선 실습파일들을 올려두고 시간이 날 때마다 복습하며 그 내용을 정리할 계획이다.
참고로 철저한 실습 위주인 만큼, 연습문제가 대부분이다.
때문에 매 시간 문제만 따로 적어서 문제만 보고 직접 출력해보는 것을 권장한다고 하셨고, 실제로 그렇게 복습했다.
그리고 그때그때 가르쳐주신 내용들'만'으로도 풀 수 있다는 점이 나중으로 갈수록 정말 어려운 점이었다.
자꾸 새로운 함수를 구글링으로 찾아보려 했는데, 그럴 필요 없이 베이직으로 충분히 풀 수 있음을 명심해야한다.
※ day01을 다 쓰고서야 발견한건데, 티스토리 자체 코드블럭을 이용하니 첫 줄만 탭이되어 보인다.
탭이 워낙 중요하다보니 일부러 첫 줄을 제외한 나머지를 다 일일이 탭하긴 했는데 너무 비효율적이라..대체 왜 이런지ㅠ
심지어 글 쓸 땐 코드의 색이 다 구분되어 보였는데 발행하니 그렇질 못하다. 해결법을 찾아야겠다.
플러그인을 적용했다. 개인적으론 Dark Mode를 선호하지만 기본 제공 다크테마 색상이 취향이 아니다ㅠ
Day_01_01_basic.py
간단한 단축키
# ctrl+shift+f10 (win) / cmd+shift+r (mac) : running창 열기
# shift + arrow(화살표) : 범위선택
# ctrl+/ 라인별 주석처리. 커서처리하면 당연히 단체주석처리
# tab 들여쓰기 / shift+tab 탭 취소
print문
print('hello, python!')
=> 출력 결과 : hello, python!
몸풀기. hello python을 세 번 출력하는 코드 3가지
#1
print('hello, python!')
print('hello, python!')
print('hello, python!')
#2
print('hello,python!','hello,python!','hello,python!')
print('hello,python!''hello,python!''hello,python!')
#3
print('hello, python!'*3)
#4
print('hello,python!'+'hello,python!'+'hello,python!')
print(12,3.14,True,'yes')
print(type(12),type(3.14),type(True),type('yes'))
python의 프린트문은 이렇게 단순히 쓰는 것 만으로도 한번에 여러 타입의 변수를 출력할 수 있다.
type()은 ()안에 입력한 내용의 데이터타입을 반환한다.
문제1. a와 b의 값을 교환하세요 (변수의 값을 모른다는 가정 하에)
c=a
a=b
b=c
# 강사님의 solution
a,b=b,a
파이썬의 가장 큰 특징은 위와 같은 다중 치환이 가능하다는 점이다.
물론 등호 좌우 변수 숫자가 같아야한다.
연산자
연산 : 산술, 관계, 논리
산술 : + - * / ** // %
# a=3
# b=7
c=a+b
print(a+b)
print(a-b)
print(a*b)
print(a/b) # 실수나눗셈
print(a**b) # 7*3
print(a//b) # 정수나눗셈(몫)
print(a % b) # 나머지
문제2. 두 자리 양수를 뒤집어 보세요 (ex. 15라면 결과물이 51이 되도록)
a= 17
a= 10*(a % 10)+1*(a//10)
print(a)
문제3. 네 자리 양수를 뒤집어 보세요
a = 1234
a1 = a//1000
a2 = a//100 % 10
a3 = a//10 % 10
a4 = a//1 % 10
print(a1+10*a2+100*a3+1000*a4)
print('-'*50)
관계 : > >= < <= == !=
a,b=3,7
print(a>b)
print(a>=b)
print(a<b)
print(a<=b)
print(a==b)
print(a!=b)
print(int(a != b)+int(a <= b)) # 형변환. cast
문제4. 나이 변수에 들어있는 값이 10대인지 알려주세요.
(코드 성립을 위해 앞쪽에 age가 정의되어있으나, 문제만 보고 풀 때는 age값은 모른다고 생각하고 코드만 짜면 된다.)
age = 27 # 계속해서 이 변수 값은 모른다고 가정
print(10 <= age < 20)
논리 : and or not
위 문제를 응용해서 True, False 연산을 다음처럼 연습해볼 수 있다.
b1 = age >= 10 # True, False
b2 = age <= 19 # True, False
print(b1==b2)
print((b1 + b2) == 2)
print(b1 * b2)
print(True and True)
print(True and False)
print(False and True)
print(False and False)
함수
함수 : 매개변수, 반환.
두 가지가 함수의 핵심이다. def 로 정의한다.
매개변수와 반환값이 있느냐, 없느냐에 따라 네 가지로 구분할 수 있다.
# 매개변수 없고, 반환값 없고
def f_1():
print('hello')
f_1() # 함수의 가장 큰 목적 : 재사용
# 매개변수 있고, 반환값 없고
def f_2(p): #p=12
print(p)
f_2(12)
def f_3(p,q):
print(p*q)
f_3(12,3)
# 매개변수 없고, 반환값 있고
def f_4():
pass
r = f_4()
print(r) # 여기서의 None은 값이 없는게 아님. 기본 반환값인 None을 반환한 것.
def f_5():
return 56
s = f_5()
print(s)
매개변수가 있고 반환값도 있는 것은 다음 문제를 풀며 만들어보기로 한다.
문제5. 두 개의 정수 중에서 큰 값을 찾는 함수를 만드세요.
def f_6(p, q):
if p > q :
return p
else :
return q
# if p > q :
# return p
# return q
def max_2(p,q) :
if p > q :
q = p
return q
# 답 확인하는 구간
a, b = 83, 43
print(str(max(a, b)) + ' is bigger one')
# if p > q :
# return p
# return q
중간의 이 구간은 f_6과 같은 내용을 다른 방식을 짠 부분이다.
여기서 알 수 있듯, 파이썬은 줄맞춤으로 영역을 구분한다.
같은 라인이면 같은 영역으로 인식해버리기때문에 줄바꿈을 잘못 해서 에러가 나는 경우가 생긴다.
문제6. 네 개의 정수 중에서 큰 값을 찾는 함수를 만드세요
a, b, c, d = 12, 5, 372, 246
def max_4(o,p,q,r) :
if o > p :
p = o
if p > q :
q = p
if q > r :
r = q
return r
print(max_4(a,b,c,d))
반대로 짤 수도 잆다. a<b 해서 a=b하면 마지막에 return a를 반환해주면 된다.
def max_4(a,b,c,d) :
if a < b : a = b
if a < c : a = c
if a < d : a = d
return a
print(max_4(a,b,c,d))
4개의 인자에 대한 비교이므로, 문제 5번을 풀 당시 짰던 max_2를 응용하는 풀이법도 있다.
# 복면가왕. 비교인자 수가 짝수여야 한다는 단점
def max_4(a,b,c,d) :
return max_2(max_2(a,b), max_2(c,d))
# 한국시리즈. 가독성은 위의 것보다 떨어지나 인자 갯수 상관 x 유연함
def max_4(a,b,c,d) :
return max(max(max_2(a,b),c),d)
제어문
rain = True
if rain : #이렇게만 쳐도 rain이 참일 때 실행하는것임. 참 = 거짓이 아닌 것. None은 거짓
print('비가 온다')
else :
print('비가 안 온다')
Day_01_02_re.py
여기에선 간단히 정규표현식의 사용에 대해 배웠다.
#-*-coding:utf-8-*-
import re
# https://ko.wikipedia.org/wiki/%EC%A0%95%EA%B7%9C_%ED%91%9C%ED%98%84%EC%8B%9D
data = '''3412 Bob 123
3834 Jonny 333
1248 Kate 634
1423 Tony 567
2567 Peter 435
3567 Alice 535
1548 Kerry 534'''
print(data, type(data)) # str타입, 당연하지만..
numbers = re.findall('[0-9]',data)
print(numbers)
문제 7. 이름을 찾으세요.
names = re.findall('[A-z]+', data)
하지만 위 코드에서 주의해야 할 점은, ASCII코드 상에서 대문자와 소문자 사이에도 문자가 존재한다.
즉 여기선 데이터가 단조로워 맞는 것처럼 보이지만 실제론 좋지 못한 코드인 것.
names = re.findall('[A-Za-z]+', data) #시작이 대문자여도,소문자여도 좋음
names = re.findall('[A-Z][a-z]+', data) #대문자 하나 소문자 하나임. 현재 데이터셋에 한해선 좋은것
print(names)
문제 8. 대문자 T로 시작하는 이름을 찾으세요.
names = re.findall('T[a-z]+', data)
문제 9. 대문자 T로 시작하지 않는 이름을 찾으세요.
names = re.findall('[^T][a-z]+', data)
이건 내 해답인데, 위 문제 8은 제대로 동작해서 조금 바꿔 이렇게 했는데 결과창은
이렇게 맨 앞글자만 무시하고 뒷부분 소문자는 전부 반영한, T만 빠진 ony가 이상하게 같이 출력된다.
해결을 위한 코드는 다음과 같다.
names = re.findall('[ABCDEFGHIJKLMNOPQRS UVWXYZ][a-z]+', data)
# or
names = re.findall('[A-SU-Z][a-z]+', data)
print(names)