Python 힌트와 기교를 아직 보지 못했습니다
18956 단어 python
Python의 멋진 특성에 대한 글이 많습니다. 예를 들어 변수 해제, 일부 함수, 중복 사용 가능한 항목이 많지만 Python에서 논의할 것이 많기 때문에 여기서 제가 알고 사용하는 특성을 보여 드리겠습니다. 이런 특성들은 다른 곳에서 언급하지 않았습니다.시작하자.
문자열 입력 정리
사용자 입력 문제를 정리하는 것은 거의 모든 프로그램에 적용됩니다.일반적으로 문자를 소문자 또는 대문자로 변환하면 충분하며 정규 표현식을 사용하여 작업을 수행할 수도 있지만 복잡한 경우에는 더 나은 방법이 있을 수 있습니다.
user_input = "This\nstring has\tsome whitespaces...\r\n"
character_map = {
ord('\n') : ' ',
ord('\t') : ' ',
ord('\r') : None
}
user_input.translate(character_map) # This string has some whitespaces...
이 예에서는 공백 문자'\n'과'\t'가 하나의 공백으로 바뀌었고'\r'가 완전히 삭제된 것을 볼 수 있습니다.이것은 간단한 예이지만, 우리는 unicodedata
패키지와 combining()
함수를 사용하여 문자열에서 모든 중음 기호를 삭제하는 데 사용할 수 있는 큰 재영사표를 생성할 수 있다.교체기의 슬라이스 가져오기
만약 교체기를 절단하려고 시도한다면, 당신은
TypeError
을 얻을 수 있습니다. 생성기의 대상은 표시할 수 없지만 간단한 해결 방안이 있습니다.import itertools
s = itertools.islice(range(50), 10, 20) # <itertools.islice object at 0x7f70fab88138>
for val in s:
...
itertools.islice
을 사용하면 우리는 islice
대상을 만들 수 있습니다. 이것은 교체기로서 필요한 항목을 생성할 수 있습니다.그러나 주의해야 할 것은 슬라이스가 시작되기 전의 모든 생성기 항목과 islice
대상 중의 모든 항목이 소모된다는 것이다.Iterable 시작 건너뛰기
때때로, 너는 반드시 몇 가지 파일을 처리해야 한다. 너는 이 파일들의 시작에 주석과 같은 필요 없는 줄이 매우 많다는 것을 안다.
itertools
은 다음과 같은 간단한 솔루션을 제공합니다.string_from_file = """
// Author: ...
// License: ...
//
// Date: ...
Actual content...
"""
import itertools
for line in itertools.dropwhile(lambda line: line.startswith("//"), string_from_file.split("\n")):
print(line)
이 코드 세그먼트는 초기 주석 섹션 이후에만 행을 생성합니다.만약 우리가iterable의 첫머리에 항목 (이 예의 줄) 을 버리고 그 중 몇 항목이 있는지 모른다면, 이런 방법은 매우 유용하다.키워드 매개 변수만 포함하는 함수 (kwargs)
이 함수를 사용하는 경우 보다 선명한 함수를 제공하기 위해 키워드 매개변수만 사용하는 함수를 생성하는 것이 도움이 될 수 있습니다.
def test(*, a, b):
pass
test("value for a", "value for b") # TypeError: test() takes 0 positional arguments...
test(a="value", b="value 2") # Works...
보시다시피 키워드 파라미터 앞에 *
파라미터를 놓으면 이 문제를 쉽게 해결할 수 있습니다.만약 우리가 위치 파라미터를 *
파라미터 앞에 두면 분명히 위치 파라미터가 있을 것이다.with
문을 지원하는 객체를 만드는 중예를 들어 우리는
with
문구를 사용하여 파일을 열거나 자물쇠를 가져오는 방법을 알고 있지만, 우리는 정말로 자신의 자물쇠를 실현할 수 있습니까?예. __enter__
과 __exit__
방법을 사용하여 컨텍스트 관리자 프로토콜을 구현할 수 있습니다.class Connection:
def __init__(self):
...
def __enter__(self):
# Initialize connection...
def __exit__(self, type, value, traceback):
# Close connection...
with Connection() as c:
# __enter__() executes
...
# conn.__exit__() executes
이것은 Python에서 컨텍스트 관리를 구현하는 데 가장 많이 사용되는 방법이지만 보다 간단한 방법이 있습니다.from contextlib import contextmanager
@contextmanager
def tag(name):
print(f"<{name}>")
yield
print(f"</{name}>")
with tag("h1"):
print("This is Title.")
위의 코드 세션은 contextmanager
관리자 장식기를 사용하여 내용 관리 프로토콜을 실현한다.tag
블록에 들어갈 때 yield
함수의 첫 부분(with
이전)을 실행하고 이 블록을 실행하며 마지막으로 tag
함수의 나머지 부분을 실행한다.__slots__
으로 메모리 절감프로그램을 작성한 적이 있다면, 프로그램이 특정한 종류의 대량의 실례를 만들었을 때, 프로그램이 갑자기 대량의 메모리를 필요로 한다는 것을 알 수 있을 것입니다.이것은 파이톤이 클래스 실례의 속성을 사전으로 표시하기 때문에 속도가 매우 빠르지만 메모리 효율이 높지 않기 때문에 보통 문제가 되지 않는다.그러나 프로그램에 문제가 발생할 경우
__slots__
을 사용해 보십시오.class Person:
__slots__ = ["first_name", "last_name", "phone"]
def __init__(self, first_name, last_name, phone):
self.first_name = first_name
self.last_name = last_name
self.phone = phone
여기에서 발생한 일은 우리가 __slots__
속성을 정의할 때 파이톤은 속성에 대해 사전이 아닌 작은 고정 크기 그룹을 사용해서 모든 실례에 필요한 메모리를 크게 줄였다.__slots__
을 사용하는 것도 단점이 있습니다. 우리는 어떤 새로운 속성도 성명할 수 없습니다. 우리는 __slots__
에서만 이러한 속성을 사용할 수 있습니다.이 밖에 __slots__
의 종류는 다중 계승을 사용할 수 없다.CPU 및 메모리 사용 제한
프로그램 메모리나 CPU 사용률을 최적화하지 않고 하드 숫자로 직접 제한하려는 경우 Python에도 다음 라이브러리가 있습니다.
import signal
import resource
import os
# To Limit CPU time
def time_exceeded(signo, frame):
print("CPU exceeded...")
raise SystemExit(1)
def set_max_runtime(seconds):
# Install the signal handler and set a resource limit
soft, hard = resource.getrlimit(resource.RLIMIT_CPU)
resource.setrlimit(resource.RLIMIT_CPU, (seconds, hard))
signal.signal(signal.SIGXCPU, time_exceeded)
# To limit memory usage
def set_max_memory(size):
soft, hard = resource.getrlimit(resource.RLIMIT_AS)
resource.setrlimit(resource.RLIMIT_AS, (size, hard))
여기서 최대 CPU 실행 시간과 최대 메모리 사용 제한을 설정하는 두 가지 옵션을 볼 수 있습니다.CPU 제한에 대해 우리는 먼저 특정 자원에 대한 소프트 제한과 하드 제한(RLIMIT_CPU
)을 얻은 다음에 파라미터가 지정한 초수와 이전에 검색한 하드 제한을 사용하여 그것을 설정한다.마지막으로 CPU 시간을 초과하면 시스템이 종료되는 신호를 등록합니다.메모리에 대해서는 소프트 제한과 하드 제한을 다시 검색하고 크기 파라미터가 있는 setrlimit
과 검색된 하드 제한을 사용합니다.가져올 수 있는 항목 및 가져올 수 없는 항목 제어
일부 언어는 구성원(변수, 방법, 인터페이스)을 뚜렷하게 내보내는 메커니즘이 있다. 예를 들어 Golang은 대문자로 시작하는 구성원만 내보낸다.다른 한편, 파이톤에서는
__all__
을 사용하지 않는 한 모든 내용을 내보냅니다.def foo():
pass
def bar():
pass
__all__ = ["bar"]
위의 코드 세션을 사용하면 from some_module import *
을 사용할 때 가져올 수 있는 내용을 제한할 수 있습니다.이 특정 예제에서 와일드카드 가져오기에는 가져오기 bar
만 포함됩니다.또한 __all__
을 비워 두었다가 와일드카드 가져오기를 사용하여 모듈에서 가져올 때 어떤 내용도 내보내지 않아 AttributeError
을 만들 수 있습니다.비교 연산자는 간단한 방법의 하나이다
한 종류를 위해 모든 비교 연산자를 실현하는 것은 매우 번거로울 수 있다. 왜냐하면 그 중에는 상당히 많은 비교 연산자인
__lt__ , __le__ , __gt__ ,
또는 __ge__
이 있기 때문이다.그런데 더 쉬운 방법이 있다면?functools.total_ordering
구조:from functools import total_ordering
@total_ordering
class Number:
def __init__(self, value):
self.value = value
def __lt__(self, other):
return self.value < other.value
def __eq__(self, other):
return self.value == other.value
print(Number(20) > Number(3))
print(Number(1) < Number(5))
print(Number(15) >= Number(15))
print(Number(10) <= Number(2))
이게 도대체 어떻게 된 일입니까?total_ordering
decorator는 클래스의 인스턴스 정렬을 단순화하는 데 사용됩니다.__lt__
과 __eq__
을 정의하면 나머지 조작을 비추는 데 필요한 최소값이며, 이것은 장식사의 작업입니다. 이것은 우리의 공백을 메우는 것입니다.결론
모든 이러한 특성이 일상적인 Python 프로그래밍에서 필요하고 유용한 것은 아니지만, 그 중 일부 특성은 때때로 쓸모가 있을 수도 있고, 임무를 간소화할 수도 있다. 그렇지 않으면 이런 임무는 매우 지루하고 실현하기 어려울 것이다.내가 지적하고 싶은 것은 모든 이 기능들은 파이톤 표준 라이브러리의 일부분이다. 내가 보기에 그 중 일부 기능은 표준 라이브러리에서 매우 비표준적인 것 같다. 그래서 파이톤에서 뭔가를 실현하기로 결정할 때마다 먼저 표준 라이브러리에서 그것을 찾는다. 만약 당신이 그것을 찾지 못한다면,만약 그것이 정말 거기에 없다면, 그것은 틀림없이 어느 제3자 라이브러리에 있을 것이다.🙂
Reference
이 문제에 관하여(Python 힌트와 기교를 아직 보지 못했습니다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/martinheinz/python-tips-and-trick-you-haven-t-already-seen-1p41텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)