2015-01-30 5 views
1

파이썬 생성기 표현식의 반복 순서가 유사한리스트 이해 및 생성기 함수와 다른 것으로 보이는 예제가 있습니다. 예를 들어파이썬 생성기 표현식 순서

, 코드

n = 10 
d = {i : str(i) for i in range(n)} 

for i in d: 
    print d[i], 
print 

def func_gen(d): 
    for i in range(n): 
     yield d[i] 

print(list(func_gen(d))) 

g = [d[i] for i in range(n)] 
print(g) 

g = {d[i] for i in range(n)} 
print(list(g)) 

내가는 지능형리스트와 함께하는 것처럼 발전기 표현이 정렬 된 출력을 생성 기대 출력

0 1 2 3 4 5 6 7 8 9 
['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'] 
['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'] 
['1', '0', '3', '2', '5', '4', '7', '6', '9', '8'] 

있습니다. 에 주문이 보장되지 않는다고 말하는 발전기 표현에 관한 것이 있습니까?

구조가 거의 동일해도 생성자 표현식이 다른 표현식과 다른 이유는 무엇입니까? 사전을 반복하는 것과 같은 순서가 아니기 때문에 처럼 보이지 않습니다.

파이썬 2에서 같은 행동을보고 있어요, 3

+0

미리보기에는 특정 순서가 없음을 유의하십시오. 즉, dict의 원래 순서는 유지되지 않습니다. – JCOC611

+0

그 예들에서의 순서는 (나는 생각할 것입니다) * d *에 의해 결정되지는 않지만, 모든 경우에 명령이 내려 질 것으로 기대되는 반복자에 의해 결정됩니다. –

+0

@AJFriend : (마지막 세 가지) 예제의 순서는 목록으로 변환되는 방식에 따라 결정됩니다. 집합의 경우 해당 변환은 순서가 지정되지 않습니다. – jwodder

답변

-1

Dicts는 주문되지 않습니다. 함수 호출 사이에서도 특정 순서로 돌아 오기 위해 항목에 의존 할 수 없습니다.

+0

기술적으로 그가 인쇄하는 것은 dict가 아닌 * set *입니다. 그래도 순서는 없습니다. – jwodder

+0

생성기 함수는 반드시 목록 이해와 마찬가지로 정렬 된 출력을 반환해야합니다. 발전기 표현이이 두 가지 경우와 어떻게 다른지 나는 알지 못합니다. –

+0

@jwodder 오, 네 말이 맞아. 나는 마지막 하나가 발전기 표현이라고 생각하고 있었지만 실제로는 하나의 세트입니다. 나는 괄호를 원해. 감사. –