abs(num) # 절댓값
pow(4, 2) # 4^2
max(5, 12) # 12
min(5, 12) # 5
round(3.14) # 3 default가 0

from math import *
floor(4.99) # 4 내림
ceil(3.14) # 4 올림
sqrt(16) # 4 제곱근
passid = 990120-1234567
passid[:6] # 처음부터 5까지 6미포함
passid[7:] # 7부터 끝
passid[-7:] # 뒤에서 7번째부터 끝까지
python = "Python is Amazing"
python.lower() # 소문자변환
python.upper() # 대문자 변환
python[0].isupper() # 0번째 문자 대문자 판별 > True/False
len(python) # 문자열 길이
python.replace("Python", "Java") # 문자 변환

python.index("n") # "n" 문자 위치 반환 ( 첫번째 )

python.index("n", index + 1) # "n"의 2번째 문자열 위치

python.find("Java") # 없으면 -1 반환
python.index("Java") # 없으면 에러
print("나는 %d살입니다." % 20) # #decimal
print("나는 %s을 좋아해요." % "파이썬") # #string
print("Apple은 %c로 시작합니다." % "A") # #character

print("나는 %s색과 %s색을 좋아해요." % ("파란","빨간")))
print("나는 {}살입니다.".format(20))
print("나는 {0}색과 {1}색을 좋아해요.".format("파란","빨간"))
print("나는 {color1}색과 {color2}색을 좋아해요.".format(color1="파란", color2="빨간"))
color1="파란"
color2="빨간"
print(f"나는 {color1}색과 {color2}색을 좋아해요.") # python 3 이상에서만 가능 f-string

escape문자

#\n #줄바꿈
#\", \' # 문장 내 따옴표 사용
# \\ 문장내 \ 사용
# \r 커서 맨 앞 이동
#example
print("Red Apple\rPine") #Pine Apple
# \b 백스페이스
print("Redd\bApple") # RedApple
# \t tab 
"""http://naver.com 입력,
1. http:// 제외
2. . 이후 제외
3. 남은 글자 중 처음 세자리, 글재 갯수, 글자 내 'e' 갯수 + 1
"""
url = "http://naver.com"
passurl = url[7:].split(".")[0] 
# passurl = url.replace("http://", "")
# passurl = passurl[:passurl.index(".")] # index로 "."이 처음 나오는 위치까지 [] slicing
passwd = passurl[:3] + str(len(passurl)) + str(passurl.count("e")) + "!"

list

subway = ['a', 'c', 'd']
subway.index('c') # c의 위치, 1
subway.append('e') # 맨 뒤에 e 추가
subway.insert(1,'b') # 1번째 위치에 b 추가 [a,b,c,d,e]
subway.pop() # 맨 뒤에 제거
subway.count("a") # list내에 'a' 몇 개?

# 정렬
num_list = [5,2,4,3,1]
num_list.sort() # 오름차순 정렬
num_list.reverse() # 뒤집기

num_list.clear() # 리스트 요소 모두 제거

tmp_list = [7,7,7]
num_list.extend(tmp_list) # num_list 뒤로 tmp_list 요소 추가

dictionary

cabinet = {1: "a", 2: "b"} # key : value

print(cabinet[1]) # key 값이 없으면 에러가 밠애
print(cabinet.get(1)) # key 값이 없으면 None 출력

print(cabinet.get(3, "사용 가능")) # 3이라는 key 값으면 출력
print(1 in cabinet) # True
print(3 in cabinet) # False
# 추가
cabinet[3] = "c" # key, value가 있으면 update

# 삭제
del cabinet[3]
cabinet.clear() # 모든 key value 제거

print(cabinet.keys()) # key 출력
print(cabinet.values()) # value 출력
print(cabinet.items()) # key, value 쌍

tuple

변경이 불가능하나 list보다 처리 속도가 빠름

tmp_tuple = ("a", "b")
print(tmp_tuple[0], tmp_tuple[1])

#example
name, age, hobby = ("byun", 32, "coding")
print(name, age, hobby)

set 집합

중복이 안되며, 순서가 없음

tmp_set = {1,2,3,3,3} # {1,2,3}

# set, 집합 생성
java = {"a", "b", "c"}
python = set(["a", "d"])

#교집합
print(java & python) # a
print(javax.intersection(python))

# 합집합
print(java | python) # a, b, c, d
print(java.union(python))

