>백엔드 개발 >파이썬 튜토리얼 >Python을 시작하기 위한 고급 기능

Python을 시작하기 위한 고급 기능

黄舟
黄舟원래의
2016-12-16 16:34:421383검색

서문

이러한 새로운 기능은 이전에 c/c++에서 볼 수 없었고, c/c++에서는 이를 지원하지 않습니다.

2조각

무를 썰어서 무의 특정 부분을 얻는다고 상상하면 되는데, 여기서는 아주 잘게 썬다는 비유입니다. Python의 슬라이싱 작업은 목록이나 튜플의 특정 세그먼트를 가져오는 것입니다.

예를 들어 다음과 같이 정의된 목록이 있습니다.

#define a list
l=['Luffy','Corey','Nancy','Jeffrey',' Kyle', 'Avery','Jason','Sunny']

처음 세 요소를 가져오는 방법은 두 가지가 있습니다. 코드는 다음과 같습니다.

>> ;>l[ :3]
['루피', '코리', '낸시']
>>> , '낸시']

즉, 0부터 시작하면 생략해도 됩니다.

2~4번째 요소를 가져오는 코드는 다음과 같습니다.

>>> l[1:5]

['Corey', 'Nancy', ' Jeffrey', 'Kyle']

두 번째부터 마지막까지 가져오는 코드는 다음과 같습니다.

>>> ]

[ 'Jason', 'Sunny']

목록의 길이를 모르고 전체 목록의 내용을 가져오는 코드는 다음과 같습니다.

>>> l[:]

['루피', '코리', '낸시', '제프리', '카일', '에이버리', '제이슨', '써니']

매번 전체 목록에서 2개 중 1개를 선택하세요:

>>> l[::2]

['Luffy', 'Nancy', 'Kyle' , 'Jason']

목록의 처음 6개 항목 중 2개 항목을 선택합니다.

>>> ['Luffy', 'Nancy', 'Kyle']



실제 편집 코드에서는 아래와 같이 슬라이싱 작업에서 목록을 가리키는 변수를 목록 자체로 대체할 수 있는 경우가 많습니다. :

>> ['루피', '코리', '낸시', '제프리', '카일', '에이버리', '제이슨', '써니'][:3]

['Luffy', 'Corey' , 'Nancy']



튜플과 문자열 모두 리스트로 간주할 수 있으므로 위 구문을 사용할 수도 있습니다.

세 가지 목록 생성

목록 생성(List CompRehensions)은 목록 생성을 위해 Python에 내장된 매우 강력한 생성입니다.

가장 간단한 예로, 1부터 10까지의 목록을 만들려면

list(range(1,11))


을 간단하게 사용할 수 있습니다. 단 한 줄의 코드로 완료됩니다. 하지만 더 복잡한 목록을 생성하는 것은 어떻습니까?

[1x1, 2x2, 3x3,...,10x10]과 같은 목록을 생성하는 방법은 무엇입니까? 물론 루프를 사용하여 달성할 수 있지만 코드가 너무 복잡합니다. 목록 생성을 사용하려면 다음 코드 줄만 필요합니다.

>>> 11)]

[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]



짝수의 제곱만 더하면 복잡하지 않다 , for 루프 뒤에 if 판단 조건을 추가하기만 하면 됩니다.

>>> [x*x for x in range(1,11) if x % 2 == 0]

[4, 16, 36, 64, 100]



2단계 루프를 사용할 수도 있습니다.

>>> [x+y for x in 'ABC' for y in 'XYZ']

[' AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']



리스트를 엄청 많이 썼네요 세대 표현이라면 다들 이 문법의 유래를 이해하고 계실 거라 생각합니다. 실제로는 일반 구문을 뒤집어 가장 안쪽 계산을 먼저 넣는 것입니다. 예를 들어, 마지막 목록 생성은 다음 일반 구문으로 작성할 수 있습니다:

for x in 'ABC':

for y in 'XYZ':

print(x+y)


4개의 생성자

리스트 생성을 이용하면 바로 리스트를 생성할 수 있지만, 메모리의 한계를 고려하면 많은 수의 리스트를 생성할 수는 없습니다. 요소, 이때 우리는 무엇을 해야 할까요?

Python은 생성기라는 메커니즘을 제공합니다. 생성기를 사용하여 후속 요소를 계산할 수 있으므로 모든 요소를 ​​한 번에 생성할 필요가 없습니다. 제너레이터를 생성하는 방법은 두 가지가 있습니다.

첫 번째 방법: 목록 생성 표현식의 []를 ()로 변경하여 제너레이터를 생성합니다.

다음 코드와 같습니다.

>>> g=(x for x in range(10))

>> > ; print(next(g))

0


생성기의 첫 번째 요소를 가져오려면 g에서 next 함수를 직접 호출할 수 있습니다. 물론 for 루프를 사용하여 다음 단계에서 전체 생성기에서 생성된 데이터를 탐색할 수도 있습니다.

두 번째 방법: 계산 방법이 너무 복잡해서 리스트 생성이 불가능할 경우 함수를 통해 구현할 수 있습니다. 목록 생성에서 생성기로 이동하는 것과 비교하면 함수에서 생성기로 이동하는 것도 매우 간단합니다. 함수를 먼저 작성한 다음 특정 위치에 Yield 키워드를 추가하기만 하면 됩니다.

예를 들어 피보나치 수열을 생성하는 함수는 다음과 같습니다.

def fib(max):
n, a, b = 0, 0, 1
while n < max ; 이 함수를 생성기로 변환하려면 print(b) 코드 줄을 Yield b로 바꾸십시오.

def fib(max):
n, a, b = 0, 0, 1
n < max:
항복 b

a, b = b, a + b

n = n + 1

return 'done'



Yield 키워드가 포함된 함수는 더 이상 함수가 아니라 생성기입니다. 제너레이터의 실행 프로세스는 함수의 실행 프로세스와 다르다는 점에 유의해야 합니다. 생성기는 항복을 만나면 반환되고 다음 호출 시 마지막 반환된 항복부터 실행을 계속합니다.



5개의 반복자

for 루프에서 직접 작동할 수 있는 객체를 총칭하여 반복 가능한 객체라고 합니다. isinstance()를 사용하여 객체가 객체인지 확인할 수 있습니다. 반복 가능한 객체입니다. 제너레이터는 for 루프뿐만 아니라 next()를 사용하여 탐색할 수도 있습니다. next() 함수에 의해 호출될 수 있는 객체를 호출하고 집합적으로 반복자라고 불리는 다음 값인 Iterator를 지속적으로 반환합니다.

여기서는 Iterable과 Iterator를 구별해야 합니다. List, dict 및 str은 모두 Iterable이지만 Iterator는 아닙니다(iter() 함수를 사용하여 Iterable을 Iterator로 바꿀 수 있습니다). Iterator는 무한한 데이터 스트림일 수 있으며 전체 시퀀스의 길이를 미리 알 수 없습니다. 이는 Iterable이 충족할 수 없는 요구 사항입니다.

Six Postscript

여기에 언급된 내용은 Python에서만 배웠던 새로운 프로그래밍 기능입니다. 오류가 있으면 메시지를 남겨주세요! ! !

위 내용은 Python 입문 학습을 위한 고급 기능 내용입니다. 더 많은 관련 글은 PHP 중국어 홈페이지(www.php.cn)를 참고해주세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.