파이썬 힌트와 기교, 아직 보지 못했습니다. 두 번째 부분입니다.
몇 주 전에 사람들이 잘 알지 못하는 파이톤의 특성에 관한 기사 ()를 발표했는데, 많은 사람들이 그것을 좋아하는 것 같아서, 다음은 또 다른 파이톤의 특성입니다. 아직 보지 못하셨으면 합니다.
slice
함수를 사용하여 슬라이스 이름 지정대량의 하드 인코딩을 사용하는 인덱스 값은 곧 유지보수와 읽기 혼란을 초래할 수 있습니다.한 가지 선택은 모든 색인 값에 상수를 사용하는 것이지만 우리는 더 잘할 수 있다.
# ID First Name Last Name
line_record = "2 John Smith"
ID = slice(0, 8)
FIRST_NAME = slice(9, 21)
LAST_NAME = slice(22, 27)
name = f"{line_record[FIRST_NAME].strip()} {line_record[LAST_NAME].strip()}"
# name == "John Smith"
이 예에서 우리는 신비로운 인덱스를 피할 수 있다. 우선 slice
함수로 그것들을 명명한 다음, 슬라이드 문자열의 일부분을 사용할 때 그것들을 사용할 수 있다.슬라이스 대상의 속성.start
, .stop
및 .step
를 사용하여 슬라이스 대상에 대한 더 많은 정보를 얻을 수 있다.런타임 시 암호 입력 프롬프트
많은 명령줄 도구나 스크립트는 사용자 이름과 비밀번호를 필요로 합니다.그래서 만약에 공교롭게도 이런 프로그램을 짰다면
getpass
모듈이 매우 유용하다는 것을 발견할 수 있을 것이다.import getpass
user = getpass.getuser()
password = getpass.getpass()
# Do Stuff...
이 간단한 패키지는 현재 사용자의 로그인 이름을 추출해서 사용자가 비밀번호를 입력하고 사용자 이름을 가져올 수 있도록 합니다.그러나 모든 시스템이 암호를 숨기는 것을 지원하는 것은 아니므로 주의해야 한다.Python은 이 점을 경고하려고 하기 때문에 명령줄의 경고를 읽기만 하면 됩니다.단어/문자열의 일치하는 항목 찾기
이제 파이썬 표준 라이브러리의 더 모호한 특성을 살펴봅시다.만약 당신이 이러한 상황을 만났다면, 입력 문자열과 비슷한 단어를 찾기 위해 Levenshtein distance 파이톤과
difflib
백 같은 것을 사용해야 한다.import difflib
difflib.get_close_matches('appel', ['ape', 'apple', 'peach', 'puppy'], n=2)
# returns ['apple', 'ape']
difflib.get_close_matches
가장 좋은 일치 항목을 찾습니다.여기서 첫 번째 논점과 두 번째 논점이 일치한다.우리는 되돌릴 최대 일치 수를 지정하는 선택할 수 있는 매개 변수 n
를 제공할 수 있습니다.사용 가능한 또 다른 키워드 매개 변수cutoff
(기본값 0.6)는 일치하는 문자열의 득점을 변경하는 한도값으로 설정할 수 있습니다.IP 주소 사용
파이톤으로 네트워크를 연결해야 한다면
ipaddress
모듈이 매우 유용하다는 것을 발견할 수 있습니다.하나의 예로는 CIDR에서 IP 주소 목록을 생성하는 것입니다.import ipaddress
net = ipaddress.ip_network('74.125.227.0/29') # Works for IPv6 too
# IPv4Network('74.125.227.0/29')
for addr in net:
print(addr)
# 74.125.227.0
# 74.125.227.1
# 74.125.227.2
# 74.125.227.3
# ...
또 다른 좋은 기능은 IP 주소의 네트워크 구성원 신분 검사이다.ip = ipaddress.ip_address("74.125.227.3")
ip in net
# True
ip = ipaddress.ip_address("74.125.227.12")
ip in net
# False
더 재미있는 기능들이 많으니 더 이상 군말하지 않겠습니다. 왜냐하면 당신은 그것들을 찾을 수 있기 때문입니다. here그러나 ipaddress
모듈과 기타 네트워크 관련 모듈 간의 상호작용성은 한계가 있음을 주의해야 한다.예를 들어 IPv4Network
의 실례를 주소 문자열로 사용할 수 없습니다. 먼저 str
를 사용해서 변환해야 합니다.셸에서 디버그 충돌
만약 당신이 IDE 사용을 거부하는 사람 중 한 명이고Vim이나 Emacs에서 코드를 작성한다면, IDE에서 유사한 디버거를 사용하는 것이 매우 유용할 수 있습니다.너 그거 알아?프로그램이 끝나면
python3.8 -i
인터랙티브 셸을 시작합니다. 모든 변수와 호출 함수를 탐색할 수 있습니다.괜찮은데 실제 디버거(-i
는?다음 절차
pdb
를 사용하겠습니다.def func():
return 0 / 0
func()
script.py
를 사용하여 스크립트 실행# Script crashes...
Traceback (most recent call last):
File "script.py", line 4, in <module>
func()
File "script.py", line 2, in func
return 0 / 0
ZeroDivisionError: division by zero
>>> import pdb
>>> pdb.pm() # Post-mortem debugger
> script.py(2)func()
-> return 0 / 0
(Pdb)
우리는 붕괴된 곳을 보았다. 이제 중단점을 설정하자.def func():
breakpoint() # import pdb; pdb.set_trace()
return 0 / 0
func()
이제 다시 실행:script.py(3)func()
-> return 0 / 0
(Pdb) # we start here
(Pdb) step
ZeroDivisionError: division by zero
> script.py(3)func()
-> return 0 / 0
(Pdb)
대부분의 경우, 프린터 문장과 거슬러 올라가는 것은 디버깅에 충분하지만, 프로그램 내부에서 무슨 일이 일어났는지 알아보기 위해 사방을 둘러보아야 할 때가 있습니다.이러한 경우 프로그램을 실행할 때 실행이 중단되는 중단점을 설정할 수 있습니다. 예를 들어 함수 매개 변수를 열거하거나 표현식을 계산하거나 변수를 열거하거나 위와 같이 한 단계로 실행할 수 있습니다.python3.8 -i script.py
는 기능이 완비된python 셸이기 때문에 어떤 조작도 할 수 있지만 디버거 명령이 필요합니다. 찾을 수 있습니다here하나의 클래스에서 여러 개의 구조 함수를 정의하다
함수 리셋은 프로그래밍 언어에서는 매우 흔하지만, 파이톤에서는 흔치 않다.일반 함수를 다시 로드할 수 없더라도 클래스 방법을 사용하여 구조 함수를 다시 로드할 수 있습니다.
import datetime
class Date:
def __init__(self, year, month, day):
self.year = year
self.month = month
self.day = day
@classmethod
def today(cls):
t = datetime.datetime.now()
return cls(t.year, t.month, t.day)
구조 함수를 대체하는 모든 논리를 pdb
에 넣고 __init__
, *args
, **kwargs
문장 한 무더기 if
를 사용해서 해결하는 경향이 있을 수 있습니다.이것은 효과가 있을 수 있지만, 읽거나 유지하기가 어려워질 수도 있다.따라서 __init__
에 아주 적은 논리를 넣고 단독 방법/구조 함수에서 모든 조작을 수행하는 것을 권장합니다.이런 방식을 통해, 당신은 클래스의 관리자와 사용자에게 명확한 코드를 얻을 수 있습니다.Decorator 캐시 함수를 사용하여 호출
값비싼 입출력 작업을 수행하는 함수나 상당히 느린 귀속 함수를 만들어 캐시 (기억) 결과에서 이득을 보았습니까?
만약 당신이 이렇게 한다면
lru_cache
중의 functools
를 사용하면 이 문제를 쉽게 해결할 수 있습니다.from functools import lru_cache
import requests
@lru_cache(maxsize=32)
def get_with_cache(url):
try:
r = requests.get(url)
return r.text
except:
return "Not Found"
for url in ["https://google.com/",
"https://martinheinz.dev/",
"https://reddit.com/",
"https://google.com/",
"https://dev.to/martinheinz",
"https://google.com/"]:
get_with_cache(url)
print(get_with_cache.cache_info())
# CacheInfo(hits=2, misses=4, maxsize=32, currsize=4)
이 예에서는 캐시 중인 GET 요청(최대 32개의 캐시 결과)을 수행합니다.우리는 cache_info
방법으로 함수의 캐시 정보를 검사할 수 있습니다.decorator는 캐시 결과를 무효화시키는 clear_cache
방법을 제공했다.부작용이 있는 함수나 호출할 때마다 가변 대상을 만드는 함수에 사용해서는 안 된다는 점도 지적하고 싶다.Iterable에서 가장 자주 나타나는 항목 찾기
목록에서 가장 흔히 볼 수 있는 항목을 찾는 것은 매우 흔한 작업입니다.
for
순환과 사전 (map) 을 사용해서 완성할 수 있지만, 이것은 시간을 낭비하는 것입니다. Counter
모듈에 collections
클래스가 있기 때문입니다.from collections import Counter
cheese = ["gouda", "brie", "feta", "cream cheese", "feta", "cheddar",
"parmesan", "parmesan", "cheddar", "mozzarella", "cheddar", "gouda",
"parmesan", "camembert", "emmental", "camembert", "parmesan"]
cheese_count = Counter(cheese)
print(cheese_count.most_common(3))
# Prints: [('parmesan', 4), ('cheddar', 3), ('gouda', 2)]
엔진 덮개 아래Counter
는 항목이 나타나는 횟수에 비추는 사전일 뿐입니다dict
.print(cheese_count["mozzarella"])
# Prints: 1
cheese_count["mozzarella"] += 1
print(cheese_count["mozzarella"])
# Prints: 2
이외에도 update(more_words)
방법으로 계수기에 더 많은 요소를 쉽게 추가할 수 있습니다.Counter
의 또 다른 멋진 특성은 수학 연산(덧셈과 뺄셈)을 사용하여 조합과 뺄셈Counter
의 실례를 만들 수 있다는 것이다.결론
이번에 파이톤을 사용하면 내가 여기서 공유하는 대부분의 기교가 거의 매일 유용하다고 생각하기 때문에 나는 그것들이 쓸모가 있기를 바란다.또한 이러한 파이톤 기교에 대해 어떤 생각이 있거나 상술한 문제를 해결하는 더 좋은 방법을 알고 있다면 저에게 알려주세요!🙂
Reference
이 문제에 관하여(파이썬 힌트와 기교, 아직 보지 못했습니다. 두 번째 부분입니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/martinheinz/python-tips-and-trick-you-haven-t-already-seen-part-2-p78텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)