# 차집합
print(java - python) # b, c
print(javax.difference(python))

# 추가
python.add("b")
# 제거
python.remove("d")

tmp_list = list(range(1,21)) # [1,2,3,4,5, … ,19, 20]

한줄 for

#example
num = [1,2,3,4,5]
num_100 = [n+100 for n in num]

Function

def function_name(전달자1,전달자2, ...):
   #...
  print("test")
  return 반환자1, 반환자2, ...

#example
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
def withdraw_night(balance, money):
  commission = 100 #수수료
  return commission, balance - money - commission # 튜플형식

balance = 0 # 잔액 초기화
balance = deposit(balance, 1000) # 입금
balance = deposit(balance, 500) # 출금
commission, balance = withdraw_night(balance, 500)
print("수수료 {0}, 잔액{1}".format(commission, balance))

기본값

함수에 전달자에 값을 넣지 않으면 default로 입력되는 값

def profile(name, age=25, main_lang="python"):
  print("이름{0}, 나이{1}, 언어{2}".format(name,age,main_lang))

profile("tester") #이름tester, 나이25, 언어python

가변인자

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

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

전역, 지역변수

# 전역변수 사용하면 코드 혼동오기 쉬움
num = 10

def checkpoint(tmp):
  global gun
  num = num - tmp
  print("num 값 : {0}".format(num))

print(num) # 10
checkpoint(2) # num 값 : 8
print(num) # 8

지역변수를 사용해 코딩

num = 10

def checkpoint_ret(num, tmp):
  num = num - tmp
  print("num 값 : {0}".format(num))
  return num
print(num) # 10
gun = checkpoint_ret(num, 2)
print(num) # 8

퀴즈

"""
표준 체중 구하는 프로그램 작성
남자 : 키(m) * 키 * 22
여자 : 키 * 키 * 21 

조건 1 : 함수 내 계산. std_weight(height,gender)
조건 2 : 표준 체중 소수점 둘째자리

ex) 키 175cm 남자의 표준 체중은 67.38kg 입니다.
"""

def std_weight(height, gender):
    if gender == "남자":
        return height * height * 22
   else: # 여자
        return  height * height * 21

height = 175
gender = "남자"
weight = round(std_weight(height / 100, gender),2) # cm > m / 반올림

print("키 {0}cm {1}의 표준 체중은 {2}}kg 입니다.".format(height, gender, weight))

표준입출력


print("Python", "Java", sep=",", end="?") # sep 기본 공백, end 기본 줄바꿈>> 따라서 이 다음 출력이 같은 줄에 나오게 됨

import sys
print("Python", "Java", file=sys.stdout) # stdout으로 출력
print("Python", "Java", file=sys.stderr) # stderr로 출력


scores = {"수학":0, "영어":50, "코딩":100} # dict type
for subject, score in scores.items(): # items key,val 반환
    print(subject.ljust(4), str(score).rjust(4), sep=":")
    # ljust 왼쪽정렬 4만큼 공간 확보, rjust 오른쪽 정렬

for num in range(1, 21):
    print("대기번호 : " + str(num).zfill(3))
    # 대기번호 : 001
    # 대기번호 : 002 공백을 0으로 채움

다양한 출력

print("{0: >10}".format(500)) #     500 //빈공간 5칸
print("{0: >+10}".format(500)) #    +500 //빈공간 4칸
print("{0: >+10}".format(-500)) #    -500 //빈공간 4칸

print("{0:_<10}".format(500)) #500_____ // _ 5개

print("{0:,}".format(1000000)) #1,000,000 //3자리마다 ,
print("{0:+,}".format(1000000)) #+1,000,000 //3자리마다 ,
print("{0:-,}".format(-1000000)) #-1,000,000 //3자리마다 ,

print("{0:^<+30,}".format(1000000000000)) #+1,000,000,000,000^^^^^^ //30자리수 까지 ^ 추가

print("{0:f}".format(5/3)) #1.666667 // 소수점 표시
print("{0:.2f}".format(5/3)) #1.67 // 소수점 표시, 3에서 반올림

파일쓰기

score_file = open("score.txt", "w", encoding="utf8") #덮어쓰기
print("test1", file=score_file)
print("test2", file=score_file)
score_file.close()

score_file = open("score.txt", "a", encoding="utf8") # append
score_file.write("test3\n") # 줄바꿈이 안됨
score_file.write("test4")
score_file.close()

