_empty_ 2019. 7. 15. 21:40

4차인재 양성사업

과학기술 빅데이터 분석가 과정 - 4주

김정훈 강사님

Day_01_01_basic.py
0.00MB
Day_01_02_re.py
0.00MB

 

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)