'전체 글'에 해당되는 글 32건

 벌써 챕터9까지 왔다. 저번 장에서는 function을 배웠으니 이번 챕터는 function이 기능이라고 한다면 classes는 공장?같은 느낌으로 function들을 비슷한 녀석들은 묶어주고 조금 더 세분화하게 역할분담과 기능정리 등을 할 수 있다. 저번 챕터보다 내용이 더 어렵고 많기 때문에 집중해서 해보도록 하자~

 

  • Creating and using a Class

 먼저 클래스란 무엇일까?? 클래스는 어떠한 기능들의 집합체를 이야기한다. 그 안에 요소, 즉 instance가 들어가기도 하고 기능을 수행하는 function이 들어가기도 한다. 예를 들어서 대학교 클래스가 있다고 가정하자. 그러면 instance로 대학생, 교수님, 과목 등이 들어갈 수 있고 기능으로는 성적 계산 기능, 학교 등록 기능 등등이 들어갈 수 있다. 이처럼 기능과 비슷한 부류에 맞게 체계화시키는 것을 클래스화시킨다고 한다. 그러면 아래 예제를 살펴보고 클래스의 기본 구성에 대해서 알아보자.

 

class Dog:							# class 이름: 내용
    def __init__(self, name, age):				# __init__ : 초기 instance 초기화 함수
        self.name = name
        self.age = age

    def introduce(self):
        print("My dog's name is {0}".format(self.name))
        print("My dog is {0} years old".format(self.age))

    def sit(self):
        print("{0} is now sitting".format(self.name))

    def roll_over(self):
        print("{0} rolled over!!".format(self.name))

my_dog = Dog('Willie', 6)					# class Dog의 Object 선언
my_dog.introduce()						# Dog의 def 사용

결과
My dog's name is Willie
My dog is 6 years old

 

 위의 예제를 보면 알 수 있듯이 Class의 시작은 function과 비슷하다고 할 수 있다. 그리고 첫 def로 생소한 녀석이 나오는데 __init__()이라는 function이다. Class 안에서 나오는 모든 function을 method라고 하는데 지금부터는 method라고 부르도록 하겠다.
 파이썬의 특징 중 하나가 무엇인가?? 바로 많은 기능들이 포함되어 있다는 것이다!! 우리가 Class를 만들 때 내장된 method가 많이 존재한다.  그 중 하나가 __init()__ method이다. 이 method는 우리가 Class를 처음 만들 때 첫 실행되는 method이다. 쉽게 말하자면 초기화 method이다. 굳이 부르지 않아도 Class를 생성하자마자 실행되는 method이기 때문에 주로 초기 instance를 초기화하거나 꼭 먼저 실행되어야 하는 기능들이 들어간다.
 다음으로 알아야 되는 것이 method 생성과 사용 방법이다. method 생성은 위의 예제를 보면 알 수 있듯이 def 이름(self): 로 시작하며 주로 이름이 그 method의 기능을 의미하고 원하는 내용을 들여쓰기에 맞게 작성하면 된다. 여기서 매개변수에 'self'라는 낯선 단어가 보이는데 이 뜻은 자기 자신, 즉 Object 자신을 가지고 가는 이유이다. 이해가 되지 않는다면 아래의 그림을 보고 이해하도록 하자. 마지막으로 밖에서 호출할 때 사용하는 방법은 온점(.)을 사용하여 사용할 수 있다.

 

Class Object 선언 방법<참조 : https://wikidocs.net/28>


 그 다음은 Object 생성 방법이다. 위에 그림을 보면 알 수 있듯이 자신이 선언한 매개변수에 맞게 생성을 해야 한다. 보통은 위에서 배운 __init__ method에 맞게 선언해주면 맞다고 볼 수 있다. Class를 처음 접해서 조금 어려울 수도 있지만 천천히 하나씩 하다보면 익숙해지기 때문에 걱정하지 말고 진행해보자~

 

  • Inheritance

 Class의 기본적인 방법들을 배웠으니 그 다음은 Inheritance에 대해서 알아보자. 이 단어가 나도 처음에는 생소했는데 찾아보니 상속과 같은 의미인 것을 알았다. 상속???? 많이 들어본 단어이다. 자바에서도 들어봤던 단어인데 바로 Class와 Class를 이어주는 역할을 하는 것이다.
 예를 들어보면 앞서 대학교 Class 얘기를 하지 않았는가?? 하지만 대학교 Class를 만들었지만 그 안의 내용이 너무나도 많다. 학과도 수없이 많고 학생, 교수님들, 학생식당 등등... 그렇기 때문에 조금 더 분할해서 관리할 필요가 있는 것이다. 대학교를 제일 위의 상위 Class로 놔두고 아래로는 공과대학 Class, 생명대 Class 등등 가지치기처럼 뻗어나간다면 관리하는데 더 효율적이지 않겠는가??
 그렇기 때문에 그러한 관리를 효율적으로 하기 위해서는 Inheritance를 사용하여 부모와 자식 Class를 만들어주고 서로서로 이어가면서 필요한 기능은 서로 공유하고 개인적인 내용은 private도 지켜나가면서 만드는 것이다. 그러면 아래 예제를 살펴보고 사용법에 대해 알아보자.

 

