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

 오늘은 Chapter10에 대해서 공부해보도록 하자~ Title에서 알 수 있듯이 Files와 Exceptions에 대해서 나오는 모양이다. Files는 자주 쓰이지는 않지만 알아두면 좋은 내용이고 Exceptions은 나중에 코드를 작성할 때 꼭 있어야 하는 기능이기 때문에 주의깊게 보고 넘어가도록 하자. 그러면 먼저 Files에 대해서 알아보자.

 

  • Reading from a File

 우리는 지금까지 파이썬 파일(.py)에 대해서만 다루고 있었다. 하지만 이번 챕터에서는 파이썬 파일뿐만 아니라 다른 파일을 참조하여 data를 읽고 쓰는 법에 대해서 배울 것이다. 가장 간단한 예제로 메모장(.txt) 파일을 읽고 쓰는 법에 대해서 알아보자.
 일반적으로 메모장은 간단한 필기나 내용을 적기 위해 사용해왔다. 그러면 이러한 메모장 파일에서 data를 가져오는 방법에 대해서 아래 예제를 살펴보고 알아보자.

 

pi_digits.txt

3.1415926535
  8979323846
  2643383279
with open('pi_digits.txt') as file_object:      # pi_digits.txt 파일 open
    contents = file_object.read()               # open한 파일을 contents에 읽기
print(contents)

결과
3.1415926535
  8979323846
  2643383279

 

 결과와 같이 pi_digits.txt의 data가 출력되는 것을 볼 수 있다. debug를 해서 살펴보면 개행(Enter)에 대해서는 문자 중간중간에 '\n'으로 삽입이 되어있는 한 줄 짜리 긴~ string type으로 되어있다. 열고자 하는 파일에 대해서는 파이썬 파일이 존재하는 곳에 같이 있어야 하며 그 경로가 다른 경우에는 따로 열고자 하는 파일의 경로를 지정하고 열어야 한다.(그렇지 않으면 FileNotFoundError!!)


 * 경로 사이에는 슬래시(/)를 써야하지만 역슬래시(\)를 써도 상관없다. 하지만 역슬래쉬(\) 같은 경우에는 escape로 사용되는 경우도 있기 때문에 두 번(\\) 사용하는 것이 올바르다.

 다음으로는 파일을 읽는 방법에 대하여 관련된 method들을 배워보도록 하자. 가장 자주 쓰이는 method는 총 2가지가 있다. strip(), replace() 2개가 있으며 이보다 더 많은 method들이 있지만 그에 관해서는 구글링을 해보도록 하자!!^^

  • strip()

 strip() method는 기본적으로 공백(' ')이나 개행('\n')을 없애주는 기능을 가지고 있다. 우리가 어떤 파일에서 여러 줄의 data를 가져올 때 문제점이 개행이 추가되어 있는 경우가 있다. 이때에는 print() 함수 자체에도 개행이 들어가 있기 때문에 2번씩 띄어지는 경우가 발생한다. 그렇기 때문에 다른 파일에서 가져온 data의 개행은 지워주는 게 편할 때가 많다. 아래 예제를 살펴보고 strip()의 사용법에 대해 알아보자.

 

qqq3.123213qqq						# pi_digits.txt

with open('file\\pi_digits.txt') as file_object:  	# pi_digits.txt 파일 open
    for line in file_object:
        print(line.strip('q'))				# strip('x') : 처음과 끝에서 x 삭제
        print(line.lstrip('q'))				# 왼쪽(처음)만 삭제
        print(line.rstrip('q'))				# 오른쪽(끝)만 삭제

결과
3.123213
3.123213qqq
qqq3.123213

 

  • replace()

 replace() method는 앞서 배웠던 strip()의 단점을 극복한 method이다. strip()은 처음과 끝의 지정된 문자만 지우고 중간에 들어가 있는 특정 문자는 지울 수 없다. 하지만 replace()는 특정 문자를 전부 찾아서 수정하는 기능을 가지고 있다. 중첩해서 사용할 수도 있으며 순서에 맞게 실행된다. 아래 예제를 살펴보고 replace()의 사용법에 대해 알아보자.

 

