MY MEMO

[PYTHON] 개념 다지기 - 2 본문

STUDYING/PYTHON

[PYTHON] 개념 다지기 - 2

l_j_yeon 2017. 10. 7. 22:05

출처 : https://programmers.co.kr/learn/courses/2


함수를 정의하고 list에서 맞는 value값이 있으면 return 해주는 문제!


def safe_index(my_list, value):

    if value in my_list:

        index = my_list.index(value);

        return index

    else :

        return None

    

safe_index([1,2,3,4,5], 5)

safe_index([1,2,3], 5)



list의 insert sort reverse 연습문제


list1 = [1, 2, 3, 4]


# 아래줄에서 list1의 1번째 자리에 8을 넣고 원래 있던 값은 오른쪽으로 밀어 보세요.

list1.insert(1,8)


# 아래줄에서 list1을 작은수 부터 큰수로 정렬해 보세요

list1.sort()


# 아래줄에서 list1을 거꾸로 만들어 보세요

list1.reverse()


string을 이용해서 spllite, index, join 연습문제


str = "오늘은 날씨가 흐림"


# split()을 이용해서 str을 공백으로 나눈 문자열을 words에 저장하세요

words = str.split()


# index()를 이용해서 "흐림"이 words의 몇번째에 있는지 찾고, position에 저장하세요.

position = words.index("흐림")


words[position] = "맑음"


#join()을 이용해서 words를 다시 문자열로 바꿔 new_str에 저장하세요. words를 문자열로 바꿀때는 공백 한 칸을 기준으로 붙이면 됩니다.

new_str = " ".join(words)


print(new_str)


list slice 문제 - 1


rainbow = ["빨", "주", "노", "초", "파", "남", "보"]


# red_colors가 ["빨", "주", "노"]의 값을 가지도록 rainbow를 slice하세요.

red_colors = rainbow[ 0 : 3 ]


#blue_colors가 ["파", "남", "보"]의 값을 가지도록 rainbow를 slice하세요.

blue_colors = rainbow[ 4: 7 ]


list slice 문제 - 2


list1 = list(range(20))


# new_list가 5, 8, 11, 14의 값을 가지도록 list1을 slice하세요

new_list = list1[5:15:3]

print(new_list)


# reverse_list가 17, 13, 9, 5의 값을 가지도록 list1을 slice하세요

reverse_list = list1[17:4:-4]

print(reverse_list)


slice와 del을 이용해서 list 내용 바꾸기


list1 = [0, 1, 2, 3, 4, 5]

# list1의 1부터 3까지를 slice를 이용해서 각각 11, 22, 33으로 바꿔보세요.

# 바꾸고 나면 list1은 [0, 11, 22, 33, 4, 5]가 되어야 합니다.

list1[1:4]=[11,22,33] 

print(list1)


list2 = [0, 1, 2, 3, 4, 5]

# list2의 1부터 3까지를 del과 slice를 이용해서 지워보세요

# 바꾸고 나면 list2은 [0, 4, 5]가 되어야 합니다.

del list2[1:4]


class를 개념잡기! -> type 알아보기


my_list = [1, 2, 3]

my_dict = {"풀": 800, "색연필": 3000}

my_tuple = (1, 2, 3)

number = 10

real_number = 3.141592


print(type(my_list))

print(type(my_dict))

print(type(my_tuple))

print(type(number))

print(type(real_number))


인스턴스(Instance)


여기서 list라는 객체에서 list1과 list2라는 인스턴스가 파생됩니다

즉 list1과 list2의 값은 같기 때문에 같은 값을 가지지만

list1과 list2는 다른 인스턴스입니다


예를 들어

강사와 학생은 모두 인간인 것이 같지만

강사와 학생은 다릅니다



이것을 보면 인간이라는 클래스 안에 강사라는 인스턴스와 학생이라는 인스턴스가 있습니다

즉 강사와 학생은 인간이라는 클래스라는 것은 같지만 두개의 인스턴스를 비교하면 다릅니다


list1 = [1, 2, 3]

list2 = [1, 2, 3]


if list1 is list1:

    print("당연히 list1과 list1은 같은 인스턴스입니다.")


if list1 == list2:

    print("list1과 list2의 값은 같습니다.")

    if list1 is list2:

        print("그리고 list1과 list2는 같은 인스턴스입니다.")

    else:

        print("하지만 list1과 list2는 다른 인스턴스입니다.")



list1 = list(range(10))

list2 = [1, 2, 3]


if isinstance(list1, list) and isinstance( list2 , list):

    print("list1과 list2는 둘 다 list클래스 입니다.")


#isinstance는 instance의 여부를 확인하는 함수입니다.


Class 만들기!


class Car():

    '''차'''

    

taxi = Car()

taxi.name = "택시"

# taxi.name에 "택시"라는 값을 저장하세요.


모델링(modeling)

클래스로 현실의 개념을 표현하는 것


class Car():

    def run(self):

    print("{}가 달립니다.".format(self.name))


taxi = Car()

taxi.name = "택시"

taxi.run()


인스턴스 객체의 변수를 가리킬 때에는 self.변수명 으로 접근 해야 합니다. 

self 를 명시하지 않으면 instance name space 또는 class name space 를 탐색하지 않고, 

local name space 를 탐색한 뒤 바로 global name space 를 탐색 합니다. 

