본문 바로가기
  • Welcome J-Kyu Tstory
국비교육과정/Python

파이썬 기초 문법

by regularity 2022. 5. 12.
728x90

0511_파이썬기본문법_2 - Jupyter Notebook.pdf
0.33MB

 

 

#!/usr/bin/env python
# coding: utf-8

# # 파이썬 기초

# In[1]:


get_ipython().system('python -V')


# In[2]:


print('Hello World~!!')


# In[3]:


# 숫자형 자료형
print(5)
print(-10)
print(3.14)
print(100000)
print(5*3)
print(3*(3*5))


# In[4]:


#문자열 자료형
print('나비')
print('교재')
print('하'*10)


# In[5]:


#boolean 자료형
print(5>10)
print(10>5)
print(True)
print(False)
print(not True)
print(not False)


# In[7]:


#변수
print('우리집강아지는 복실이 입니다')
print('복실이는 4살이며 산책을 좋아합니다')
print('복실이는 어른일까요?True')

animal="강아지"
name="복실이"
age=4
hobby="산책"
is_adult=age>=3
print("우리집"+animal+"이름은"+name+"입니다")
print(name+"는"+str(age)+"살이며"+hobby+"을 좋아합니다")


# In[8]:


#변수를 선언하여 놓으면 비슷하게 응용하여 사용할 수 있음


# In[9]:


#콤마를 사용하면 변환없이 사용할 수 있음


# In[10]:


#여러문장 주석처리내용
'''자동적으로 여러줄 주석처리할때'''


# In[15]:


#퀴즈 1
#수를 사용하여 다음 문장을 출력하시오
#변수명 : station
#변수값   시딩/신도림/인천공항
#출력문장
#xxx행 열차가 들어오고 있습니다.
#answer
station="인천공항"
print(station+"행 열차가 들어오고 있습니다")


# In[16]:


#연산자


# In[17]:


#간단한 수식들
print(2+3*4) #14
print((2+3)*4) #20
number=2+3*4
print(number) #14


# In[18]:


#숫자처리함수
print(abs(-5))


# In[23]:


#랜덤함수
from random import*
print(random()) #0~1 미만의 임의의 값을 생성
print(random()*10)
print(int(random()*10))
print(int(random()*10)+1) #1~10이하의 임의의 값 생성

#로또값을 생성하는 방법
print('로또값을 생성하는 방법')
print(int(random()*45)+1)
print(int(random()*45)+1)
print(int(random()*45)+1)
print(int(random()*45)+1)
print(int(random()*45)+1)
print(int(random()*45)+1)

print('로또값을 생성하는 방법2')
print(randint(1,45))
print(randint(1,45))
print(randint(1,45))
print(randint(1,45))
print(randint(1,45))
print(randint(1,45))


# In[24]:


#퀴즈2
#당신은 최근데 코딩스터디 모집일정을 잡으려고 합니다
#월 4회 스터디를 하는데 3번은 온라인으로 하고 1번은 오프라인으로 진행하기로 함.
#아래 조건에 맞는 오프라인 모임날자를 정합시다

#조건1 : 랜덤으로 날자를 뽑아야함
#조건2 : 월별 날자는 다름을 참고하여 최소일수인 28일 이내로 설정
#조건3 :  매월1일~3일은 스터디 준비를 하는 시간으로 제외함

#출력문
#오프라인 스터디 모임날자는 매월 x 일로 선정 되었습니다


# In[36]:


from random import*
date=randint(4,28)
print('오프라인 스터디 모임날자는 매월'+str(date)+'일로 선정되었습니다')


# In[37]:


#문자열
sentence='나는 소년입니다!'
print(sentence)

sentence2='파이썬은 쉬워요'
print(sentence2)

sentence3="""
나는 소년이고
파이썬은 쉬워요."""
print(sentence3)


# In[39]:


#슬라이씽
jumin='99120-1234567'
print(jumin[0])
print("성별:"+jumin[7])
print("년 :"+jumin[0:2]) #0~2직전까지
print("월 :"+jumin[2:4])
print("일 :"+jumin[4:6])


print('생년월일 :'+jumin[:6]) #처음부터 6직전까지
print('뒤7자리 :'+jumin[7:])
print('뒤 7자리(뒤에서 7자리) :'+jumin[-7:]) #맨뒤부터 뒤에서7번째


# In[13]:


#문자열 처리함수
Python="Python is Amazing"
print(Python.lower())
print(Python.upper())
print(Python[0].isupper())
print(len(Python))
print(Python.replace("Python","JAVA"))

index=Python.index("n")#순서를 이야기하는 문법임.
print(index)
index=Python.index("n",index+1) #첫번쨰 찾은 그 다음부터 써칭하여 찾아라
print(index)

print(Python.find("n"))
print(Python.find("JAVA"))
print(Python)
#print(Python.index("JAVA"))
print("HI")

print(Python.count("n"))


# In[31]:


#문자열 포멧
print("a"+"b")
print("a","b")

#방법1
print('나는 20살입니다')
print('나는 %d살입니다'%20)
print('나는 %s을 좋아해요.'%'파이썬')
print('Apple은 %c로 시작해요.'%"A") #문자 ->c

