이 글에서는 튜터, 데코레이터 등 중요한 고급 지식 포인트를 포함하여 Python의 일부 고급 프로그래밍 기술을 주로 소개합니다. Python 개발을 심층적으로 학습하는 데 필요한 기본 기술입니다.
텍스트:
이 문서에서는 몇 가지 고급 Python 디자인 구조와 사용 방법을 보여줍니다. 일상 업무에서는 빠른 검색 가능성 요구 사항, 데이터 일관성 요구 사항, 인덱스 요구 사항 등 필요에 따라 적절한 데이터 구조를 선택할 수 있습니다. 또한 다양한 데이터 구조를 적절하게 결합하여 논리적이고 효율적인 데이터 구조를 생성할 수도 있습니다. 이해하기 쉬운 데이터 모델. Python의 데이터 구조는 구문적으로 매우 직관적이며 많은 선택적 작업을 제공합니다. 이 가이드에서는 일반적으로 사용되는 대부분의 데이터 구조 지식을 종합하고 최상의 사용법에 대한 논의를 제공합니다.
Comprehensions
Python을 오랫동안 사용해 왔다면 적어도 List Comprehensions에 대해 들어본 적이 있을 것입니다. for 루프, if 표현식, 대입문을 하나의 문장에 담는 방식입니다. 즉, 표현식을 통해 목록을 매핑하거나 필터링할 수 있습니다.
리스트 컴프리헨션은 다음 부분을 포함합니다:
입력 시퀀스
입력 시퀀스의 멤버를 나타내는 변수
선택적 어설션 표현식
입력 시퀀스 어설션 표현식은 출력 목록 구성원의 출력 표현식으로 변환됩니다
예를 들어, 0보다 큰 모든 정수를 제곱하여 입력 목록에서 새 시퀀스를 생성해야 합니다. 다음과 같이 쓸 수 있습니다.
num = [1, 4, -5, 10, -7, 2, 3, -1] filtered_and_squared = [] for number in num: if number > 0: filtered_and_squared.append(number ** 2) print filtered_and_squared # [1, 16, 100, 4, 9]
쉽습니다. 오른쪽? 그러나 이는 4줄의 코드, 두 가지 수준의 중첩 및 완전히 불필요한 추가 작업이 됩니다. 필터, 람다, 맵 함수를 사용하면 코드가 크게 단순화될 수 있습니다.
num = [1, 4, -5, 10, -7, 2, 3, -1] filtered_and_squared = map(lambda x: x ** 2, filter(lambda x: x > 0, num)) print filtered_and_squared # [1, 16, 100, 4, 9]
글쎄, 이렇게 하면 코드가 가로 방향으로 확장됩니다. 그러면 계속해서 코드를 단순화할 수 있을까요? 목록 파생을 통해 답을 얻을 수 있습니다.
num = [1, 4, -5, 10, -7, 2, 3, -1] filtered_and_squared = [ x**2 for x in num if x > 0] print filtered_and_squared # [1, 16, 100, 4, 9]
반복자는 입력 시퀀스의 각 구성원을 순회하며 num은 출력 표현식에 제공되고 제곱된 후 출력 목록의 구성원이 됩니다.
목록 이해는 목록에 캡슐화되어 있으므로 즉시 새 목록을 생성할 수 있습니다. 유형 함수 호출만 있고 람다 함수에 대한 암시적 호출은 없습니다. 목록 이해에서는 일반 반복자, 표현식 및 if 표현식을 사용하여 선택적 매개변수를 제어합니다.
위 문제를 보면
Generator(Generator objector)를 생성하므로 한 번에 하나의 목록 요소만 로드됩니다.
생성기 표현식은 목록 이해와 거의 동일한 문법 구조를 가지고 있습니다. 차이점은 생성기 표현식이 대괄호 대신 괄호로 둘러싸여 있다는 것입니다.
num = [1, 4, -5, 10, -7, 2, 3, -1] filtered_and_squared = ( x**2 for x in num if x > 0 ) print filtered_and_squared # <generator object <genexpr> at 0x00583E18> for item in filtered_and_squared: print item # 1, 16, 100 4,9
num = [1, 4, -5, 10, -7, 2, 3, -1] def square_generator(optional_parameter): return (x ** 2 for x in num if x > optional_parameter) print square_generator(0) # <generator object <genexpr> at 0x004E6418> # Option I for k in square_generator(0): print k # 1, 16, 100, 4, 9 # Option II g = list(square_generator(0)) print g # [1, 16, 100, 4, 9]
alist = ['a1', 'a2', 'a3'] blist = ['1', '2', '3'] for a, b in zip(alist, blist): print a, b # a1 1 # a2 2 # a3 3
2단계 목록 이해를 통해 디렉토리
를 순회하는 예를 살펴보겠습니다.import os def tree(top): for path, names, fnames in os.walk(top): for fname in fnames: yield os.path.join(path, fname) for name in tree('C:\Users\XXX\Downloads\Test'): print name
데코레이터( 데코레이터)
데코레이터는 기존 함수나 클래스의 기능을 향상시키는 효과적인 방법을 제공합니다. Java의 관점 지향 프로그래밍(Aspect-Oriented 프로그래밍) 개념과 많이 비슷합니까? 둘 다 간단하지만 데코레이터가 더 강력합니다. 예를 들어, 함수의 시작 및 종료 지점에서 일부 특수 작업(일부 보안, 추적, 잠금 등)을 수행하려는 경우 데코레이터를 사용할 수 있습니다. 데코레이터는 다른 함수를 래핑하는 특수 함수입니다. 메인 함수가 호출되고, 그 반환 값이 데코레이터에 전달됩니다. 그런 다음 데코레이터는 메인 함수와 나머지 함수를 래핑하는 대체 함수를 반환합니다. 프로그램 여러분이 보는 것의 일부는 이 래퍼 함수입니다.
def timethis(func): ''' Decorator that reports the execution time. ''' pass @timethis def countdown(n): while n > 0: n -= 1
구문 설탕 @은 데코레이터를 식별합니다. 好了,让我们回到刚才的例子。我们将用装饰器做一些更典型的操作: 当你写下如下代码时: 意味着你分开执行了以下步骤: 装饰器函数中的代码创建了一个新的函数(正如此例中的wrapper函数),它用 *args 和 **kwargs 接收任意的输入参数,并且在此函数内调用原函数并且返回其结果。你可以根据自己的需要放置任何额外的代码(例如本例中的计时操作),新创建的包装函数将作为结果返回并取代原函数。 当编译器查看以上代码时,function()函数将会被编译,并且函数返回对象将会被传给装饰器代码,装饰器将会在做完相关操作之后用一个新的函数对象代替原函数。 装饰器代码是什么样的?大部分的例子都是将装饰器定义为函数,而我发觉将装饰器定义成类更容易理解其功能,并且这样更能发挥装饰器机制的威力。 对装饰器的类实现唯一要求是它必须能如函数一般使用,也就是说它必须是可调用的。所以,如果想这么做这个类必须实现call方法。 这样的装饰器应该用来做些什么?它可以做任何事,但通常它用在当你想在一些特殊的地方使用原函数时,但这不是必须的,例如: 위 내용은 Python의 고급 프로그래밍에 대한 몇 가지 팁 요약의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!import time
from functools import wraps
def timethis(func):
'''
Decorator that reports the execution time.
'''
@wraps(func)
def wrapper(*args, **kwargs):
start = time.time()
result = func(*args, **kwargs)
end = time.time()
print(func.name, end-start)
return result
return wrapper
@timethis
def countdown(n):
while n > 0:
n -= 1
countdown(100000)
# ('countdown', 0.006999969482421875)
@timethis
def countdown(n):
def countdown(n):
...
countdown = timethis(countdown)
@decorator
def function():
print("inside function")
class decorator(object):
def init(self, f):
print("inside decorator.init()")
f() # Prove that function definition has completed
def call(self):
print("inside decorator.call()")
@decorator
def function():
print("inside function()")
print("Finished decorating function()")
function()
# inside decorator.init()
# inside function()
# Finished decorating function()
# inside decorator.call()