[Python] Basic(기초문법)

파이썬(Python)



문법정리

  • Tab으로 들여쓰기 하는부분 꼭 잘 확인.(이 부분으로 인해 에러 발생하는 경우도 많음)
  • \ 를 입력해서 다음줄에 이어서 코드작성 가능


2-1. 숫자 자료형

# print() : 출력 및 '\n'이 들어가 있음. (=자동 줄바꿈)
print(5)
print(5+3) : 연산도 가능


2-2. 문자 자료형

print('풍선')
print("나비") -> 둘다 가능
print("ㅋ"*9) :  9번출력


2-3. boolean 자료형

print(5>10) : false
print(not True) : false


2-4. 변수 (+말고 , 도 사용가능하고 ,사용시 str필요x)

animal ="강아지"
name = "연탄이"
age = 4
hobby = "산책"
is_adult = age >= 3 
print("우리집 " + animal + "의 이름은 " + name + "예요")
print(name + "는 " + str(age) + "살이며, " + hobby + "을 아주 좋아해요")
print(name + "는 오른일까요? " + str(is_adult)) 


2-5. 주석(#),(‘’’),(‘’’),(Ctrl + ‘/’)

# 주석
''' 주석
'''
# 단축기 : Ctrl+'/'


3-1. 연산자

2**2 : 2 2
5%3 : 나머지 구하기 2
5//3 :  구하기 1
3==3 : true
4==2 : false
1!=3 : true(! not생각)
and = & : 둘다 사용 가능
or = | : 둘다 사용 가능 


3-2. 간단한 수식

변수 선언 num으로 했다가정
num = num + 2
num += 2 : 둘다 같음 


3-3. 숫자처리 함수

from math import * // 수학math 라이브러리 가져오기
floor, ceil, sqrt : 내림, 올림, 제곱근
abs :절대값
pow(4,2) : 4 2
max : 최대값, min : 최소값, round : 반올림 


3-4. 랜덤함수 : randint(1, 45)

from random import *
random() : 0.0 ~ 1.0 미만의 임의의  생성
random() * 10 : 0.0 ~ 10.0 미만의 임의의  생성
int(random() *10) : 0 ~ 10 미만의 임의의  생성
int(random() *10)+1 : 1 ~ 10 이하의 임의의 값생성
randrange(1, 46) : 1~46미만 임의  생성
randint(1, 45) : 1~45이하 임의  생성 


3-5. 퀴즈

조건 1 : 랜덤 날짜 
조건 2 : 월별 28 이내 
조건 3 : 매월 1~3 제외
from random import *
date = randint(4,28)
print("오프라인 스터디 모임 날짜는 매월 ",str(date) ," 일로 선정되었습니다.")


4-1. 문자열 (‘),(“)

변수 = """
나는 소년이고,
파이썬은 쉬워요
"""
print(변수) : 쌍따 줄바꿈이고 문자 잘나옴 => """하고 엔터치고 문자입력해도 된다는 의미.


4-2. 슬라이싱 (원하는 부분만 가져오기)

주민="990909-1234567"
print("성별 : " + 주민[7]) : 7번째  가져옴(그러나 index는 0부터 세니까 실제론 8번째 )
print("연 : " + 주민[0:2]) : 0부터 2직전까지(0,1)
print("뒤 7자리 (뒤에부터) : " + 주민[-7:]) 


4-3. 문자열 처리함수

파이썬 = "Python is Amazing"
print(파이썬.lower()) : 소문자로 나타냄
print(파이썬.upper()) : 대문자로 나타냄
print(파이썬[0].isupper()) : 0번째 대문자냐? true
print(len(파이썬)) : 문자길이
print(파이썬.replace("Python", "Java")) : 대체해줌 

index = 파이썬.index("n") : index값 구해줌
print(index) :  5
index = 파이썬.index("n", index +1) : 뒤에꺼 스타트지점
print(index) : 15
-> find함수도 가능. 차이점은  없을시
print(파이썬.find("Java")) :  -1 나옴
print(파이썬.index("Java")) : 오류뜸
-> 마지막 count는 문자가 몇번나왔는지 개수! 


4-4. 문자열 포맷

+ , 말고도 다양한 문자열
print("나는 %d살입니다." % 20) : 정수
print("나는 %s살입니다." % "파이썬") : 스트링. 문자
print("나는 %c살입니다." % "A") : 캐릭터 문자
print("나는 %s색과 %s색을 좋아해요." % ("파란", "빨간")) 

print("나는 {}살입니다.".format(20))
print("나는 {}색과 {}색을 좋아해요.".format("파란","빨간"))
print("나는 {0}색과 {1}색을 좋아해요.".format("파란","빨간")) 
print("나는 {age}살이며, {color}색을 좋아해요.".format(age = 20,color = "빨간")) 

파이썬 버전 3.6이상~~!!! (추천!)
age =20
color ="빨간"
print(f"나는 {age}살이며, {color}색을 좋아해요.") 


4-5. 탈출문자

\n : 줄바꿈
"백문이 불여일견\n백견이 불여일타"
"저는 \"나도코딩\"입니다." : 쌍따를 문자로 넣음 
\\ : 문장 내에서 \

\r : 커서를 맨앞으로 이동
"red apple\rpine" : pineapple

\b : 백스페에스 ( 글자 삭제)
"redd\bapple" : redapple

\t : 
"red\tapple" : red   apple 


4-6. 퀴즈()

사이트별로 비밀번호 만들기
http://naver.com
조건 1 : http:// 제외
조건 2 : 처음 만나는 (.) 이후 부분 제외
조건 3 : 남은 글자  처음 세자리 + 글자개수 + 글자 
'e' 갯수 + "!"  구성

site = "http://naver.com"
# site.replace("http://", "") # 이걸로 해도 된다는 의미.
site_1 = site[7:]
site_2 = site_1[0:site_1.index(".")]
password = site_2[0:3] + str(len(site_2)) + str(site_2.count("e")) + "!"
# 문자로 합치기 위해서는 str로 감싸줘야함(각자 데이터형식 다를 수 있으니까)
print(password)


5-1. 리스트(LIST) : []

# 선언
subway = list()
subway = []

# 자료넣기
subway = [10,20,30]

# append() => 뒤에 삽입되는 특징
subway.append("조세호")

# insert() => 10과 20사이에 정형돈씨 넣기
subway.insert(1,"정형돈") # index 1에 "정형돈" 삽입

# pop() => 뒤에서 부터 빠지는 특징
subway.pop()

# 정렬
numlist = [5,2,4,3,1]
numlist.sort()

# 순서 뒤집기
numlist.reverse() # numlist가 뒤집혀 진거임.

# 모두 지우기
numlist.clear()

# 다양한 자료형 함께사용
mixlist = ["조세호",20,True]

#리스트 확장
numlist.extend(mixlist) # 두 리스트를 합친거임(numlist가 합쳐짐)


5-2. 사전(DICT) : {}

cab = {3:"유재석"} ; 앞은 키값이고 3 = 유재석
print(cab[3]) ; 유재석이 나옴
print(cab.get(3)) ; 똑같음
print(cab[5]) ; 오류 발생  종료
print(cab.get(5)) ; none이 나옴(위와 차이는 오류X)
print(cab.get(5, "사용 가능")) ; 사용가능이 나옴
print(3 in cab) ; true값 반환 

#새손님
print(cab)
cab[3] = "김종국" # 유재석에서 김종국으로
cab["A-20"] = "조세호" # A-20:조세호 로 추가(cab에)

#간 손님
del cab[3] # 김종국이 사라지겠죠

# key들만 출력
print(cab.keys())

#value들만 출력
print(cab.values())

#key,value 쌍으로 출력
print(cab.items())

#목욕탕 폐점
cab.clear() 


5-3. 튜플(TUPLE) : ()

<br>
### 리스트와 다르게 내용변경 추가 못함 그러나 속도가 빠름 리스트보다

menu = ("돈까스","치즈까스")
print(menu) # ('돈까스', '치즈까스')
print(menu[0]) # 돈까스 

(name,age,hobby) = ("김종국",20,"코딩")
print(name) # 김종국
print(name,age,hobby) # 김종국 20 코딩


5-4 세트(set 집합) : {}

<br>
### 중복 불가, 순서없음

my= {1,2,3,3,3} # set 형식으로 저장
print(my) # {1,2,3,3,3}

ja= {"유재석","김태호","양세형"}
py=set(["유재석","박명수"]) # 리스트의 중복제거에 사용할 수 있겠죠?

# 교집합
print(ja & py)
print(ja.intersection(py))

#합집합
print(ja | py)
print(ja.union(py))

#차집합
print(ja - py)
print(ja.difference(py))

#파이썬 할줄아는사람 늘어남
py.add("김태호") # 뒤에 추가
print(py)

#java 까먹음
ja.remove("김태호")
print(ja) 


5-5. 자료구조의 변경

#커피숍
menu = {"커피","우유","주스"}
print(menu,type(menu)) ; type이 set으로나옴 
menu = list(menu)
print(menu,type(menu)) ; type이 list으로나옴 
menu = tuple(menu)
print(menu,type(menu)) ; type이 tuple으로나옴 
menu = set(menu)
print(menu,type(menu)) ; type이 set으로나옴 


5-6.퀴즈 () => random 모듈 활용

추첨 프로그램 ( 1 치킨, 3 커피)
조건 1 : 20명이고 아이디 1~20 이라고 가정
조건 2 : 무작위 추첨하되 중복 불가
조건 3 : random 모듈의 shuffle  sample  활용
# 처음엔 randint 활용해보려고 했음.

from random import *
lst = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]
shuffle(lst) # 랜덤으로 섞어줌

lst_no=sample(lst,4) # 중복 X => 4개를 sample로 뽑아오는 함수임!!
print(lst_no[0]) # 치킨 당첨자
print(lst_no[1:]) # 커피 당첨자


6-1.if문

weather = input("오늘 날씨는 어때요? ") => C언어의 scanf같은 것임.
if weather == "비" or weather == "눈": # 자바와 다르게 바로 "=="으로 비교 가능~!
  print("우산을 챙기세요")
elif weather == "미세먼지": # elif 인점 체크.
  print("마스크를 챙기세요")
else:
  print("준비물 필요 없어요.")

temp = int(input("기온은 어때요? "))
if 30 <= temp:
  print("너무 더워요, 나가지 마세요")
elif 10 <= temp and temp < 30:
  print("괜찮은 날씨에요")
elif 0 <= temp and temp < 10:
  print("외투를 챙기세요")
else:
  print("너무 추워요. 나가지 마세요")


6-2.for문

print("대기번호 : 1")
print("대기번호 : 2")
print("대기번호 : 3")
print("대기번호 : 4")

# 두가지 유형확인
for watino in range(1,6): # 1~5
  print("대기번호 : {0}".format(watino))

star = ["아이언맨", "토르", "아이엠 그루트"]
for cutomer in star:
  print("{0}, 커피가 준비되었습니다.".format(cutomer))


6-3.while문

customer = "토르"
index = 5

while index >= 1:
  print("{0}, 커피가 준비 되었습니다. {1} 번 남았어요.".format(customer,index))
  index -= 1
  if index == 0:
    print("커피는 폐기처분되었습니다.")

customer = "아이언맨"
index = 1

while True:
  print("{0}, 커피가 준비 되었습니다. 호출 {1} 회".format(customer,index))
  index += 1

**ctrl + C 누르면 강제종료**

customer = "토르"
person = "Unknown"

while person != customer :
  print("{0}, 커피가 준비 되었습니다.".format(customer))
  person = input("이름이 어떻게 되세요? ")


6-4 continue(다음반복으로 감) 와 break(바로나감)

absent = [2,5] # 결석
nobook = [7] # 책을 깜빡했음

for student in range(1, 11):
  if student in absent:
    continue
  elif student in nobook:
    print("오늘 수업 여기까지. {0}는 교무실로 따라와".format(student))
    break
  print("{0}, 책을 읽어봐".format(student))


6-5 한줄 for

# 출석번호가 1 2 3 4, 앞에 100을 붙이기로 함 -> 101, 102, 103, 104.
 students = [1,2,3,4,5]
 print(students)
 students = [i+100 for i in students]
 print(students)

# 학생 이름을 길이로 변환
students = ["Iron man", "Thor", "I am groot"]
students = [len(i) for i in students]
print(students)

# 학생 이름을 대문자로 변환
students = ["Iron man", "Thor", "I am groot"]
students = [i.upper() for i in students]
print(students)


6-6.퀴즈 ()

50명의 승객과 매칭 기회,  탑승 승객 ?
조건 1 : 승객별 운행 시간 5 ~ 50 사이의 난수
조건 2 : 당신의 소요 시간 5 ~ 15 사이의 승객만 매칭

(출력문 예제)
[O] 1번째 손님 (소요시간 : 15)
[ ] 2번째 손님 (소요시간 : 50)
...
[ ] 50번째 손님 (소요시간 : 16)
 탑승 승객 : 2 

# 답안
from random import *
count = 0

for i in range(1,51):
  time = randint(5,50)
  if time >= 5 and time <= 15:
    count += 1
    print("[O] {0}번째 손님 (소요시간 : {1}분)".format(i,time))
  else:
    print("[ ] {0}번째 손님 (소요시간 : {1}분)".format(i,time))
print("총 탑승 승객 : {0} 분".format(count))


7-1.함수

def open_account():
  print("새로운 계좌가 생성되었습니다.")


7-2.전달값과 반환값 : 매개변수, 인수, return

  • 매개변수 : 함수 호출할 때 전달받은 인수를 매개변수(파라미터)로 함수내에서 사용
  • 인수 : 함수 호출할 때 전달하는 인수(argument)
  • return : 함수의 반환을 의미
# 함수 선언
def deposit(balance, money): # 입금 : balance, money는 매개변수
  print("입금이 완료되었습니다. 잔액은 {0} 원입니다.".format(balance + money))
  return balance + money # 반환값

def withdraw(balance, money): # 출금
  if balance >= money:
    print("출금이 완료되었습니다. 잔액은 {0} 원입니다.".format(balance - money))
    return balance - money
  else:
    print("출금이 완료되지 않았습니다. 잔액은 {0} 원입니다.".format(balance))
    return balance
    
<br>
##### return 2개이상 가능
def withdraw_night(balance, money): # 저녁에 출금
  commission = 100 # 수수료 100원
  return commission, balance - money - commission

# 함수 호출
balance = 0 # 잔액
balance = deposit(balance, 1000) # balance, 1000은 인수
print(balance)
balance = withdraw(balance, 500)
commission, balance = withdraw_night(balance, 500)
print("수수료 {0} 원이며, 잔액은 {1} 원입니다.".format(commission, balance))


7-3.기본값 : 매개변수를 기본값 설정

def profile(name, age, main_lang):
   print("이름 : {0}\t나이 : {1}\t주 사용 언어 : {2}" \
     .format(name,age,main_lang))

profile("유재석", 20, "파이썬")
profile("김태호", 25, "자바")

# 같은 학교 같은 학년 같은 반 같은 수업.
# 기본값!!
def profile(name, age=17, main_lang="파이썬"):
  print("이름 : {0}\t나이 : {1}\t주 사용 언어 : {2}" \
    .format(name,age,main_lang))

profile("유재석")
profile("김태호")


7-4.키워드값

  • 키워드=값 형식으로 사용.
    • 장점 : 가독성 상승, 함수의 매개변수에 넣어줄 인자를 순서대로 안해도 됨.
    • 즉, profile()함수의 main_lang매개변수를 main_lang=”파이썬” 먼저 넣어도 된다는 의미.
def profile(name, age, main_lang):
  print(name, age, main_lang)
  
profile(name="유재석", main_lang="파이썬", age=20) # 키워드값 사용은 이렇게 순서 상관X


7-5.가변인자 -> *language로 lang갯수 상관 X!!

def profile(name, age, lang1, lang2, lang3, lang4, lang5):
  print("이름 : {0}\t나이 : {1}\t".format(name,age), end=" ")
  print(lang1, lang2, lang3, lang4, lang5)

def profile(name, age, *language): # 가변인자!!!
  print("이름 : {0}\t나이 : {1}\t".format(name,age), end=" ")
  for lang in language:
    print(lang, end=" ") # 줄바꿈 안함
  print() # 줄바꿈

profile("유재석", 20, "Python", "Java", "C", "C++", "C#", "JavaScript")
profile("김태호", 20, "Python", "Java")


7-6.지역변수와 전역변수

gun = 10 # 이녀석을 전역으로 쓴거임.

def checkpoint(soldiers): # 경계근무
  # gun = 20 # 지역변수!!!
  global gun # 전역 공간에 있는 gun 사용!!!
  gun = gun - soldiers
  print("[함수 내] 남은 총 : {0}".format(gun))

def checkpoint_ret(gun, soldiers):
  gun = gun - soldiers
  print("[함수 내] 남은 총 : {0}".format(gun))
  return gun # 실질적으론 이런식으로 사용하자! gun을 외부로 보내준것임

print("전체 총 : {0}".format(gun))
checkpoint(2) # 2명이 경계근무 나감
gun = checkpoint_ret(gun, 2) # 실제로 쳌(10,2)라는 것.
print("남은 총 : {0}".format(gun))


7-7.퀴즈()

표준 체중 프로그램
(성별 따른 공식)
남자 : (m) x (m) x 22
여자 : (m) x (m) x 21
조건 1 : 표준 체중은 별도 함수 내에서 계산
      \* 함수명 : std_weight
      \* 전달값 : (height), 성별(gender)
조건 2 : 표준 체중은 소수점 둘째자리까지 표시

(출력 예제)
 175cm 남자의 표준 체중은 67.38kg 입니다.

# 답안
def std_weight(height, gender): # 키 m 단위(실수), 성별
  if gender == "남자":
    return height * height * 22
  else:
    return height * height * 21 

height = 175 # cm 단위
gender = "남자"
weight = round(std_weight(height / 100, gender), 2) # 소수점
print("키 {0}cm {1}의 표준 체중은 {2}kg 입니다.".format(height,gender,weight))


8-1.표준입출력

  • print내부에 콤마(,)로 구분시 한칸 자동으로 띄어서 구분함.
    • sep를 사용해 콤마부분 수정가능.
  • print만 입력시 자동으로 한줄 넘어감(끝에 자동으로 ‘\n’ 들어가는 특징때문임)
    • end를 사용해 문장끝부분 수정가능.(한줄 넘어가는걸 막을 수 있는것.)
  • print내부에 +로 문자열 합칠시 말 그대로 둘이 합침. (보충)
    • ljust, rjust 메소드(보충) : 공간 확보 후 왼쪽정렬, 오른쪽정렬
    • zfill 메소드(보충) : 공간 확보 후 값 없는곳은 0표시
import sys
print("Python" ,"java", file=sys.stdout)
print("Python" ,"java", file=sys.stderr) # 에러처리 가능
print("Python" ,"java", sep=",", end="?")
# sep를 사용해 콤마부분 입력, end를 사용해 문장끝부분 입력

scores = {"수학":0, "영어":50, "코딩":100} # 앞: key 뒤: value
for subject, score in scores.items(): # items는 key, value 받아줌
  print(subject.ljust(8),str(score).rjust(4), sep=":") # ljust(8)은 왼쪽8칸 할당 후 정렬

# 은행 대기순번표
for num in range(1, 21):
  print("대기번호 : " + str(num).zfill(3)) # 3공간확보 값없는곳 0표시

answer = input("아무 값이나 입력하세요 : ")
answer = 10
print(type(answer))
print("입력하신 값은 " + answer + "입니다.")
사용자 입력을 받은후 출력하면 무조건 문자열(str)형태!!


8-2.다양한 출력포맷

# 빈 자리는 빈공간으로 두고, 오른쪽 정렬 하되, 총 10자리 공간 확보
print("{0: >10}".format(500)) #               500

# 양수일 땐 +로 표시, 음수일 땐 -로 표시
print("{0: >+10}".format(500))
print("{0: >+10}".format(-500))

# 왼쪽 정렬하고, 빈칸으로 _로 채움
print("{0:_<10}".format(500))

# 3자리 마다 콤마를 찍어주기
print("{0:,}".format(1000000000))

# 3자리 마다 콤마를 찍어주기, +- 부호도 붙이기
print("{0:+,}".format(1000000000))
print("{0:+,}".format(-1000000000))

# 3자리 마다 콤마를 찍어주기, 부호도 붙이고, 자릿수 확보하기
# 돈이 많으면 행복하니까 빈 자리는 ^로 채워주기
print("{0:^<+30,}".format(100000000000))

# 소수점 출력
print("{0:f}".format(5/3))
# 소수점 특정 자리수 까지만 표시
print("{0:.2f}".format(5/3))


8-3.파일입출력

#파일 쓰기
score_file = open("score.txt", "w", encoding="utf8") # 쓰기목적으로 open
print("수학 : 0", file=score_file)
print("영어 : 50", file=score_file)
score_file.close() # 열었으면 닫아줘야함

#파일 내용 추가
score_file = open("score.txt", "a", encoding="utf8") # append의미
score_file.write("과학 : 80")
score_file.write("\n코딩 : 100")
score_file.close()

#파일 읽기
score_file = open("score.txt", "r", encoding="utf8") # reading 뜻
print(score_file.read())
score_file.close()

#파일 한줄 읽기
score_file = open("score.txt", "r", encoding="utf8") # reading 뜻
print(score_file.readline()) # 한줄만 읽어와서 커서를 다음줄로 이동
print(score_file.readline())
print(score_file.readline())
print(score_file.readline())
score_file.close()

#파일 전체 읽기
score_file = open("score.txt", "r", encoding="utf8") 
while True:
  line = score_file.readline()
  if not line:
    break
  print(line, end="")
score_file.close()

#파일 전체 읽기 - 리스트에 값 넣어서 처리 
score_file = open("score.txt", "r", encoding="utf8")
lines = score_file.readlines() # list 형태로 저장
for line in lines:
  print(line, end="")
score_file.close()


8-4.pickle

import pickle => pickle이라는 데이터파일을 따로 만든다고 생각 .pickle
profile_file = open("profile.pickle", "wb") # 따로 인코딩 안해도됨
profile = {"이름":"박명수", "나이":30, "취미":["축구", "골프", "코딩"]}
print(profile)

pickle.dump(profile, profile_file) # profile 에 있는 정보를 file 에 저장
profile_file.close()

profile_file = open("profile.pickle", "rb")
profile = pickle.load(profile_file) # file에 있는 정보를 profile 에 불러오기

print(profile)

profile_file.close()


8-5.with : 자동 close해주는 장점.

# with문을 탈출하면서 자동으로 close도 해줌
import pickle

with open("profile.pickle", "rb") as profile_file:
  print(pickle.load(profile_file))

with open("study.txt", "w", encoding="utf8") as study_file:
  study_file.write("파이썬을 열심히 공부하고 있어요")

with open("study.txt", "r", encoding="utf8") as study_file:
  print(study_file.read())


8-6.퀴즈()

매주 1 작성해야 하는 보고서가 있다.
양식)
\- X 주차 주간보고 -
부서 :
이름 :
업무 요약 :

1주차부터 50주차까지의 보고서 파일을 만드는 프로그램을 작성하시오.
조건 : 파일명은 '1주차.txt', ...  같이 만듭니다.

for a in range(1,51):
  with open("{0}주차.txt".format(a), "w", encoding="utf8") as study_:
    study_.write("- {0} 주차 주간보고 -".format(a))
    study_.write("\n부서 : ")
    study_.write("\n이름 : ")
    study_.write("\n업무 요약 : ")


9-1.클래스 (붕어빵 틀) : 객체지향

class Unit: # 클래스 내부에선 항상 self 적어준다 생각
  def __init__(self, name, hp, damage):
    self.name = name
    self.hp = hp
    self.damage = damage
    print("{0} 유닛이 생성 되었습니다.".format(self.name))
    print("체력 {0}, 공격력 {1}".format(self.hp, self.damage))

marine1 = Unit("마린", 40, 5)
marine2 = Unit("마린", 40, 5)
tank = Unit("탱크", 150, 35)

# 레이스 : 공중 유닛, 비행기. 클로킹 (상대방에게 보이지 않음)
wraith1 = Unit("레이스", 80, 5)
print("유닛 이름 : {0}, 공격력 : {1}".format(wraith1.name, wraith1.damage))

# 마인드 컨트롤 : 상대방 유닛 내 것으로 만듬
wraith2 = Unit("빼앗은 레이스", 80, 5)
wraith2.clocking = True # 클래스 외부에서 원하는 변수를 확장 할수도 있다.

if wraith2.clocking == True:
  print("{0} 는 현재 클로킹 상태입니다.".format(wraith2.name))


9-2.init : 생성자, del : 소멸자…등

마린이라던지 탱크같은 객체만들어질때 자동으로 호출되는 부분(init)

마린이나 탱크와 같이 어떤 클래스로부터 만들어지는 녀석들을 객체라 하고

이때, 마린과 탱크는 유닛클래스의 인스턴스라고 표현을 합니다.

  • init

    간단해서 생략.
    
  • del

     또한 생략.
    
  • repr

    # 출력.
    def __repr__(self):
    	return self.title
    
  • add

    # 덧셈.
    def __add__(self, other):
    	return self.area + other.area
    
  • cmp

    # 비교.
    def __cmp__(self, other):
    	if self.area < other.area :
    		return -1
    	elif self.area == other.area :
    		return 0
    	else :
    		return 1
    


9-3.멤버변수

어떤 클래스 내에서 정의된 변수

변수를 내부 외부(.변수)에서도 사용 가능

클래스 외부에서 원하는 변수를 확장 할수도 있다.

  • wraith2.clocking = True # class에서 예시부분


9-4.메소드 : 함수

# 일반 유닛
class Unit:
  def __init__(self, name, hp, damage):
    self.name = name
    self.hp = hp
    self.damage = damage
    print("{0} 유닛이 생성 되었습니다.".format(self.name))
    print("체력 {0}, 공격력 {1}".format(self.hp, self.damage))

# 공격 유닛  
class AttackUnit:
  def __init__(self, name, hp, damage):
    self.name = name
    self.hp = hp
    self.damage = damage

  def attack(self, location):
    print("{0} : {1} 방향으로 적군을 공격 합니다. [공격력 {2}]" \
      .format(self.name, location, self.damage))

  def damaged(self, damage):
    print("{0} : {1} 데미지를 입었습니다.".format(self.name, damage))
    self.hp -= damage
    print("{0} : 현재 체력은 {1} 입니다.".format(self.name, self.hp))
    if self.hp <= 0:
      print("{0} : 파괴되었습니다.".format(self.name))

# 파이어뱃 : 공격 유닛, 화염방사기.
firebat1 = AttackUnit("파이어뱃", 50, 16)
firebat1.attack("5시")

# 공격 2번 받는다고 가정
firebat1.damaged(25)
firebat1.damaged(25)


9-5.상속 : 부모 자식 관계

# 공격 유닛  
class AttackUnit(Unit): # 상속!
  def __init__(self, name, hp, damage):
    Unit.__init__(self, name, hp)
    self.damage = damage


9-6.다중상속

# 드랍쉽 : 공중 유닛, 수송기. 마린 / 파이어뱃 / 탱크 등을 수송. 공격 X
# 공중 공격 유닛 클래스
class FlyableAttackUnit(AttackUnit, Flyable): # 다중상속
  def __init__(self, name, hp, damage, flying_speed):
    AttackUnit.__init__(self, name, hp, damage)
    Flyable.__init__(self, flying_speed)

# 정리:
Unit <- AttackUnit <- FlyableAttackUnit -> Flyable


9-7.메소드 오버라이딩(연산자 오버라이딩)

  • 상속받으면 부모의 함수를 사용할 수 있지만, 그 함수를 가공해서 조금 다르게 사용하고 싶을때.
# 일반 유닛
class Unit:
  def __init__(self, name, hp, speed):
    self.name = name
    self.hp = hp
    self.speed = speed

  def move(self, location):
    print("[지상 유닛 이동]")
    print("{0} : {1} 방향으로 이동합니다. [속도 {2}]".\
      format(self.name, location, self.speed))

# 공격 유닛  
class AttackUnit(Unit): # 상속!
  def __init__(self, name, hp, speed, damage):
    Unit.__init__(self, name, hp, speed)
    self.damage = damage

  def attack(self, location):
    print("{0} : {1} 방향으로 적군을 공격 합니다. [공격력 {2}]" \
      .format(self.name, location, self.damage))

  def damaged(self, damage):
    print("{0} : {1} 데미지를 입었습니다.".format(self.name, damage))
    self.hp -= damage
    print("{0} : 현재 체력은 {1} 입니다.".format(self.name, self.hp))
    if self.hp <= 0:
      print("{0} : 파괴되었습니다.".format(self.name))

# 공중 기능 클래스
class Flyable:
  def __init__(self, flying_speed):
    self.flying_speed = flying_speed

  def fly(self, name, location):
    print("{0} : {1} 방향으로 날아갑니다. [속도 {2}]"\
      .format(name, location, self.flying_speed))

# 공중 공격 유닛 클래스
class FlyableAttackUnit(AttackUnit, Flyable): # 다중상속
  def __init__(self, name, hp, damage, flying_speed):
    AttackUnit.__init__(self, name, hp, 0, damage) # 지상 speed 0
    Flyable.__init__(self, flying_speed)

  def move(self, location): # 메소드 오버라이딩!!!!!
    print("[공중 유닛 이동]")
    self.fly(self.name, location)

# 벌쳐 : 지상 유닛, 기동성이 좋음
vulture = AttackUnit("벌쳐", 80, 10, 20)

# 배틀크루저 : 공중 유닛, 체력도 굉장히 좋음, 공격력도 좋음.
battlecruiser = FlyableAttackUnit("배틀크루저", 500, 25, 3)

vulture.move("11시")
battlecruiser.fly("배틀크루저", "9시")

# 따라서 매번 공중(fly), 지상유닛일시(move) 다른 함수를 써야함..
battlecruiser.move("9시") # move로 통일!

# 정리:
Unit(move()) <- AttackUnit <- FlyableAttackUnit(move()) -> Flyable


9-8.pass : 바로 넘어감.

class BuildingUnit(Unit):
  def __init__(self, name, hp, location):
    pass


9-9.super

  • 부모를 의미. super().함수() 이런식으로 사용하겠죠.
# 단일 상속일때
class BuildingUnit(Unit):
  def __init__(self, name, hp, location):
    # Unit.__init__(self, name, hp, 0) # speed는 0으루 가정
    super().__init__(name, hp, 0) 
    self.location = location

# 다중 상속일때
class Unit:
  def __init__(self):
    print("Unit 생성자")

class Flyable:
  def __init__(self):
    print("Flyable 생성자")

class FlyableUnit(Unit, Flyable): # 다중 상속.
  def __init__(self):
    # super().__init__() # 다중 상속일때는 앞에만 받아와짐
    Unit.__init__(self)
    Flyable.__init__(self)

# 드랍쉽
dropship = FlyableUnit()


9-10.퀴즈()

부동산 프로그램 작성하시오
(예제)
 3대의 매물이 있습니다.
강남 아파트 매매 10 2010
마포 오피스텔 전세 5 2007
송파 빌라 월세 500/50 2000

[코드]
class House:
  # 매물 초기화
  def __init__(self, location, house_type, deal_type, price, comletion_year):
    self.location = location
    self.house_type = house_type
    self.deal_type = deal_type
    self.price = price
    self.comletion_year = comletion_year

  # 매물 정보 표시
  def show_detail(self):
    print(self.location, self.house_type, self.deal_type\
      , self.price, self.comletion_year)

houses = []
house1 = House("강남", "아파트", "매매", "10억", "2010년")
house2 = House("마포", "오피스텔", "전세", "5억", "2007년")
house3 = House("송파", "빌라", "월세", "500/50", "2000년")
houses.append(house1) # 각각 show_detail하긴 힘드니까 for문사용위해
houses.append(house2)
houses.append(house3)

print("총 {0}대의 매물이 있습니다.".format(len(houses))) # 객체가 몇개인지 알려줌
for house in houses:
  house.show_detail()


10-1.예외처리

  • 에러이름 알아내는법, except:만 사용시 에러 전부
  • raise ValueError # 에러를 정의해줌!
try:
  print("나누기 전용 계산기입니다.")
  nums = []
  nums.append(int(input("첫 번째 숫자를 입력하세요 : ")))
  nums.append(int(input("두 번째 숫자를 입력하세요 : ")))
  #nums.append(int(nums[0]/nums[1]))
  print("{0} / {1} = {2}".format(nums[0],nums[1],nums[2]))
except ValueError:
  print("에러! 잘못된 값을 입력하였습니다.")
except ZeroDivisionError as err:
  print(err)
except Exception as err: # 에러이름 알아내는법, except:만 사용시 에러 전부
  print("알 수 없는 에러가 발생하였습니다.")
  print(err)


10-2.에러 발생시키기

try:
  print("한 자리 숫자 나누기 전용 계산기입니다.")
  num1 = int(input("첫 번째 숫자를 입력하세요 : "))
  num2 = int(input("두 번째 숫자를 입력하세요 : "))
  if num1 >= 10 or num2 >=10:
    raise ValueError # 에러를 정의해줌!
  print("{0} / {1} = {2}".format(num1, num2, int(num1 / num2)))
except ValueError: # 그 에러를 여기서 받을수 있음!
  print("잘못된 값을 입력하였습니다. 한 자리 숫자만 입력하세요.")


10-3.사용자 정의 예외처리 (에러 직접정의!)

class BigNumberError(Exception): # 에러 정의해줬음(Exception)상속 해줘야함
  #pass
  def __init__(self, msg):
    self.msg = msg
    
  def __str__(self):
    return self.msg
try:
  print("한 자리 숫자 나누기 전용 계산기입니다.")
  num1 = int(input("첫 번째 숫자를 입력하세요 : "))
  num2 = int(input("두 번째 숫자를 입력하세요 : "))
  if num1 >= 10 or num2 >=10:
    raise BigNumberError("입력값 : {0}, {1}".format(num1, num2)) # 에러를 정의해줌!
  print("{0} / {1} = {2}".format(num1, num2, int(num1 / num2)))
except ValueError: # 그 에러를 여기서 받을수 있음!
  print("잘못된 값을 입력하였습니다. 한 자리 숫자만 입력하세요.")
except BigNumberError as err:
  print("에러가 발생하였습니다. 한 자리 숫자만 입력하세요.")
  print(err)


10-4.finally

class BigNumberError(Exception):
  #pass
  def __init__(self, msg):
    self.msg = msg
    
  def __str__(self):
    return self.msg

try:
  print("한 자리 숫자 나누기 전용 계산기입니다.")
  num1 = int(input("첫 번째 숫자를 입력하세요 : "))
  num2 = int(input("두 번째 숫자를 입력하세요 : "))
  if num1 >= 10 or num2 >=10:
    raise BigNumberError("입력값 : {0}, {1}".format(num1, num2)) 
  print("{0} / {1} = {2}".format(num1, num2, int(num1 / num2)))
except ValueError:
  print("잘못된 값을 입력하였습니다. 한 자리 숫자만 입력하세요.")
except BigNumberError as err:
  print("에러가 발생하였습니다. 한 자리 숫자만 입력하세요.")
  print(err)
finally: # 반드시 실행 함!
  print("계산기를 이용해 주셔서 감사합니다.")


10-5.퀴즈()

치킨집있당. 자동 주문 시스템 제작했당.
코드 확인후 적절한 예외처리 구문넣기
조건 1 : 1보다 작거나 숫자가 아닌 입력값올때 ValueError로 처리
    출력 메시지 : "잘못된 값을 입력하였습니다."
조건 2 : 대기 손님이 주문할  있는  치킨량은 10마리로 한정
    치킨 소진  사용자 정의 에러[SoldOutError]발생후 프로그램 종료
    출력 메시지 : "재고가 소진되어 더 이상 주문을 받지 않습니다."

[코드]
class SoldOutError(Exception):
  pass

chicken = 10
waiting = 1 # 홀 안에는 현재 만석. 대기번호 1부터 시작

while(True):
  try:
    print("[남은 치킨 : {0}]".format(chicken))
    order = int(input("치킨 몇 마리 주문하시겠습니까?"))
    if order > chicken: # 남은 치킨보다 주문량이 많을때
      print("재료가 부족합니다.")
    elif order < 1:
      raise ValueError
    else:
      print("[대기번호 {0}] {1} 마리 주문이 완료되었습니다."\
        .format(waiting, order))
      waiting += 1
      chicken -= order
    if chicken == 0:
      raise SoldOutError
  except ValueError:
    print("잘못된 값을 입력하였습니다.")
  except SoldOutError:
    print("재고가 소진되어 더 이상 주문을 받지 않습니다.")
    break


11-1.모듈 # theater_modoul.py


theater_modoul.py

# 일반 가격
def price(people):
    print("{0}명 가격은 {1}원 입니다.".format(people, people * 10000))

# 조조할인 가격
def price_morning(people):
    print("{0}명 조조 할인 가격은 {1}원 입니다.".format(people,people * 6000))

# 군인 할인 가격
def price_soldier(people):
    print("{0}명 군인 할인 가격은 {1}원 입니다.".format(people,people * 4000))


다른 파일.py

import theater_module
theater_module.price(3) # 3명이서 영화 보러갔을 때 가격
theater_module.price_morning(4)
theater_module.price_soldier(5)

import theater_module as mv
mv.price(3)
mv.price_morning(4)
mv.price_soldier(5)

from theater_module import * # 대박 줄임!!
price(3)
price_morning(4)
price_soldier(5)

from theater_module import price, price_morning # 원하는것만!!
price(3)
price_morning(4)

from theater_module import price_soldier as price # 원하는걸 원하는 형태까지!!
price(5)


11-2.패키지(pycache)

  • travel이란 폴더에, thailand.py 만듬

    class ThailandPackage:
        def detail(self):
            print("[태국 패키지 3박 5일] 방콕, 파타야 여행 (야시장 투어) 50만원")
      
    if __name__ == "__main__":
        print("Thailand 모듈을 직접 실행")
        print("이 문장은 모듈을 직접 실행할 때만 실행돼요")
        trip_to = ThailandPackage()
        trip_to.detail()
    else:
        print("Thailand 외부에서 모듈 호출")
    
import travel.thailand # 이 파일보다 현재 코드작성하는 파일이 위에있어야함.
trip_to = travel.thailand.ThailandPackage()
trip_to.detail()

# 주의할점
# import뒤에는 모듈이나 패키지만가능, 즉 클래스나 함수는 직접 import바로 못함
import travel.thailand.ThailandPackage # 오류

다만,
from travel.thailand import ThailandPackage # 이건가능!!
trip_to = ThailandPackage()
trip_to.detail()


11-3.all


travel/vietnam.py

class VietnamPackage:
    def detail(self):
        print("[베트남 패키지 3박 5일] 다낭 효도 여행 60만원")


외부 파일.py

# from random import *
from travel import * 
trip_to = vietnam.VietnamPackage()
trip_to.detail()
# 오류 뜨는이유는 패키지안에서 공유하는 범위지정해줄수 있는데
# 그것때문
# __init__.py에서 범위 수정!! 수정하는거 확인!


__ init __.py

__all__ = ["vietnam", "thailand"]


11-4.모듈 직접 실행


thailand.py

class ThailandPackage:
    def detail(self):
        print("[태국 패키지 3박 5일] 방콕, 파타야 여행 (야시장 투어) 50만원")

if __name__ == "__main__":
    print("Thailand 모듈을 직접 실행")
    print("이 문장은 모듈을 직접 실행할 때만 실행돼요")
    trip_to = ThailandPackage()
    trip_to.detail()
else:
    print("Thailand 외부에서 모듈 호출")


11-5.패키지, 모듈 위치

from travel import * # travel패키지 안에 py다 받아옴.
import inspect
import random

print(inspect.getfile(random)) # 경로 구해줌
print(inspect.getfile(thailand))
만약 thailand가 폴더를 random있는 경로에 넣어줘도 .


11-6.pip install

pypi구글에 검색해서 들어가서 여러가지 볼수있음.
pip list - 치면은 뭐깔렸는지 볼수있음.
pip show 패키지명 - 치면은 자세한 정보 볼수있음.
pip install --upgrade 패키지명 - 업그레이드 할수있음.
pip uninstall 패키지명 - 삭제 할수있음.


11-7.내장함수 # 구글에 list of python builtins 검색하면 많이 나옴!

  • dir() : 객체가 어떤 변수와 함수를 가지는지 표시.
# input() : 사용자 입력을 받는 함수
language = input("무슨 언어를 좋아하세요?")
print("{0}은 아주 좋은 언어입니다!".format(language))

# dir : 어떤 객체를 넘겨줬을 때 그 객체가 어떤 변수와 함수를 가지고 있는지 표시
print(dir())

import random # 외장 함수
print(dir()) # random이 추가됨

import pickle
print(dir()) # pickle이 추가됨

print(dir(random)) # random. 찍었을때 나오는함수들 유사하게 나온다 생각
lst = [1,2,3]
print(dir(lst))

name = "Jim"
print(dir(name))


11-8.외장함수 # 구글에 list of python modules 검색하면 많이 나옴!

  • glob, os 모듈
  • time, datetime 모듈
# glob : 경로 내의 폴더 / 파일 목록 조회
import glob
print(glob.glob("*.py")) # 확장자가 py인 모든 파일

# os : 운영체제에서 제공하는 기본 기능
import os
print(os.getcwd()) # 현재 디렉토리

folder = "sample_dir"
if os.path.exists(folder):
  print("이미 존재하는 폴더입니다.")
  os.rmdir(folder)
  print(folder, "폴더를 삭제하였습니다.")
else:
  os.makedirs(folder) # 폴더 생성
  print(folder, "폴더를 생성하였습니다.")

print(os.listdir()) # glob가 비슷하게

import time
print(time.localtime()) # 현재시간
print(time.strftime("%Y-%m-%d %H:%M:%S"))

import datetime
print("오늘 날짜는 ", datetime.date.today()) # 현재날짜
timedelta :  날짜 사이의 간격
today = datetime.date.today()
td = datetime.timedelta(days=100) # 100일 저장
print("우리가 만난지 100일은", today + td) # 오늘 날짜에서 100일 더해줌


11-9.퀴즈()

# 프로젝트 내에 나만의 시그니처를 남기는 모듈을 만드시오
# 조건 : 모듈 파일명은 byme.py로 작성
# (모듈 사용 예제)

# (출력 예제)
# 이 프로그램은 ~~~~~~에 의해 만들어졌습니다.
# 유튜브 : http://youtube.com
# 이메일 : ~~~~~~~~@gmail.com

# 답안(외부 파일.py)
import byme
byme.sign()
# 답안(byme.py)
def sign():
    print("이 프로그램은 ~~~~~~에 의해 만들어졌습니다.")
    print("유튜브 : http://youtube.com")
    print("이메일 : ~~~~~~~~@gmail.com")

댓글남기기