전처리, 클래스

그 전에 지금까지 복습한 것 관련 퀴즈 문제

1~100까지의 숫자 중에서 3과 5로 나누어 떨어지는 수를 저장하는 List


In [1]:
print([i for i in range(1, 100+1) if i%3==0 or i%5==0])


[3, 5, 6, 9, 10, 12, 15, 18, 20, 21, 24, 25, 27, 30, 33, 35, 36, 39, 40, 42, 45, 48, 50, 51, 54, 55, 57, 60, 63, 65, 66, 69, 70, 72, 75, 78, 80, 81, 84, 85, 87, 90, 93, 95, 96, 99, 100]

3의 배수가 입력되면 beer, 5의 배수가 입력되면 chicken, 15의 배수는 beerchicken


In [2]:
num = 15
result = ""
if num % 3 == 0:
    result += "Beer"
if num % 5 == 0:
    result += "Chichen"
print(result)


BeerChichen

In [3]:
result = []
for i in range(1, 100+1):
    word = ''
    if i % 3 == 0:
        word += "Beer"
    if i % 5 == 0:
        word += "Chicken"
    result.append(word)
print(result)


['', '', 'Beer', '', 'Chicken', 'Beer', '', '', 'Beer', 'Chicken', '', 'Beer', '', '', 'BeerChicken', '', '', 'Beer', '', 'Chicken', 'Beer', '', '', 'Beer', 'Chicken', '', 'Beer', '', '', 'BeerChicken', '', '', 'Beer', '', 'Chicken', 'Beer', '', '', 'Beer', 'Chicken', '', 'Beer', '', '', 'BeerChicken', '', '', 'Beer', '', 'Chicken', 'Beer', '', '', 'Beer', 'Chicken', '', 'Beer', '', '', 'BeerChicken', '', '', 'Beer', '', 'Chicken', 'Beer', '', '', 'Beer', 'Chicken', '', 'Beer', '', '', 'BeerChicken', '', '', 'Beer', '', 'Chicken', 'Beer', '', '', 'Beer', 'Chicken', '', 'Beer', '', '', 'BeerChicken', '', '', 'Beer', '', 'Chicken', 'Beer', '', '', 'Beer', 'Chicken']

In [4]:
beer_list = [
    "Beer" if x % 3 == 0 else ""
    for x
    in range(1, 100+1)
]

chicken_list = [
    "Chicken" if x % 5 == 0 else ""
    for x
    in range(1, 100+1)
]

print([
    beer_list[i] + chicken_list[i]
    for i
    in range(100)
])


['', '', 'Beer', '', 'Chicken', 'Beer', '', '', 'Beer', 'Chicken', '', 'Beer', '', '', 'BeerChicken', '', '', 'Beer', '', 'Chicken', 'Beer', '', '', 'Beer', 'Chicken', '', 'Beer', '', '', 'BeerChicken', '', '', 'Beer', '', 'Chicken', 'Beer', '', '', 'Beer', 'Chicken', '', 'Beer', '', '', 'BeerChicken', '', '', 'Beer', '', 'Chicken', 'Beer', '', '', 'Beer', 'Chicken', '', 'Beer', '', '', 'BeerChicken', '', '', 'Beer', '', 'Chicken', 'Beer', '', '', 'Beer', 'Chicken', '', 'Beer', '', '', 'BeerChicken', '', '', 'Beer', '', 'Chicken', 'Beer', '', '', 'Beer', 'Chicken', '', 'Beer', '', '', 'BeerChicken', '', '', 'Beer', '', 'Chicken', 'Beer', '', '', 'Beer', 'Chicken']

In [7]:
def word_add_num(count, first_num, first_word, second_num, second_word):
    first_list = [
        first_word if i % first_num == 0 else ""
        for i
        in range(1, count+1)
    ]
    
    second_list = [
        second_word if i % second_num == 0 else ""
        for i
        in range(1, count+1)
    ]
    
    return [
        first_list[i] + second_list[i]
        for i
        in range(count)
    ]
#함수이기 때문에 return을 해주어야 한다.