qqq3.123213qqq							# pi_digits.txt

with open('file\\pi_digits.txt') as file_object:     		# pi_digits.txt 파일 open
    for line in file_object:
        print(line.replace('q', '0').replace('0', '1'))		# replace('x', 'a') : x를 a로 치환
        print(line.replace('0', '1').replace('q', '0'))		# 앞의 replace()부터 실행

결과
1113.123213111
0003.123213000

 

  • Writing to a File

 앞서 파일을 읽는 방법에 대해서 알아봤으니 다음은 쓰는 방법에 대해 알아보자. 방밥은 매우 비슷하기 때문에 크게 어려운 점은 없다. 아래 예제를 살펴보고 파일에 data를 쓰거나 만드는 방법에 대해서 알아보자.

 

filename = 'programming.txt'			# 파일 이름 지정
with open(filename, 'w') as file_object:	# 파일 오픈
    file_object.write("I love programming.")	# 파일 data 저장

결과
programming.txt 파일 생성(이미 존재 시 내용 변경)
I love programming.

 

 읽는 방식과 동일하나 파일을 오픈할 때 'r'이 아닌 'w'로 설정해줘야 한다는 것이 다른 점이다. 위에서는 생략됬으나 기본값이 'r'이기 때문에 생략한 것이다. 형식을 'w'로 하는 경우에는 파일의 내용을 추가하는 것이 아니라 수정하는 것이기 때문에 이미 입력된 data가 날아갈 수 있는 위험도 있다. 그렇기 때문에 이미 만들어진 파일에 data를 추가하려면 형식을 'w'가 아닌 'a'로 지정해야 한다. 아래 예제를 살펴보고 파일에 내용을 추가하는 방법에 대해 알아보자.

 

filename = 'programming.txt'
with open(filename, 'a') as file_object:			# 'a' : 파일 내용 추가
    file_object.write("I love creating new games \n")		# '\n'을 직접 추가해줘야 한다

결과
"""programming.txt"""

I love programming.
I loveI love creating new games 

 

  • Exceptions

 Exceptions은 흔히 예외 처리라고 하며 우리가 지금까지 코딩하면서 혹은 앞으로도 코딩하면서 수많은 Error들에 대해서 보게 될 것이다. 하지만 그러한 error가 발생할 때마다 프로그램이 멈추고 다운된다면 얼마나 스트레스를 받겠는가...그리고 특정 error에 대해서는 왜 발생한지도 모른 채 찾아봐야 되는 수고스러움도 발생할 것이다.
 이러한 상황을 해결하기 위한 것이 Exceptions이다. 자신이 작성한 코드에서 어떤 부분을 잘못 입력하면 어떠한 error가 뜨는지 알고 그 error를 대처하기 위한 문장이나 처리를 미리 해놓는 것이다. 그렇게 되면 다른 사람이 봐도 왜 발생하고 어떻게 해결해야 하는지 찾기 쉽고 해결하기 쉬울 것이다.
 * 항상 설명하지만 코드는 지금은 혼자서 작성하지만 나중에는 여러 명이서 같이 하는 프로젝트 형식을 많이 가지게 된다. 그렇기 때문에 나만 보기 편한 게 아니라 상대방도 보기 쉬운 가독성이 좋아야 한다.

 그러면 아래 예제를 살펴보고 exception을 사용하는 방법에 대해 알아보자.

 

try:
    print(5/0)				# ZeroDivisionError 에러 발생
except ZeroDivisionError as e:		# 해당 에러 종류에 대한 처리 / e : 에러 내용
    print('"{0}"라는 에러 발생! \n'	# 에러 없이 해당 구간 실행
          '0 쓰지 마세요'.format(e))
          
