본문 바로가기

개발

파이썬3 기초 정리

■여러가지 타입

type(int)
type(float)
type(str)
type(list)
type(tuple)
bool(True,False)
type(set)
type(dict)

 

■연산자

 

■스트링에러 ('이 싱글코테션으로 인식되는 경우)

원본: Who am i, "i have a i'am" , that park            (에러 발생)

수정: '''Who am i, "i have a i'am" , that park'''      (앞뒤로 더블코테,싱글코테를 삽입한다.) (문자로 인식됨)

코드: '''Who am i, "i have a i'am" , that park'''
           Who am i, "i have a i\'am" , that park'        (\ 이스케이프 문자 표시)

 

■print 사용법

기본: print("박현진")

응용: print("박\n현진")                            (\n 개행문자)

응용: print("박현\n진짱이야\t일까?")     (\t 탭의 약자, 탭 키를 누른것과 같음)

코드: print("박현\n진짱이야\t일까?")
         박현
         진짱이야        일까?

 

---인덱싱---

기본: "박현진이야"

응용: "박현진이야"[3]           인덱싱: 몇번째 순서의 특정 값을 가져와

코드: "박현진이야"[3]
          '이'                               가 출력 (순서: 0,1,2,3,4,5)

 

응용: "박현진이야"[-1]           -1을 넣어보자

코드: "박현진이야"[-1]

          '진'                               가 출력 (순서: 뒤에서부터 -1,-2,-3)

 

응용: "박현진이야"[2:5]         2:5을 넣어보자

코드: "박현진이야"[2:5]         슬라이싱: 몇번에서 몇번을 가져오겠다.

          '진이야'                         가 출력 (주의: 시작 순서는 0에서 시작, 끝은 시작에서 5번째까지의 값)

코드: "박현진이야"[0:-1]       -1번째를 빼는거

          '박현진이'                     가 출력 

코드:  "박현진이야"[1:-3]
           '현'

코드: "박현진이야"[2:] "박현진이야"[:3]
          '진이야'               /  '박현진'

※인덱싱은 소수점을 사용할 수 없음! 정수만 사용가능

 

--- 기호 및 Split 사용---

코드:  파이썬" + "은" +" "+ "참 어렵구나"         + 기호는 문자를 붙여준다.
          '파이썬은 참 어렵구나'
코드:  "1234123412341234".split("23")            split은 해당 문자를 기준으로 문자를 쪼개준다.

           ['1', '41', '41', '41', '4']
코드:  "1234123412341234".split("1")
           ['', '234', '234', '234', '234']

 

--- in 사용---

코드:  "p" in "parkhyunjin"
           True

코드: "15" in "parkhyunjin"
           False

코드:  "15" not in "parkhyunjin"
           True

 

■리스트 정리

코드: a = [1,2,3,4,5,6,"박현진"]

결과:        a[6]
                '박현진'

응용:        a[3:5 + 6]
                [4, 5, 6, '박현진']

 

코드: a[7] = "우리금동이"                 (리스트 내부의 인덱싱 내용 바꾸기)

결과:        a
                [1, 2, 3, 4, 5, 6, '우리금동이']

 

코드: b = "parkhmhjr"                      (스트링 변수 입력)

코드: b[1] = "g"                                 (1번 '스트링' 인덱스 내용 바꾸기)

결과:      TypeError: 'str' object does not support item assignment
                스트링 인덱싱 내용은 리스트와 달리 값 변환이 제한 됨

 

코드: a.append("박현진")                 (a변수 끝에 값을 '추가')

결과:        [1, 2, 3, 4, 5, 6, '우리금동이', '박현진']

 

코드: a.pop(0)                                      (a변수 끝에 값을 '삭제')

결과:        [1, 2, 3, 4, 5, 6, '우리금동이']

 

코드: b = a.pop()                                   (스트링 금동이를 정수 6으로 치환하고 했음 / 스트링 pop 안됨!)  

결과:       b

                Out[56]: 6                              (값 6 삭제)
                In [57]: a
                Out[57]: [1, 2, 3, 4, 5]            (a를 출력해보니 삭제되어있음)

 

■튜플 정리 (리스트와 달리 소괄호를 사용한다.)

코드:      b = (1,2,3,4,5,6)

결과:      b
              (1, 2, 3, 4, 5, 6)
코드:      b.append(3)

결과:      AttributeError: 'tuple' object has no attribute 'append'

코드:      b.pop()

결과:      AttributeError: 'tuple' object has no attribute 'pop'

-> 튜플은 어떠한 값도 추가/삭제가 불가능하다

 

코드:       c = "abcde"

결과:       len(c)                             (len으로 c 변수의 값의 길이를 알수있다.)

               5                                     개

 

■함수 (input과 output)

코드:      def box(x):
               return x + 3                      (return은 값을 뱉어내는(output) 부분)

결과:      box(15)
              18

응용:      def gugu(x):
    ...:     print(x)
    ...:     print(x * 2)
    ...:     print(x * 3)
    ...:     print(x * 4)
    ...:     print(x * 5)
    ...:     print(x * 6)
    ...:     print(x * 7)
    ...:     print(x * 8)
    ...:     print(x * 9)
    ...:     print(x * 10)

결과:      gugu(5)
               5
               10
               15
               20
               25
               30
               35
               40
               45
               50

 

■pypi.org (파이썬 패키지 인덱스 / 다른 사람의 코드를 가져오자!)

# pip install numpy     [git bash에서 실행]

>>> import numpy as np

>>>  a = np.arange(15).reshape(3,5)

>>> a 

array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14]])

