본문 바로가기
CS/Python&R

사수가 지도하는 듯한 느낌의 몸풀기 서적 - 파이썬 매일 코딩

by Diligejy 2022. 4. 2.

서평은 출판사의 지원을 받아 작성하였습니다.

처음 코딩이란 걸 시작했을 때 신기했다. 그전까지는 컴퓨터 프로그래밍은 고사하고 파워포인트, 엑셀과도 댐을 쌓고 지내던(사실 지금도 많이 하지 않아서 만약 해야한다면 연습을 많이 해야한다) 지독한 문돌이 습관을 가지고 있어서 코딩이라는 걸 배울 때 참 어려웠다. (사실 지금도 어렵다)

 

무엇보다 문법은 배웠는데, 어떻게 해야 더 실력을 키울 수 있을지 잘 몰랐다. 다들 사이드 프로젝트 하라고 하는데, 막막했다. 하면 좋다는 걸 누가 모르겠나? 구체적으로 어떻게 해야할지 막막하니까 그러지. 알고리즘 연습을 하면 좀 더 잘할까 싶어 해봤는데 재미가 별로 없었다. 말그대로 입사 테스트 용으로 많이 사용하기 때문에 난이도가 높거나 초보자용은 너무나도 낮은 경우도 많고, 주로 문제풀이에 집중되기 때문이다. 고등학교 시절 별로 좋아하지 않았던 수학 문제집이었던 쎈 1000제 같은 느낌이라고 할까? 풀어도 풀어도 끝이 없는 쎈 1000제는 사놓고 50문제 정도 풀다가 결국 깨끗하게 버려졌다.

 

사실 제일 좋은건 자본주의적 학습(?!)이다. 회사 업무 던져지면 돈이 걸려있고 일정이 걸려있으니 어떻게든 구글링하고 페이스북 커뮤니티든 어디 커뮤니티든 묻고 또 묻고 사정사정해서라도 해답을 알아내게 되고, 그러면서 실력이 커진다. 하지만 그렇게 하기 어려우니까 그 중간 어딘가의 학습 도구가 필요하다고 나를 포함해서 사람들이 말하는게 아닐까.

 

이 책은 그 지점에서 적절한 것 같다. 알고리즘 문제처럼 너무 어려운 문제 위주로 무조건 맞혀야 한다는 강박감을 주지 않으면서도, 꼼꼼하게 공식문서 링크와 관련 자료링크를 제공해서 마치 뭔가 많이 알게 된 것처럼 착각을 일으킨다. 이런 착각은 좋은게 아닐까? 이런 착각을 통해 뭔가 많이 안다는 자신감을 갖게 되고 그러면서 많이 하다보면 실제로 잘하게 되는 그런 선순환을 일으킬 수 있을거 같았다.

 

마치 코딩 잘 못하는 신입사원에게 사수가 대책으로 하나하나 문제 풀어보라고 내주고 꼼꼼히 피드백주는듯한 느낌을 이 책에서 받았다. 텍스트로 더 이상 설명하는 건 어려울거 같다. 읽어보면 무슨 말 하는지 알 거라고 생각한다. 

 

 

밑줄 긋기 

p.33 ~34

walrus 연산자(바다사자 연산자)

 

다른 프로그래밍 언어를 사용하다가 파이썬을 공부하는 사람은 사용자로부터 입력받고, while 반복문을 벗어나는 코드를 다음과 같이 작성하려 합니다. 이는 대부분의 프로그래밍 언어에서 널리 활용하는 형태의 코드입니다.

 

while s = input('Enter thoughts:'):
	print(f'Your thoughts are: {s}')

이 코드는 사용자로부터 입력받고, 이를 s에 넣는 것을 while 반복문의 조건식에 활용하고 있습니다. 따라서 s가 Boolean으로 변환되어서 비교됩니다. 빈 문자열이 입력될 경우, s가 False로 변환되어서 반복문을 벗어납니다.

 

하지만 이 코드에는 중요한 문제가 있습니다. 파이썬에서는 이러한 코드가 동작하지 않는다는 것입니다. 이는 파이썬의 할당 구문이 표현식이 아니기 때문에 발생하는 일입니다. 파이썬의 할당 구문은 어떠한 값도 만들어내지 않습니다. 따라서 반복문의 조건식 부분에 사용할 수 없습니다.

 

