11# ** Zen of Python**
2+
23[ PEP 20 – The Zen of Python] ( https://peps.python.org/pep-0020/ ) 은 Python 설계에 대한 지침 원칙을 20개의 격언으로 간결하게 정리한 내용을 다루며, 그중에 19개의 격언만 기록되어 아래와 같이 ` import this ` 를 통해 확인할 수 있다.
34
4- The Zen of Python, by [ Tim Peters] ( https://en.wikipedia.org/wiki/Tim_Peters_(software_engineer) )
5+ The Zen of Python, by [ Tim Peters] ( < https://en.wikipedia.org/wiki/Tim_Peters_(software_engineer) > )
6+
57``` python
68import this
79```
810
911## 1. Beautiful is better than ugly.
12+
1013** 해석** : 아름다운 것이 못생긴 것보다 낫다.
1114** 의미** : 코드는 기능뿐만 아니라 읽기 쉽고 보기 좋아야 한다. 가독성과 구조적인 아름다움을 위해 노력하라.
12- 즉, 코드가 명료하고, 읽는 사람에게 스트레스를 주지 않도록 작성하는 것을 목표로 한다.
15+ 즉, 코드가 명료하고, 읽는 사람에게 스트레스를 주지 않도록 작성하는 것을 목표로 한다.
1316
1417** Bad Code Example** :
18+
1519``` python
1620a= [1 ,2 ,3 ]
1721b= []
@@ -21,6 +25,7 @@ for i in a:
2125```
2226
2327** Good Code Example** :
28+
2429``` python
2530numbers = [1 , 2 , 3 ]
2631even_numbers = [n for n in numbers if n % 2 == 0 ]
@@ -29,17 +34,20 @@ even_numbers = [n for n in numbers if n % 2 == 0]
2934---
3035
3136## 2. Explicit is better than implicit.
37+
3238** 해석** : 명시적인 것이 암시적인 것보다 낫다.
3339** 의미** : 의도를 명확히 표현하라. 코드가 무엇을 하고 있는지 쉽게 이해할 수 있어야 한다.
34- 즉, 코드의 동작이 숨겨져 있지 않고, 모든 동작이 명확하게 드러나도록 작성한다.
40+ 즉, 코드의 동작이 숨겨져 있지 않고, 모든 동작이 명확하게 드러나도록 작성한다.
3541
3642** Bad Code Example** :
43+
3744``` python
3845from math import *
3946print (sqrt(4 ))
4047```
4148
4249** Good Code Example** :
50+
4351``` python
4452import math
4553print (math.sqrt(4 )) # 'sqrt'가 어디에서 왔는지 명확히 알 수 있음
@@ -48,11 +56,13 @@ print(math.sqrt(4)) # 'sqrt'가 어디에서 왔는지 명확히 알 수 있음
4856---
4957
5058## 3. Simple is better than complex.
59+
5160** 해석** : 단순한 것이 복잡한 것보다 낫다.
5261** 의미** : 불필요한 복잡성을 줄이고 간결하게 작성하라.
53- 즉, 단순한 코드가 유지 보수와 디버깅에 유리하며, 다른 사람이 이해하기 쉽다.
62+ 즉, 단순한 코드가 유지 보수와 디버깅에 유리하며, 다른 사람이 이해하기 쉽다.
5463
5564** Bad Code Example** :
65+
5666``` python
5767def add (a , b ):
5868 if type (a) == int and type (b) == int :
@@ -62,6 +72,7 @@ def add(a, b):
6272```
6373
6474** Good Code Example** :
75+
6576``` python
6677def add (a : int , b : int ) -> int :
6778 return a + b
@@ -70,18 +81,21 @@ def add(a: int, b: int) -> int:
7081---
7182
7283## 4. Complex is better than complicated.
84+
7385** 해석** : 복잡한 것이 난해한 것보다 낫다.
7486** 의미** : 복잡성이 필요한 경우에도, 그것이 난해하거나 이해하기 어렵지 않도록 명확한 구조를 유지하라.
75- 즉, 복잡한 문제를 해결할 때도 코드가 이해 가능하고 명확해야 한다.
87+ 즉, 복잡한 문제를 해결할 때도 코드가 이해 가능하고 명확해야 한다.
7688
7789** Bad Code Example** :
90+
7891``` python
7992def process (data ):
8093 # 많은 작업을 한 함수에 몰아넣음
8194 return [x** 2 for x in data if x > 0 and isinstance (x, int )]
8295```
8396
8497** Good Code Example** :
98+
8599``` python
86100def filter_positive_integers (data ):
87101 return [x for x in data if x > 0 and isinstance (x, int )]
@@ -97,11 +111,13 @@ result = square_numbers(filtered_data)
97111---
98112
99113## 5. Flat is better than nested.
114+
100115** 해석** : 평평한 구조가 중첩된 것보다 낫다.
101116** 의미** : 코드 계층을 최소화하고, 지나치게 중첩된 구조를 피하라.
102- 즉, 깊은 중첩은 코드의 가독성과 디버깅을 어렵게 한다.
117+ 즉, 깊은 중첩은 코드의 가독성과 디버깅을 어렵게 한다.
103118
104119** Bad Code Example** :
120+
105121``` python
106122for i in range (3 ):
107123 for j in range (3 ):
@@ -110,6 +126,7 @@ for i in range(3):
110126```
111127
112128** Good Code Example** :
129+
113130``` python
114131from itertools import product
115132
@@ -120,16 +137,19 @@ for i, j, k in product(range(3), repeat=3):
120137---
121138
122139## 6. Sparse is better than dense.
140+
123141** 해석** : 나눠진 것이 밀집된 것보다 낫다.
124142** 의미** : 코드를 한 줄에 지나치게 압축하지 말고, 읽기 쉽게 분리하라.
125- 즉, 지나치게 압축된 코드는 읽기 어렵고, 유지 보수성을 해친다.
143+ 즉, 지나치게 압축된 코드는 읽기 어렵고, 유지 보수성을 해친다.
126144
127145** Bad Code Example** :
146+
128147``` python
129148if x > 0 : print (" Positive" ); y = x** 2
130149```
131150
132151** Good Code Example** :
152+
133153``` python
134154if x > 0 :
135155 print (" Positive" )
@@ -139,17 +159,20 @@ if x > 0:
139159---
140160
141161## 7. Readability counts.
162+
142163** 해석** : 읽기 쉬운 것이 중요하다.
143164** 의미** : 코드를 작성할 때 가독성을 항상 염두에 두어라.
144- 즉, 다른 사람이 코드를 쉽게 이해할 수 있도록 돕는다.
165+ 즉, 다른 사람이 코드를 쉽게 이해할 수 있도록 돕는다.
145166
146167** Bad Code Example** :
168+
147169``` python
148170x, y, z = 1 , 2 , 3
149171print (z, y, x)
150172```
151173
152174** Good Code Example** :
175+
153176``` python
154177first, second, third = 1 , 2 , 3
155178print (third, second, first)
@@ -158,11 +181,13 @@ print(third, second, first)
158181---
159182
160183## 8. Special cases aren't special enough to break the rules. Although practicality beats purity.
184+
161185** 해석** : 특별한 경우가 규칙을 깰 만큼 특별하지는 않다. 하지만 실용성이 순수성보다 우선한다.
162186** 의미** : 규칙은 중요하지만, 실용적인 해결책이 필요할 때는 융통성을 발휘하라.
163- 즉, 원칙을 고수하면서도, 현실적인 제약을 고려해 실용적인 코드를 작성한다.
187+ 즉, 원칙을 고수하면서도, 현실적인 제약을 고려해 실용적인 코드를 작성한다.
164188
165189** Bad Code Example** :
190+
166191``` python
167192def divide (a , b ):
168193 if b == 0 :
@@ -171,6 +196,7 @@ def divide(a, b):
171196```
172197
173198** Good Code Example** :
199+
174200``` python
175201def divide (a , b ):
176202 if b == 0 :
@@ -181,11 +207,13 @@ def divide(a, b):
181207---
182208
183209## 9. Errors should never pass silently. Unless explicitly silenced.
210+
184211** 해석** : 에러는 결코 조용히 지나가지 않는다. 알고도 침묵하지 않는 한.
185212** 의미** : 에러를 무시하지 말고 적절히 처리하라.
186- 즉, 디버깅과 문제 해결을 쉽게 하기 위해 에러를 명확히 드러내고 관리한다.
213+ 즉, 디버깅과 문제 해결을 쉽게 하기 위해 에러를 명확히 드러내고 관리한다.
187214
188215** Bad Code Example** :
216+
189217``` python
190218try :
191219 1 / 0
@@ -194,6 +222,7 @@ except:
194222```
195223
196224** Good Code Example** :
225+
197226``` python
198227try :
199228 1 / 0
@@ -204,11 +233,13 @@ except ZeroDivisionError as e:
204233---
205234
206235## 10. In the face of ambiguity, refuse the temptation to guess.
236+
207237** 해석** : 모호한 상황에서는 추측하려는 유혹을 뿌리쳐라.
208238** 의미** : 코드는 항상 명확해야 하며, 모호한 로직을 남겨두지 않도록 설계하라.
209- 즉, 코드를 읽는 사람이 의도를 오해하지 않도록 작성한다.
239+ 즉, 코드를 읽는 사람이 의도를 오해하지 않도록 작성한다.
210240
211241** Bad Code Example** :
242+
212243``` python
213244def get_status (code ):
214245 if code == 1 :
@@ -218,6 +249,7 @@ def get_status(code):
218249```
219250
220251** Good Code Example** :
252+
221253``` python
222254def get_status (code ):
223255 if code == 1 :
@@ -231,36 +263,42 @@ def get_status(code):
231263---
232264
233265## 11. There should be one-- and preferably only one --obvious way to do it.
266+
234267** 해석** : 하나의 명확하고 선호되는 방법이 있어야 한다.
235268** 의미** : 동일한 결과를 도출하는 다양한 방법이 있더라도, 가장 직관적이고 간단한 방법을 선택하라.
236- 즉, 코드를 작성할 때 명확하고 표준적인 방식을 따름으로써 협업과 유지 보수를 용이하게 한다.
269+ 즉, 코드를 작성할 때 명확하고 표준적인 방식을 따름으로써 협업과 유지 보수를 용이하게 한다.
237270
238271** Bad Code Example** :
272+
239273``` python
240274result = []
241275for i in range (10 ):
242276 result.append(i * 2 )
243277```
244278
245279** Good Code Example** :
280+
246281``` python
247282result = [i * 2 for i in range (10 )] # Pythonic한 방식
248283```
249284
250285---
251286
252287## 12. Now is better than never. Although never is often better than right now.
288+
253289** 해석** : 지금 하는 것이 하지 않는 것보다 낫다. 하지만 지금 당장 하는 것이 항상 옳은 것은 아니다.
254290** 의미** : 작업을 미루지 말되, 신중하게 실행하라. 필요 없는 조급함은 피하라.
255- 즉, 너무 서두르지 않으면서도, 중요한 작업은 시기적절하게 처리한다.
291+ 즉, 너무 서두르지 않으면서도, 중요한 작업은 시기적절하게 처리한다.
256292
257293** Bad Code Example** :
294+
258295``` python
259296def process_data (data ):
260297 return data.split(" ," ) # 데이터 구조를 고려하지 않고 서둘러 처리
261298```
262299
263300** Good Code Example** :
301+
264302``` python
265303def process_data (data ):
266304 if not isinstance (data, str ):
@@ -271,17 +309,20 @@ def process_data(data):
271309---
272310
273311## 13. If the implementation is hard to explain, it's a bad idea.
312+
274313** 해석** : 구현을 설명하기 어렵다면, 그것은 나쁜 아이디어다.
275314** 의미** : 코드는 명확하고 간단해야 하며, 쉽게 설명할 수 있어야 한다.
276- 즉, 복잡한 코드를 피하고, 쉽게 이해할 수 있는 로직을 작성한다.
315+ 즉, 복잡한 코드를 피하고, 쉽게 이해할 수 있는 로직을 작성한다.
277316
278317** Bad Code Example** :
318+
279319``` python
280320def f (a , b ):
281321 return (a ** b) / ((a + b) ** 0.5 ) if a > b else (b ** a) / ((a + b) ** 0.5 )
282322```
283323
284324** Good Code Example** :
325+
285326``` python
286327def compute_ratio (a , b ):
287328 if a > b:
@@ -293,19 +334,21 @@ def compute_ratio(a, b):
293334---
294335
295336## 14. If the implementation is easy to explain, it may be a good idea.
337+
296338** 해석** : 구현을 쉽게 설명할 수 있다면, 그것은 좋은 아이디어일 수 있다.
297339** 의미** : 간단하고 명료한 로직이 포함된 코드를 작성하라.
298- 즉, 다른 개발자와 협업 시, 의사소통이 원활하게 이루어지도록 돕는다.
299-
340+ 즉, 다른 개발자와 협업 시, 의사소통이 원활하게 이루어지도록 돕는다.
300341
301342---
302343
303344## 15. Namespaces are one honking great idea -- let's do more of those!
345+
304346** 해석** : 네임스페이스는 정말 멋진 아이디어다. 더 많이 사용하자!
305347** 의미** : 충돌을 방지하기 위해 네임스페이스를 활용하라.
306- 즉, 코드의 모듈화와 충돌 없는 확장이 가능하도록 설계한다.
348+ 즉, 코드의 모듈화와 충돌 없는 확장이 가능하도록 설계한다.
307349
308350** Good Code Example** :
351+
309352``` python
310353import my_module.utilities as utils
311354
@@ -315,4 +358,13 @@ result = utils.process_data(data)
315358---
316359
317360## 결론
361+
318362Zen of Python의 가이드는 Pythonic한 코드 작성을 돕는 철학과 원칙을 제공한다. 이를 실천함으로써 더욱 명확하고 유지 보수 가능한 코드를 작성할 수 있다.
363+
364+ Zen of Python에 대한 해석은 사람마다 다르며, 여기에 대해 궁금한 사람들은 아래 자료들을 살펴보라.
365+
366+ ## 다른 사람들의 해석
367+
368+ - [ realpython.com/zen-of-python] ( https://realpython.com/zen-of-python/ )
369+ - [ the-zen-of-python-explained-with-examples] ( https://www.codeconquest.com/blog/the-zen-of-python-explained-with-examples/ )
370+ - [ 파이썬의 선: the-zen-of-python] ( https://tyoon9781.tistory.com/entry/the-zen-of-python )
0 commit comments