-> 테스트 해봤으면 구글에 numpy로 ## 하는법 검색하자~

 

■실습 자료

- while 실습

numbers = [1,2,3]
length = len(numbers)
i = 0
while :
    print(numbers[i])
    i = i + 1
numbers = [(1, 2), (10, 0)]

for a, b in numbers:
    if b == 0:
        print("0으로 나눌 수는 없습니다.")
   # else:
        continue    
    print("{}을(를) {}로 나누면 {}".format(a, b, a/b))

for문 = range(범위) 만큼 반복함
break = 반복문에서 멈추는 타이밍
continue = for 반복문을 돌다가 특정 조건을 만족하게 될 때 for문의 처음으로 바로 올라가고 싶을때 (참이면 그 구문을 스킵하고 다음 것 실행)

 

- try,except 실습

>>> try:
...     a = 3/0
...     print(a)
... except ZeroDivisionError:
...     print("0으로는 못나눈다 맨이야")
...
0으로는 못나눈다 맨이야

- try,except 실습2 (예외처리한 에러가 어떤 오류인지 확인)

>>> try:
...     a = 5
...     b = 0
...     c = a / b
... except Exception as ex:
...     print('다음과 같은 에러가 발생했습니다: {}'.format(ex))
...
다음과 같은 에러가 발생했습니다: division by zero

raise 에러 발생 시키는 실습

>>> shops = {
...     "송일문방구": {"강시영": 500, "김민창": 3000},
...     "알파문구": {"강시영": 800, "박해성": 300, "전희상": 8000},
...     "다이소": {"강시영": 500, "박현진": 2000, "대통령": 3000}
... }
>>>
>>> for shop, products in shops.items():
...     for product, price in products.items():
...         if product =='강시영':
...             print("{}: {}은 {}원".format(shop,product,price))
...
송일문방구: 강시영은 500원
알파문구: 강시영은 800원
다이소: 강시영은 500원

 

shops = {
    "송일문방구": {"김민창": 500, "박해성": 3000},
    "알파문구": {"강시영": 80000000, "전희상": 300, "김만두": 8000},
    "다이소": {"강시영": 500, "박현진": 2000, "김민창": 3000}
}

try:
    for shop, products in shops.items():
        for product, price in products.items():
            if product =='강시영':
                print("{}: {}은 {}원".format(shop,product,price))
                raise StopIteration                        #raise 에러코드 발생
                
except StopIteration:                                      #에러코드 예외처리
    print("정상적인 가격이네요!")
   
출력>
알파문구: 강시영은 80000000원
정상적인 가격이네요!

- 딕셔너리 if 문으로 and 연산

dic = {"key2":"Value1"}

if "key1" in dic and dic["key1"] == "value1":
	print("key1도 있고, 그 값은 value1이네")