#%s를 사용하는 경우들
print("나는 %s 살입니다." %20)
print("나는 %s색과 %s색을 좋아합니다." %('파란','빨간'))

#방법2
print("나는 {} 살입니다.".format(20))
print("나는{1}색과 {0}색을 좋아해요".format('빨간색','파란색'))

#방법3
print("나는 {age}살이며, {color}색을 좋아해요".format(age=20,color='빨간색'))

#방법4(v3.8~) format이 필요없음
age=20
color="빨간"
print(f'나는 {age} 살이며 {color}색을 좋아해요')


# In[42]:


#탈출문자
print('백문이 불여일견 \n 백견이 불여일타') #\n ->개행문자(=엔터)

#저는 최정규입니다
print("저는 '최정규'입니다")
print('저는 "최정규"입니다')
print("저는 \"최정규\" 입니다.") #\" -> 탈출문자
print("저는 \"최정규\" 입니다.")

# \\ 문장내에서 \를 의미한다
print("c:\\user\\cjk")

# \r -> 커서를 맨 앞으로 이동하여 주는 것
print("Red Apple\rPine")

# \b -> 백스페이스(한 글자 삭제)
print("Red Apple\bPine")

# \t -> 탭
print("Red\tApple")


# In[47]:


#퀴즈3
#Quiz) 사이트별로 비밀번호를 만들어 주는 프로그램을 작성하시오

#규칙1 : http:// 부분은 제외 ==>naver.com http://google.com, http://daum.net
#규칙2 : 처음 만나는 점(.) 이후 부분은 제외 ==> naver
#규칙3 : 남은 글자 중 처음 세자리 + 글자개수 + 글자 내 'e' 갯수 + '!'로 구성
#     .예) 생성된 비밀번호 :nav51!


# In[62]:


#리스트
subway1=10
subway2=20
subway3=30

subway=[10,20,30]
print(subway)
print(subway[0])
subway=["유재석","박명수","조세호"]
print(subway)
#박명수씨가 몇번쨰 칸에 타고 있는가?
print(subway.index("박명수"))

#하하씨가 다음정류장에서 탑승함
subway.append("하하")
print(subway)

#정형돈씨를 유재석과 박명수 사이에 집어넣어보자
subway.insert(1,"정형돈")
print(subway)

#지하철에 있는 사람을 한명씩 뒤에서 꺼냄
print(subway.pop())
print(subway)
print(subway.pop())
print(subway)
subway.append("유재석")
print(subway)

#같은 이르므이 사람이 몇명 있는지 확인
subway.append("유재석")
print(subway)
print(subway.count("유재석"))

#정렬도 가능(내림차순/오름차순)
num_list=[5,2,4,1,3]
num_list.sort()
print(num_list)

num_list.reverse()
print(num_list)

#모두 지우기
num_list.clear()
print(num_list)

#다양한 데이터타입들이 존재할 수 있음.
mix_list=["조세호",20,True]
print(mix_list)

num_list=[5,2,3,4,1]
num_list.extend(mix_list)
print(num_list)


# In[75]:


#사전
cabinet={3:"유재석",100:"김태호"}
print(cabinet[3])
print(cabinet[100])

print(cabinet.get(3))
print(3 in cabinet)
print(100 in cabinet)
print(30 in cabinet)

#print(cabinet[5])
print("HI")
cabinet={"A-3":"유재석","B-100":"김태호"}
print(cabinet["A-3"])
print(cabinet["B-100"])

#새 손님
print(cabinet)
cabinet["A-3"]="김종국"
cabinet["A-100"]="조세호"
print(cabinet)

#간 손님
del cabinet["A-3"]

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

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

#목욕탕 폐점
cabinet.clear()
print(cabinet)


# In[78]:


#튜플?
##내용 변경이나 추가를 할 수 없습니다
##속도가 리스트보다 빠르기 때문에 변경되는 어떤 내용에 사용하기도 합니다

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

#menu add("생성까스")  -> 에러 발생
(name,age,hobby)=("최정규",34,"코딩")
print(name,age,hobby)


# In[88]:


#세트(집합) : 중복이 안되며 순서가 없음
my_set={1,2,3,3,3}
print(my_set)

java={"유재석","김태호","양세형"}
python=set(["유재석","박명수"])
print(java)
print(python)
#교집합(java와 python을 모두 할 수있는 개발자)
print(java & python)

#합집합(java를 할 수 있거나 python을 할 수 있는 개발자)
print(java | python)
print(java.union(python)) #순서가 보장되지 않음

#차집합(java를 할 수 있지만 python은 할 줄 모르는 개발자)
print(java-python)
print(java.difference(python))

#python 할 수 있는 사림이 늘어남
python.add("김태호")
print(python)

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


# In[89]:


#자료구조의 타입 :  리스트/튜플/사전/집합...
#변경
menu={"커피","우유","주스"}
print(menu)
print(menu,type(menu))

menu=list(menu)
print(menu, type(menu))

menu=tuple(menu)
print(menu,type(menu))

#다시 원복시키는 내용으로..
menu=set(menu)
print(menu, type(menu))


# In[92]:


#{활용예제}
from random import *
lst=[1,2,3,4,5] #users=range(1,21) -->casting to list
print(lst)
shuffle(lst) #무작위로 바꿈
print(lst)
print(sample(lst,1)) #무작위로 1개를 뽑음


