2. 파이썬
• 인터프리터, 스크립트
• 동적 타입 언어
• 함수, 클래스, 모듈, 패키지
• 간결하고 쉬운 문법
• 다양한 라이브러리 많음
• 통계, 기계학습, 웹 개발, 배포
도구 등 다양한 영역에서 사용
• 현재 버전 3.5
• 여전히 2.7도 많이 사용
[http://www.tiobe.com/tiobe_index]
4. 몇 가지 기본 구성 요소
import httplib, urllib # 패키지/모듈 임포트
import time
# 주석
key = 'XXXXXXXX' # 글로별 변수
def sendCommand(): # 함수
# 블록은 들여쓰기로 처리
# params, headers 등 로컬 변수
params = urllib.urlencode({'api_key':key, 'command_string': 'OFF'})
headers = {"Content-type": "application/x-www-form-urlencoded","Accept": "text/plain"}
conn = httplib.HTTPSConnection("api.thingspeak.com")
try:
# 블록은 들여쓰기로
conn.request("POST", "/talkbacks/7678/commands", params, headers)
response = conn.getresponse()
print response.status, response.reason
data = response.read()
print("command id =", data)
conn.close()
except:
print "connection failed"
5. 주요 타입
데이터 타입
• 숫자
• int : 10, 20
• float : 10.1, 0.8
• 부울(bool) : True, False
• 문자열(str) : '가', "가나다"
주요 연산
• 수치 연산:
• 10 + 20, 10 – 5, 2 * 3
• 24 / 5 : 4.8 (실수 반환)
• 240 // 50 : 4
• 240 % 50 : 40
• 2 ** 3 : 2의 3승
• 비교 연산:
• < <= > >= == !=
• is : 같은 객체인지
• is not : 같은 객체가 아닌지
6. 주요 타입: 리스트(list)
• 여러 값을 순차적으로 저장할 수 있는 자료형: 배열
• 생성 : pk = [4, 6, 1, 9]
• 추가/사입
• 추가 : pk.append(10) [4, 6, 1, 9, 10]
• 삽입 : pk.insert(1, 3) [4, 3, 6, 1, 9]
• 인덱스 기반 접근
• 양수 인덱스(0부터 시작): pk[0] 4, pk[2] = 3 pk = [4, ,6, 3, 9]
• 음수 인덱스뒤에서 -1부터 시작): pk[-2] 1
• 제거
• remove(val): pk.remove(6) [4, 1, 9]
• pop(idx): popped = pk.pop(2) popped = 1, pk = [4, 6, 9]
7. 주요 타입: 사전(dict)
• (키, 값) 쌍을 갖는 해시
• 생성 : map = {'r': 'red', 'g': 'green', 'b': 'blue'}
• 추가/변경
• map['r'] = 'RED' {'r': 'RED', 'g': 'green', 'b': 'blue'}
• 접근
• 개별 요소: map['g'] 'red'
• 키: map.keys() dict_keys(['r', 'b', 'g'])
• 값: map.values() dict_values(['red', 'blue', 'green'])
• 키 존재 여부: 'g' in map True, 'x' not in map True
• 개별 쌍 제거
• del map['g']
8. 주요 타입: 튜플(tuple)
• Immutable 리스트
• 생성 : cardExp = (12, 2019)
• cardNo = 1234, 5678, 2468, 0987
• oneItem = 433,
• 접근
• 인덱스: cardExp[0] 12, cardExp[1] 2019
• 튜플 언패킹
• mon, year = cardExp mon = 12, year = 2019
• 변환
• tuple list: cardNoList = list(cardNo)
• list -> tuple: cNo = tuple(cardNoList)
9. 제어문
if age > 10 and age < 20:
print('무서운10대')
elif age <= 10:
print('아직은 말 들음')
else:
print('성인')
while 조건:
코드 # 조건이 True이면 실행
for i in range(5): # range(5) : 0~4
print(i)
for v in [1,2,3,4,5]:
print(v)
break, continue, pass문 존재
10. 함수
def hello(name):
print('Hello,', name)
def hello2(name):
print('Hello,', name)
return # 반환 값 없음
def sum(a, b):
return a + b # 값 반환
hello('이름')
s = sum(1, 2) # s는 3
h = hello # 함수는 first-class
h('이름')
# 키워드 인자, 기본 값
def createCar(doors = 2, type = 'sports'):
…
createCar() # doors = 2, type = 'sports'
createCar(4, 'suv) # doors = 4, type = 'suv'
createCar(type = 'sedan', doors = 4)
createCar(type = 'suv') # doors = 2
# 람다식
reduce(lambda x, y: x + y, [0, 1, 2, 3, 4])
11. 클래스
class Raspberry:
def __init__(self, ver): # 생성자(초기화)
self.version = ver # 멤버 변수
def turnOn(self): # 멤버 함수
# __로 시작하는 멤버 변수 : 일종의 private
self.__powerState = True
def temperature(self):
temp = …
return temp
def gpio_on(self, num):
GPIO.output(num, True)
rp = Raspberry(3) # 생성
rp.turnOn() # 멤버 함수 사용
rp.version # 멤버 변수 사용
rp.gpio_on(18)
12. 상속
class Developer:
def __init__(self, name):
self.name = name
def coding(self):
print(self.name, 'is coding!!')
class PythonDeveloper(Developer):
def coding(self):
super().coding()
print(self.name, 'is python coding!!')
class JavaDeveloper(Developer):
def __init__(self, name):
super().__init__(name + ' in java')
>>> jd = JavaDeveloper('bk')
>>> jd.coding()
bk in java is coding!!
>>>
>>> pd = PythonDeveloper('Gudio')
>>> pd.coding()
Gudio is coding!!
Gudio is python coding!!
>>>
13. 모듈=파일, 패키지=모듈 모음=폴더
# switch.py
# py 파일이 곧 모듈
import os
statusFilePath = "/home/pi/switchStatus.txt"
def isSwitchOff():
if not os.path.exists(statusFilePath):
return False
f = open(statusFilePath, 'r')
line = f.readline()
f.close()
if line == "ON":
return False
else:
return True
def setSwitchStatus(newStatus):
f = open(statusFilePath, 'w')
f.write(newStatus)
f.close()
…
importswitch #switch 모듈임포트
defrunCommand():
params =urllib.urlencode({'api_key':key })
headers ={"Content-type": "application/x-www-form-urlencoded","Accept": "text/plain"}
conn=httplib.HTTPSConnection("api.thingspeak.com")
try:
…
iflen(data)>0:
switch.setSwitchStatus(data) #모듈명.구성요소:함수,변수,클래스등접근가능
conn.close()
#switch.statusFilePath처럼 모듈의글로벌변수접근
except:
print "connection failed"
if__name__ =="__main__":
runCommand()
import
* 파이썬 3.3 전에는 폴더에 __init__.py 파일이 있어야 패키지로 인식
* 3.3부터는 이 파일이 없어도 패키지로 인식함
14. 패키지=모듈 모음=폴더
* 파이썬 3.3 전에는 폴더에 __init__.py 파일이 있어야 패키지로 인식
* 3.3부터는 이 파일이 없어도 패키지로 인식함
패키지 구조 예:
my/
__init__.py
pack/
__init__.py
infomod.py
pack1/
__init__.py
memlist.py
15. 모듈/패키지 사용, import/from
• 패키지/모듈 검색 기준 : sys.path
• import, from import로 사용 대상 지정
• import 모듈/패키지명 (as 별칭)
• from 패키지/모듈 import 모듈/구성요소 (as 별칭)
import my.pack.infomod
my.pack.infomod.info()
# my/pack/infomod.py
def info():
…
import my.pack.infomod as infom
infom.info()
from my.pack import infomod
infomod.info()
from my.pack.infomod import info
info()
16. 스크립트 실행 진입 지점
# run.py
import switch # 임포트 시점에 실행
def runCommand():
print("runCommand")
...
print("before")
if __name__ == "__main__":
runCommand()
print("after")
# switch.py
print("switch")
python run.py
switch
before
runCommand
after
18. 기타
• pip : 패키지 관리 도구
• Django : 웹 프레임워크
• numpy, pandas, matplotlib : 데이터 분석 모듈
• scikit, tensorflow, theano : 머신러닝
• jupyter notebook : 웹 브라우저 기반 파이썬 실행 환경
• 코드, 데이터 분석, 시각화 등 공유 가능