목록에 참여 :
>>> ''.join([ str(_) for _ in xrange(10) ])
'0123456789'
join
반복 가능해야합니다.
분명히 join
의 인수는 [ str(_) for _ in xrange(10) ]
이고 목록 이해력 입니다.
이것 좀봐:
>>>''.join( str(_) for _ in xrange(10) )
'0123456789'
이제 join
의 인수는 str(_) for _ in xrange(10)
, no []
이지만 결과는 동일합니다.
왜? str(_) for _ in xrange(10)
목록이나 반복 가능 항목도 생성 합니까 ?
답변
>>>''.join( str(_) for _ in xrange(10) )
이를 생성기 표현식 이라고하며 PEP 289에 설명되어 있습니다.
생성기 표현식과 목록 이해의 주요 차이점은 전자가 메모리에 목록을 생성하지 않는다는 것입니다.
표현식을 작성하는 세 번째 방법이 있습니다.
''.join(map(str, xrange(10)))
답변
다른 응답자들은 생성기 표현식 (목록 이해와 유사한 표기법이 있지만 주변 대괄호가 없음)을 발견했다고 답했습니다 .
일반적으로 genexp (정말로 알려진대로)는 목록 이해보다 메모리 효율적이고 빠릅니다.
그러나 ''.join()
목록 이해는 더 빠르고 메모리 효율적입니다. 그 이유는 조인 이 데이터를 두 번 통과해야하므로 실제로 실제 목록이 필요하기 때문입니다. 하나를 주면 즉시 작업을 시작할 수 있습니다. 대신 genexp를 제공하면 genexp를 실행하여 메모리에 새 목록을 작성할 때까지 작업을 시작할 수 없습니다.
~ $ python -m timeit '"".join(str(n) for n in xrange(1000))'
1000 loops, best of 3: 335 usec per loop
~ $ python -m timeit '"".join([str(n) for n in xrange(1000)])'
1000 loops, best of 3: 288 usec per loop
itertools.imap 과 map을 비교할 때 동일한 결과가 유지됩니다 .
~ $ python -m timeit -s'from itertools import imap' '"".join(imap(str, xrange(1000)))'
1000 loops, best of 3: 220 usec per loop
~ $ python -m timeit '"".join(map(str, xrange(1000)))'
1000 loops, best of 3: 212 usec per loop
답변
두 번째 예제는 목록 이해가 아닌 생성기 표현식을 사용합니다. 차이점은 목록 이해력을 사용하면 목록이 완전히 빌드되고에 전달된다는 것 .join()
입니다. 생성기 표현식을 사용하면 항목이 하나씩 생성되고 .join()
. 후자는 메모리를 덜 사용하고 일반적으로 더 빠릅니다.
발생하면 목록 생성자는 생성기 표현식을 포함하여 모든 이터 러블을 기꺼이 소비합니다. 그래서:
[str(n) for n in xrange(10)]
다음에 대한 “구문 설탕”입니다.
list(str(n) for n in xrange(10))
즉, 목록 이해는 목록으로 변환되는 생성기 표현식입니다.
답변
답변
괄호 안에 있지만 대괄호가 아닌 경우 기술적으로 는 생성기 표현식입니다. 생성기 표현식은 Python 2.4에서 처음 도입되었습니다.
http://wiki.python.org/moin/Generators
조인 이후 부분 ( str(_) for _ in xrange(10) )
은 그 자체로 생성기 표현식입니다. 다음과 같이 할 수 있습니다.
mylist = (str(_) for _ in xrange(10))
''.join(mylist)
위의 두 번째 경우에서 쓴 것과 똑같은 의미입니다.
생성기에는 매우 흥미로운 속성이 있지만 그중에서도 필요하지 않을 때 전체 목록을 할당하지 않는다는 점은 중요합니다. 대신 조인과 같은 함수는 생성기 표현식에서 항목을 한 번에 하나씩 “펌핑”하여 작은 중간 부분에서 작업을 수행합니다.
특정 예에서 목록과 생성기는 아마도 크게 다르게 수행되지 않지만 일반적으로 가능할 때마다 생성기 표현식 (및 생성기 함수)을 사용하는 것을 선호합니다. 대부분 생성기가 전체 목록보다 느린 경우가 극히 드뭅니다. 구체화.
답변
그것은 목록 이해력이 아니라 생성기입니다. 생성기도 반복 가능하지만 전체 목록을 먼저 만든 다음 조인에 전달하는 대신 xrange의 각 값을 하나씩 전달하므로 훨씬 더 효율적일 수 있습니다.
답변
두 번째 join
호출에 대한 인수 는 생성기 표현식입니다. iterable을 생성합니다.