# In[95]:


#조건문?
#weather ="비"
#weather="미세먼지"
weather=input("오늘날씨는 어때요?") #String type
if weather=="비" or weather=="눈":
    print("우산을 준비하세요")
elif weather=="미세먼지":
    print("마스크를 준비하세요")
else:
    print("오늘 준비물은 필요없어요")


# In[100]:


a=int(input("숫자를 1개 집어넣어라"))
b=int(input("숫자를 1개 집어넣어라"))
print("합계 a+b는:",a+b)


# In[104]:


#위의 내용에서 
##숫자입력인 경우는?
temp=int(input("기온은 어때요?"))
if 30<=temp:
    print("너무 더워요 외출을 삼가하세요")
elif 10<=temp and temp<30:
    print("오늘의 날씨는 좋습니다")
elif 0<=temp<10:
    print("외투를 챙기세요")
else:
    print("추워요 외출을 삼가하세요")
    


# In[106]:


#반복문: for()/ while()
print("대기번호: 1")
print("대기번호: 2")
print("대기번호: 3")
print("대기번호: 4")
print("대기번호: 5")
print("대기번호: 6")
for waiting_no in range(1,7):
    print("대기번호:{}".format(waiting_no))


# In[112]:


#위의 내용에 이어서의 예제로. .스타벅스에서 대기번호
starbucks=["아이언맨","토르","그루트"]
for customer in starbucks:
    print("{}손님 커피가 준비 되었습니다!".format(customer))


# In[114]:


#while 문은 true 일때 계속 반복 / for 문은 지정된 범위만 반복
#반복문 : while문의 예
#토르가 아니면 프로그램이 계속 반복됨
customer = "토르"
person = "Unknown"
while person != customer:
    print("{}씨 커피가 준비되었습니다!".format(customer))
    person=input("이름이 어떻게 되세요?")


# In[116]:


#continue/break?
absent=[2,5]
no_book=[7] #책을 깜박한 학생
for student in range(1,11):
    if student in absent:
        continue
    elif student in no_book:
        print("오늘 수업여기까지 {}는 교무실로".format(student))
        break
    print("{}번 책읽어라".format(student))


# In[ ]:


#한줄 for문
students=[1,2,3,4,5] #이학생들이 번호가 변경됨.
print(student)
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)


# In[127]:


#===============================과제===================================


# In[4]:


1.# Quiz) 사이트별로 비밀번호를 만들어 주는 프로그램을 작성하시오

# 예)https://naver.com, https://google.com, https://daum.net
# 규칙1 :htto:// 부분은 제외 ==>naver.com
# 규칙2 :처음 만나는 점(.) 이후부분은 제외 ==> naver
# 규칙3 : 남은 글자 중 처음 세자리 + 글자개수 +글자 내 'e' 갯수 + "!"로 구성
#     ,예) 생성된 비밀번호 :nav51!

url = "http://naver.com"
my_str = url.replace("http://", "")  # 규칙 1
my_str = my_str[:my_str.index(".")] # 규칙 2
password = my_str[:3] + str(len(my_str)) + str(my_str.count("e")) + "!"
print("{0} 의 비밀번호는 {1} 입니다.".format(url, password))

url = "http://google.com"
my_str = url.replace("http://", "")  # 규칙 1
my_str = my_str[:my_str.index(".")] # 규칙 2
password = my_str[:3] + str(len(my_str)) + str(my_str.count("e")) + "!"
print("{0} 의 비밀번호는 {1} 입니다.".format(url, password))

url = "http://daum.net"
my_str = url.replace("http://", "")  # 규칙 1
my_str = my_str[:my_str.index(".")] # 규칙 2
password = my_str[:3] + str(len(my_str)) + str(my_str.count("e")) + "!"
print("{0} 의 비밀번호는 {1} 입니다.".format(url, password))


# In[ ]:





# In[5]:


#퀴즈2)2.#코딩대회를 주최합니다.
#참석률을 높이기 위해 댓글 이벤트를 진행하기로 합니다.
#댓글 작성자들중에 추첨을 통해 1명은 치킨, 3명은 커피쿠폰을 받기로 함.
#추천프로그램을 작성하시오?

#조건1 : 편의상 댓글은 20명이 작성하였고 아이디는 1~20이라고 가정
#조건2 : 닷글내용과 상관없이 무작위로 추첨하되 중복불가
#조건3 : random모듈의 shuffle과 sample을 활용

#(출력예제)
#----- 당첨자 발표 -----
#치킨 당첨자 :1
#커피당첨자 : [2,3,4]
#--- 축하합니다. ---

#(활용예제)
#from random import *
#lst=[1,2,3,4,5]
#print(lst)
#shuffle(lst) #무작위로 바꿈.
#print(lst)
#print(sample(lst,1)) #무작위로 1개를 뽑는다는 뜻임.
from random import *

users = range(1, 21)
users = list(users)

print(users)
shuffle(users)
print(users)

winners = sample(users, 4)
print("-- 당첨자 발표 --")
print("치킨 당첨자: {0}".format(winners[0]))
print("커피 당첨자: {0}".format(winners[1:]))
print("-- 축하합니다 --")