class Car:
    def __init__(self, make, model, year):
        self.make = make
        self.model = model
        self.year = year
        self.odometer_reading = 0

    def get_descriptive_name(self):
        long_name = "{0} {1} {2}".format(self.year, self.make, self.model)
        return long_name.title()

class ElectricCar(Car):						# Class Car 상속
    def __init__(self, make, model, year):
        super().__init__(make, model, year)			# Car에서 __init__ 가져옴

my_tesla = ElectricCar('tesla', 'model s', 2019)
print(my_tesla.get_descriptive_name())

결과
2019 Tesla Model S

 

 위의 예제를 보면 Class ElectricCar에서 Class Car를 상속받았다. 괄호 안에 적는 것으로 상속이 되므로 사용하는 법은 간단한 편이다. 그리고 상속을 받은 EC(줄여서 씀)는 Car의 __init__ method 뿐만 아니라 다른 method들도 모두 사용할 수 있다는 것을 알 수 있다. 이처럼 상속을 하게 되면 method를 공유하기 때문에 더 효율적인 코딩이 가능하고 좀 더 간결하게 만들 수 있는 장점이 있다.

 

  • Overriding

 Overring이란 위의 예제처럼 상속을 받아서 method를 공유했다고 했을 때 Child class에서 똑같은 이름의 method를 생성하는 것을 의미한다. 그렇게 된다면 parents class의 method가 무시가 되고 Child class의 method만 실행되게 되는데 이러한 경우를 Overriding이라고 한다. 아래 예제를 살펴보고 정확한 의미과 상용법을 알아보자.

 

class stu:
    def __init__(self, *args):
        self.name = args[0]
        self.age = args[1]

    def print(self):
        print("Hello my name is {0}\n"
              "my age is {1}".format(self.name, self.age))

class ex_stu(stu):
    def __init__(self, *args):
        super().__init__(args[0], args[1])

    def print(self):
        # super().print()					: class stu의 print() method
        print("Nice to meet you")				# class ex_stu()의 print() method

student = ex_stu('Sara', 21)
student.print()							# class ex_stu()의 print() method 실행

결과
Nice to meet you

 

 결과를 보면 알 수 있듯이 child class의 method만 실행되고 parents class의 method는 실행되지 않았다. 만약 이름과 나이를 소개하고 인사를 하기 위해서는 super().print()의 주석을 해제하고 실행하게 되면 3줄 모두 출력된다.

 

  • Importing Classes

 다음으로는 지난 장에서 배웠던 import 이녀석에 대해서 사용하는 방법에 대해 알아보자. 우리가 이때까지는 .py 파일 하나에 모든 코드를 입력하고 실행했다. 하지만 나중에 코드가 길어지면 길어질수록 하나의 파일로 관리하기에는 너무 복잡하고 코드를 직관적으로 보는 게 힘들어진다.
 그렇기 때문에 각 기능을 가지고 있는 class마다 파일을 나누어서 관리하면 어떤 기능에 문제가 생기면 해당 파일만 검사하면 되기 때문에 훨씬 빠르고 효율적인 코드 관리가 가능해진다. 물론 내장함수나 기능들도 많이 있지만 우리가 직접 파일을 만들어서 import 할 수 있기 때문에 아래 예제를 살펴보고 사용법을 알아보자.

 

# car.py 파일

class Car:
    def __init__(self, *args):
        self.make = args[0]
        self.model = args[1]
        self.year = args[2]
        self.odometer_reading = 0

    def get_descriptive_name(self):
        long_name = "{0} {1} {2}".format(self.year, self.make, self.model)
        print(long_name.title())

    def read_odometer(self):
        print("This car has {0} miles on it.".format(self.odometer_reading))
# my_car.py 파일

from car import Car			# car.py의 class Car 포함

my_new_car = Car('audi', 'a4', 2019)
my_new_car.get_descriptive_name()

my_new_car.odometer_reading = 23
my_new_car.read_odometer()