else:
	print("아니네")
출력>
아니네

- 딕셔너리 출력방법

딕1 = {'남편':'아내'}

딕1['남편']                  # 남편이라는 키의 밸류를 불러옴
출력>
아내
print(딕1)                   # 키 : 밸류 형식으로 다 불러옴
출력>
{'남편': '아내'}
딕1.keys()                   # key를 불러오는 형식에 dict_keys가 포함됨
출력>
dict_keys(['남편'])

- 딕셔너리 출력 응용

 

딕1 = {'김민창' : '만두', '박현진' : '금동이'}

사랑하는동물 = '박현진'
[사랑하는동물] + "의 형아는 박현진"               #사랑하는동물 이라는 변수의 결과 값을 딕1에서 찾아 key에 있을 경우
출력>
'금동이의 형아는 박현진'

- def 및 함수.index(값) 연습

def safe_index(my_list, value):
    if value in my_list:             #2번: my_list = [1,2,3,4,5] 안에 value = 5가 있는지 확인.(True)
        return my_list.index(value)  #3번: [1,2,3,4,5] 안에 5가 몇 번째 있는지 검색 후 값을 #1번에 리턴 후 함수 종료.
    else:
        return None

print(safe_index([1,2,3,4,5], 5))  #1번:safe_index 함수 호출 my_list에 [1,2,3,4,5] 전달, value에 5 전달. 
                                   #4번:리턴 받은 값을 출력(값 : 4)
print(safe_index([1,2,3], 5)) #5번:1번과 마찬가지 과정을 거치고 my_list = [1,2,3] 안에 value = 5 값이 없으므로 리턴 받은 None 값 출력.

- while 문 끝나는 조건: ture를 반복하다가 false 때 멈춤

n = 100
s = 0
count = 1

while count < n:     #while은 값이 false가 나올때 까지 반복함
    s = s + count    
    count = count + 1
print(count)         
print(count,"의 값입니다.") 
값: 100,의 값입니다

- def 함수명(임의로 디폴트값 넣거나 안넣거나):
        return

 

-for 문 실습( 2가지 패턴)

# for 문 패턴1    (pi리스트를 정의해서 안에 값의 갯수 만큼 for문을 반복)
pi =[3.14, 3.15, 3.16]
def circleArea(r):
    for item in pi:
        area = item * (r**2) 
        print("r: {}, pi : {}".format(r,item))
circleArea(3)
#print값이 3개 나옴 pi 리스트 값 개수만큼
print("다음 코드 시작합니다.\n")

# for 문 패턴2    (pi를 바로 값 하나로 정의하고 for 1번만 반복)
def circleArea(r,*pi):              #(즉 item=pi값이 된다.)
    for item in pi:
        area = item * (r**2) 
        print("r: {}, pi : {}".format(r,item))
circleArea(3,3.15)
#print값이 1개만나옴

- 람다식

람다식 개념
람다식 써보자!
람다식 응용
map 함수를 써서 list형식을 바로 대입할 수 있다.
filter는 조건식으로 사용가능(true,false) (내용 까면: if x > 0 으로 0보다 큰값만 출력됨 true니까)
reduce는 다음 리턴 값들을 누적해서 결과를 하나의 "값"으로 나타냄&nbsp; *리스트가 아니다."&nbsp; ex) 위에 코드는 처음 a가 50,b가 22인데 a가 더 크기 때문에 50이 a로 들어가고, 50과 42비교 50이 크기 a로 다시들어가고 50(a)와 103(b)를 비교했는데 b가 더크다. 103이 다시 누적해서 a값으로 들어간 후 다시 13과 비교 후 가장 높은 a인 103이 나옴

- 입/출력 방법 (file)

기본 사용법

print("휴가일정을 입력 해 주세요 :\n ex) 5월1일 = 5,1")

def s():                                          # 함수의 정의와 파일 내용을 데이터로 저장
    file = open('D:\python_work\Holiday_check\Holiday_check.txt','a',encoding='utf8')
    try:
        a1,a2 = (input().split(','))
        print('입력하신 휴가일정은 {}월 {}일 입니다.'.format(a1,a2),file=file)
        print('입력하신 휴가일정은 {}월 {}일 입니다.'.format(a1,a2))
    except ValueError:
        print('형식에 맞춰 재 입력 하십시오 :', end =" ")
        s()                                       # ValueError 에러가 났을 경우 함수 재 실행
    file.close()