# In[7]:


#퀴즈3)

#Quiz)당시은 카카오서비스를 이용하는 택시기사님입니다.
#50명의 승객과 매칭기회가 있을때, 총 탑승승객수를 구하는 프로그램을 작성하시오
#조건1)승각별 운행소요시간은 5분~50분 사이의 난수로 정해집니다
#조건2) 당신은 소요시간 5분 ~15분 사이의 

from random import *

cnt = 0 # 총 탑승 승객 수
for i in range(1, 51): # 총 50분의 승객
    time = randrange(5, 51) # 5분 ~ 50분 사이의 소요 시간
    
    if 5 <= time <= 15: # 5분 ~ 15분 사이의 손님의 경우 매칭 성공
        print("[O] {0}번째 손님 (소요시간 : {1}분)".format(i, time)) # 성공 정보 출력
        cnt += 1 # 총 탑승 승객 수 증가 처리
    else: # 매칭 실패한 경우
        print("[ ] {0}번째 손님 (소요시간 : {1}분)".format(i, time)) # 실패 정보 출력

print("총 탑승 승객 : {0}분".format(cnt))


# In[10]:


#함수:어떤 박스 형태의 기능 구성체임
##자신을 부르기전까지는 수행되지않음
def open_account():
    print("새로운 계좌가 생성되었습니다.")
    
open_account()


# In[20]:


