Python 프로그래밍 언어에는 특정 규칙에 따라 채워진 목록을 만들 수 있는 특별한 구문 구조가 있습니다. 이러한 구조를 목록 생성기. 그들의 편의는 더 짧은 표기법에 있습니다 프로그램 코드목록이 일반적인 방식으로 생성된 경우보다.

예를 들어 특정 숫자까지 자연수로 채워진 목록을 만들어야 합니다. "고전적인" 방식은 다음과 같습니다.

>>>아= >>> 범위 (1 , 15 )의 i에 대해 : ...a.추가(i) ... >>>

목록을 만드는 데 세 줄의 코드가 필요했습니다. 제너레이터는 다음 중 하나로 수행합니다.

>>> a = [ i for i in range (1 , 15 ) ] >>>

여기 건설 [ i for i in range (1, 15) ]목록 생성기입니다. 전체 구성은 대괄호로 묶여 있으며, 이는 목록이 생성될 것이라고 말합니다. 대괄호 안에서 세 부분을 구분할 수 있습니다. 1) 요소로 수행하는 작업(이 경우에는 아무 것도 하지 않고 목록에 추가하기만 함), 2) 가져오는 작업(이 경우 요소 i) , 3) (여기서는 범위 개체에서) 에서 가져옵니다. 부품은 키워드로 서로 구분됩니다. ~을 위한그리고 안에.

다음 예를 고려하십시오.

>>> a = [ 2 , -2 , 4 , -4 , 7 , 5 ] >>> b = [i**2 for i in a] >>>ㄴ

이 경우 목록 생성기는 목록 a에서 각 요소를 가져와 제곱합니다. 따라서 1) 우리가 하는 일 - 우리는 요소를 제곱하고, 2) 우리가 취하는 것 - 요소, 3) 우리가 취하는 곳 - 목록에서 a .

>>> >>> b = [ i*a[ i] for i in a] >>>ㄴ

여기에서 키는 사전에서 가져오고 키와 해당 값의 곱이 생성된 목록에 추가됩니다.

>>> a = ( 1:10 , 2:20 , 3:30 ) >>> b = [ [ i, a[ i] ] for i in a] >>>ㄴ [, , ] >>> c = [ j for i in b for j in i] >>> ㄷ

이 예에서 생성된 목록 b는 중첩 목록으로 구성됩니다. 생성자가 식에서 대괄호를 생략한 경우 [이,아[이]], 오류가 발생합니다. 여전히 사전의 키와 값의 단일 수준 목록을 가져와야 하는 경우 각 중첩 목록을 가져와서 각 요소를 가져와야 합니다. 이것은 중첩 구조를 통해 달성됩니다. ~을 위한, 이는 c 라인에 표시됩니다. = [i에 대한 j in i에 대한 j에 대한 b]. 목록 c를 채우는 "클래식" 구문은 다음과 같습니다.

>>>c= >>> b의 i: ... i의 j에 대해: ...c.추가(j) ... >>> ㄷ

생성기 끝에 구성을 추가할 수 있습니다. 만약에. 예를 들어 문자열에서 모든 숫자를 추출해야 합니다. if i%30 == 0 or i%31 == 0 ] >>>

따라서 생성기를 사용하면 목록을 더 쉽고 빠르게 만들 수 있습니다. 그러나 그것들은 다소 복잡한 구조를 대체할 수 없습니다. 예를 들어 유효성 검사 조건에 분기가 포함되어야 하는 경우 또 다른.

Python 프로그래밍 언어에는 특정 규칙에 따라 채워진 목록을 만들 수 있는 특별한 구문이 있습니다. 생성된 목록은 다를 수 있고 구조의 내용은 다를 수 있으므로 목록 생성기라고 합니다. 항목이 목록을 생성하는 전통적인 방법만큼 길지 않기 때문에 편리합니다.

예를 들어, 특정 숫자까지의 자연수 목록이 필요합니다. 전통적인 방법다음과 같이 보일 것입니다:

>>> a = >>> for i in range(1,15): ... a.append(i) ... >>>

목록에는 세 줄의 코드가 필요했습니다. 그리고 생성기는 하나만 필요합니다.

>>> 에이 = >>> 에이

구성은 목록 생성기입니다. 모든 구성은 목록 생성을 반영하는 정사각형 목록에 배치되어야 합니다. 브래킷 내부에는 세 부분이 있습니다.

  1. 요소로 무엇을 할 것인가(우리 상황에서는 아무 것도 하지 않고 목록에 추가하기만 하면 됨).
  2. 우리는 무엇을 취할 것입니까 (우리는 요소 i를 취합니다).
  3. (범위 개체에서) 어디에서 가져올 것입니까? 부분을 ​​분리하려면 in 및 for 키워드를 사용하십시오.

예를 하나 보자

>>> a = >>> b = >>> b

이 상황에서 우리는 목록의 각 요소를 가져와 제곱합니다. 여기에서:

  1. 우리는 요소를 정사각형으로 올립니다.
  2. 우리는 요소를 취합니다.
  3. From - 목록에서 a.
>>> a = (1:10, 2:20, 3:30) >>> b = for i in a] >>> b

여기에서 사전에서 키를 가져오고 키와 해당 값의 곱이 생성된 목록에 들어갑니다.

>>> a = (1:10, 2:20, 3:30) >>> b = [] for i in a] >>> b [, , ] >>> c = >>> c

이 경우 목록 b에는 중첩 목록이 포함됩니다. 식에서 생성기에서 대괄호를 생략하면 오류가 발생합니다. 사전 값의 키가 있는 단일 수준 목록이 필요한 경우 각 중첩 목록을 가져와서 각 구성 요소를 가져와야 합니다. 이것은 nested for 구문으로 수행됩니다. 기존 목록 구문은 다음과 같습니다.

>>> c = >>> for i in b: ... for j in i: ... c.append(j) ... >>> c

목록 이해는 if 구조로 보완될 수 있습니다. 예를 들어 문자열에서 모든 숫자를 추출해야 합니다.

>>> a="lsj94ksd231 9" >>> b=

또는 31 또는 30의 배수인 숫자로 목록을 채우십시오.

>>> 에이 = >>> 에이

목록을 만드는 것이 훨씬 쉽고 빠릅니다. 그러나 다소 복잡한 구조를 대체하는 데 적합하지 않습니다. 예를 들어 검사 조건에 else 분기가 있는 경우입니다.

돈이 부족하고 월급날이 아직 몇 주 남았습니까? 빌릴 수는 있지만 아무도 없다면? 대출을 받으러 은행에 가지 마십시오. 이 경우 소액 대출이 도움이 될 것입니다. 사이트로 이동하여 신청서를 작성하면(매우 간단하고 빠름) 몇 분 안에 돈을 받게 됩니다! 매우 편리하고 빠르며 가장 중요한 것은 누구에게 물어볼 필요가 없다는 것입니다!

이상하게도 목록 이해(목록 생성기)는 새 목록 생성과 기존 목록 수정을 모두 포함하는 목록의 편리한 처리를 위해 설계되었습니다.

25를 초과하지 않는 홀수 목록을 가져와야 한다고 가정해 보겠습니다. 원칙적으로 xrange 명령의 작업에 익숙해지면 이 문제를 해결하는 것이 어렵지 않습니다.

Res = xrange(1, 25, 2)의 x에 대해: res.append(x) ... 인쇄 해상도

일반적으로 얻은 결과는 긴 기록을 제외하고 모든 것에 완전히 적합합니다. 이것은 우리의 "설탕"이 구출 될 곳입니다. 아주에서 간단한 양식, 그는 보통

해상도 = ... 인쇄 해상도

구문은 기본적으로 간단합니다. 전체 표현식은 대괄호로 표시됩니다. 먼저 목록의 요소를 설정하는 표현식이 나온 다음 표현식을 변경할 수 있는 루프가 나옵니다. 두 부분 모두 임의로 복잡할 수 있습니다. 예를 들어, 동일한 홀수의 제곱 목록을 얻는 방법은 다음과 같습니다.

