서문
이러한 새로운 기능은 이전에 c/c++에서 볼 수 없었고, c/c++에서는 이를 지원하지 않습니다.
2조각
무를 썰어서 무의 특정 부분을 얻는다고 상상하면 되는데, 여기서는 아주 잘게 썬다는 비유입니다. Python의 슬라이싱 작업은 목록이나 튜플의 특정 세그먼트를 가져오는 것입니다.
예를 들어 다음과 같이 정의된 목록이 있습니다.
#define a list
l=['Luffy','Corey','Nancy','Jeffrey',' Kyle', 'Avery','Jason','Sunny']
처음 세 요소를 가져오는 방법은 두 가지가 있습니다. 코드는 다음과 같습니다.
>> ;>l[ :3]
['루피', '코리', '낸시']
>>> , '낸시']
['Corey', 'Nancy', ' Jeffrey', 'Kyle']
[ 'Jason', 'Sunny']
['루피', '코리', '낸시', '제프리', '카일', '에이버리', '제이슨', '써니']
['Luffy', 'Nancy', 'Kyle' , 'Jason']
실제 편집 코드에서는 아래와 같이 슬라이싱 작업에서 목록을 가리키는 변수를 목록 자체로 대체할 수 있는 경우가 많습니다. :
>> ['루피', '코리', '낸시', '제프리', '카일', '에이버리', '제이슨', '써니'][: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
n = n + 1
return 'done'
Yield 키워드가 포함된 함수는 더 이상 함수가 아니라 생성기입니다. 제너레이터의 실행 프로세스는 함수의 실행 프로세스와 다르다는 점에 유의해야 합니다. 생성기는 항복을 만나면 반환되고 다음 호출 시 마지막 반환된 항복부터 실행을 계속합니다.
5개의 반복자