In [9]:
print(word_add_num(100, 3, "ki", 7, "poy"))


['', '', 'ki', '', '', 'ki', 'poy', '', 'ki', '', '', 'ki', '', 'poy', 'ki', '', '', 'ki', '', '', 'kipoy', '', '', 'ki', '', '', 'ki', 'poy', '', 'ki', '', '', 'ki', '', 'poy', 'ki', '', '', 'ki', '', '', 'kipoy', '', '', 'ki', '', '', 'ki', 'poy', '', 'ki', '', '', 'ki', '', 'poy', 'ki', '', '', 'ki', '', '', 'kipoy', '', '', 'ki', '', '', 'ki', 'poy', '', 'ki', '', '', 'ki', '', 'poy', 'ki', '', '', 'ki', '', '', 'kipoy', '', '', 'ki', '', '', 'ki', 'poy', '', 'ki', '', '', 'ki', '', 'poy', 'ki', '']

In [ ]:

Palindrome

  • 거꾸로 해도 같은 단어
  • 기러기 => 기러기, 소주만병만주소 => 소주만병만주소
  • 문자열을 받아서, 뒤집었을 때 같으면 True, 다르면 False

In [13]:
def reverse(word):
    reversed_word = ""
    for i in range(len(word)):
        reversed_word += word[len(word)-1-i]
    return reversed_word

def is_palindrome(word):
    return word == reverse(word)

In [15]:
is_palindrome("기러기")


Out[15]:
True

In [17]:
is_palindrome("소주만병만주소")


Out[17]:
True

In [18]:
is_palindrome("김기표")


Out[18]:
False

In [19]:
"자일리톨껌"[::-1]


Out[19]:
'껌톨리일자'

In [20]:
def reverse(word):
    return word[::-1]

def is_palindrome(word):
    return word == reverse(word)

In [21]:
is_palindrome("기러기")


Out[21]:
True

In [22]:
is_palindrome("PCA")


Out[22]:
False

In [23]:
is_palindrome("ABCBA")


Out[23]:
True

In [24]:
def is_palindrome(word):
    return word == word[::-1]

In [25]:
is_palindrome("수박이박수")


Out[25]:
True

In [26]:
(lambda x: x == x[::-1])("손가방")


Out[26]:
False

In [27]:
(lambda x: x == x[::-1])("고기고")


Out[27]:
True

In [ ]:


In [29]:
def word_split(sentence, sperat=" "):
    word_list = []
    word = ""
    for char in sentence:
        if char == " ":
            word_list.append(word)
            word = ""
        else:
            word += char
    return word_list

word_split("오늘은 날씨가 참 맑구나.")


Out[29]:
['오늘은', '날씨가', '참']

In [30]:
def word_split(sentence, sperat=" "):
    word_list = []
    word = ""
    for char in sentence + " ":   # " " 이거를 추가해야 끝까지 출력이 됩니다.
        if char == " ":
            word_list.append(word)
            word = ""
        else:
            word += char
    return word_list

word_split("오늘은 날씨가 참 맑구나.")


Out[30]:
['오늘은', '날씨가', '참', '맑구나.']

In [33]:
def word_split(sentence, seperate=" "):
    word_list =[]
    word = ""
    
    for char in sentence:
        if char == " ":
            word_list.append(word)
            word=""
        else:
            word += char
    if word != "":
        word_list.append(word)
    return word_list

word_split("오늘은 날씨가 참 맑구나.")


Out[33]:
['오늘은', '날씨가', '참', '맑구나.']

In [35]:
def word_split(sentence, seperate=" "):
    word_list = []
    word = ""
    
    for char in sentence:
        if char == seperate:
            word_list.append(word)
            word = ""
        else:
            word += char
    if word != "":
        word_list.append(word)
    return word_list

word_split("오늘은 왠지 날씨가 참 맑은가.", "가")


Out[35]:
['오늘은 왠지 날씨', ' 참 맑은', '.']

In [ ]:

word_split => 문장을 받아 단어 리스트

word_join => 단어 리스트를 받아서 문장으로 만드는