#전달값과 반환값
##입금을 처리하여 주는 함수
def deposit(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
    
balance=0
balance=deposit(balance,1000)
#print(balance)
balance=withdraw(balance,2000)
balance=withdraw(balance,500)
    
    


# In[21]:


#함수자체에서 기본값을 설정하는 방법
def profile(name, age=17, main_lang="파이썬"):
    print("이름 :{0}\t나이 : {1}\t주 사용언어 :{2}".format(name,age,main_lang))
    
profile("홍우택")
profile("황한슬")


# In[23]:


#키워드값을 이용한 함수 호출
def profile(name,age,main_lang):
    print(name,age,main_lang)
    
profile("황한슬",23,"자바")


# In[26]:


for i in range(11):
    print(i, end=" ")


# In[29]:


#가변인자를 이용한 함수호출
def profile(name,age,*language):
    print("이름:{0}\t나이:{1}\t".format(name,age),end=" ")
    for lang in language:
        print(lang, end=" ")
    print()

profile("김태호",25,"Python","Java")
profile("김태호",25,"Python","Java","C","C#","C++","JavaScript")


# In[31]:


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


# In[36]:


#표준입출력
print("Python","JAVA") #둘사이가 띄어져 있음을 볼 수 있음
print("***************************************************")
print("*"*60)
print("Python","JAVA",sep=",")
print("Python","JAVA","Java Script",sep=" .vs. ")
print("Python","JAVA",sep=",",end="?")
print(" 무엇이 더 재밌을까요?")


# In[42]:


#시험성적?
scores={"수학":0,"영어":50,"코딩":100}
for subject, score in scores.items(): #items()는 쌍으로 이를 보내준다
#  print(subject.score)
    print(subject.ljust(8),str(score).rjust(4),sep=":")


# In[46]:


#은행대기순번표
##001,002,003...
for num in range(1,21):
    print("대기번호:"+str(num).zfill(3)) #3자리를 할당하고 빈공간을 0으로 채우라


# In[47]:


#표준입력
answer=input("아무값이나 입력하세요?") #문자열로 인식함
print(type(answer))
print("입력하신 값은 "+answer+"입니다.")


# In[56]:


#다양한 출력포멧에 대한 이야기
#빈자리는 빈 공간으로 두고, 오른쪽 정렬을 하되, 총 10자리 공간을 확보
print("{0:>10}".format(500))

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

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


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

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

#소수점 출력
print("{0:f}".format(5/3))

#소수점을 특정 자리수까지만 정하는 방법
print("{0:.2f}".format(5/3)) #소수점 3째 자리에서 반올림.


# In[58]:


#파일입출력에 대한 이야기
score_file=open("score.txt","w",encoding="utf-8")
print("수학 :0",file=score_file)
print("수학 :50",file=score_file)
score_file.close()
# PC Anaconda 폴더에 txt 파일로 저장됨


# In[59]:


#파일에 이어서 쓰기
score_file=open("score.txt","a",encoding="utf-8")
score_file.write("과학:80")
score_file.write("\n코딩:100")#여기에는 따로 줄바꿈이 없어서 이렇게 써줘야함
score_file.close()


# In[60]:


#이제 파일을 읽어오는 방법으로...
score_file=open("score.txt","r",encoding="utf-8")
##한번에 다 읽어오는 방법으로는,
print(score_file.read())
score_file.close()


# In[62]:


#한줄한줄 읽어오는 방법으로..
score_file=open("score.txt","r",encoding="utf-8")
print(score_file.readline(),end="")
print(score_file.readline(),end="")
print(score_file.readline(),end="")
print(score_file.readline(),end="")
print(score_file.readline(),end="")
score_file.close()


# In[63]:


#만약 몇줄인줄을 모른다면..
score_file=open("score.txt","r",encoding="utf-8")
while True:
    line=score_file.readline()
    if not line:
        break
    print(line,end="")
score_file.close()


# In[64]:


#리스트에 넣어서 프린트할 수 있음.
score_file=open("score.txt","r",encoding="utf-8")
lines=score_file.readlines() #list형태로 저장
for line in lines:
    print(line,end="")
    
score_file.close()


# In[68]:


#pickle : 프로그램상에서 사용하고 있는 데이터를 가져와서 파일형태로 저장하는 것
import pickle
profile_file=open("profile.pickle","wb") #pickle에서는 항상 쓸때는 바이너리로 지정해 주어야 함.
#pickle에서는 따로 인코딩을 설정해 줄 필요가 없음.
profile={"이름":"박명수","나이":30,"취미":["축구","골프","코딩"]}
print(profile)

pickle.dump(profile,profile_file)
profile_file.close()


# In[73]:


#class : 판박이
##마린 :공격유닛, 군인, 총을 쏠 수 있음
name="마린" #유닛의 이름
hp=40 #유닛의 체력
damage=5 #유닛의 공격력

print("{}유닛이 생성되었습니다.".format(name))
print("체력 {0}, 공격력 {1}\n".format(hp,damage))

#탱크 : 공격유닛, 탱크, 포를 쏠수 있는데, 일반모드 / 시즈모드
tank_name="탱크"
tank_hp=150
tank_damage=35

print("{}유닛이 생성되었습니다.".format(tank_name))
print("체력 {0}, 공격력 {1}\n".format(hp,tank_damage))

#탱크추가
tank2_name="탱크"
tank2_hp=150
tank2_damage=35

print("{}유닛이 생성되었습니다.".format(tank2_name))
print("체력 {0}, 공격력 {1}\n".format(hp,tank2_damage))

def attack(name,location,damage):
    print("{0} : {1}방향으로 적군을 공격합니다. [공격력{2}]".format(name,location,damage))
    
print()
print("#"*70)
attack(name,"1시",damage)  
attack(tank_name,"1시",tank_damage)   
attack(tank2_name,"1시",tank2_damage)   


# In[83]:


#위의 내용에서 많은 어떤 객체들이 필요한 어떤 틀이 필요한데 그것이 클래스(붕어빵형태처럼)
class Unit:
    def __init__(self, name,hp,damage):
        self.name=name
        self.hp=hp
        self.damage=damage
        print("{}유닛이 생성되었습니다".format(self.name))
        print("체력 {0}, 공격력 {1}\n".format(self.hp, self.damage))
marine1=Unit("마린",40,5)
marine2=Unit("마린2",40,5)
tank=Unit("탱크",150,35)


# In[ ]:


##__init__이란 무엇인가?
파이썬에서 쓰이는 생성자로써, 즉 자동으로 호출(수행)되는 부분임
마힌이나 탱크는 유닛클래스의 인스턴스라고 이야기 함
매개변수는 동일하게 매치가 되어야 함


# In[88]:


#멤버변수?
# 클래스내에서 정의 된 변수라고 보면 됨
class Unit:
    def __init__(self, name,hp,damage):
        self.name=name
        self.hp=hp
        self.damage=damage
        print("{}유닛이 생성되었습니다".format(self.name))
        print("체력 {0}, 공격력 {1}\n".format(self.hp, self.damage))
        
#레이스:공중유닛, 비행기, 클로킹(상대방에게 보이지 않음)
wraith1=Unit("레이스",80,5)
print("유닛이름 : {0},공격력 : {1}".format(wraith1.name,wraith1.damage))

#마인드컨트롤 : 상대방 유닛을 내것으로 만드는것(뺴앗음)
wraith2=Unit("빼앗은 레이스",80,5)
wraith2.clocking=True #Unit에 포함시킴(파이썬은 외부에서 변수를 추가하여 볼 수있음)

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


# In[92]:


#일반유닛
class Unit:
    def __init__(self, name,hp,damage):
        self.name=name
        self.hp=hp
        self.damage=damage
        print("{}유닛이 생성되었습니다".format(self.name))
        print("체력 {0}, 공격력 {1}\n".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))
        #self는 자기자신의 정의된 내용이고 location은 전달 받은 매개변수 값을 쓴다는 내용
        
    def demage(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.damage(25)
firebat1.damage(25)


# In[ ]:


#다중상속-부모클래스를 두번이상 상속받는 것, 즉부모가 둘이상인것임.
#함수인 메소드에서는 항상 자기자신을의미하는 self를 항상 적어준다.
#일반유닛
#pass
#메소드 오버라이딩
#다중상속 - 부모클래스를 두번 이상 상속받는 것.즉 부모가 둘이상인것임.
#메소드에선 자기자신을 의미하는 self를 할사적어준다.
#일반유닛
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))
#         self.damage=damage
#         print("{}유닛이 생성되었습니다.".format(self.name))
#         print("체력 {0}, 공격력 {1}\n".format(self.hp, self.damage))

# 공격유닛(위의 내용인 곧통부분을 그대로 상속받기위하여...)     
class AttackUnit(Unit):
    def __init__(self, name,hp,speed,damage):
        Unit.__init__(self,name,speed,hp)
        self.damage=damage #추가로 데미지를 추가할 수 있음.
        #이와 같이 진행할 수 있음.