결과
"division by zero"라는 에러 발생! 
0 쓰지 마세요

 

 자! 출력 결과를 살펴보자. 원래는 코드가 멈추고 에러가 떠야 정상이지만 미리 에러에 대한 대처를 했기 때문에 어떤 에러인지 더 알기 쉽고 해결할 수 있게 된다. try: except: 형식을 가지고 있고 굳이 에러명을 적지 않아도 에러가 발생하게 되면 except문으로 넘어가게 된다. 다음엔 조금 더 발전되서 에러가 발생하지 않았을 때나 무조건 실행하는 else: 와 finally: 에 대해서 아래 예제 코드를 살펴보고 알아보자.

 

try:
    실행할 코드
except:
    예외가 발생했을 때 처리하는 코드
else:
    예외가 발생하지 않았을 때 실행할 코드
finally:
    예외 발생 여부와 상관없이 항상 실행할 코드
--------------------------------------------------------------------------
try:
    x = int(input('나눌 숫자를 입력하세요: '))
    y = 10 / x
except ZeroDivisionError:    # 숫자를 0으로 나눠서 에러가 발생했을 때 실행됨
    print('숫자를 0으로 나눌 수 없습니다.')
else:                        # try의 코드에서 예외가 발생하지 않았을 때 실행됨
    print(y)
finally:                     # 예외 발생 여부와 상관없이 항상 실행됨
    print('코드 실행이 끝났습니다.')
    
결과
나눌 숫자를 입력하세요: 2
5.0
코드 실행이 끝났습니다.

 

 각각의 발생 상황은 위와 같이 되어있으며 상황에 맞게 구현할 수 있다. 마지막으로 우리가 직접 예외를 발생시킬 수도 있는데 이 때 사용하는 기능이 raise이다. 위에서는 예외가 발생이 됬을 때 조치를 취하는 형태의 코드를 만들었지만 지금부터는 예외가 발생할 것 같은 상황에 미리 예외를 발생시키고 처리를 하는 것이다. 아래 예제를 살펴보고 예제를 미리 발생시키는 방법에 대해 알아보자.

 

try:
    x = int(input('3의 배수를 입력하세요: '))
    if x % 3 != 0:					# x가 3의 배수가 아니면
        raise Exception('3의 배수가 아닙니다.')		# 예외를 발생시킴
    print(x)
except Exception as e:                          	# 예외가 발생했을 때 실행됨
    print('예외가 발생했습니다.', e)
    
결과
3의 배수를 입력하세요: 2
예외가 발생했습니다. 3의 배수가 아닙니다.

 

 그 뒤에 나오는 Storing Data는 약간의 응용이기 때문에 따로 다루지 않겠다. 자! 이로써 이 책에서 나오는 기본 개념에 대해서는 모두 공부를 마친 것 같다. 마지막 장에서는 지금까지 배운 코드를 응용한 테스트와 어떻게 하면 더 효율적인 코드, 유지 보수가 좋은 코드를 만들 수 있는지에 대한 방법 등이 나오는 것 같다. 코드는 짜는 건 어떻게든 짤 수 있지만 그 코드에 살을 붙여 눈덩이처럼 커지게 되기 때문에 관리를 잘 하는 것도 매우 중요하다고 생각한다. 그러면 지금까지의 내용들을 잘 숙지하고 마지막 장을 넘어가보도록 하자!

 

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

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

Mr.HB

프로그래밍 이야기

,

 플레밍의 법칙은 오른손의 법칙과 왼손의 법칙으로 두 가지가 존재한다. 서로 햇갈릴 수 있기 때문에 분명히 구분하고 알고 있는 게 좋다. 둘의 차이점은 다음과 같다.

  • 오른손의 법칙 : 발전기의 원리에서 사용되며 마이크, 전자펜, 기타 모든 발전기의 원리에 사용
     * 오른손은 밥 먹는 손이기 때문에 에너지를 생성하는 의미(오른손잡이 기준)

  • 왼손의 법칙 : 전동기의 원리에서 사용되며 선풍기, 청소기, 냉장고 등 모터를 사용하는 곳에서 적용
     * 왼손은 밥 먹은 오른손의 에너지를 소비하는 의미

플레밍의 법칙<참조 : 사이언스올>

 