결과
2019 Audi A4
This car has 23 miles on it.

 

 위의 파일이 class Car만 포함함 파일이고 아래 파일은 class Car를 포함시켜 실행한 파일이다. 해당 기능처럼 파일 전체 중의 특정 class만 가져올 수 있게 작성되었다. 그 외에도 여러 기능들을 앞서 배웠기 때문에 어렵지 않게 파일들을 분할하고 포함시킬 수 있을 것이다. 다른 기능들에 대한 예제들도 많이 있지만 지난 장에서 배우고 설명했기 때문에 더 다루지는 않겠다.

 계속 글을 읽다 보면 내장형 함수인 random에 대해서 짧게 나오기 때문에 한 번 읽어보고 넘어가보면 좋을 것 같다.(매우 재밌는 Library이다.^^)

 마지막으로 클래스를 어떻게 하면 더 자신의 것으로 만드는지에 대한 팁이 나오는데 docstring을 작성해야 한다는 것에 대해서는 찬성한다. 왜냐하면 우리의 기억력의 문제도 있지만 상대방이 코드를 보았을 때 그 class나 method가 어떤 기능을 하는지 한 눈에 알아보기란 매우 힘든 일이다. 그렇기 때문에 각각의 기능들을 간단히 서술하고 정리해 놓으면 매우 가독성이 뛰어난 코드가 될 수 있다. 자!! 다음 장은 배우는 것의 마지막 장인 File에 관련된 내용이 나온다. 마지막을 기대하고 이번 장은 마치도록 하겠다.

'Python > No Starch Press_Python' 카테고리의 다른 글

Chapter10. Files and Exceptions  (0) 2020.05.20
Chapter8-2. Function++  (0) 2020.05.13
Chapter8. Functions  (0) 2020.04.28
Chapter7. USER INPUT AND WHILE LOOPS  (0) 2020.04.20
Chapter6. DICTIONARIES  (0) 2020.04.17
블로그 이미지

Mr.HB

프로그래밍 이야기

,

 오늘은 챕터8 Functions에 대해서 배워보자. 우리는 이때까지 어떤 기능이 있으면 따로따로 구현을 하거나 파이썬에 내장된 Functions을 가지고 프로그램을 만들었다. 하지만 이번 장부터는 우리에게 필요한 기능을 가진 function을 생성함으로써 더욱 더 견고하고 좋은 코드를 짤 수 있게 된다. 그러면 본격적으로 function에 대해 알아보도록 하자.

 

  • Defining a Function

 function이란 무엇일까?? function은 어떠한 특수한 기능을 가진 블록을 말하는데 예를 들어서 두 변수의 합을 구하고 싶다고 하자. 그러려면 a+b = c 이런 식의 코드가 필요할 것이다. 이것을 미리 function으로 구현해서 여러 번 쓸 수도 있고 function의 명칭을 plus()로 만들어서 어떤 기능을 사용하는지 눈에 쉽게 알 수도 있으며 해당 부분에서 error가 나면 해당되는 function만 수정하면 되기 때문에 유지보수도 용이하다.

 이처럼 function을 사용하게 되면 내 코드가 조금 더 발전할 수 있고 가독성, 편의성, 유지 보수 등등 여러한 곳에서 이점이 생긴다. 자! 그러면 아래의 간단한 예제 코드를 살펴보고 function의 사용법을 알아보자.

 

def greet_user():		# 함수 정의 -> def 이름():
    print("Hello!")		# 함수 내용
    
greet_user()			# 함수 호출

결과
Hello!

 

 function의 시작은 def로 시작한다. keyword def는 파이썬에서 function을 정의한다는 의미로 시작되고 그 뒤에는 function의 이름, 매개변수(), 따음표(:)로 첫 줄이 마무리된다. 다른 if(), for() 등의 함수들과 마찬가지로 내용은 들여쓰기로 지정되있으며 내용으로는 자신이 원하는 기능을 추가하면 된다. function을 호출하는 방법은 해당 function의 이름을 호출하고 지정한 매개변수에 맞게 variable 혹은 value를 대입하여 호출해야 한다. 

 위의 예제는 몇 번을 실행하든 항상 같은 결과가 나올 것이다. 아래 예제를 실행해보고 실행할 때마다 들어가는 값에 따라 변하는 function의 사용법을 알아보자.

 

def greet_user(name):
    print("Hello! {0}".format(name))

greet_user('Jain')

결과
Hello! Jain

 

  • Passing Argument

 다음은 본격적으로 여러 개의 매개 변수를 활용하여 사용하는 function들에 대해서 알아보도록 하자. 매개 변수는 없을수도 있고 한개 혹은 한개 이상을 가질 수 있다. type에 따라서 여러 가지 유형으로 바뀔 수도 있으며 무궁무진한 활용 또한 가능하다. 아래 예제를 살펴보고 매개 변수를 활용한 function의 사용법에 대해 알아보자.

 