#         self.name=name
#         self.hp=hp
#         self.damage=damage
        
    def attack(self,location):
        print("{0} : {1} 방향으로 적군을 공격합니다. 공격력 {2}".format(self.name,location,self.damage))
        #self는 자기자신의 정의된 내용이지만 location은 전달받은 매개변수 값을 쓴다는 이야기임.
        
    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): #다중상속으로...AttackUnit와 Flyable을 상속받음.
    def __init__(self,name,hp,damage,flying_speed):
        AttackUnit.__init__(self,name,hp,0,damage) #지상스피드는 0으로 처리함.
        Flyable.__init__(self,flying_speed)#초기화 완료
        
    #여기에다가 아래와 같은 내용을 추가하여주면 이를 메소드오버라이딩임.
    #현재 무브나 플라잉같은 경우는 일일이 지상인지 공중인지를 체크해야 되었지만...
    def move(self,location):
        print("[공중 유닛 이동]")
        self.fly(self.name,location)

#건물
class BuildingUnit(Unit):
    def __init__(self,name,hp,location):
        pass #이렇게 하고나면...아무것도 안하고 일단 넘어간다는 의미임.
    
#서플라이 디폿 : 건물, 1개건물=8유닛.
supply_depot=BuildingUnit("서플라이 디폿",500,"7시")

#pass는 다음과 같이 사용하기도 합니다..
def game_start():
    print("[알림] 새로운 게임을 시작합니다.")
    
def game_over():
    pass

game_start()
game_over()


# In[ ]:





# In[ ]:


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

#공중유닛(위의 내용인 공통부분을 그대로 상속받기 위하여..)
class AttackUnit:
    def __init__(self, name,hp,damage):
        self.name=name
        self.hp=hp
        self.damage=damage
    


# In[93]:


#스타크래프트전반전/ 후반전
from random import *

#일반유닛
class Unit:
    def __init__(self, name,hp,speed): #스피드를 추가함.
        self.name=name
        self.hp=hp
        self.speed=speed
        print("{0} 유닛이 생성되었습니다.".format(name))
        
    def move(self, location):
        print("[지상유닛이동]")
        print("{0} : {1} 방향으로 이동합니다. [속도{2}]".format(self.name,location,self.speed))

    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 AttackUnit(Unit):
    def __init__(self, name,hp,speed,damage):
        Unit.__init__(self,name,speed,hp)
        self.damage=damage #추가로 데미지를 추가할 수 있음.

        
    def attack(self,location):
        print("{0} : {1} 방향으로 적군을 공격합니다. 공격력 {2}".format(self.name,location,self.damage))
        #self는 자기자신의 정의된 내용이지만 location은 전달받은 매개변수 값을 쓴다는 이야기임.


#마린
class Marine(AttackUnit):
    def __init__(self):
        AttackUnit.__init__(self,"마린",40,1,5)
    #스팀백 :일정시간동안 이동및공격속도를 증가, 체력10 감소
    def stimpack(self):
        if self.hp>10:
            self.hp -=10
            print("{0} : 스팀백을 사용합니다. (HP 10 감소)".format(self.name))
        else:
            print("{0} : 체력이 부족하여 스팀백을 사용하지 않습니다.".format(self.name))
    
#탱크
class Tank(AttackUnit):
    #시즈모드 : 탱크를 지상에 고정시켜 더 높은 파워로 공격가능. 이동불가
    seize_developed=False #시즈모드 개발여부
    def __init__(self):
        AttackUnit.__init__(self,"탱크",150,1,35)
        self.seize_mode=False
        
    def set_seize_mode(self):
        if Tank.seize_developed==False:
            return
        #현재시즈모드가 아닐때-->시즈모드
        if self.seize_mode==False:
            print("{0} : 시즈모드로 전환합니다.".format(self.name))
            self.damage *=2
            self.seize_mode=True
            
        #현재 시즈모드일때-->시즈모드 해제
        else:
            print("{0} : 시즈모드를 해제합니다.".format(self.name))
            self.damage /=2
            self.seize_mode=False
        

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): #다중상속으로...AttackUnit와 Flyable을 상속받음.
    def __init__(self,name,hp,damage,flying_speed):
        AttackUnit.__init__(self,name,hp,0,damage) #지상스피드는 0으로 처리함.
        Flyable.__init__(self,flying_speed)#초기화 완료
        
    #여기에다가 아래와 같은 내용을 추가하여주면 이를 메소드오버라이딩임.
    #현재 무브나 플라잉같은 경우는 일일이 지상인지 공중인지를 체크해야 되었지만...
    def move(self,location):
        print("[공중 유닛 이동]")
        self.fly(self.name,location)

#공중유닛 레이스 생성
class wraith(FlyableAttackUnit):
    def __init__(self):
        FlyableAttackUnit.__init__(self,"레이스",80,20,5)#이름/체력/공격력/날아다니는 속도
        self.clocked=False #클로킹 모드(해제상태)
     #gusw   
    def clocking(self):
        if self.clocked==True: #클록킹모드-->해제
            print("{0} : 클로킹 모드로 해제합니다.".format(self.name))
            self.clocked=False
            
        else: #클로킹 모드해제-->전환
            print("{0} : 클로킹 모드로 전환합니다.".format(self.name))
            self.clocked=True
            