파일 읽기

score_file = open("score.txt", "r", encoding="utf8")
print(score_file.read()) # 전체읽기
score_file.close()

score_file = open("score.txt", "r", encoding="utf8")
print(score_file.readline(), end="") # 한줄씩 읽기, 읽고 커서는 다음줄로
print(score_file.readline(), end="")
score_file.close()


score_file = open("score.txt", "r", encoding="utf8")
while True:
    line = score_file.readline()
    if not line:
        break
    print(line)
score_file.close()


score_file = open("score.txt", "r", encoding="utf8")
lines = score_file.readlines() # 리스트 형태로 lines에 저장

pickle

python의 변수, 데이터를 파일 형태(pickle)로 저장하고, 불러오기 위한 라이브러리

import pickle

profile_file = open("profile.pickle", "wb") #write, binary
profile = {"이름":"아무개", "나이":30, "취미":["축구","골프","바보"]}
pickle.dump(profile, profile_file) # file에 저장
profile_file.close()


profile_file = open("profile.pickle", "rb") #read, binary
profile = pickle.load(profile_file)
print(profile) #{"이름":"아무개", "나이":30, "취미":["축구","골프","바보"]}
profile_file.close()

with

# 별도로 close() 할 필요가 없음
with open("score.txt", "w", encoding="utf8") as score_file:
    score_file.write("test1")

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

Class

def 생성자 객체는 클래스로 부터 만들어지는 값이면서 클래스의 인스턴스라고 한다.

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))          

marine1 = Unit("마린", 40, 5)
marine2 = Unit("마린", 40, 5)

멤버 변수

클래스 내에서 선언된 변수.

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))          

wraith1 = Unit("레이스", 80, 5)
print("유닛 이름 : {0}, 공격력 : {1}".format(warith1.name, wraith1.damage)) # 멤버 변수를 외부에서 활용하는 예

# 마인드 컨트롤 한 경우
wraith2 = Unit("마컨된 레이스", 80, 5)
wraith2.clocking = True # Unit클래스 에는 없는 변수를 새로 생성 

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

#wraith1에는 clocking이라는 변수를 사용할 수 없다.
#if wraith1.clocking == True:
#    print("{0} 는 현재 클로킹 상태입니다.".format(warith2.name))

메소드

#일반 유닛
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)) ## attack 함수에 전달된 location 변수 활용, self가 붙은 변수는 클래스 내에 정해진 변수값 활용.
    
    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) #유닛 생성
firebat.attack("5시") # AttackUnit의 attack 메소드 활용
#2번 공격받음
firebat1.damaged(25)
firebat1.damaged(25)

상속

#일반 유닛
class Unit:
    def __init__(self, name, hp, damage):
          self.name = name # 멤버 변수
          self.hp = hp # 멤버 변수
   
# 공격유닛
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)) ## attack 함수에 전달된 location 변수 활용, self가 붙은 변수는 클래스 내에 정해진 변수값 활용.
    
    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))

# 메딕같은 경우는 공격능력이 없음. 따라서 Unit 함수로 만들 수 있다.
# 그런데 Unit, AttackUnti 클래스는 중복되는 내용들이 있음. 이 경우에 상속의 개념을 사용할 수 있다.


class Unit: #부모 클래스
    def __init__(self, name, hp):
          self.name = name # 멤버 변수
          self.hp = hp # 멤버 변수
   
# 공격유닛
class AttackUnit(Unit): # 자식 클래스
    def __init__(self, name, hp, damage):
        #self.name = name
        #self.hp = hp
        Unit.__init__(self, name, hp) # Unit 클래스의 init 메소드를 호출해서 중복되는 name, hp 변수를 생성
        self.damage = damage
    
    def attack(self, location):
        print("{0} : {1} 방향으로 적군을 공격. [공격력 {2}]"\
        .format(self.name, location, self.damage)) ## attack 함수에 전달된 location 변수 활용, self가 붙은 변수는 클래스 내에 정해진 변수값 활용.
    
    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 Unit: #부모 클래스
    def __init__(self, name, hp):
          self.name = name # 멤버 변수
          self.hp = hp # 멤버 변수
   
