파이썬 힌트와 기교, 아직 보지 못했습니다. 두 번째 부분입니다.

19848 단어 pythonlearningtutorial
참고: 이 메시지는 martinheinz.dev
몇 주 전에 사람들이 잘 알지 못하는 파이톤의 특성에 관한 기사 ()를 발표했는데, 많은 사람들이 그것을 좋아하는 것 같아서, 다음은 또 다른 파이톤의 특성입니다. 아직 보지 못하셨으면 합니다.
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의 실례를 만들 수 있다는 것이다.

결론
이번에 파이톤을 사용하면 내가 여기서 공유하는 대부분의 기교가 거의 매일 유용하다고 생각하기 때문에 나는 그것들이 쓸모가 있기를 바란다.또한 이러한 파이톤 기교에 대해 어떤 생각이 있거나 상술한 문제를 해결하는 더 좋은 방법을 알고 있다면 저에게 알려주세요!🙂

좋은 웹페이지 즐겨찾기