# Pythonic이란 무엇인가?

- Author: @baealex
- Published: 2019-12-10
- Updated: 2021-08-06
- Source: http://blex.me/@baealex/pythonic%EC%9D%B4%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80
- Tags: 프로그래밍, 파이썬

---

## 파이써닉(Pythonic)

파이썬스러운 코드라는 의미. 아주 잘 짜여진 `Python` 코드를 `Pythonic` 하다고 부른다. 파이썬스러운 코드라? 파이썬은 무엇보다 읽기 쉽고 가독성이 높은 것을 추구한다. 파이썬에선 가독성이 높은 코드를 작성하기 위해 파이써니스타(파이썬 베테랑)들이 가이드라인을 제시하고 있고 이러한 가이드라인을 잘 따르는 코드가 파이썬스러운 코드다.

[Hitchhiker's Guide to Python](https://python-guide-kr.readthedocs.io/ko/latest/writing/style.html) / [PEP 8](https://pep8.org/)

위 홈페이지를 둘러보면 정말 잘 정리가 되어있는데 내가 새로 알게된? 자주 활용하지 않았던? 것들만 정리해 볼 예정이다.

<br>

#### 정리

- 한 줄의 한 구문을 준수하자

```python
if x == 1: print('one')
```

위 같은 코드는 절대 작성하지 말자. 가끔가다 가독성을 추구한답시고 위와같이 코딩했던 적도 많았는데 나쁜 예란다. 충격.. 😅

- `kwargs`는 정말 필요한 경우에만 쓰자 가독성을 저해시킬 수 있다
- 클래스에서 `private`속성을 가진 변수는 이름 앞에 _(언더스코어)를 사용하여 표현하자

위와같은 경우는 새로 알게 된 사실이다. 파이썬에선 `private` 속성 자체가 존재하지 않고 사용자가 직접 접근할 수 있는데 _를 달아 둠으로써 주의를 기울이게 할 수 있다.

- 반환값을 대체적으로 하나만 작성하며 예외를 처리해야 하는 경우 최대한 위쪽에 비치시키자. 이런 방식을 early return 이라고 부른다.

```python
def division(x, y):
    if y == 0:
        return False

    return x/y
```

- 사용하지 않을 변수는 __(언더스코어 2개)로 표현하자. 1개만 사용하는 것은 지양하자. 곂치는 경우가 있다.

```python
for __ in range(10):
    print('단순반복')
```

- 동일한 내용물을 가진 리스트를 생성할때는 `*`를 활용하자

```python
list = [None] * 4
```

- 다차원 리스트를 생성할 경우 리스트 내포를 적극 활용하자! 

```python
lists = [[] for __ in range(5)]
```

- 값이 `True`, 거나 `None`이거나 `0`인 경우 따로 값을 비교시킬 필요가 없음
- `if`문에서 `dict.has_key()`를 쓰지 말고 `in`으로 키의 존재 여부를 파악하자
- `lambda` + `filter`, `lambda` + `map`을 활용할 수 있으면 적극 활용하자
- 파일을 읽는 경우 `with open`을 사용하도록 하자
- 길고 이어지는 경우에는 ()를 사용하도록 하자. 닫는 괄호는 개행하기 전에 닫자

```python
from some.deep.module.inside.a.module import (
    a_nice_function, another_nice_function, yet_another_nice_function)

my_very_big_string = (
    "For a long time I used to go to bed early. Sometimes, "
    "when I had put out my candle, my eyes would close so quickly "
    "that I had not even time to say “I’m going to sleep.”")
```

오... ()가 있으면 띄어쓰기를 해서 가독성을 올리는 편인데 ()가 어디서나 활용할 수 있는 도구인지는 몰랐다. 문자열, 임포트할 때도 사용할 수가 있구나 😮

- 개행할때 사칙연산 기호가 있다면 개행 후 기호를 표시한다

```python
add_result = my_very_long_add_function( 
    my_very_long_variable_one
    + my_very_long_variable_two)
```

- `import` 할때는 연속적으로 하지 않고 별도로 하는게 합리적이다

```python
import os
import sys
```

- `from`을 사용하여 `import` 할때는 연속적으로 해도 좋다

```python
from subprocess import Popen, PIPE
```

- 불필요한 공백은 지양하라. `,`, `:`, `;`가 나온 후에만 공백을 두는게 트랜드로 보인다 단 한개의 원소를 가진 튜플인 경우 마지막에 `,`찍고 띄어쓰기 금지 연산 기호의 경우 앞 뒤로 공백을 준다

```python
spam(ham[1], {eggs: 2})
bread = (3,)
total_age = person1.age + person2.age
```

- `PEP 8`을 이용하여 가이드라인을 준수하고 있는지 파악해보자

```
pip install pep8
pep8 mysouce.py
```