#스타크랩트 후반전
def game_start():
    print("[알림] 새로운 게임을 시작합니다.")
    
def game_over():
    print("Player : gg")#good game
    print("[Player] 님이 퇴장하셨습니다.")
    
#게임 시작
game_start()

#마린 3개생성
m1=Marine()
m2=Marine()
m3=Marine()

#탱크2기 생성
t1=Tank()
t2=Tank()
#레이스 1기 생성
w1=wraith()

#유닛 일괄관리 - 생성된 모든 유닛 append
attack_units=[]
attack_units.append(m1)
attack_units.append(m2)
attack_units.append(m3)
attack_units.append(t1)
attack_units.append(t2)
attack_units.append(w1)

#전군이동
for unit in attack_units:
    unit.move("1시")
    
#탱크시즈모드 개발
Tank.seize_developed=True
print("[알림]탱크 시즈모드 개발이 완료되었습니다.")

#공격모드 준비(마린 :스팀백, 탱크:시즈모드, 레이스:클로킹)
for unit in attack_units:
    if isinstance(unit,Marine):#unit이 Marine이라는 인스턴스인가라는 문법임.
        unit.stimpack()
    elif isinstance(unit,Tank):
        unit.set_seize_mode()
    elif isinstance(unit,wraith):
        unit.clocking()
        
#전군공격
for unit in attack_units:
    unit.attack("1시")

#전군피해
for unit in attack_units:
    unit.damaged(randint(5,21))#공격은 랜덤으로 받음(5~20)
#게임종료
game_over()


# In[96]:


#예외처리-에러가 발생했을때 그에 대하여 처리하여 주는 것임
print("나누기 전용계산기입니다")
num1=int(input("첫번째 숫자를 입력하세요: "))
num2=int(input("두번째 숫자를 입력하세요: "))

print("{0} /{1} = {2}".format(num1,num2,int(num1/num2)))


# In[ ]:


#예외처리를 위한 사례

print("나누기 전용계산기입니다")
try:
    num1=int(input("첫번째 숫자를 입력하세요: "))
    num2=int(input("두번째 숫자를 입력하세요: "))
    
    print("{0} /{1} = {2}".format(num1,num2,int(num1/num2)))
except ZeroDivisionError as err:
    print(err)
except ValueError:
    print("에러!!! 잘못된 값을 입력하셨어요.")
    print(err)


# In[ ]:


#에러 발생시키기
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("잘못된 값을 입력하셨어요. 한자리 숫자만 입력하세요.")


# In[ ]:


#사용자 정의 예외 처리
class BigNumberError(Exception):
    pass
try:
    print("한자리 숫자 나누기 전용계산기입니다.")
    num1=int(input("첫번째 숫자를 입력하세요: "))
    num2=int(input("첫번째 숫자를 입력하세요: "))
    if num1>=10 or num2>10:
        raise BigNumberError # 의도적으로 익셉트부분으로 내려오게 할 수 있음
    print("{0}/{1}={2}".format(num1,num2,int(num1/num2)))
except ValueError:
    print("잘못된 값을 입력하셨어요. 한자리 숫자만 입력하세요.")
except BigNumberError as err:
    print("에러가 발생하였습니다. 한자리 숫자만 입력하세요")
    print(err) #속성값이 없는 경우임..(아무것도 없음.)
finally:
    print("어쨋든 계산기를 사용하여 주셔서 감사합니다")


# In[ ]:


#-------------------------------------------------------------------------


# In[22]:


#0512_hw_1
#퀴즈6:
#표준 체중을 구하는 프로그램을 작성하시오
#표준체중 : 각 개인의 키에 적당한 체중

#(성별에 따른 공식)
#남자 : 키(m)x키(m)x22
#여자 : 키(m)x키(m)x21

#조건1 : 표준체중을 별도의 함수내에서 계산
#함수명 :std_weight
#전달값 : 키(height), 성별(gender)
#조건2 : 표준체중은 소수점 둘째자리까지 표시

#(출력예제)
#키 175cm 남자의 표준체중은 67.38kg 입니다.
        #========================================================
gender = ["남자","여자"]

def std_weight(height ,gender):
    for g in gender:
        if g == "남자":
            std_weightM =round((height*height*22/10000),2)
            print("키{0}cm {1}의 표준 체중은 {2}입니다.".format(height,gender,std_weightM))
            return std_weightM
        else:
            std_weightW =round((height*height*22/10000),2)
            print("키{0}cm {1}의 표준 체중은 {2}입니다.".format(height,gender,std_weightW))
            return std_weightW
std_weight(175,"여자") 
std_weight(175,"남자") 
        #==============================결과==========================
키175cm 여자의 표준 체중은 67.38입니다.
키175cm 남자의 표준 체중은 67.38입니다.


# In[9]:


#0512_hw_2
#퀴즈7:
# 당신의 회사에서는 매주 1회 작성해야 하는 보고서가 있습니다.
# 보고서는 항상 아래와 같은 형태로 출력되어야 합니다.

# -x 주차 주간보고-
# 부서 :
# 이름 :
# 업무요약 :
    
# 1주차부터 10주차까지의 보고서 파일을 만드는 프로그램을 작성하시오.