def describe_pet(animal_type, pet_name):			# 매개 변수를 2개 가지는 function
    print("I have a {0}\n"
          "My {0}'s name is {1}".format(animal_type, pet_name))
describe_pet('hamster', 'harry')				# 함수 호출(매개 변수 2개)

결과
I have a hamster
My hamster's name is harry

 

  • Keyword Agument

  하지만 여러 개의 매개 변수를 사용하다가 보면 순서가 뒤바뀌는 일들이 존재할 수 있다. 그러한 일들을 방지하기 위해 파이썬에서는 keyword argument가 존재한다. 순서에 상관없이 keyword에 맞게 value가 대입되는 것이다. 아래 예제를 살펴보고 keyword argument를 사용하는 function에 대해서 알아보자.

 

def describe_pet(animal_type, pet_name):
    print("I have a {0}\n"
          "My {0}'s name is {1}".format(animal_type, pet_name))
describe_pet(animal_type='hamster', pet_name='harry')		# 각 keyword에 맞게 value 대입

결과
I have a hamster
My hamster's name is harry

 

  • Default Values

 다음으로는 우리가 argument에 value 혹은 variable을 지정해야 function을 호출할 수 있다고 했지만 argument에 default value를 설정하면 굳이 지정하지 않아도 function을 호출하여 사용할 수 있다. 한마디로 value를 대입하지 않아도 default value를 대입하여 function을 사용한다는 것이다. 아래 예제를 살펴보고 default value를 사용하는 function에 대해서 사용법을 알아보자.
(주의사항 : default value는 두 개 중 한 개만 지정해도 되지만 지정한다면 항상 지정된 agument는 지정되지 않는 agument보다 뒤에 위치하여야 한다. / 그렇지 않으면 error)

 

def describe_pet(pet_name, animal_type='dog'):		# animal_type의 default value : 'dog'
    print("I have a {0}\n"
          "My {0}'s name is {1}".format(animal_type, pet_name))
describe_pet(pet_name='harry')

결과
I have a dog
My dog's name is harry

 

  • Return Values 

 앞서 agument에 관한 여러 가지 경우에 대해 알아봤으니 인제 우리가 알고 있는 return value에 대해 알아보자. 흔히 알고 있는 return에는 여러 가지 의미가 있지만 여기서는 function에서 어떤 기능을 수행하고 그에 맞게 value를 반환하는 기능의 return을 배워볼 것이다.
 우리가 function을 어떠한 기능을 수행하기 위해서 사용하기 때문에 기능을 수행하고 나서 그 value는 function 안에서만 지속되기 때문에 밖으로 꺼내올 방법이 필요하다. 그 때 필요한 기능이 return이다. return을 통해 기능을 수행하고 해결된 value를 밖의 variable에게 전달하여 function의 기능을 더욱 극대화시키는 것이다. 아래 예제를 살펴보고 return value를 사용하는 function의 사용법에 대해 알아보자.

 

def get_formatted_name(first_name, last_name):
    full_name = '{0} {1}'.format(first_name, last_name)
    return full_name.title()				# return value : full_name 값 반환
musician = get_formatted_name('jimi', 'hendrix')
print(musician)

결과
Jimi Hendrix

 

  • Using a Function with a while Loop

 그 다음은 우리가 앞서 배웠던 while문과 function을 조합한 코드를 알아보자. while문은 반복적인 기능을 수행할 때 사용할 수 있기 때문에 기능을 구현해 놓은 function과 함께 쓰면 꽤 좋은 코드가 완성된다. 사용 방법은 우리가 예상하는 것과 크게 다르지 않기 때문에 금방 익힐 수 있을 것이다. 아래 예제를 살펴보고 while문과 function을 같이 쓰는 방법에 대해 알아보자.

 

def formatted_name(first_name, last_name):		# 이름 합치기 함수 정의
    full_name = "{0} {1}".format(first_name, last_name)
    return full_name

while True:						# 무한 루프
    print("Please tell me your name"
          "\nex) Pack jisun\n")
    f_name, l_name = input("Your full name : ").split()
    full_name = formatted_name(f_name, l_name)
    print("Hello, {0}!!!".format(full_name))
    ch = input("\nGO and STOP?(Enter is stop) ")	# 아무거나 입력은 계속, 엔터는 종료
    if ch:						# ch == True
        print("---------------------------")
    else:						# ch == False
        break
        
결과
Please tell me your name
ex) Pack jisun

Your full name : edfs dfsdf
Hello, edfs dfsdf!!!

GO and STOP?(Enter is stop) ef
---------------------------
Please tell me your name
ex) Pack jisun

Your full name : df sfesf
Hello, df sfesf!!!

