Powerful Iterable Language Python!!!
파이썬은 반복에도 강하고, 다른 언어에 비해 파일 IO가 매우 간단하게 구현되는 편입니다. 물론 파일 IO는 만약 비전공자분들이 시라면, 시중에 파는 책 가장 맨 마지막에 나오는 내용으로 접하셨겠지요. 어려워서라기 보다는 입문하는 입장에서 파일 IO는 다룰 필요는 없습니다. 나중에 실력이 쌓여가시면서 버그나 기타 발생사항들을 작성하는 로그를 자동화하는 경우나 데이터 분석 쪽에서 많이 사용되니까요!!
그리고 제가 설명드리고자하는 짤막한 개념은 제너레이터입니다. 언젠가 제가 블로그에서 반복자 구현과 관련해서 글을 올리겠다 말했는데, 이 반복자만 올리자 하니 , 조금 허무할 것 같아서 파일 입출력과 묶어서 실용적인 프로그래밍에 도움이 되고자 합니다!!
Make the Generator
제너레이터의 뜻이 뭔지 아시나요? 구글에 검색하면 발전기, 뭐 생성기 이렇게 나오는데 뭐라고 해석되든 파이썬에서 사용되는 제너레이터의 개념은 다를 바 없습니다. 그러니까 자동으로 생성해준다 이거죠? 프로그래머의 귀찮은 루틴을 제거해주겠단 겁니다. 그렇다면 어떻게 구현되는지 확인해보겠습니다!!
1
2
3
4
5
6
|
import random
def generateInt():
while True:
foo = random.randint(1,100)
yield foo
|
cs |
위와 같이 구현될 수 있습니다. 우선 함수를 작성해주셔야 하는데요, while문은 무한 루프입니다. 무한 루트는 오작동 및 심각한 오류를 야기하므로 사용하지 않는 걸 권하지만, 만약 난수 생성이나 계속되는 반복이 필요한 경우에는 사용해도 무방합니다.(제대로 동작하는 로직이라는 가정 하에 말이죠) 그리고 foo 변수는 1부터 100 사이의 랜덤 한 난수를 부여받아 가지고 있습니다. 여기서 새로 보는 키워드가 나왔죠?
"yield"
나중에 많이 사용될 키워드가 될 테니까 꼭 외워두시고요! 사전적 의미로는 수확이라고 하는데 뭐 맞습니다 이렇게 하면 함수가 잘 작동할 것 같지 않죠? 그래서 아래 코드를 추가합니다!
1
2
3
4
5
6
7
8
|
import random
def generateInt():
while True:
foo = random.randint(1,100)
yield foo
gI = generateInt()
|
cs |
아래 구문과 같이 변수에다가 함수를 일급 객체로 묶어서 객체로 사용합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
|
import random
def generateInt():
while True:
foo = random.randint(1,100)
yield foo
gI = generateInt()
with open('file.txt', 'w') as lr:
for i in range(1,10):
lr.write(str(next(gI)))
lr.write("\n")
lr.close()
|
cs |
그리고 아래에 파일 로드하는 구문을 작성해주는데요, with - as 구문은 뭐뭐로써 뭐뭐 사용 이런 의미입니다. 그리고 본 파이썬 파일과 "같은 디렉터리 영역 내에" file.txt 파일을 생성해줍시다!! 그리고 'w'는 파일 로드할 때, 파일을 작성하는 목적으로 열겠다는 의미입니다. 그리고 lr.write(str(next(gI))) 코드를 작성하는데요, next() 함수가 눈에 뜨이죠?
"next()"
yield로 생성하는 객체에서 다음으로 빠져나올 데이터를 반환받는 함수입니다. 그렇다면 generateInt()에서 반복된 데이터인 foo가 반환되게 됩니다!! 그렇게 파일에 10번 난수가 작성됩니다. 물론 개행 문자와 같이! 그리고 close()로 닫아주어야 합니다. 어 난 안 닫아도 오류 안나던데? 이러시면 안 됩니다. 당연히 안 납니다. 그런데 프로그램, 프레임워크 등 수많은 소프트웨어에서 파일을 로드하고 닫아주지 않으면 심각한 오류와 보안 결함을 야기시키니까 닫는 습관을 들이세요🤣🤣🤣🥲
그러고 읽어와 보겠습니다!!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
import random
def generateInt():
while True:
foo = random.randint(1,100)
yield foo
gI = generateInt()
with open('file.txt', 'w') as lr:
for i in range(1,10):
lr.write(str(next(gI)))
lr.write("\n")
lr.close()
with open('file.txt', 'r') as f:
for i in range(1,10):
a = f.readline()
print(a)
f.close()
|
cs |
이번엔 'w'가 아니라 'r'인데요, 읽기 목적으로 불러오겠단 겁니다. 그리고 f.readline() 돼있는데, 이외에도 read(), readlines()등 많은 내장 함수들이 존재합니다. 개행 문자를 만날 때까지 읽은 문자열만 가져오겠단 겁니다. 그리고 close()로 닫아주고 마무리합니다!!
한 번씩 모두 작성해보시면서 파일 입출력과 제너레이터 함수를 간략하게 사용해보시면, 나중에 분명 도움이 될 날이 오실 겁니다!!
도움이 되셨다면, 공감 하트와 댓글 남겨주시면 감사하겠습니다🤪😎
감사합니다.
댓글로 피드백, 문의 , 질문 모두 환영합니다!!
'Python' 카테고리의 다른 글
[Python 자료구조] 연결리스트_implemented Linked List@_탐색, 순회, 추가 및 삭제 (0) | 2021.01.06 |
---|---|
[Python 자료구조] 트리자료구조 구현_implemented Tree Structure@_탐색, 순회, 추가 및 삭제 (0) | 2021.01.04 |
[Python] map과 zip 내장함수 사용하기!! (0) | 2020.12.12 |
[Python] DefaultDict 다루기!!! (0) | 2020.12.10 |
[Python_Class#1] 파이썬 Class 손 쉽게 이해하기!! (0) | 2020.12.08 |
댓글