# 조건 : 파일명은 '1주차.txt','2주차.txt',....와 같이 만듭니다.

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


# In[12]:


#0512_hw_3
#위의 홈웍내용(퀴즈6,7)에 이어서...아래내용을 정리하시오.
#퀴즈8:
#클래스 이름 House를 만들어서
#매물초기화를 통한 생성자 구성함수와
#매물정보표시를 위한 함수를 만들어서 아래와 같은
#데이터가 주어졌을때 이를 출력시키는 프로그램을 작성하시오?

# 주어진 코드를 활용하여 부동산 프로그램을 작성하시오
# (출력예제)
# 총 3대의 매물이 있습니다.
# 강남아파트 매매 10억 2010년
# 마포 오피스텔 전세 5억 2007년
# 송파 빌라 월세 500/50 2000년
        #========================================================
class House:
    # 매물 초기화
    def __init__(self, location, house_type, deal_type, price, completion_year):
        self.location = location
        self.house_type = house_type
        self.deal_type = deal_type
        self.price = price
        self.completion_year = completion_year

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

houses = []

houses.append(House("강남", "아파트", "매매", "10억", "2010년"))
houses.append(House("마포", "오피스텔", "전세", "5억", "2007년"))
houses.append(House("송파", "빌라", "월세", "500/50", "2000년"))

print("총 {0}대의 매물이 있습니다.".format(len(houses)))

for house in houses:
    house.show_detail()


# In[4]:


#0512_hw_4
#퀴즈9) 동네에 항상 대기 손님이 있는 맛있는 치킨집이 있습니다.
#대기 손님의 치킨 요리 시간을 줄이고자 자동 주문 시스템을 제작하였습니다.
#시스템 코드를 확인하고 적절한 예외처리 구문을 넣으시오.

#조건1 : 1보다 작거나 숫자가 아닌 입력값이 들어올 때는 ValueError 로 처리
#        출력 메세지 : "잘못된 값을 입력하였습니다."
#조건2 : 대기 손님이 주문할 수 있는 총 치킨량은 10마리로 한정
#        치킨 소진 시 사용자 정의 에러[SoldOutError]를 발생시키고 프로그램 종료
#        출력 메세지 : "재고가 소진되어 더 이상 주문을 받지 않습니다."

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

class SoldOutError(Exception):
    pass

chicken = 10
waiting = 1

while(True):
    try:
        print("[남은 치킨 : {0}]".format(chicken))
        order = int(input("치킨 몇 마리 주문하시겠습니까?"))
        if order > chicken:
            print("재료가 부족합니다.")    
        elif order <= 0:
            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
        
        


# In[14]:


#0512_hw_5
#퀴즈10
##프로젝트내의 나만의 시그니처를 남기는 모듈을 만드시오

#조건 : 모든 파일명은 byme.py로 작성
#(모듈사용예제)
# import byme
# byme.sign()

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

# 파일명 ->byme.py
def choi():
    print("이 프로그램은 나 CHOI JUNG KYU에 의해 만들어 졌습니다.")
    print("작성자:CHOI JUNG KYU")
    print("이메일:javakyu4030@tstory.com")
    
#import
import byme
byme.choi()


# In[ ]:





# In[ ]:


#------------------------------------------------------------------------


# In[7]:


#모듈-잘 만들어진 부품처럼의 파일형태
#영화관에서 사람수에 따라 가격이 얼마인지의 모듈

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

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


# In[ ]:





# In[9]:


import module
module.price(3)
module.price_morning(4)
module.price_soldier(6)


# In[11]:


#위의 내용을 좀 더 구체적으로 필요한 내용만을 가지고 명시적으로 사용할 수 있음
from module import price,price_morning
price(3)
price_morning(4)
module.price_soldier(6)


# In[12]:


#약간 변형하여 내가 군인이라면 군인의 할인가격을 price만으로 대입하여 알고자 한다면..
from module import price_soldier as price
price(6)


# In[ ]:


#패키지-모듈들을 모아놓은 집합/구성체라고 보면됨
#신규여행사의 프로젝트를 담당하게되었다고 보았을때
# 이 여행사는 태국과 베트남의 여행상품을 제공한다고 본다
#폴더를 만든다
#그리고 그 밑에 thiland.py 와 viewname.py 파일 그리고 __init__.py파일을 만든다


# In[ ]:


#위의 내용에서 우선 thiland.py 파일을 만들어 메모장으로 저장하여 위의 travel폴더에 저장한다
class ThailandPackage:
    def detail(self):
        print("[태국 패키지 3박5일]방콕,파타야 여행(야시장 투어)50만원")


# In[14]:


#그리고 위의 내용처럼 vietnam.py파일을 메모장으로 만들어 저장하여 위의 travel폴더에 저장한다
class VietnamPackage:
    def detail(self):
        print("[베트남 패키지 3박5일]다낭 효도 여행 60만원")
        


# In[15]:


#위의 내용을 완료하고서..
import travel.thailand #임포트할때 여기는 모듈이나 패키지만 가능함
#import travel.thailan.thailandPackage
trip_to=travel.thiland.thailandPackage()
trip_to.detail()
728x90

'국비교육과정 > Python' 카테고리의 다른 글

[Python]기본문법  (0) 2022.05.02

댓글