GO and STOP?(Enter is stop) 				# 엔터 입력하여 종료

 

  • Passing a List

 그 다음으로 list와 function을 같이 쓰는 경우에 대해 알아보자. 앞에서는 multiple agument를 사용할 때 여러 공간을 할당해서 받았지만 그것마저도 한 개로 정의하여 list로 받으면 더 많은 values를 한 번에 받을 수 있지 않겠는가?? 이처럼 agument를 list type으로 대입하여 여러 values를 한번에 받을 수 있다. 아래 예제를 살펴보고 그 방법에 대해 알아보자.

 

def greet_users(names):
    for name in names:				# for문을 통한 list 출력
        msg = "Hello, {0}".format(name.title())
        print(msg)
usernames = ['hannah', 'ty', 'margot']		# list type : usernames 생성
greet_users(usernames)				# list type 대입

결과
Hello, Hannah
Hello, Ty
Hello, Margot

 

 책에서는 원본 list를 수정하지 않고 싶은 방법에 대해서도 나오는데 우리가 앞서 배웠던 slicing을 사용하면 원본 list는 수정하지 않으면서 원본 list를 복사하여 사용할 수 있는 방법이 있다. 잠깐 slicing을 복습하자면 list에서 사용하는 방법으로 자신이 원하는 부분을 잘라 복사해서 사용하는 방법이었다. 그러면 전체 복사를 어떻게 하는가??(모르겠다면 돌아가서 찾아보고 오자!!) 바로 list[ : ] 이렇게 표현하면 전체 범위가 지정되므로 원본 list를 그대로 복사할 수 있다. 이 방법도 있으니 한 번 기억하고 넘어가기로 하자.

 

  • Passing an Arbitraty Number of Arguments

그 다음으로는 Argumets 개수가 정해지지 않는 경우에 대해서 알아보자. 앞서 배웠던 경우에는 한 개인 경우, 한 개 이상인 경우, list type(다른 type도 가능)인 경우에 대해 공부했다. 하지만 경우에 따라서 1개 혹은 1개 이상으로 그때그때마다 다르면 어떻게 할까?? 그 문제에 대해서 이번 장에서 배울 수 있다.
 바로 argument 앞에 *을 붙여 사용하는 방법이다. 이렇게 되면 values 개수가 변해도 변한만큼 argument로 사용할 수 있으며 type은 tuple type으로 들어가기 때문에 수정이 불가능하다는 단점도 있다. 아래 예제를 살펴보고 개수가 변하는 argument 경우에 대한 사용법을 알아보자.

 

def make_pizza(*toppings):
    print(toppings)
make_pizza('pepperoni')
make_pizza('mushrooms', 'green peppers', 'extra cheese')

결과
('pepperoni',)					# tuple type인 소괄호가 보임
('mushrooms', 'green peppers', 'extra cheese')

 

str, int, tuple, list type들을 알아봤는데 아직 배우지 않은 type이 있다. 무엇일까?? 바로 dic type 쓰는 법을 아직 배우지 않았다. 그래서~ 여러 type을 같이 쓰는 법과 dic type을 argument로 가지는 방법에 대해 설명하고자 한다. dic type은 vaule가 한 개가 아닌 한 쌍을 가지는 type으로 key:value 이렇게 사용하는 type이다. 그렇기 때문에 우리가 이때까지 쓰던 형태로 쓰지 않고 dic type argument는 **을 붙여서 사용한다. 그러면 아래 예제를 살펴보고 여러 type, dic type을 argument로 쓰는 방법에 대해 알아보자.

 

def build_profile(first, last, **user_info):				# dic type : **user_info
"""항상 dic type(**) or 개수가 다른 type(*)은 항상 맨 뒤에 써야 한다"""
    user_info['first_name'] = first
    user_info['last_name'] = last
    return user_info
user_profile = build_profile('albert', 'einstein',
                             location='princeton',
                             field='physics')
print(user_profile)

