단지 부작용을 위해 목록 이해를 사용하는 것이 피토닉입니까?
반환 값(화면으로 인쇄, GUI 업데이트, 파일로 인쇄 등)이 아닌 부작용을 위해 부르는 기능을 생각해 보십시오.
def fun_with_side_effects(x):
...side effects...
return y
이 기능을 사용하기 위해 목록 이해를 사용하는 것이 Pythonic일까요?
[fun_with_side_effects(x) for x in y if (...conditions...)]
목록을 어디에도 저장하지 않습니다.
아니면 이 기능을 이렇게 불러야 할까요?
for x in y:
if (...conditions...):
fun_with_side_effects(x)
어떤 것이 더 낫고 그 이유는 무엇입니까?
그렇게 하는 것은 매우 반(反)파이토닉이며, 노련한 파이토니스타라면 누구나 당신에게 지옥을 선사할 것입니다.중간 목록은 생성된 후에 버려지므로 생성하는 데 비용이 많이 들 수 있습니다.
목록 이해력을 사용하면 안 됩니다. 사람들이 말했듯이 목록 이해력은 필요 없는 대규모 임시 목록을 만들 수 있기 때문입니다.다음 두 가지 방법은 동등합니다.
consume(side_effects(x) for x in xs)
for x in xs:
side_effects(x)
의 정의하에consume로부터itertoolsman 페이지:
def consume(iterator, n=None):
"Advance the iterator n-steps ahead. If n is none, consume entirely."
# Use functions that consume iterators at C speed.
if n is None:
# feed the entire iterator into a zero-length deque
collections.deque(iterator, maxlen=0)
else:
# advance to the empty slice starting at position n
next(islice(iterator, n, n), None)
물론 후자가 더 명확하고 이해하기 쉽습니다.
목록 이해는 목록을 작성하기 위한 것입니다.그리고 실제로 목록을 작성하는 경우가 아니라면 목록 이해 기능을 사용해서는 안 됩니다.
그래서 두 번째 옵션을 선택하고 목록을 반복한 다음 조건이 적용되면 함수를 호출합니다.
두 번째가 더 낫습니다.
당신의 코드를 이해할 필요가 있는 사람을 생각해 보세요.첫번째로 나쁜 업보를 쉽게 얻을 수 있습니다 :)
필터()를 사용하여 둘 사이의 중간을 선택할 수 있습니다.예를 들어 다음과 같이 생각해 봅니다.
y=[1,2,3,4,5,6]
def func(x):
print "call with %r"%x
for x in filter(lambda x: x>3, y):
func(x)
당신의 목표에 달려있습니다.
목록의 각 개체에 대해 일부 작업을 수행하려는 경우 두 번째 접근 방식을 채택해야 합니다.
다른 목록에서 목록을 생성하려는 경우 목록 이해력을 사용할 수 있습니다.
명시적인 것이 암묵적인 것보다 낫습니다.복잡한 것보다는 간단한 것이 좋습니다. (피톤 젠)
할수있습니다
for z in (fun_with_side_effects(x) for x in y if (...conditions...)): pass
별로 안 예뻐요.
부작용에 대한 목록 이해를 사용하는 것은 추하고, 파이토닉적이지 않으며, 비효율적이며, 저는 그렇게 하지 않을 것입니다.나는 a를 사용할 것입니다.for대신에 루프를 합니다, 왜냐하면 a.for루프는 측면 방향이 중요한 절차 스타일을 나타냅니다.
그러나 부작용에 대한 목록 이해를 절대적으로 사용해야 한다고 주장한다면 대신 생성자 표현을 사용하여 비효율성을 피해야 합니다.이 스타일을 꼭 고집한다면 다음 두 가지 중 하나를 수행합니다.
any(fun_with_side_effects(x) and False for x in y if (...conditions...))
또는:
all(fun_with_side_effects(x) or True for x in y if (...conditions...))
이것들은 생성자 식이며, 임의로 버려지는 목록을 생성하지 않습니다.제 생각에는.all양식이 조금 더 명확할 수도 있지만, 두 가지 모두 혼동되므로 사용해서는 안 된다고 생각합니다.
나는 이것이 추하고 코드로 하지 않을 것이라고 생각합니다.하지만 당신이 이런 식으로 루프를 구현해야 한다면, 저는 그렇게 할 겁니다.
저는 목록의 이해와 그들의 일크가 적어도 기능적인 스타일과 비슷한 것을 희미하게나마 사용하려는 시도의 신호가 될 것이라고 생각하는 경향이 있습니다.그 가정을 깨는 부작용을 가진 것들을 넣는 것은 사람들이 당신의 코드를 더 주의 깊게 읽어야 하게 만들 것이고, 저는 그것이 나쁜 일이라고 생각합니다.
언급URL : https://stackoverflow.com/questions/5753597/is-it-pythonic-to-use-list-comprehensions-for-just-side-effects
'programing' 카테고리의 다른 글
| '노드'라는 용어를 인식할 수 없습니다...인 파워셸 (0) | 2023.09.06 |
|---|---|
| UImageView - 이미지의 파일 이름을 할당하는 방법은 무엇입니까? (0) | 2023.09.06 |
| 자동 완성 목록에서 VBA 및 HTML로 항목 클릭 (0) | 2023.09.06 |
| Powershell: 사용자가 로그인하지 않았을 때 실행할 스케줄링된 작업 설정 (0) | 2023.09.06 |
| Angular2 클릭 요소 ID (0) | 2023.09.06 |