사용자 입력 정리 문제는 프로그래밍 과정에서 매우 흔히 발생합니다. 종종 문자를 소문자 또는 대문자로 변환하는 것만으로도 충분하며 때로는 정규식 모듈 "Regex"를 사용하여 작업을 수행할 수 있습니다. 하지만 문제가 복잡하다면 더 나은 해결 방법이 있을 수 있습니다.
user_input = "Thisnstring hastsome whitespaces...rn" 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"를 사용하여 생성할 수 있습니다. one "islice" 객체는 우리가 원하는 항목을 생성하는 반복자입니다. 그러나 이 작업은 "islice" 객체의 모든 항목뿐만 아니라 슬라이스 이전의 모든 생성기 항목도 사용한다는 점에 유의해야 합니다.
때로는 원치 않는 줄(예: 주석)로 시작하는 일부 파일을 처리해야 할 때가 있습니다. "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)
이 코드는 초기 주석 부분 이후의 내용만 인쇄합니다. 이 방법은 반복 가능한 객체의 시작 부분(이 경우 시작 주석 줄)만 삭제하려는 경우에 유용하지만 이 부분이 얼마나 오래 지속되기를 원하는지 알 수 없습니다.
다음 함수를 사용할 때 더 명확한 함수 정의를 제공하기 위해 키워드 인수만 입력으로 요구하는 함수를 생성하는 것이 도움이 될 수 있습니다.
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" 문을 사용하여 파일을 열거나 잠금을 얻는 방법을 알고 있지만 고유한 상황별 표현을 구현할 수 있나요? 예, "__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의 관리자 데코레이터를 사용하여 콘텐츠 관리 프로토콜을 구현합니다. with 블록이 진입하면 태그 함수의 첫 번째 부분(yield 이전 부분)이 실행되고, 이어서 with 블록이 실행되고, 마지막으로 태그 함수의 나머지 부분이 실행됩니다.
특정 클래스의 인스턴스를 많이 생성하는 프로그램을 작성한 적이 있다면 프로그램에 갑자기 많은 메모리가 필요하다는 사실을 눈치채셨을 것입니다. Python은 클래스 인스턴스의 속성을 나타내기 위해 사전을 사용하기 때문에 속도는 빠르지만 메모리 효율성은 그리 높지 않습니다. 일반적으로 이는 심각한 문제가 아닙니다. 그러나 프로그램이 이로 인해 심각한 영향을 받는다면 "__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__" 속성을 정의할 때 Python은 속성을 표시하기 위해 사전을 사용하지 않고 작은 고정 크기를 사용합니다. 이렇게 하면 인스턴스당 필요한 메모리가 크게 줄어듭니다. "__slots__"을 사용하면 몇 가지 단점도 있습니다. 새 속성을 선언할 수 없으며 "__slots__"의 기존 속성만 사용할 수 있습니다. 게다가 "__slots__"가 있는 클래스는 다중 상속을 사용할 수 없습니다.
프로그램의 메모리나 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가 한도를 초과하면 시스템에 종료 신호를 보냅니다. 메모리 사용량 측면에서 소프트 제한과 하드 제한을 다시 검색하고 "size" 매개변수와 이전에 검색된 하드 제한과 함께 "setrlimit"를 사용하여 설정합니다.
일부 언어에는 멤버(변수, 메서드, 인터페이스)를 내보내는 매우 명확한 메커니즘이 있습니다. 예를 들어 Golang에서는 대문자로 시작하는 멤버만 내보냅니다. 그러나 Python에서는 모든 멤버를 내보냅니다("__all__"을 사용하지 않는 한).
def foo(): pass def bar(): pass __all__ = ["bar"]
위 코드에서는 "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」装饰器简化实现对类实例排序的过程。我们只需要定义「__lt__」和「__eq__」就可以了,它们是实现其余操作所需要的最小的操作集合(这里也体现了装饰器的作用——为我们填补空白)。
并非本文中所有提到的功能在日常的 Python 编程中都是必需或有用的,但是其中某些功能可能会不时派上用场,而且它们也可能简化一些原本就很冗长且令人烦恼的任务。还需指出的是,所有这些功能都是 Python 标准库的一部分。而在我看来,其中一些功能似乎并不像标准库中包含的标准内容,所以当你使用 Python 实现本文提到的某些功能时,请先参阅 Python 的标准库,如果你不能找到想要的功能,可能只是因为你还没有尽力查找(如果真的没有,那它肯定也存在于一些第三方库)。
위 내용은 고급 Python 프로그래밍, 일반적으로 사용되는 8가지 기술!의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!