결과
{'location': 'princeton', 'field': 'physics', 'first_name': 'albert', 'last_name': 'einstein'}

 

  • Storing Your Function in Modules

  다음은 Modules를 만드는 방법에 대해서 알아보자. Module이란 각종 변수, 함수, 클래스를 담고 있는 .py 파일이다. 주로 특정 기능을 담고 있으며 우리가 input(), print() 등을 사용할 수 있는 이유도 파이썬에서 기본적으로 제공하고 있는 라이브러리에 입력 함수 모듈, 출력 함수 모듈 등이 포함되어 있기 때문이다. 여기서 용어에 대해서 한 번 정리하고 다시 설명하겠다.

  • 모듈(Modules) : 특정 기능을 .py 단위로 작성한 것

  • 패키지(Package) : 특정 기능을 가진 여러 모듈을 하나도 묶은 것

  • 라이브러리(Library) : 파이썬에서 기본적으로 설치된 모듈, 패키지, 내장 함수들을 묶은 것

 솔직히 우리가 모듈이나 패키지를 만들기에는 아직 공부하 많이 부족하다. 그리고 파이썬에는 생각보다(우리가 생각한 것 보다 훨씬 많이.....) 많은 모듈과 패키지들을 존재하기 때문에 그 중에서 우리가 필요한 것을 찾아쓰는 것이 더 효율적이라고 생각한다.
 하지만 그렇기 위해서도 간단하게 모듈과 패키지를 사용하는 방법에 대해서는 알아야 찾아서 쓸 수 있기 때문에 여기서는 모듈을 사용하는 방법에 대해서 알아보자. 아래 예제를 살펴보고 모듈을 포함하고 변수나 함수를 사용하는 방법에 대해 알아보자.(책과 다르게 math 모듈을 사용했다.)

 

import math				# module : math 포함
print(math.pi)				# math 모듈의 pi 변수 사용
print(math.factorial(5))		# math 모듈의 factorial 함수 사용

결과
3.141592653589793
120

 

 사용법은 간단하다. | import 모듈이름 | 과 같은 형식으로 포함시키고 | 모듈이름.변수?함수? | 과 같은 형식으로 포함된 기능들을 사용할 수 있다. 모듈이름은 재정의해서 사용할 수 있으며 모듈 전체 혹은 모듈의 일부 변수나 함수만 가져와서 사용하는 것도 가능하다. 아래 예제를 살펴보고 다른 사용법에 대해서도 알아보자.

 

import math as m		# math module을 m으로 재정의
print(m.pi)
print(m.factorial(5))

결과
3.141592653589793
120

from math import factorial as f	# math module에서 factorial function만 가저와서 f로 재정의
print(f(5))

결과
120

 

 이번 장은 꽤 많은 내용들을 배우게 되었다. 그만큼 function이 코딩에서는 빼먹을 수 없는 중요한 내용이며 꼭 사용법을 기억해둬야 한다는 것이다. 다만 모든 내용을 숙지하되 다 알고 있을 필요는 없고(전부 기억도 나지 않는다...) 챕터 마지막에 있는 Styling Function처럼 자신이 쓰기 편하고 괜찮다 싶은 스타일의 function을 완성하면 되기 때문에 크게 걱정할 필요는 없다. 사람마다 코딩하는 스타일이 모두 다르기 때문에 자신에게 맞는 코딩을 찾는 것이 첫번째이다.

 다음 장에서는 코딩의 꽃이라고 할 수 있는 Class에 대해서 공부한다. Class까지 배운다면 코딩을 하는 사람으로써 쫌 배운 사람이고 있어 보이는 코딩을 할 수 있게 된다. 그러면 다음 장에서 봐요~

'Python > No Starch Press_Python' 카테고리의 다른 글

Chapter8-2. Function++  (0) 2020.05.13
Chapter9. Classes  (0) 2020.05.08
Chapter7. USER INPUT AND WHILE LOOPS  (0) 2020.04.20
Chapter6. DICTIONARIES  (0) 2020.04.17
Chapter5. IF STATEMENTS  (0) 2020.04.10
블로그 이미지

Mr.HB

프로그래밍 이야기

,

 벌써 챕터 7까지 왔다. 절반 이상은 왔다는 소리다. 조금 더 힘내서 파이팅 해보자~ㅎㅎ

 이번 장에서는 입력 함수와 또 다른 loop문인 while에 대해서 공부해보자. 우리가 지금까지 출력 함수인 print()를 자주 써왔다. 우리는 지금까지 출력 값으로 variable 또는 지정된 값만 넣어서 사용했다. 그러면 그때그때 값이 다르게 출력하고 싶으면 어떻게 해야 하는가? 바로 입력 함수인 input()을 사용하면 원하는 값을 출력할 수 있다. variable도 초기값을 설정해서 사용하는 것이 아니라 직접 입력해서 원하는 값을 넣어 사용할 수 있는 것이다. 

 

  • How the input() Function Works

 그러면 지금부터 어떻게 input()을 사용하는지 천천히 알아보자. 흔히 우리가 알고 있는 입력 함수는 프로그램을 실행하면 콘솔 창에 값을 입력하고 엔터키를 누르면 입력되는 방식이었다. 그렇다면 파이썬은??? 크게 다르지 않다. 우리가 알고 있는 방식으로 하면 충분히 값을 입력할 수 있을 것이다. 아래 예제를 살펴보고 사용법을 알아보자.

 