'용어사전' 카테고리의 다른 글

PWM(Pulse Width Modulation)  (0) 2020.03.19
OAM(Operation Administration Maintenance)  (2) 2020.02.20
4-way-handshaking  (3) 2020.01.29
3-way-handshaking  (3) 2020.01.29
블로그 이미지

Mr.HB

프로그래밍 이야기

,

 이번주는 Chapter8 Function에 대해서 조금 더 자세히 다뤄보고자 한다. 책에서는 없던 내용이지만 스스로 공부한 것 중에서 재귀함수와 지역·전역변수에 대해서 설명하겠다. 둘 다 들어는 봤을 것 같은 내용들이다. 그렇기 때문에 어려운 내용이 아니므로 천천히 그 의미와 사용법에 대해서 알아보자.

 

  • Recursive Function

 재귀함수란 자기 자신을 호출하는 것을 의미한다. 기본적으로는 함수 F를 만들면 다른 곳에서 F를 호출해 사용하지만 재귀함수는 F 함수 안에서 F 함수를 다시 호출하는 것으로 즉!!! 자기 자신을 다시 불러서 사용하는 것이다.
 보통 재귀함수를 공부해보면 제일 좋은 예시가 팩토리얼을 많이 이야기한다. 팩토리얼이란 n! 즉 n까지의 모든 정수를 모두 곱하는 것을 말한다. 이론적으로는 매우 쉽게 느껴지지만 코드를 실행해보면 '이게 왜 이렇게 되지??' 라는 의문을 가지는 게 재귀함수이다. 그러면 예제 코드를 먼저 살펴보고 사용법을 알아보자.

 

def factorial(n):
    if n == 1:
        return 1
    return n * factorial(n-1)		# 재귀함수 호출

print(factorial(7))

결과
5040

 

 재귀 함수를 쓰는 방법은 간단하다. 자기 자신 이름을 호출하게 되면 그게 재귀 함수를 사용하는 방법이다. 위의 예제에서는 function 이름이 factorial이기 때문에 factorial()로 사용하고 있는 것을 알 수 있다. 그리고 재귀 함수로 들어간 함수는 끝에 도착했을 때 역으로 들어간 만큼 나오는 특징을 가지고 있다. 이 점을 유의하면서 공부해보자.
그러면 문제 : 위의 예제에서 factorial은 몇 번 실행됬을까??(정답을 알기 위해선 디버깅을 하는 게 가장 편하다.)
정답 : 7번(드래그하면 정답이 보입니다.)

 자! 그러면 정답이 왜 그렇게 되는지 그림으로 설명을 적어보겠다.

 

<factorial 재귀함수 순서>

 그림을 내가 직접 쓰면서 해서 이해가 조금 어려울 수도 있기 때문에 순서를 글로도 한 번 정리하겠다.

  1. 그림에서 1번 return과 2번 return이 존재한다. 하지만 1번 return은 n = 1일 때만 동작하기 때문에 무시하고 n = 7 ~ 2까지는 조건에 맞지 않아서 2번 return의 재귀 함수가 호출된다.

  2. n = 1일 때 드디어 1번의 retrun문이 실행되고 끝에 도착했기 때문에 재귀 함수로 들어온 수만큼 다시 돌아가게 된다.(return 값은 1을 가진 채로 돌아감)

  3. n = 2일 때로 돌아왔고 재귀 함수 위의 코드 즉 조건문은 실행을 하고 지나갔기 때문에 또 실행되지는 않고 재귀 함수 아래에 존재하는 코드(위의 예제에서는 없다. 존재한다면 재귀 함수 아래 코드로 진행)가 실행되고 n = 3으로 거슬러 올라간다.

  4. n = 3일 때는 2에서 올라온 retrun 값 2 * 1 = 2 를 가지고 3 * 2 = 6의 return 값을 가지고 4로 올라간다.

  5. 위의 행동을 7까지 반복한다.

  6. n = 7일 때 이때까지 누적되서 올라온 return 값과 (7 * 누적 값)을 return 값으로 가지고 function이 종료된다.

 

 디버깅을 하면 한 단계식 들어가는 것과 나가는 것을 볼 수 있으니 한 번 해보는 것을 추천한다.