선택적으로 추가할 수 있습니다. 추가 조건여과법. 예를 들어, 3으로 나눌 수 있는 숫자의 제곱이 제외되도록 이전 예제를 수정해 보겠습니다.

해상도 = ... 인쇄 해상도

작업 6.1. 목록 생성기

목록을 가져와야 합니다. 이진수정사각형이 아닌 것.

발전기

mylist와 같은 구성은 값이 메모리에 저장된 요소의 목록을 형성합니다. mylist: print(i) 구문에서 for i를 적용하여 원하는 만큼 요소를 사용할 수 있습니다.

제너레이터도 이터러블 객체이지만 한 번만 읽을 수 있습니다. 이는 값을 메모리에 저장하지 않고 즉석에서 생성하기 때문입니다.

mygenerator = (x*x for x in range(3)) for i in mygenerator: print(i)

사각형 대신 괄호가 사용된다는 점을 제외하고는 모든 것이 동일합니다. 그러나 mygenerator 구성에서 for i를 두 번째로 사용할 수는 없습니다. 제너레이터는 한 번만 사용할 수 있기 때문입니다. 생성기는 0으로 평가한 다음 잊어버리고 1로 평가하여 4로 끝납니다. 또한 len() 으로 요소 수를 얻을 수 없습니다. 제너레이터는 mygenerator로 슬라이싱할 수 없습니다. 그러나 생성기를 사용하면 프로그램을 실행하는 데 필요한 메모리 양을 줄일 수 있습니다.

생산하다

Yield는 return과 유사하게 사용되는 키워드입니다. 차이점은 함수가 생성기를 반환한다는 것입니다.

Def createGenerator() : mylist = range(3) for i in mylist: yield i*i mygenerator = createGenerator() # mygenerator에서 i용 생성기 생성: print(i)

작업 6.2. 사면체 수 생성기

삼각수 생성기를 사용하여 사면체 수 생성기를 생성합니다.

작업 6.3. 수혈 발생기

무한 풀과 두 개의 버킷을 사용하여 필요한 볼륨을 얻는 데 학교 문제가 있습니다. 예: 3리터와 5리터 용량의 버킷 2개를 사용하여 4리터를 가져와야 합니다. 당구공법으로 해결하는 방법이 있습니다.

선박의 충만 인 숫자 쌍을 생성하는 발전기를 만들어야합니다. 작업 예:

Buckets = pool(3,5) for,b in bucket: print("a=",a," b=",b) if b==4: break

오늘은 다음과 같은 데이터 유형에 대해 이야기하겠습니다. 기울기, 작업 및 방법, 목록 이해 및 목록 사용.

목록이란 무엇입니까?

Python의 목록은 임의 유형(배열과 유사하지만 유형은 다를 수 있음)의 개체의 정렬된 변경 가능한 컬렉션입니다.

목록을 사용하려면 목록을 만들어야 합니다. 목록을 만드는 방법에는 여러 가지가 있습니다. 예를 들어, 내장 함수를 사용하여 모든 반복 가능한 객체(예: )를 처리할 수 있습니다. 목록:

>>> 목록("목록") ["목록"]

리터럴을 사용하여 목록을 만들 수도 있습니다.

>>> s = # 빈 목록 >>> l = [ "s" , "p" , [ "isok" ], 2 ] >>> s >>> l ["s", "p", ["isok "], 2]

예제에서 볼 수 있듯이 목록에는 여러 개체(중첩 목록 포함)가 포함될 수도 있고 아무 것도 포함되지 않을 수 있습니다.

목록을 만드는 또 다른 방법은 목록 생성기. 목록 이해는 시퀀스의 각 요소에 표현식을 적용하여 새 목록을 구성하는 방법입니다. 목록 이해는 루프와 매우 유사합니다.