s()                                               # 중요!! : s()함수를 실행

- Class란

클래스와 객체
#self: 객체 자신을 가리키는 특수한 키워드, 다른 언어의 this 키워드와 유사한 개념을 가짐
ex)

#1
class Car():
    '''자동차'''
    def name(self,name):
        self.name = name
    
taxi = Car()
taxi.name('taxi1')
print(taxi.name)

class Car():
    '''자동차'''
    def run(self):
        print("{}가 달립니다.".format(self.name))

taxi = Car()
taxi.name = "택시"
taxi.run()

#2
class MyClass(object):
  name = 'korea'
  def get_name(self):
    return self.name

  def getinfo(self):
    self.get_name()
    
m1 = MyClass()
m2 = MyClass()
m3 = MyClass()

m3.name = 'Spain'
print(m1.name)
print(m2.name)
print(m3.get_name())

클래스연습#1

class Human():
    
    def __init__(self, name, weight):
        self.name = name
        self.weight = weight
    
    def __str__(self):
        return "{} (몸무게 {}kg)".format(self.name, self.weight)
    
    def eat(self):
        self.weight += 0.1
        print("{}가 먹어서 {}kg이 되었습니다.".format(self.name, self.weight))
    
    def walk(self):
        self.weight -= 0.1
        print("{}가 걸어서 {}kg이 되었습니다.".format(self.name, self.weight))

# 아래에서 person을 이름과 몸무게를 가지는 Human클래스의 인스턴스로 만들어보세요.
person = Human('다라이',15)
print(person.walk())
print(person.walk())
print(person.eat())

# 클래스 상속개념  

class Car():
    def run(self):
        print("차가 달립니다.")

# 아래에서 Car를 상속받는 Truck이라는 클래스를 만들고, load라는 메소드를 만들어 보세요.
# load메소드에서는 "짐을 실었습니다."라고 출력하면 됩니다.

class Truck(Car):                                 #<--Truck 클래스의 부모클래스를 Car로 지정해주어 Car()의 메소드를 쓸수있게됨                              
    def load(self):
        print('짐을 실었습니다.')

park = Truck()
print(park.run())
print(park.load())

# 오버라이드 (같은 이름을 가진 메소드 덮어쓰기)

class Car():
  def run(self):
        print("차가 달립니다.")

class Truck(Car):
    def load(self):
        print("짐을 실었습니다.")
    # 이 아래에서 run 메소드를 오버라이드 하세요.
    def run(self):
        self.run = print('트럭이 달립니다.')            or          print('트럭이 달립니다')  

truck = Truck()
truck.run()

# 클래스 상속개념

class Car():
    def run(self):
        print("차가 달립니다.")

# 아래에서 Car를 상속받는 Truck이라는 클래스를 만들고, load라는 메소드를 만들어 보세요.
# load메소드에서는 "짐을 실었습니다."라고 출력하면 됩니다.

class Truck(Car):                                 #<--Truck 클래스의 부모클래스를 Car로 지정해주어 Car()의 메소드를 쓸수있게됨                              
    def load(self):
        print('짐을 실었습니다.')

park = Truck()
print(park.run())
print(park.load())

#부모 클래스로 일부 값으로 처리하고 나머지는 자식 클래스가 처리 상속 개념 : super().메소드명(아규먼트) 

class Car():
    def __init__(self, name):
        self.name = name
    
    def run(self):
        print("차가 달립니다.")

class Truck(Car):
    # 이 아래에서 __init__ 메소드를 오버라이드 하세요
    def __init__(self, name, capacity):
        super().__init__(name)           #<- 부모의 __init__ (name)메소드를 호출
        self.capacity = capacity         #<- capacity에 메소드를 자기로 선정
        print('{}이 {}kg을 싣고있다람쥐.'.format(self.name,self.capacity))
    
    def load(self):
        print("짐을 실었습니다.")

gogo = Truck('트럭','50')
print(gogo)