일요일, 5월 26, 2024
Home자동화Python 초보자가 저지르는 10가지 실수

Python 초보자가 저지르는 10가지 실수


본문은 Nowaday IT와 번역가 Mr.P가 공동으로 제작한 해외 번역 콘텐츠입니다. 이 기사를 쓴 Frank Andrade는 데이터 과학 및 프로그래밍 기술에 대한 다양한 기사를 업데이트하며 총 조회수 400만 회가 넘는 인기 편집자입니다. 이 글에서는 Python을 처음 배우는 사람들이 흔히 저지르는 나쁜 코딩 습관을 소개합니다.

Python 초보자의 실수

Python을 처음 배울 때 우리는 자신도 모르게 몇 가지 나쁜 코딩 습관을 익히게 됩니다. 처음에는 문제가 잘 작동하다가 작동이 멈추거나 나중에 문제를 더 쉽게 해결할 수 있도록 내장된 기능을 찾는 경우도 있습니다.

Python을 처음 접하는 대부분의 사람들은 처음 배웠을 때 가졌던 나쁜 습관 중 적어도 하나를 여전히 가지고 있습니다. 오늘은 그러한 나쁜 습관을 쉽게 고칠 수 있는 방법에 대해 설명하겠습니다.

1. 수입을 이용하세요 *

가끔 코딩하다가 게을러지면, from xyz import *모든 모듈(1)을 한 번에 로드하는 데 사용됩니다. 이는 여러 가지 이유로 좋은 습관이 아닙니다.

몇 가지 예는 다음과 같습니다.

  • 비효율적일 수도 있습니다. 모듈에 객체가 많으면 객체를 모두 로드하는 데 오랜 시간을 기다려야 합니다.
  • 변수 이름에 충돌이 발생할 수 있습니다. *를 사용하면 어떤 개체를 얻는지, 개체 이름이 무엇인지 알 수 없습니다.

이 문제를 어떻게 해결할 수 있나요? 사용하려는 특정 개체를 로드하거나 *를 사용하지 않고 전체 모듈을 로드한 다음 개체를 사용하기 전에 모듈 이름을 지정할 수 있습니다.

# Using import *

# Bad
from math import *

print(floor(2.4))
print(ceil(2.4))
print(pi)

# Good
import math
from math import pi

print(math.floor(2.4))
print(math.ceil(2.4))
print(pi)

2. 예외 처리: ‘제외’ 절에 예외를 지정하지 마세요.

나는 이것을 오랫동안 무시해 왔습니다. 덕분에 ‘Pycharm’을 사용하면 보기 흉한 밑줄이 나타나게 됩니다. PEP 8: do not use bare ‘except’나는 다음과 같은 수많은 경고 표시를 보았습니다. 이는 PEP 8 지침에서 권장되지 않습니다.

# Try - except
# Bad
try:
   driver.find_element(...)
except:
   print("Which exception?")
# Good
try:
   driver.find_element(...)
except NoSuchElementException:
   print("It's giving NoSuchElementException")
except ElementClickInterceptedException:
   print("It's giving ElementClickInterceptedException")

없는 ‘except’문제는 SystemExit 및 KeyboardInterrupt 예외를 포착하여 Control-C를 사용하여 프로그램을 중지하기 어렵게 한다는 것입니다. 다음에 try/Exception을 사용할 때는 반드시 Except 절에 예외를 지정하세요.

3. 수학 계산에 Numpy를 사용하지 마세요

우리는 Python에 우리 삶을 더욱 생산적이고 쉽게 만들어 주는 많은 패키지가 있다는 사실을 종종 잊어버립니다. Numpy는 수학적 계산에 사용되는 패키지 중 하나입니다. Numpy는 수학 연산을 해결하는 데 사용됩니다. for 이렇게 하면 루프를 사용하는 것보다 문제가 더 빨리 해결됩니다.

우리 random_scores 배열이 있고 테스트에 실패한 사람들의 평균 점수(점수 <70)를 얻고 싶다고 가정해 보겠습니다. 이것 for 루프로 해결해 봅시다.

import numpy as np

random_scores = np.random.randint(1, 100, size=10000001)

# Bad (solving problem with a for loop)
count_failed = 0
sum_failed = 0
for score in random_scores:
   if score < 70:
       sum_failed += score
       count_failed += 1

print(sum_failed/count_failed)

이제 Numpy로 해결해보자.

