오늘 ''에서 '평가 시간 차이'아래에있는 잡아 당김을 발견하고 힘든 시간을 보내고 있습니다.발전기의 평가 시간 불일치를 해결하는 방법
내 문제에 대한 간략한 시연, 나는 n
이 [2..5]
에서가는 모든 n
일 번호를 건너 무한 발전기합니다
from itertools import count
skip_lists = []
for idx in range(2, 5):
# skip every 2nd, 3rd, 4th.. number
skip_lists.append(x for x in count() if (x % idx) != 0)
# print first 10 numbers of every skip_list
for skip_list in skip_lists:
for _, num in zip(range(10), skip_list):
print("{}, ".format(num), end="")
print()
예상 출력 :
1, 3, 5, 7, 9, 11, 13, 15, 17, 19,
1, 2, 4, 5, 7, 8, 10, 11, 13, 14,
1, 2, 3, 5, 6, 7, 9, 10, 11, 13,
실제 출력 :
1, 2, 3, 5, 6, 7, 9, 10, 11, 13,
1, 2, 3, 5, 6, 7, 9, 10, 11, 13,
1, 2, 3, 5, 6, 7, 9, 10, 11, 13,
다시
from itertools import count
skip_lists = []
for idx in range(2, 5):
# bind the skip distance
skip_lists.append([idx])
# same as in the first try, but use bound value instead of 'idx'
skip_lists[-1].append(x for x in count() if (x % skip_lists[-1][0]) != 0)
# print first 10 numbers of every skip_list
for skip_list in (entry[1] for entry in skip_lists):
for _, num in zip(range(10), skip_list):
print("{}, ".format(num), end="")
print()
:하지만
1, 2, 3, 5, 6, 7, 9, 10, 11, 13,
1, 2, 3, 5, 6, 7, 9, 10, 11, 13,
1, 2, 3, 5, 6, 7, 9, 10, 11, 13,
내가 그 훌륭한 기능을 기억하면 088,243,210
, 나는 skip_list
의 일부가 될 것입니다 일정에 if
절 변수를 결합하여 "해결"을 시도
실제 솔루션 외에도 해킹이 작동하지 않는 이유를 알고 싶습니다.
멋진 대답을 =) 그러나 나는 skip_lists.append ([idx])에'idx'를 저장하는 것이 왜'idx' 대신에 접근하는지 이해하지 못한다. 그 값은 마지막 반복으로 바뀌지 않습니다.'print (skip_list)'는 결국 두 번째 예제에서 [[2,], [3, ], [4, ]]을 산출합니다. –
Arne
생성자 표현식의 코드 객체는 평가할 때 처음에 루프가 완료된 후'idx' 이름을 읽습니다. 그 루프 이후에'idx'를 출력하는 것과 비슷합니다. 그 시점에서'idx'라는 이름은 int 4를 참조합니다. –
그것은 끔찍한 것입니다. skip_lists.append ([lambda x idx : x])조차도 로컬 범위 참조를 만드는 데는 효과가 없습니다. 이 문제를 해결하는 방법을 알려 주셔서 감사합니다. – Arne