message = input("Tell me something, and I will repeat it back to you : ")
print(message)

결과
Tell me something, and I will repeat it back to you : hi		# 입력값 : hi
hi

 

 예제를 살펴보면 input() 안에 설명글을 적을 수 있는 걸 알 수 있다. 저 글은 실제로 입력되는 값은 아니며 어떤 입력값을 입력해야 하는지 도와주는 글로 쓸 수 있다.

 다음으로 알아야 할 내용은 우리가 입력하는 모든 값은 string type으로 저장된다는 것이다. 이 말이 무슨 말이냐면.... 우리가 입력값으로 20을 입력한다고 해도 숫자 20이 아니라 문자열 '20'으로 입력된다는 것이다. 그렇기 때문에 우리가 다른 type을 입력값으로 지정하기 위해서는 아래 예제와 같이 사용해야 한다. 아래 예제를 살펴보고 다른 type으로 입력값을 넣는 방법에 대해 알아보자.

 

age = int(input("How old are you?"))	# int(a) : a type을 int type으로 변환
print(type(age))			# age type 확인
print(age)

결과
How old are you? 23			# 입력값 : 23
<class 'int'>
23

 

 책에서는 값을 입력 후 int()로 변환하여 다시 대입하고 있지만 이렇게 한번에 처리하는 것도 가능하기 때문에 과정을 생략해봤다. int()외에도 float(), list() 등등으로 변환할 수 있기 때문에 경우에 맞게 사용하면 type 지정을 더 쉽게 할 수 있다.

 다음으로는 modulo poerator에 대해서 나오는데 일반적으로 알고 있는 연산자와 지금 나온 연산자 등 밑에 표로 정리했으니 파이썬에서 자주 쓰는 연산자에 대해서 정리해보고 넘어가자.(이외에도 많이 있지만 그것은 구글링!!!!!^^)

 

연산자 의미 example
+ 더하기 2 + 1 = 3
- 빼기 2 - 1 = 1
* 곱하기 2 * 1 = 2
/ 나누기 2 / 1 = 2
** 제곱 2 ** 3 = 8
// 3 // 3 = 1
% 나머지 3 % 2 = 1

 

  • Introducing while Loops

 다음으로 loop문인 while()에 대해 배워보자. 앞서 배웠던 for()문의 형태와는 조금 다른 형태를 가지고 있다. 더 간단한 형태를 띄고 있는데 while()문은 조건문만 적으면 완성되기 때문에 for()문처럼 초기값, 초기값에 쓰이는 값, 조건문 이렇게 많이 필요한 것이 아니라 조건문 하나만 쓰면 되기 때문에 사용법은 더 간단하다. 그렇기 때문에 조건문에서 쓰이는 variable이나 무한 loop가 되지 않게 설정하는 조건 등은 다른 곳에서 미리 설정을 해줘야 한다는 점도 있다. 먼저 아래 예제를 살펴보고 while()문의 사용법을 알아보도록 하자.

 

current_number = 1			# 초기값 설정
while current_number <= 5:		# 조건문 설정
    print(current_number)		# 내용
    current_number += 1			# 무한 loop에 걸리지 않는 조건 설정
    	
결과
1
2
3
4
5

 

 예제를 살펴보니 형태는 더 간단하지 않은가? 대신 신경써야 할 조건들이 존재할 뿐이다. 주의만 한다면 잘 이용할 수 있을 것 같다. 위의 예제 외에도 책에서 다른 종료 방법에 대한 예제가 몇 개 추가되어 있으니 실행해보고 자신이 원하는 스타일로 만들어보도록 하자.

 다음으로 여기서 새로 나온 키워드 두 개가 있는데 break와 continue이다. 이 두 키워드를 알아보도록 하자.

 

  • break

 break는 말 그대로 멈춘다는 의미이다. 우리가 loop문을 쓸 때 가장 주의해야 하는 점이 무엇인가? 바로 무한 loop가 걸리지 않게 조건을 만들어 줘야 되는 것이다. 그 때 자주 사용하는 것이 break이다. break는 특정 loop문을 강제로 멈추는 기능을 하고 있으며 특정 조건 만족 시 break문이 실행되게 한다면 깔끔하게 loop문을 종료시킬 수 있는 것이다. 아래 예제를 살펴보고 break문의 사용법에 대해 알아보자.

 

prompt = "\nPlease enter the name of a city you have visited:"
prompt += "\n(Enter 'quit' when you are finished.) "
while True:							# 무한 루프
    city = input(prompt)
    if city == 'quit':						# 무한 루프 종료 조건
        break							# 무한 루프 종료
    else:
        print(f"I'd love to go to {city.title()}!")


결과
Please enter the name of a city you have visited:
(Enter 'quit' when you are finished.) efjkld
I'd love to go to Efjkld!