# Good (solving problem using vector operations)
mean_failed = (random_scores(random_scores < 70)).mean()
print(mean_failed)

둘 다 실행하면 Numpy가 더 빠르다는 것을 알 수 있습니다. Numpy는 작업을 벡터화하기 때문입니다(2).

4. 이전에 열었던 파일을 닫지 않음

우리 모두는 Python으로 열린 파일을 다시 닫아야 한다는 것을 알고 있습니다. 이건 우리가 일할 때마다 하는 일이야 open, write/read, close이것이 당신이 사용하는 이유입니다. 여기까지는 괜찮습니다. 하지만 우리는 write/read 메서드 사용 시 예외가 발생하면 이미 열려 있는 파일은 닫히지 않습니다.

이 문제를 피하기 위해 우리는 다음을 수행합니다 with 다음 구문을 사용해야 합니다. 이 경우 예외가 발생하더라도 파일을 정상적으로 닫을 수 있습니다.

# Bad
f = open('dataset.txt', 'w')
f.write('new_data')
f.close()

# Good
with open('dataset.txt', 'w') as f:
   f.write('new_data')

5. PEP8 지침에서 벗어남

PEP8Python을 공부하는 사람이라면 반드시 읽어야 할 문서입니다. PEP8은 코드 작성을 위한 최고의 코드 샘플과 지침을 제공합니다. (이 기사의 일부 조언은 PEP8에서도 가져왔습니다.)

Python을 처음 접하는 사람에게는 이러한 지침을 모두 따르는 것이 다소 부담스러울 수 있습니다. 다행히 일부 PEP8 규칙이 IDE에 통합되어 있습니다. (이것이 내가 Bare Except Rules에 대해 배운 이유입니다.)

Pycharm을 사용한다고 가정하고 PEP8 지침을 따르지 않은 경우 아래 이미지와 같이 보기 흉한 밑줄이 표시됩니다.

PEP8 지침

밑줄 위에 마우스를 올리면 밑줄 친 부분을 수정하는 방법에 대한 안내가 나옵니다. 위 이미지의 경우 , 및 : 뒤에 공백을 추가하면 해결됩니다.

# Good
my_list = (1, 2, 3, 4, 5)
my_dict = {'key1': 'value1', 'key2': 'value2'}

my_name = "Frank"

변수 이름도 x깁스 my_name으로 변경했습니다. 이는 Pycharm에서는 제안되지 않지만 PEP8에서는 이해하기 쉬운 변수 이름을 사용할 것을 권장합니다.

6. 사전을 사용할 때 .keys, .values를 제대로 사용하지 않음

이 글을 읽는 독자들이 바랍니다. .keys그리고 .values나는 당신이 그것이 무엇인지 알고 있다고 생각합니다. 모르시는 분들을 위해 아래 코드의 예를 살펴보겠습니다.

dict_countries = {'USA': 329.5, 'UK': 67.2, 'Canada': 38}

>>>dict_countries.keys()
dict_keys(('USA', 'UK', 'Canada'))

>>>dict_countries.values()
dict_values((329.5, 67.2, 38))

여기서 문제는 때때로 우리가 그것을 제대로 사용하지 않는다는 것입니다. 키를 얻기 위해 사전을 반복한다고 가정해 보겠습니다. 당신은 .keys 방법을 사용하게 됩니다. 하지만 .keys를 사용하지 않고 사전을 반복하는 것만으로도 키 값을 얻을 수 있다는 것을 알고 계셨습니까? 다음 예를 살펴보겠습니다.

# Not using .keys() properly
# Bad
for key in dict_countries.keys():
   print(key)

   
# Good
for key in dict_countries:
   print(key)

또한, 사전의 가치를 얻기 위한 해결책을 고민할 때, .items()를 사용하면 이 문제를 더 쉽게 해결할 수 있습니다.

# Not using .items()
# Bad
for key in dict_countries:
   print(dict_countries(key))
   
# Good
for key, value in dict_countries.items():
   print(key)
   print(value)

7. 절대 (또는 항상) 이해력을 사용하지 마십시오

컴프리헨션은 이미 정의된 시퀀스를 기반으로 새 시퀀스(목록, 사전 등)를 생성하려는 경우 더 짧은 코드로 이 작업을 수행하는 데 도움이 됩니다.

Countries 목록의 모든 요소를 ​​소문자로 변환한다고 가정해 보겠습니다. 이것 for 루프를 사용하는 대신 목록 이해를 통해 이를 단순화할 수 있습니다.