# 공격유닛
class AttackUnit(Unit): # 자식 클래스
    def __init__(self, name, hp, damage):
        #self.name = name
        #self.hp = hp
        Unit.__init__(self, name, hp) # Unit 클래스의 init 메소드를 호출해서 중복되는 name, hp 변수를 생성
        self.damage = damage
    
    def attack(self, location):
        print("{0} : {1} 방향으로 적군을 공격. [공격력 {2}]"\
        .format(self.name, location, self.damage)) ## attack 함수에 전달된 location 변수 활용, self가 붙은 변수는 클래스 내에 정해진 변수값 활용.
    
    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))

# 드랍쉽을 정의
def 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))

def FlyableAttackUnit(AttackUnit, Flyable): # 공중 유닛이며 공격이 가능한 클래스
    def __init__(self, name, hp, damage, flying_speed):
        AttackUnit.__init__(self, name, hp, damage) # 초기화
        Flyable.__init__(self, flying_speed)

# 발키리 : 공중 공격 유닛, 한번에 14번 공격
valkyrie = FlyableAttackUnit("발키리", 200, 6, 5) #AttackUnit과, Unit클래스의 유닛 정의 하는 부분 // 유닛 생성
valkyrie.fly(valkyrie.name, "3시")# Flyable 클래스의 fly함수 호출 Flyable __init__을 보면 flying_speed만을 변수로 입력 받기 대문에 name을 명시하려면 별도로 변수를 추가해야함.

연산자 오버라이딩

자식 클래스에서 정의한 메소드 이용

class Unit: #부모 클래스
    def __init__(self, name, hp, spped):
          self.name = name # 멤버 변수
          self.hp = hp # 멤버 변수
          self.spped = 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):
        #self
        Unit.__init__(self, name, hp, speed) # Unit 클래스의 init 메소드를 호출해서 중복되는 name, hp 변수를 생성
        self.damage = damage
    
    def attack(self, location):
        print("{0} : {1} 방향으로 적군을 공격. [공격력 {2}]"\
        .format(self.name, location, self.damage)) ## attack 함수에 전달된 location 변수 활용, self가 붙은 변수는 클래스 내에 정해진 변수값 활용.
    
    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))

# 드랍쉽을 정의
def 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))

def FlyableAttackUnit(AttackUnit, Flyable): # 공중 유닛이며 공격이 가능한 클래스
    def __init__(self, name, hp, damage, flying_speed):
        AttackUnit.__init__(self, name, hp, 0, damage) # 지상 스피드는 0으로 하기 위해서 0 넣어둠
        Flyable.__init__(self, flying_speed)

vulture = AttackUnit("벌쳐", 80, 10, 20) # 이름, 체력, 속도, 공격력
battlecruiser = FlyableAttackUnit("배틀크루저", 500, 25 , 3)

vulture.move("11시")
battlecruiser.fly(battlecruiser.name, "9시")
# 위와 같은 경우 지상, 공중 유닛의 이동하는 메소드가 이름이 다르다 move != fly... 귀찮으니 수정이 필요.

수정된 내용…

```python class Unit: #부모 클래스 def init(self, name, hp, spped): self.name = name # 멤버 변수 self.hp = hp # 멤버 변수 self.spped = 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):
    #self
    Unit.__init__(self, name, hp, speed) # Unit 클래스의 init 메소드를 호출해서 중복되는 name, hp 변수를 생성
    self.damage = damage

def attack(self, location):
    print("{0} : {1} 방향으로 적군을 공격. [공격력 {2}]"\
    .format(self.name, location, self.damage)) ## attack 함수에 전달된 location 변수 활용, self가 붙은 변수는 클래스 내에 정해진 변수값 활용.

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))

드랍쉽을 정의

def 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))

def FlyableAttackUnit(AttackUnit, Flyable): # 공중 유닛이며 공격이 가능한 클래스 def init(self, name, hp, damage, flying_speed): AttackUnit.init(self, name, hp, 0, damage) # 지상 스피드는 0으로 하기 위해서 0 넣어둠 Flyable.init(self, flying_speed)

def move(self, location): ## move 함수를 재정의.
    print("[공중 유닛 이동]")
    self.fly(self.name, location)

vulture = AttackUnit(“벌쳐”, 80, 10, 20) # 이름, 체력, 속도, 공격력 battlecruiser = FlyableAttackUnit(“배틀크루저”, 500, 25 , 3)

vulture.move(“11시”) battlecruiser.move(“9시”)