(디버깅 방법을 모른다고 하시면 그것도 리뷰해드립니다. 말씀해주세요^^ / 디버그 실행 Ctrl+F9)

 

  • Global & Local Variable

 다음은 지역 변수와 전역 변수에 관한 이야기이다. 우리가 흔히 알고 있는 내용인데 함수 내에서만 사용하는 것을 지역 변수, 코드 전체에서 사용하는 것을 전역 변수로 지칭한다. 아래 예제를 살펴보고 전역변수와 지역변수의 차이점과 사용법을 알아보자.

 

x = 10 			 # 전역 변수
def foo1():
    x = 20 		 # x는 foo1의 지역 변수
    print(x) 		 # foo1의 지역 변수 출력
foo1()
print(x) 		 # 전역 변수 출력

def foo2():
    global x    	 # 전역 변수 x를 사용하겠다고 설정
    x = 20		 # x는 전역 변수
    print(x) 		 # 전역 변수 출력
foo2()
print(x) 		 # 전역 변수 출력

결과
20(global)
10(local)
20(global)
20(global)

 

 기본적으로 전역 변수는 함수 바깥에 선언한 모든 variable은 전역 변수로 사용된다. 그러므로 어디서 사용하던지 쓸 수 있고 반면에 지역 변수는 function 내에서 선언한 variable이기 때문에 바깥에서는 사용하거나 호출할 수 없게 된다. 
 전역 변수와 지역 변수가 이름이 같게 되면 지역에서 사투리를 먼저 쓰듯이 지역 변수가 우선으로 사용되고 만약에 전역 변수를 사용하고 싶으면 위의 예제처럼 global x(variable 명칭)를 통해 사용 할 수 있다.

 

 전역 변수와 지역 변수의 기본적인 사용법에 대해 알아보았다. 다음은 이중 함수 즉 지역 내의 지역이 있는 경우에 대해서도 알아보자. 보통 우리가 function을 쓸 때 특별한 기능을 쓰기 위해 사용하기도 하지만 한 개가 아닌 중첩 function을 사용해야 하는 경우도 있다. 그럴 때는 지역 변수 간의 차이와 용도를 아래 예제를 통해서 알아보자.

 

def A():
    x = 10              # function A 의 지역 변수
    y = 100             # function A 의 지역 변수
    def B():
        x = 20          # function B 의 지역 변수
        def C():
            """nonlocal : 상위의 지역 혹은 전역 변수 호출(계단형 검색)"""
            nonlocal x  # function A 의 지역 변수 호출
            nonlocal y  # function B 의 지역 변수 호출
            x = x + 30
            y = y + 300
            print(x)
            print(y)
        C()
    B()
A()

결과
50
400

 

 위의 예제코드를 그림으로 아주 쉽게 만들었다.(A 안에 B가 있고 B 안에 C가 있는 형태이다)

 

<nonlocal의 variable 찾는 방법>

 

 위와 같은 방법으로 지역이 중첩되어 있더라도 원하는 지역이나 전역의 variable을 가져다가 쓸 수 있다. 이번 장에서는 재귀 함수과 지역별 변수 사용 방법에 대해 알아보았다. 재귀 함수는 많이 쓰이지 않을 수도 있지만 전역 변수와 지역 변수 같은 경우에는 많은 코드를 짤 때 분명히 나눠야 되는 영역이기 때문에 꼭 학습하고 넘어가기로 하자.

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

Chapter10. Files and Exceptions  (0) 2020.05.20
Chapter9. Classes  (0) 2020.05.08
Chapter8. Functions  (0) 2020.04.28
Chapter7. USER INPUT AND WHILE LOOPS  (0) 2020.04.20
Chapter6. DICTIONARIES  (0) 2020.04.17
블로그 이미지

Mr.HB

프로그래밍 이야기

,