# Bad
countries = ('USA', 'UK', 'Canada')

lower_case = ()
for country in countries:
   lower_case.append(country.lower())

# Good (but don't overuse it!)
lower_case = (country.lower() for country in countries)

이해력이 매우 효율적입니다. 하지만 과용하지 마세요! “복잡한 것보다 단순한 것이 낫다” 파이썬의 정도기억해 주세요.

8. range(len()) 사용하기

우리가 초보자였을 때 가장 먼저 배운 기능 중 하나는 range그리고 len아니 알겠습니다. 따라서 대부분의 사람들이 목록을 반복할 때 range(len())우리가 를 사용하여 나쁜 습관을 갖게 되는 것은 놀라운 일이 아닙니다.

두 개의 목록 countries그리고 populations당신이 가지고 있다고 가정 해 봅시다. 두 개의 목록을 동시에 반복하려는 경우 다음을 수행할 수 있습니다. range(len())을 사용할 것입니다.

# Using range(len())
countries = ('USA', 'UK', 'Canada')
populations = (329.5, 67.2, 38)

# Bad
for i in range(len(countries)):
   country = countries(i)
   population = populations(i)
   print(f'{country} has a population of {population} million people')

그러면 작업이 완료됩니다. 하지만 당신은 enumerate를 사용하면 작업을 더욱 단순화할 수 있습니다. (또는 두 목록을 함께 반복하는 경우: zip이것이 더 효율적이다)

# OK
for i, country in enumerate(countries):
   population = populations(i)
   print(f'{country} has a population of {population} million people')

# Much Better
for country, population in zip(countries, populations):
   print(f'{country} has a population of {population} million people')

9. + 연산자를 사용한 문자열 연결

아마도 우리가 Python에서 가장 먼저 배우는 것 중 하나는 + 연산자를 사용하여 문자열을 결합하는 방법입니다. 이것은 유용합니다. 그러나 이는 문자열을 연결하는 비효율적인 방법입니다. 게다가 가독성도 좋지 않습니다. 더 많은 문자열을 결합해야 하는 경우, + 연산자를 사용해야 합니다.

+ 연산자를 사용하는 대신 f-문자열을 사용할 수 있습니다.

# Formatting with + operator
# Bad
name = input("Introduce Name: ")
print("Good Morning, " + name + "!")

# Good
name = input("Introduce Name: ")
print(f'Good Morning, {name}')

f-문자열의 가장 큰 장점은 문자열 연결에만 유용하지 않다는 것입니다. 다양한 적용 방법이것이 바로 그것입니다.

10. 변경 가능한 값을 기본 매개변수로 사용하는 경우

변경 가능한 값(예: 목록)을 함수의 기본 매개변수로 포함하면 다음과 같은 예기치 않은 동작이 발생합니다.

# Bad
def my_function(i, my_list=()):
   my_list.append(i)
   return my_list

>>> my_function(1)
(1)
>>> my_function(2)
(1, 2)
>>> my_function(3)
(1, 2, 3)

위의 코드에서, my_function 함수를 호출할 때마다 목록이 my_list이전 호출의 값을 계속 저장합니다. (함수를 호출할 때 빈 목록으로 시작한다고 가정) 이 동작을 방지하려면 my_list기본값은 None다음으로 설정하세요 if 아래 구문을 추가해야 합니다.

# Good
def my_function(i, my_list=None):
   if my_list is None: 
       my_list = ()
   my_list.append(i)
   return my_list

>>> my_function(1)
(1)
>>> my_function(2)
(2)
>>> my_function(3)
(3)

(1) 단일 Python(.py) 파일을 의미하는 단어입니다. 다른 Python 프로그램에서 사용하기 위해 생성된 파일입니다.
(2) 선형대수학의 벡터 개념을 이용하면 동일한 인덱스에 위치한 요소에 대해 연산을 수행할 수 있어 루프를 사용하지 않고도 동일한 위치의 값에 대한 연산이 가능하다.

당신이 멍청하다는 것을 알려주는 10가지 파이썬 실수

위 번역문의 원저작권은 Frank Andrade에게 있으며, IT는 요즘 이 기사를 통해 수익을 창출하지 않습니다.



RELATED ARTICLES

LEAVE A REPLY

Please enter your comment!
Please enter your name here

- Advertisment -
Google search engine

Most Popular

Recent Comments