하지만 이러한 코드는 굉장히 편리하므로, 파이썬 3.8버전부터는 이러한 코드를 사용할 수 있게 :=라는 새로운 할당 연산자가 추가되었습니다. 정식 명칭은 '할당 표현식 연산자(assignment expression operator)'이지만, 일반적으로 :=라는 모습이 바다사자와 비슷하게 생겼다고 해서 'warlus 연산자'라고 부릅니다. 이 연산자는 처음 도입될 때 굉장히 많은 논란을 불러일으켰습니다. 언어에 불필요한 복잡성을 만들고, 잠재적인 버그의 가능성을 만들었다는 이유 때문입니다.

 

어쨌거나 파이썬 3.8버전에서는 다음과 같은 코드를 활용할 수 있습니다.

while s = input('Enter thoughts:'):
	print(f'Your thoughts are: {s}')

 

참고로 walrus 연산자와 관련한 논란, 그리고 walrus 연산자가 도입된 이유인 walrus 연산자의 장점 등을 자세하게 알고 싶다면 파이콘 2019에서 Dustin Ingram이 발표한 내용 (http://mng.bz/nPxv)을 살펴보기 바랍니다.

 

https://www.youtube.com/watch?v=6uAvHOKofws 

이 연산자와 관련한 자세한 내용은 PEP 572 문서 (https://www.python.org/dev/peps/pep-0572)을 참고해주세요.

https://peps.python.org/pep-0572/

 

PEP 572 – Assignment Expressions | peps.python.org

PEP 572 – Assignment Expressions PEP 572 Title Assignment Expressions Author Chris Angelico , Tim Peters , Guido van Rossum Status Accepted Type Standards Track Created 28-Feb-2018 Python-Version 3.8 Post-History 28-Feb-2018, 02-Mar-2018, 23-Mar-2018, 04

peps.python.org

 

p.35

Python Tutor를 활용해서 코드 실행 분석하기

 

https://pythontutor.com/

 

Python Tutor - Visualize Python, Java, C, C++, JavaScript, TypeScript, and Ruby code execution

VISUALIZE CODE EXECUTION Learn Python, Java, C, C++, JavaScript, and Ruby Python Tutor helps people overcome a fundamental barrier to learning programming: understanding what happens as the computer runs each line of code. You can use it to write Python, J

pythontutor.com

p.37

{ } 내부에 :을 넣어서, 자료를 원하는 형태로 포매팅해서 출력할 수도 있습니다.

 

예를 들어 문자열이 10칸의 공간을 갖고, 왼쪽 또는 오른쪽에 정렬하게 출력하고 싶다면 #을 다음과 같이 활용합니다.

 

name = 'world'
first = 'Reuven'
last = 'Lerner'
	print(f'Hello, {first:#<10} {last:#>10}')

필자는 최근 파이썬에 추가된 기능 중에 f-string이 가장 마음에 듭니다. 독자분들도 적극적으로 사용해보면 좋을 것 같습니다.

 

- 파이썬에서 문자열 형식을 지정할 때 사용할 수 있는 여러 가지를 비교한 글입니다.

https://pyformat.info/

 

PyFormat: Using % and .format() for great good!

Python has had awesome string formatters for many years but the documentation on them is far too theoretic and technical. With this site we try to show you the most common use-cases covered by the old and new style string formatting API with practical exam

pyformat.info

- f-string에 대한 설명과 활용 예를 자세하게 설명한 글입니다 : 

https://realpython.com/python-f-strings/

 

Python 3's f-Strings: An Improved String Formatting Syntax (Guide) – Real Python

As of Python 3.6, f-strings are a great new way to format strings. Not only are they more readable, more concise, and less prone to error than other ways of formatting, but they are also faster! By the end of this article, you will learn how and why to sta

realpython.com

- f-string을 설명하는 PEP 문서입니다. 

https://peps.python.org/pep-0498/

 

PEP 498 – Literal String Interpolation | peps.python.org

PEP 498 – Literal String Interpolation PEP 498 Title Literal String Interpolation Author Eric V. Smith Status Final Type Standards Track Created 01-Aug-2015 Python-Version 3.6 Post-History 07-Aug-2015, 30-Aug-2015, 04-Sep-2015, 19-Sep-2015, 06-Nov-2016 R

peps.python.org

p.40

이터러블을 매개변수로 전개하기

 

[1, 2, 3]과 같은 리스트 형태로 자료를 갖고 있다면 mysum 함수의 매개변수로 어떻게 전달해야, 이러한 리스트 내부의 숫자를 더할 수 있을까요? 단순하게 mysum([1, 2, 3])으로 호출하면 *numbers로 ([1, 2, 3], ) 형태의 튜플이 전달될 뿐입니다.

 

따라서 O에 각각의 요소를 더하는 형태로 코드를 구성했다면 O에 [1, 2, 3]을 더하게 되어서 TypeError 예외가 발생할 것입니다. 파이썬에서는 리스트와 숫자를 더할 수 없기 때문입니다. 결론부터 말하자면 리스트를 매개변수로 넣을 때 앞에 *연산자를 붙여주면 됩니다. 예를 들어 mysum(*[1, 2, 3]) 형태로 호출하면 리스트 내부의 요소들이 마치 mysum(1, 2, 3) 형태로 각각 매개변수로 들어갑니다.

 

이터러블 객체의 요소 하나하나를 함수의 매개변수로 전달해야 하는 경우에 굉장히 많이 사용하는 코드이므로, 꼭 기억하기 바랍니다.

 

p.43

빈 문자열과 숫자 0은 if 조건문의 조건식에 넣었을 때 False로 변환됩니다. 따라서 다음과 같이 문자열 또는 숫자 입력을 if 조건문의 조건식에 직접 사용하는 경우가 많습니다. 이후의 코드에서도 이러한 형태를 사용하겠습니다.

 

if not one_run:
	break

참고로 문자열 입력을 다음과 같이 구분하고자 하는 독자도 있을 것입니다.

 

if len(one_run) == 0:
	break

물론 이런 코드는 작동하지만, 일반적으로 파이썬 개발자가 볼 때 파이썬스럽지 않은 코드라고 할 수 있습니다. 파이썬 개발자는 이전 코드처럼 not을 변수 앞에 사용해서 문자열이 빈 문자열인지 확인하는 코드를 더 많이 사용합니다. 따라서 앞의 코드가 더 파이썬스럽고, 파이썬 개발자가 읽기 더 쉽습니다. 

 

참고로 일반적으로 사용자에게 입력받고, float 함수를 호출하는 경우에는 사용자가 유효하지 않은 값을 입력할 경우를 대비해서 try 구문을 함께 사용합니다.

try:
	n = float(input('Enter a number: '))
    print(f'n = {n}')
except ValueError as e:
	print('Hey! That's not a valid number!')

 

p.44

부동소수점 계산이 정확하지 않다는 것이 무슨 의미인지 잘 모르겠다면 파이썬 인터랙티브 셀에 0.1 + 0.2를 입력해보세요. 신기한 결과를 볼 수 있을 것입니다. 참고로 프로그래밍 언어에 따라서 이 결과에 약간씩 차이가 있습니다. 여러 프로그래밍 언어에서 0.1 + 0.2의 결과가 어떻게 나오는지 정리해서 확인하고 싶다면 

https://0.30000000000000004.com/

 

Floating Point Math

Floating Point Math Your language isn’t broken, it’s doing floating point math. Computers can only natively store integers, so they need some way of representing decimal numbers. This representation is not perfectly accurate. This is why, more often th

0.30000000000000004.com

를 참고해보기 바랍니다.

 

p.46

부동소수점 계산을 정확하게 할 수 있는 Decimal 클래스(https://docs.python.org/3.7/library/decimal.html )

 

decimal — Decimal fixed point and floating point arithmetic — Python 3.7.13 documentation

The decimal module provides support for fast correctly-rounded decimal floating point arithmetic. It offers several advantages over the float datatype: The module design is centered around three concepts: the decimal number, the context for arithmetic, and

docs.python.org

를 확인

 

p.47

필자도 현재 일반 업무에서는 16진수를 거의 사용하지 않습니다. 또한, 필요한 경우에도 단순하게 hex 함수

 

https://docs.python.org/3/library/functions.html?#hex 

 

Built-in Functions — Python 3.10.4 documentation

Built-in Functions The Python interpreter has a number of functions and types built into it that are always available. They are listed here in alphabetical order. abs(x) Return the absolute value of a number. The argument may be an integer, a floating poin

docs.python.org

와 0x접두사를 활용합니다. hex 함수는 문자열을 입력받고, 16진수 문자열을 리턴합니다. 그리고 0x접두사는 16진수를 표현할 수 있는 방법입니다. 예를 들어 hex(80)은 문자열 '0x50'을 리턴하며, 0x50이라고 입력하면 정수 80이 들어갑니다.

 

p.54

문자열에 대해서는 두 가지 내용을 잘 이해하고 있어야 합니다.

 

1. 문자열은 이뮤터블(immutable)이다.

2. UTF-8 인코딩을 사용한다.

 

파이썬의 문자열은 굉장히 재미있으면서도 유용합니다. 파이썬에서 문자열은 단순한 텍스트가 아니라 시퀀스이기도 합니다. 따라서 반복문에 활용할 수 있으며(문자 하나하나 반복 처리됩니다), 인덱스를 활용해서 특정 위치의 문자열을 출력할 수도 있습니다.

 

p.57

무엇보다도 파이썬 프로그램은 짧아야 합니다. 만약 코드를 작성하다가 자신의 코드에서 반복되는 부분이 보이고, 긴 표현식 또는 문장을 작성하고 있다는 것을 발견했다면 파이썬스러운 코드를 작성할 수 있게 대책을 세워야 합니다.

 

p.61

파이썬의 문자열은 왜 이뮤터블일까요? 여기에는 여러 이유가 있습니다. 예를 들어 구현을 효율적으로 할 수 있다는 점이 있습니다. 일반적으로 문자열은 딕셔너리의 키로 많이 사용합니다. 딕셔너리는 이뮤터블 자료만 키로 사용할 수 있으므로, 문자열이 뮤터블이라면 딕셔너리의 키로 사용될 수 없습니다. 이는 굉장히 많은 문제를 일으킬 것입니다.

 

이뮤터블 자료는 변하지 않습니다. 이로 인해서 여러 상황이 발생합니다. 이뮤터블 자료형을 함수의 매개변수로 전달하면 함수 내부에서 이를 수정할 수 없습니다. 이뮤터블 자료형을 여러 스레드에서 활용할 경우, 변하지 않으므로 락킹을 따로 신경 쓰지 않아도 괜찮습니다. 또한 이뮤터블 자료형의 메서드를 호출하면 원본 자료를 수정한 새로운 자료를 리턴받습니다(원래 자료를 변경할 수 없으므로 새로운 것을 만드는 것입니다).

 

문자열을 이뮤터블로 만들면서 발생하는 여러 트레이드오프(trade-off)가 있습니다. 하지만 파이썬 개발자는 문자열을 이뮤터블로 활용하는 것이 더 좋다고 생각하므로, 이런 선택을 한 것입니다. 만약에 문자열을 뮤터블 자료형으로 사용하고 싶다면 StringIO(https://docs.python.org/3/library/io.html#io.StringIO) 

 

io — Core tools for working with streams — Python 3.10.4 documentation

The io module provides Python’s main facilities for dealing with various types of I/O. There are three main types of I/O: text I/O, binary I/O and raw I/O. These are generic categories, and various backing stores can be used for each of them. A concrete

docs.python.org

를 사용해야 합니다. 이는 파일과 같은 형태로 사용할 수 있는 인메모리 자료형입니다.

 

다른 프로그래밍 언어를 사용하다가 파이썬을 공부하기 시작한 사람은 이뮤터블이 상수(constant)와 같은 것이라고 오해하기도 하는데요. 전혀 다른 개념입니다. 상수는 이름(변수)과 값을 영구적으로 연결한다는 개념입니다. 파이썬에서는 이러한 상수가 존재하지 않습니다. 파이선은 어떤 이름(변수)에 언제나 원하는 값을 연결할 수 있습니다. 문자열과 튜플을 넣은 이름(변수)을 변경할 수는 있지만, 문자열과 튜플 값 자체를 변경할 수는 없습니다.

 

p.68

str.translate()

 

https://docs.python.org/3/library/stdtypes.html?#str.translate 

 

Built-in Types — Python 3.10.4 documentation

The following sections describe the standard types that are built into the interpreter. The principal built-in types are numerics, sequences, mappings, classes, instances and exceptions. Some collection classes are mutable. The methods that add, subtract,

docs.python.org

https://justdoit709.tistory.com/37

 

str: format(), format_map(), translate()

format()     format_map()     translate()     문자열 포맷을 지정하는 메서드와 문자열을 변환하는 메서드 여기서는 문자열의 포맷을 지정할 수 있는 다음 두 메서드와 문자열을 변환하는 메서드

justdoit709.tistory.com


p.69

URL 인코딩할 때는 URL로 처리할 수 없는 특수한 문자를 % 기호와 함께 아스키 문자(ASCII 32)에 해당하는 값을 16진수로 입력해서 변환합니다. 예를 들어 URL에 띄어쓰기가 들어갔다면 아스키 문자로 0x20이므로, %20으로 변환합니다. 

 

p.70

파이썬이 기본적으로 제공하는 sorted 함수 https://docs.python.org/3/library/functions.html#sorted

 

Built-in Functions — Python 3.10.4 documentation

Built-in Functions The Python interpreter has a number of functions and types built into it that are always available. They are listed here in alphabetical order. abs(x) Return the absolute value of a number. The argument may be an integer, a floating poin

docs.python.org

는 매개변수로 이터러블을 받습니다. 즉, 시퀀스뿐만 아니라 반복할 수 있는 것이라면 모두 사용할 수 있습니다. 따라서 sorted 함수의 매개변수에 문자열을 전달할 수도 있습니다. 

 

p.71

유니코드는 각각의 글자를 숫자에 일대일 대응시킵니다. 그런데 대충 생각해도 굉장히 많은 숫자가 포함될 것입니다. 이와 같은 유니코드 문자를 나타내는 숫자(코드 포인트라고 부릅니다)를 활용해서 여러 개의 바이트를 읽어 들이고, 이를 적절한 글자로 변환합니다. 파이썬을 포함한 대부분의 프로그래밍 언어는 UTF-8을 지원합니다. UTF-8은 고정된 바이트 길이를 사용하지 않고, 가변적인 바이트 길이를 사용해서 글자를 표현합니다. 예를 들어 기존의 ASCII 코드에 존재하던 글자는 그대로 1바이트를 활용해서 표현합니다. 프랑스, 스페인, 히브리, 아랍, 그리스, 러시아 글자는 2바이트를 활용해서 표현합니다. 그리고 한글, 한자, 이모티콘은 3바이트 또는 3바이트 이상을 활용해서 표현합니다.

 

유니코드는 우리가 개발할 때 어떤 영향을 줄까요? 일단 개발할 때 따로 언어 종류를 구분해서 사용할 필요가 없습니다. 하지만 바이트와 글자 사이의 관계를 생각해줘야 합니다. 파일을 읽어들일 때, 바이트를 글자로 변환하는 방법과 글자를 바이트로 변환하는 방법을 모두 기억해야 합니다.

 

파이썬이 글자와 문자열을 어떤 형태로 다루는지 더 자세하게 살펴보고 싶다면 파이콘 2012에서 발표한 Ned Batchelder의 

https://nedbatchelder.com/text/unipain.html

 

Pragmatic Unicode

Unicode can be confusing. Here’s a “just the facts I need” presentation about how to handle it correctly.

nedbatchelder.com

를 참고해보기 바랍니다.

 

p.84

슬라이싱은 굉장히 재미있는 특성이 있습니다. 어떤 x 자료형의 객체를 슬라이싱하면 새로 만들어지는 객체의 자료형도 x가 됩니다.

댓글