word_replace => 단어를 받아서, 특정 단어만 다른 단어로 바꾸는 거


In [36]:
def word_join(word_list, seperate=" "):
    result = ""
    for word in word_list:
        result += word
        result += seperate
    return result

word_join(["오늘은", "정말", "공부가", "하기", "싫다고", "말하면", "안", "되고", "그냥", "그래요"])


Out[36]:
'오늘은 정말 공부가 하기 싫다고 말하면 안 되고 그냥 그래요 '

In [ ]:


In [37]:
def word_join_2(word_list, seperate=" "):
    result = ""
    for index, word in enumerate(word_list):
        result += word
        if not index == len(word_list)-1:
            result += seperate
    return result

word_join_2(["당신은", "존재", "자체로", "소중합니다."])


Out[37]:
'당신은 존재 자체로 소중합니다.'

In [ ]:


In [49]:
word_list = "카페나 도서관이나 공부하기는 참 좋다.".split(" ")
word_list


Out[49]:
['카페나', '도서관이나', '공부하기는', '참', '좋다.']

In [52]:
[word for word in word_list if not word == ""]


Out[52]:
['카페나', '도서관이나', '공부하기는', '참', '좋다.']

In [54]:
" ".join(["카페나", "도서관이나", "공부하기는", "참", "좋다."])


Out[54]:
'카페나 도서관이나 공부하기는 참 좋다.'

In [ ]:


In [55]:
"지진무서워".replace("지진", "홍수")


Out[55]:
'홍수무서워'

In [ ]:


In [56]:
user_list = [
    ["김기표", "주소1"],
    ["김깊효", "주소2"],
]

In [60]:
user_dict_list = []

for user in user_list:
    name = user[0]
    address = user[1]
    
    user_dict = {
        "name": name,
        "address": address,
    }
    user_dict_list.append(user_dict)

user_dict_list


Out[60]:
[{'address': '주소1', 'name': '김기표'}, {'address': '주소2', 'name': '김깊효'}]

In [ ]:


In [65]:
def get_user_dict(user):
    return {
        "name": user[0],
        "address": user[1]
    }

get_user_dict(user_list)


Out[65]:
{'address': ['김깊효', '주소2'], 'name': ['김기표', '주소1']}

In [68]:
[
    {
        "name": user[0],
        "address": user[1]
    }
    for user
    in user_list
]


Out[68]:
[{'address': '주소1', 'name': '김기표'}, {'address': '주소2', 'name': '김깊효'}]

In [ ]:


In [69]:
with open("./users.csv", "r") as f:   #기존에 users_csv에 사용자 정보가 있다면
    user_list = []
    
    for line in f.readlines():
        user_list.append({
                "name": line.split(",")[0],
                "address": line.split(",")[1].replace("\n", "")
            })
user_list