Please enter the name of a city you have visited:
(Enter 'quit' when you are finished.) ejfaie
I'd love to go to Ejfaie!

Please enter the name of a city you have visited:
(Enter 'quit' when you are finished.) quit			# 종료

 

  • continue

 continue는 우리가 영화나 드라마에서 많이 본 단어인데 to be continue..... 이런 식으로 항상 마무리될 때 나오는 멘트였다. 이와 같이 기능을 유추해보면 무난히 진행하는 기능을 가지고 있을 것 같지만 그게 맞다...ㅎㅎ 조건문을 설정은 했지만 별다른 실행할 내용이 없을 때 넘어가게 해주는 녀석이 바로 continue이다. break와는 정반대의 기능을 가지고 있으며 아래 예제를 살펴보고 어떻게 사용하는지 알아보자.

 

current_number = 1
while current_number < 10:
    current_number += 1
    if current_number % 2 == 0:		# 짝수 조건
        continue			# 현재 진행되고 있는 while문 생략(간단 종료?)
    print(current_number)

결과
3
5
7
9

 

 위의 예제는 설명을 하면 위의 while문 조건을 살펴보면 current_number가 1~9까지 총 9번 실행된다. 그 중에서 %2의 조건이 있으므로 짝수인 2, 4, 6, 8에서는 continue가 실행되므로 print가 실행되지 않고 그때의 loop문은 간단 종료가 되는 것이다. 어떻게 보면 break와 햇갈릴 수도 있는데 한 줄로 정리하면 이렇게 된다.

  • break : loop문 전체 종료(뒤에 몇 번이 남았건 종료)
  • continue : loop문 현재 실행되고 있는 구간만 종료(생략 기능)

 

  • Using a while Loop with Lists and Dictionaries

 마지막으로 while()문과 list, dic type을 사용하는 방법에 대해 알아보자. 예제가 1~2개 나와있기에 실행은 해보았지만 역시 list는 for문으로 쓰는 것이 더 편한 것 같다는 생각이 든다. while문은 포괄적인 형태(전체를 감싼다는 느낌?)로 쓰는 것이 좋고 for문은 list나 조그마한 기능들을 만드는 데 적절하다고 생각한다. list 예제는 각자 실행해보고 모르는 점이 있으면 질문해주길 바란다. dic type 예제는 아래 예제를 실행해보고 사용법에 대해 알아보자.

 

responses = {}
polling_active = True
while polling_active:									# 무한 루프
    name, response = input("Please your name and favorite mountain : ").split()		# 두 변수에 값 저장
    responses[name] = response
    repeat = input("Would you like to let another person respond? (yes/ no) ")
    if repeat == 'no':									# 종료 조건
        polling_active = False								# 무한 루프 종료
print("\n--- Poll Results ---")
for name, response in responses.items():						# 전체 요소 출력
    print(f"{name} would like to climb {response}.")

결과
Please your name and favorite mountain : sara backdusan			# 입력 : sara, backdusan
Would you like to let another person respond? (yes/ no) yes		# 진행
Please your name and favorite mountain : dangon dokdo			# 입력 : dangon, dokdo
Would you like to let another person respond? (yes/ no) no		# 종료

--- Poll Results ---
sara would like to climb backdusan.
dangon would like to climb dokdo.

 

 위의 예제에서 입력 함수에서 .split() method를 사용하였는데 이 method는 두 개 이상의 변수에 입력값을 대입하고 싶을 때 사용하는 method이다. defalt값으로는 ' '(공백)으로 값을 나누며 split(','), spilt(':') 등등 괄호 안의 값에 따라 값을 나누는 기준이 달라진다.

 

 이번 장은 입력 함수와 또 다른 loop문인 while문에 대해서 알아봤다. 인제 파이썬에서 기본적으로 아는 조건, 반목, 입력, 출력, 여러 type 등은 학습이 완료된 것 같다. 책도 그렇게 느꼈는지 우리가 지금까지 배운 것을 바탕으로 function, 즉 함수를 만드는 장이 나온다. 이때까지 배운 것을 바탕으로 만들면 간단하기 때문에 당황하지 말고 천천히 공부해보도록 하자.(역시나 모르면 구글링!!!!^^)

'Python > No Starch Press_Python' 카테고리의 다른 글

Chapter9. Classes  (0) 2020.05.08
Chapter8. Functions  (0) 2020.04.28
Chapter6. DICTIONARIES  (0) 2020.04.17
Chapter5. IF STATEMENTS  (0) 2020.04.10
chapter4. working with lists  (0) 2020.04.10
블로그 이미지

Mr.HB

프로그래밍 이야기

,