>>> c = [ c * 3 for c in "list" ] >>> c ["llll", "iii", "sss", "ttt"]

목록 생성기의 더 복잡한 구성도 가능합니다.

>>> c = [ c * 3 for c in "list" if c != "i" ] >>> c ["llll", "sss", "ttt"] >>> c = [ c + d for c in "list" if c != "i" for d in "spam" if d != "a" ] >>> c ["ls", "lp", "lm", "ss", "sp", "sm", "ts", "tp", "tm"]

그러나 복잡한 경우에는 일반 for 루프를 사용하여 목록을 생성하는 것이 좋습니다.

함수 및 메서드 나열

생성이 생성되었습니다. 이제 목록으로 작업을 수행해야 합니다. 기본 및 목록 방법은 목록에 사용할 수 있습니다.

메소드 테이블 나열

방법그는 무엇을하고있어
목록.추가(엑스)목록의 끝에 요소를 추가합니다.
목록.확장(엘)목록 L의 모든 요소를 ​​끝에 추가하여 목록 목록을 확장합니다.
목록.삽입(나, 엑스)i번째 요소에 값 x를 삽입합니다.
목록.제거(엑스)값이 x인 목록의 첫 번째 요소를 제거합니다. 해당 요소가 없는 경우 ValueError
목록.팝([나])i번째 요소를 제거하고 반환합니다. 인덱스를 지정하지 않으면 마지막 요소가 제거됩니다.
목록.색인(엑스,])값이 x인 첫 번째 요소의 위치를 ​​반환합니다(처음부터 끝까지 검색).
list.count(엑스)값이 x인 요소의 수를 반환합니다.
목록.정렬() 기능을 기반으로 목록 정렬
list.reverse() 목록을 확장합니다.
목록.복사() 목록의 얕은 사본
list.clear() 목록을 지웁니다

목록 메소드는 와 달리 목록 자체를 변경하므로 실행 결과를 이 변수에 쓸 필요가 없습니다.

>>> l = [ 1 , 2 , 3 , 5 , 7 ] >>> l . 정렬() >>> l >>> l = l . 정렬() >>> 인쇄(l) 없음

마지막으로 목록 작업의 예:

>>> a = [ 66.25 , 333 , 333 , 1 , 1234.5 ] >>> print (a .count(333),a.count(66.25),a.count("x")) 2 1 0 >>> ㅏ. 삽입 (2, - 1) >>> a . 추가(333) >>> >>> . 색인 (333) 1 >>> a . 제거(333) >>> >>> . 역방향() >>> >>> . 정렬() >>> [-1, 1, 66.25, 333, 333, 1234.5]

때때로 성능을 높이기 위해 목록이 훨씬 덜 유연한 목록으로 바뀝니다.

생성기 및 반복기는 일반적으로 스트리밍 데이터에 사용되는 도구입니다. 이번 강의에서는 반복자의 개념을 살펴보겠습니다. 파이썬, 자신만의 반복자를 만드는 방법과 생성기로 작업하는 방법을 알아보세요.

파이썬의 반복자

많은 현대 언어프로그래밍은 반복자와 같은 엔터티를 사용합니다. 주요 목적은 일반적으로 컬렉션(목록, 사전 등)인 개체의 요소를 통한 탐색을 단순화하는 것입니다. 언어 파이썬, 이 경우에도 예외는 아니며 반복자도 지원합니다. 반복자는 주어진 객체에 대해 다음을 반환하는 열거자 객체입니다. 다음 요소, 또는 더 이상 요소가 없으면 예외를 throw합니다.

반복자를 사용하는 주요 장소는 루프입니다. ~을 위한. 루프를 사용하여 일부 목록의 요소 또는 문자열의 문자를 반복하는 경우 ~을 위한, 그러면 사실, 이것은 루프를 반복할 때마다 문자열 / 목록에 포함된 반복기에 액세스하고 다음 요소를 반환해야 한다는 요구 사항을 의미합니다. 객체에 더 이상 요소가 없으면 반복기가 다음 요소를 던집니다. 루프 내에서 처리된 예외 ~을 위한사용자에게 보이지 않습니다.