---------------------------------------------------------------------------
FileNotFoundError                         Traceback (most recent call last)
<ipython-input-69-b200ad49df94> in <module>()
----> 1 with open("./users.csv", "r") as f:   #기존에 users_csv에 사용자 정보가 있다면
      2     user_list = []
      3 
      4     for line in f.readlines():
      5         user_list.append({

FileNotFoundError: [Errno 2] No such file or directory: './users.csv'

In [70]:
with open("./users.csv", "r") as f:
    user_list = [
        {
            "name": line.split(",")[0],
            "address": line.split(",")[1].replace("\n", "")
        }
        for line
        in f.readlines()
    ]
user_list


---------------------------------------------------------------------------
FileNotFoundError                         Traceback (most recent call last)
<ipython-input-70-50ccf67b64b7> in <module>()
----> 1 with open("./users.csv", "r") as f:
      2     user_list = [
      3         {
      4             "name": line.split(",")[0],
      5             "address": line.split(",")[1].replace("\n", "")

FileNotFoundError: [Errno 2] No such file or directory: './users.csv'

핸드폰 번호 전처리


In [71]:
def preprocess(phonenumber):
    phonenumber_process_dict = {
        "공": 0,
        "영": 0,
        "일": 1,
        "이": 2,
        "삼": 3,
        "사": 4,
        "오": 5,
        "육": 6,
        "칠": 7,
        "팔": 8,
        "구": 9,
        "-": "",
        " ": "",
    }
    for key, value in phonenumber_process_dict.items():   #items는 key, value를 한 번에 뽑을 때 사용된다.
        phonenumber = phonenumber.replace(key, str(value))
    return phonenumber
preprocess("공일공육이35-삼삼1구")


Out[71]:
'01062353319'

In [72]:
with open("./phonenumber.txt", "r") as input_file:   #전처리 대상 텍스트 파일 있을 때
    result = [
        preprocess(line.replace("\n", ""))
        for line
        in input_file.readlines()
    ]
result


---------------------------------------------------------------------------
FileNotFoundError                         Traceback (most recent call last)
<ipython-input-72-e7ff740f5134> in <module>()
----> 1 with open("./phonenumber.txt", "r") as input_file:   #전처리 대상 텍스트 파일 있을 때
      2     result = [
      3         preprocess(line.replace("\n", ""))
      4         for line
      5         in input_file.readlines()

FileNotFoundError: [Errno 2] No such file or directory: './phonenumber.txt'

In [73]:
with open("./phonenumber.txt", "r") as input_file:  
    with open("./phonenumber_preprocessed.txt", "w") as output_file:
        [
            output_file.write(
                preprocess(line.replace("\n", "")) + "\n"
            )
            for line
            in input_file.readlines()
        ]


---------------------------------------------------------------------------
FileNotFoundError                         Traceback (most recent call last)
<ipython-input-73-7bd25725b209> in <module>()
----> 1 with open("./phonenumber.txt", "r") as input_file:
      2     with open("./phonenumber_preprocessed.txt", "w") as output_file:
      3         [
      4             output_file.write(
      5                 preprocess(line.replace("\n", "")) + "\n"

FileNotFoundError: [Errno 2] No such file or directory: './phonenumber.txt'
  • 절차 지향 프로그래밍: 데이터, 데이터 처리하는 함수
  • 객체 지향 프로그래밍 ( Object Oriented Programming )

    • 절차 <<<< 객체
    • 둥둥 떠다니는 객체
    • 객체(데이터, 각각의 데이터를 처리하는 방법) <=> 객체 : 메시지를 전달
    • 실험 => 완벽하게 적합한 알고리즘
  • 함수형 프로그래밍 => Lambda, Lambda Operator, List Comprehension

  • 객체는 자료형(클래스)를 가진다
  • 모듈은 .py파일 형식. 함수와 변수 선언을 담고 있다. 다른 .py파일에서 추가해서 사용할 수 있다. import로 모듈을 불러올 수 있다.

In [77]:
class Student():     # Student() => __init__ 함수가 실행되는 것
    __campus = "패스트캠퍼스"   #변수를 밖에서 부를 수는 있지만 안 부르는 것이 약속
    
    def __init__(self, name, age):  # init => initialize ( 초기화하다 )
        self.name = name
        self.age = age
        print("학생 {name}({age}) 가 태어났습니다.".format(
            name=self.name,
            age=self.age
        ))
    
    # 자기소개를 할 수 있다.
    def introduce(self):
        print("안녕하세요, 저는 {campus}에 다녔던 {age}{name} 입니다.".format(
            campus=self.__campus,
            age=self.age,
            name=self.name,
        ))

In [78]:
kimkipoy = Student("김기표", 29)


학생 김기표(29) 가 태어났습니다.

In [79]:
kimkipoy.introduce()


안녕하세요, 저는 패스트캠퍼스에 다녔던 29살 김기표 입니다.

In [82]:
kimkipoy.campus = "경쟁사"
kimkipoy.introduce()


안녕하세요, 저는 패스트캠퍼스에 다녔던 29살 김기표 입니다.

In [83]:
kimkipoy   #_Student__campus 이와 같은 형태로 변수가 바뀌었다.
dir(kimkipoy)


Out[83]:
['_Student__campus',
 '__class__',
 '__delattr__',
 '__dict__',
 '__dir__',
 '__doc__',
 '__eq__',
 '__format__',
 '__ge__',
 '__getattribute__',
 '__gt__',
 '__hash__',
 '__init__',
 '__le__',
 '__lt__',
 '__module__',
 '__ne__',
 '__new__',
 '__reduce__',
 '__reduce_ex__',
 '__repr__',
 '__setattr__',
 '__sizeof__',
 '__str__',
 '__subclasshook__',
 '__weakref__',
 'age',
 'campus',
 'introduce',
 'name']

In [84]:
kimkipoy._Student__campus = "경쟁사2"
kimkipoy.introduce()


안녕하세요, 저는 경쟁사2에 다녔던 29살 김기표 입니다.

In [ ]:


In [85]:
class Rectangle():
    def __init__(self, width, height):
        self.width = width
        self.height = height
        
    def area(self):
        return self.width * self.height
    
    def girth(self):
        return 2 * (self.width + self.height)
    
    def is_bigger(self, another):
        if self.area() - another.area() >= 0:
            print("내가 더 큼")
        else:
            print("내가 더 작음")

In [86]:
rec1 = Rectangle(10, 20)
rec2 = Rectangle(30, 10)

rec1.is_bigger(rec2)


내가 더 작음
  • Class ( Rectangle ) => 붕어빵틀, 이데아
    • 객체를 정의해 놓은 것
    • 객체를 생성하기 위해 사용
  • Object=객체 ( rec1, rec2 ) => 실제 있는 애, 붕어빵, ..
    • 실제로 존재하는 것. 사물 또는 개념

In [87]:
class Rectangle():
    
    def __init__(self, width, height):
        self.width = width
        self.height = height
        
    def area(self):
        return "면적은 {area} 입니다.".format(
            area=self.width * self.height
        ) 
    
    def girth(self):
        return "둘레는 {girth} 입니다".format(
            girth = self.width * 2 + self.height * 2,
        )
    
    def is_bigger(self, another):
        my_area = self.area()
        another_area = another.area()
        
        return my_area > another_area

In [88]:
my_rectangle = Rectangle(100, 200)
another_rect = Rectangle(10, 20)
my_rectangle.is_bigger(another_rect)


Out[88]:
True

In [89]:
class Person():
    
    def __init__(self, name, money):
        self.name = name
        self.money = money
        
    def send_money(self, to, amount):
        print("{to_name}한테 {amount}원 만큼 돈을 보냅니다.".format(
            to_name=to.name,
            amount=amount,
            ))
        self.money -= amount
        to.money += amount

In [90]:
person1 = Person("돈 빌려준 사람", 1000)
person2 = Person("돈 빌린 사람", 500)

In [91]:
person2.send_money(person1, 500)


돈 빌려준 사람한테 500원 만큼 돈을 보냅니다.

In [92]:
person1.money, person2.money


Out[92]:
(1500, 0)

In [93]:
class Student():
    
    def __init__(self, name, address):
        self.name = name
        self.address = address
        
    def introduce(self):
        print("저는 {address}에 살고 있는 {name}입니다.".format(
            address=self.address,
            name=self.name,
            ))

In [94]:
student = Student("김기표", "경기도 안양시")
student.introduce()


저는 경기도 안양시에 살고 있는 김기표입니다.

In [95]:
with open("../users.csv", "r") as f:   #users.csv라는 사용자 정보 있을 때
    student_list = [
        Student(
            line.split(",")[0],
            line.split(",")[1].replace("\n", "")
        )
        for line
        in f.readlines()
    ]
for student in student_list:
    student.introduce()


---------------------------------------------------------------------------
FileNotFoundError                         Traceback (most recent call last)
<ipython-input-95-b2d15266ce1b> in <module>()
----> 1 with open("../users.csv", "r") as f:   #users.csv라는 사용자 정보 있을 때
      2     student_list = [
      3         Student(
      4             line.split(",")[0],
      5             line.split(",")[1].replace("\n", "")

FileNotFoundError: [Errno 2] No such file or directory: '../users.csv'