렌(제너레이터() 방법)
Python 생성기는 매우 유용합니다.목록을 반환하는 기능에 비해 장점이 있습니다.하지만, 당신은 할 수 있습니다.len(list_returning_function())할 수 있는 방법이 있습니까?len(generator_function())?
업데이트:
물론이야.len(list(generator_function()))효과가 있을 것입니다...
새로 생성하는 생성기 내부에 생성한 생성기를 사용하려고 합니다.새 발전기 계산의 일부로 기존 발전기의 길이를 알아야 합니다.그러나 저는 두 가지 모두 생성기와 동일한 속성으로 함께 유지하고 싶습니다. 특히 매우 길기 때문에 전체 목록을 메모리에 유지하지 않습니다.
업데이트 2:
생성기가 첫 번째 단계부터 목표 길이임을 알고 있다고 가정합니다.또한, 그것을 유지할 이유가 없습니다.len()통사론예 - Python의 함수가 객체인 경우, 새 생성기가 액세스할 수 있는 이 객체의 변수에 길이를 할당할 수 없습니까?
로의 변환list다른 답변에서 제안한 바와 같이 생성기 요소를 나중에 처리하려는 경우 가장 좋은 방법이지만 한 가지 결함이 있습니다.O(n) 메모리를 사용합니다.다음과 같이 메모리를 많이 사용하지 않고 제너레이터의 요소를 셀 수 있습니다.
sum(1 for x in generator)
물론, 이것은 다음보다 느릴 수 있습니다.len(list(generator))일반적인 Python 구현에서, 그리고 생성기가 메모리 복잡성이 문제가 될 만큼 충분히 길다면, 작업은 꽤 시간이 걸릴 것입니다.하지만 개인적으로 이 솔루션을 선호하는 이유는 이 솔루션이 원하는 것을 설명하고 필요 없는 추가 요소(예: 모든 요소 목록)를 제공하지 않기 때문입니다.
또한 델난의 조언을 들어보세요.제너레이터의 출력을 폐기하는 경우에는 제너레이터를 실행하지 않고 요소 수를 계산하거나 다른 방법으로 계수하는 방법이 있을 가능성이 높습니다.
발전기는 길이가 없습니다. 결국 수집품이 아닙니다.
생성기는 내부 상태(및 고급 구문)를 가진 함수입니다.반복적으로 호출하여 일련의 값을 얻을 수 있으므로 루프에서 사용할 수 있습니다.하지만 그들은 어떤 요소도 포함하지 않기 때문에 발전기의 길이를 묻는 것은 함수의 길이를 묻는 것과 같습니다.
Python의 함수가 객체인 경우, 새 생성기가 액세스할 수 있는 이 객체의 변수에 길이를 할당할 수 없습니까?
함수는 개체이지만 새 속성을 할당할 수 없습니다.그 이유는 아마도 그러한 기본적인 물체를 가능한 한 효율적으로 유지하기 위해서일 것입니다.
하지만 간단히 돌아올 수 있습니다.(generator, length)함수에서 쌍을 이루거나 제너레이터를 다음과 같은 간단한 개체로 래핑합니다.
class GeneratorLen(object):
def __init__(self, gen, length):
self.gen = gen
self.length = length
def __len__(self):
return self.length
def __iter__(self):
return self.gen
g = some_generator()
h = GeneratorLen(g, 1)
print len(h), list(h)
발전기가 있다고 가정해 보겠습니다.
def gen():
for i in range(10):
yield i
알려진 길이와 함께 제너레이터를 개체로 감쌀 수 있습니다.
import itertools
class LenGen(object):
def __init__(self,gen,length):
self.gen=gen
self.length=length
def __call__(self):
return itertools.islice(self.gen(),self.length)
def __len__(self):
return self.length
lgen=LenGen(gen,10)
의 LenGen재생기를 호출하면 반복기가 반환되므로 재생기 자체가 재생기입니다.
이제 사용할 수 있습니다.lgen gen 및액스에 액세스합니다.len(lgen)또한:
def new_gen():
for i in lgen():
yield float(i)/len(lgen)
for i in new_gen():
print(i)
사용할 수 있습니다.len(list(generator_function())그러나 이렇게 하면 제너레이터가 소모되지만 생성되는 요소의 수를 확인할 수 있는 유일한 방법입니다.따라서 항목을 사용하려는 경우 목록을 어딘가에 저장할 수도 있습니다.
a = list(generator_function())
print(len(a))
print(a[0])
넌 할 수 있다.len(list(generator))하지만 정말로 결과를 버리려고 한다면 더 효율적인 것을 만들 수 있을 것입니다.
사용할 수 있습니다.reduce.
Python 3의 경우:
>>> import functools
>>> def gen():
... yield 1
... yield 2
... yield 3
...
>>> functools.reduce(lambda x,y: x + 1, gen(), 0)
에서 파썬에 2서이는reduce글로벌 네임스페이스에 있으므로 가져올 필요가 없습니다.
사용할 수 있습니다.send해킹으로:
def counter():
length = 10
i = 0
while i < length:
val = (yield i)
if val == 'length':
yield length
i += 1
it = counter()
print(it.next())
#0
print(it.next())
#1
print(it.send('length'))
#10
print(it.next())
#2
print(it.next())
#3
할 수 .len()사용자 고유의 반복 가능한 개체 생성:
class MyIterable(object):
def __init__(self, n):
self.n = n
def __len__(self):
return self.n
def __iter__(self):
self._gen = self._generator()
return self
def _generator(self):
# Put your generator code here
i = 0
while i < self.n:
yield i
i += 1
def next(self):
return next(self._gen)
mi = MyIterable(100)
print len(mi)
for i in mi:
print i,
으로 이은기로간구다현니입단의 간단한 입니다.xrange렌을 사용할 수 있는 개체를 반환하지만 명시적인 목록은 만들지 않습니다.
언급URL : https://stackoverflow.com/questions/7460836/how-to-lengenerator
'programing' 카테고리의 다른 글
| 업데이트 패널을 새로 고친 후 자바스크립트를 실행하려면 어떻게 해야 합니까? (0) | 2023.06.30 |
|---|---|
| Floating 앱 출시 후 Google 로그인이 작동하지 않음 (0) | 2023.06.25 |
| jQuery: text()와 html()의 차이점은 무엇입니까? (0) | 2023.06.25 |
| IIS 7.5의 GZip 압축이 작동하지 않음 (0) | 2023.06.25 |
| 값이 없는 테이블에 삽입하기 위한 구문? (0) | 2023.06.25 |