다음은 이 개념을 더 잘 이해하는 데 도움이 되는 몇 가지 예입니다.먼저 임의 목록의 요소를 화면에 표시해 보겠습니다.

> > > num_list => > > for i in num_list: print (i) 1 2 3 4 5

이미 언급했듯이 요소가 루프에서 반복될 수 있는 객체 ~을 위한, iterator 객체를 포함합니다. 그것을 얻으려면 함수를 사용해야 합니다. 반복(), 반복자에서 다음 요소를 추출하려면 - 함수 다음().

> > > itr = iter(num_list) > > > print(next(itr)) 1 > > > print(next(itr)) 2 > > > print(next(itr)) 3 > > > print(next(itr) )) 4 > > > print(next(itr)) 5 > > > print(next(itr)) 역추적(가장 최근 호출 마지막): 파일 " " , 1행 , 에서< module>print (next(itr)) StopIteration

위의 예에서 볼 수 있듯이 함수 호출은 다음(itr)매번 목록에서 다음 요소를 반환하고 해당 요소가 다 떨어지면 예외가 발생합니다. 반복 중지.

나만의 반복자 만들기

고유한 클래스의 개체 내 요소를 반복해야 하는 경우 고유한 반복자를 빌드해야 합니다. 만들자객체를 생성할 때 사용자가 지정하는 특정 수의 단위를 생성하는 반복자가 될 객체의 클래스입니다. 이러한 클래스에는 단위 수를 입력으로 사용하는 생성자와 메서드가 포함됩니다. __다음__(), 이것이 없으면 이 클래스의 인스턴스는 반복자가 아닙니다.

__초기__ < self .limit: self .counter += 1 return 1 else : raise StopIteration s_iter1 = SimpleIterator(3 ) print (next(s_iter1)) print (next(s_iter1)) print (next(s_iter1)) print (next(s_iter1))

이 예에서는 네 번째 함수 호출에서 다음()예외가 발생합니다 반복 중지. 루프에서 주어진 객체로 작업할 수 있기를 원한다면 ~을 위한, 그 다음 수업으로 단순 반복자메소드를 추가해야 합니다 __iter__(), 반복자를 반환하는 이 경우 이 메서드는 반환해야 합니다. 본인.

클래스 SimpleIterator : def __이터__(self): self def를 반환 __초기__(self, limit): self .limit = limit self .counter = 0 def __next__ (self): if self .counter< self .limit: self .counter += 1 return 1 else : raise StopIteration s_iter2 = SimpleIterator(5 ) for i in s_iter2: print (i)

발전기

제너레이터는 반복자 생성을 훨씬 쉽게 만듭니다. 이전 예제에서 iterator를 빌드하고 작업하기 위해 별도의 클래스를 만들었습니다. 제너레이터는 함수에서 호출될 때 다음()작업 알고리즘에 따라 다음 객체를 반환합니다. 대신에 예어 반품발전기에서 사용 생산하다. 제너레이터가 어떻게 작동하는지 보는 가장 쉬운 방법은 예제를 보는 것입니다. 필요한 단위 수를 생성하는 함수를 작성해 보겠습니다.

def simple_generator (val ): val > 0 : val -= 1 yield 1 gen_iter = simple_generator(5 ) print (next(gen_iter)) print (next(gen_iter)) print (next(gen_iter)) print (next(gen_iter) ) 인쇄(next(gen_iter)) 인쇄(next(gen_iter))

이 함수는 클래스와 똑같이 작동합니다. 단순 반복자이전 예에서.

제너레이터가 어떻게 작동하는지 이해하는 열쇠는 생산하다함수는 작업을 중지하지 않지만 함수에 의해 다음 반복이 시작될 때까지 "고정"됩니다. 다음(). 생성기에 있는 경우 어딘가에 키워드를 사용하십시오.