(여기서 name space 란 package 의 개념이 아니라, variable pool 의 개념입니다.)


첫번째 파라미터에 항상 객체 자신을 의미하는 "self"라는 파라미터를 갖습니다


+) method란


특별한 method 알아보기

__init__ : 생성자와 같은 함수

__str__ : class의 값을 print해주는 함수


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("홍길동",60)

print(person)

person.walk()

person.walk()

person.eat()


상속

상속이라는 개념은 c++과 java에 있는 것과 같이 객체를 상속하는 개념입니다.

자식이 부모의 class에게 상속받는다면 부모의 method를 사용할 수 있습니다.


class Car():

    def run(self):

        print("차가 달립니다.")


class Truck(Car):

    def load(self):

        print("짐을 실었습니다.")


Override

부모에서 함수를 받았을 때 항상 부모와 같은 동작을 할 수는 없습니다

만약 Animal 객체를 상속받았을 때

Dog 와 Human은 객체에서 wave 행위는 다른 것입니다.

Dog는 꼬리를 Human은 손을 흔드는 것입니다

이럴때는 Dog class와 Human의 class에서 wave를 overriding한 후 값을 변경하면 가능합니다.


+) Overriding 과 Overloading의 개념의 차이

: Overriding : 객체내에서 부모 클래스의 함수의 이름과 같지만 다른 동작을 하는 것 (단 return type, 매개변수의 수와 type은 동일해야함)

 Overloading : 함수의 이름은 같지만 return type, 매개변수의 개수 및 type이 동일하거나 변경된 함수를 의미

 (즉 함수의 이름만 동일)


class Car():

    def run(self):

        print("차가 달립니다.")



class Truck(Car):

    def load(self):

        print("짐을 실었습니다.")

    def run(self):

        print("트럭이 달립니다.")



truck = Truck()

truck.run()


super

부모 Class를 실행시키는 함수 //python 2.7 version에서는 안되나봅니다..ㅠㅠ


class Car():

    def __init__(self, name):

        self.name = name


    def run(self):

        print("차가 달립니다.")



class Truck(Car):

    def __init__(self, name,capacity):

        super().__init__(name)

        self.capacity = capacity

    def load(self):

        print("짐을 실었습니다.")


Exception

자신이 원하는 Exception을 만들면 예외처리를 하는 것이 쉬워집니다.


class MyException(Exception):

    '''예외처리'''

    

shops = {

    "송일문방구": {"가위": 500, "크레파스": 3000},

    "알파문구": {"풀": 800, "도화지": 300, "A4용지": 8000},

    "다이소": {"풀": 500, "목공본드": 2000, "화분": 3000}

}


try:

    for shop, products in shops.items():

        for product, price in products.items():

            if product == '풀':

                print("{}: {}원".format(shop, price))

                raise MyException

except MyException:

    print("풀을 찾았습니다.")

    

"""

예를 들어

try:

signup()

except BadUserName:

print("아이디 오류")

except WrongPassword:

print("비밀번호 오류")

"""


Dictionary Comprehension

python에서 잘 쓰이는 것이라고 합니다.

for문을 []안에 넣어 list를 구성할 수 있고

zip을 이용해서 여러 data를 한번에 묶을 수도 있습니다.


list1 = [i for i in range(1,100) if i%8 == 0 ]

print(list1)


product_list = ["풀", "가위", "크래파스"]

price_list = [800, 2500, 5000]

product_dict = {product:price for product, price in zip(product_list,price_list)}

print(product_dict)


datetime

datetime을 이용해서 시간을 표현하거나 시간계산을 합니다.


import datetime


christmas_2016 = datetime.datetime.now()

christmas_2016 = datetime.datetime(2016,12,25)

print(christmas_2016)


import datetime


def days_until_christmas():

    christmas_2030 = datetime.datetime(2030, 12, 25)

    days = christmas_2030 - datetime.datetime.now()

    return days.days


print("{}일".format(days_until_christmas()))


+) 지금부터 100일 후 9시 정각


import datetime


hundred_after = datetime.datetime.now().replace(hour=9,minute=0,second=0)+datetime.timedelta(days=100)


print("{}/{}/{}".format(hundred_after.year,hundred_after.month, hundred_after.day))


추가 문제 입니다!

서버에서 어떤 값을 넣어도 자신이 선택한 값과 맞게 만들라는 것이었습니다.

hashcode를 태그해 주셨는데 처음에는 몰랐다가 후에 알게되었습니다


__eq__는 ==와 같은 method로 true/false를 return합니다

__eq__은 재정의 도 가능한데

재정의를 해서 true만 항상 return되게 만든다면 이 문제를 풀 수 있습니다.


from random import randint


class foo(object):

    def __eq__(self, other): 

        return True


def maybe_lucky():

    return foo()


'STUDYING > PYTHON' 카테고리의 다른 글

[PYTHON] Rivescript 개념  (0) 2017.10.15
[PYTHON] 추가  (0) 2017.10.15
[PYTHON] 개념 다지기 -1  (0) 2017.10.06
[PYTHON] Django 프로젝트 시작부터 mysql 연동까지  (0) 2017.10.06
[PYTHON] Konlpy 설치하기 (Window,Ubuntu)  (0) 2017.10.06
Comments