복붙노트

[PYTHON] "For"루프 첫 번째 반복

PYTHON

"For"루프 첫 번째 반복

인사말 pyc-sires 및 py-ladies, 첫 번째 루프 반복에서 일부 함수를 실행하는 우아한 비단뱀 식 방법이 있는지 궁금하다. 내가 생각할 수있는 유일한 가능성은 :

first = True
for member in something.get():
    if first:
        root.copy(member)
        first = False
    else:
        somewhereElse.copy(member)
    foo(member)

해결법

  1. ==============================

    1.Head-Tail 디자인 패턴에는 몇 가지 선택 사항이 있습니다.

    Head-Tail 디자인 패턴에는 몇 가지 선택 사항이 있습니다.

    seq= something.get()
    root.copy( seq[0] )
    foo( seq[0] )
    for member in seq[1:]:
        somewhereElse.copy(member)
        foo( member )
    

    아니면 이거

    seq_iter= iter( something.get() )
    head = seq_iter.next()
    root.copy( head )
    foo( head )
    for member in seq_iter:
        somewhereElse.copy( member )
        foo( member )
    

    사람들은 이것이 "중복 foo (구성원)"코드 때문에 "DRY"가 아니라는 것을 부끄러워합니다. 그것은 어리석은 주장입니다. 그것이 사실이라면 모든 기능을 한 번만 사용할 수 있습니다. 하나의 참조 만 가질 수 있다면 함수를 정의하는 요점은 무엇입니까?

  2. ==============================

    2.이런 식으로하면 효과가 있습니다.

    이런 식으로하면 효과가 있습니다.

    for i, member in enumerate(something.get()):
        if i == 0:
             # Do thing
        # Code for everything
    

    그러나, 코드의 개념을 "더러운"일종의 코드라고 생각하면됩니다. 특별한 처리가 필요한 요소를 가져온 다음 루프의 다른 모든 핸들러에 대해 정기적 인 처리를 수행하는 것이 좋습니다.

    내가 이런 방식으로하지 않는 것을 볼 수있는 유일한 이유는 발전기 표현식 (메모리에 맞지 않기 때문에 앞쪽으로 가져오고 싶지 않을 것입니다)이나 비슷한 상황 .

  3. ==============================

    3.어때?

    어때?

    my_array = something.get()
    for member in my_array:
        if my_array.index(member) == 0:
            root.copy(member)
        else:
            somewhereElse.copy(member)
        foo(member)
    

    또는 어쩌면 :

    for index, member in enumerate(something.get()):
        if index == 0:
            root.copy(member)
        else:
            somewhereElse.copy(member)
        foo(member)
    

    index-method의 문서화.

  4. ==============================

    4.나는 이것이 아주 우아하다고 생각하지만, 아마도 그것이하는 일을 너무 복잡하게 만든다.

    나는 이것이 아주 우아하다고 생각하지만, 아마도 그것이하는 일을 너무 복잡하게 만든다.

    from itertools import chain, repeat, izip
    for place, member in izip(chain([root], repeat(somewhereElse)), something.get()):
        place.copy(member)
        foo(member)
    
  5. ==============================

    5.작동 방식 :

    작동 방식 :

    for number, member in enumerate(something.get()):
        if not number:
            root.copy(member)
        else:
            somewhereElse.copy(member)
        foo(member)
    

    대부분의 경우, 나는 [1 :] 무엇이든 반복하고 루프 밖에서 근본적인 작업을하는 것이 좋습니다. 일반적으로 더 읽기 쉽습니다. 물론 유스 케이스에 따라 다릅니다.

  6. ==============================

    6.여기, 나는 "pertty"를 볼 수있는 Pythonic 관용구를 사용할 수 있습니다. 가장 가능성은 있지만 질문을 할 때 제안한 양식을 사용하는 것이 좋습니다. 코드는 좀 덜 분명하지만 덜 우아합니다.

    여기, 나는 "pertty"를 볼 수있는 Pythonic 관용구를 사용할 수 있습니다. 가장 가능성은 있지만 질문을 할 때 제안한 양식을 사용하는 것이 좋습니다. 코드는 좀 덜 분명하지만 덜 우아합니다.

    def copy_iter():
        yield root.copy
        while True:
            yield somewhereElse.copy
    
    for member, copy in zip(something.get(), copy_iter()):
        copy(member)
        foo(member)
    

    (미안 해요 - 편집하기 전에 폼이 작동하지 않을 것입니다. 실제로 복사 된 객체의 반복자를 얻는 것을 잊었습니다)

  7. ==============================

    7.something.get ()이 무언가를 반복 할 경우 다음과 같이 할 수 있습니다.

    something.get ()이 무언가를 반복 할 경우 다음과 같이 할 수 있습니다.

    root.copy(something.get())
    
    for member in something.get():
      #  the rest of the loop
    
  8. ==============================

    8.iter를 사용하고 첫 번째 요소를 사용하는 것은 어떻습니까?

    iter를 사용하고 첫 번째 요소를 사용하는 것은 어떻습니까?

    편집 : OP의 질문으로 돌아 가면 모든 요소에 대해 수행하려는 공통 작업이 있고 첫 번째 요소에서 수행 할 작업 하나와 나머지 작업에서 수행 할 작업이 있습니다.

    하나의 함수 호출이라면 두 번 쓰는 것입니다. 그것은 세상을 끝내지 못할 것입니다. 관련이 더 많은 경우 데코레이터를 사용하여 "첫 번째"기능과 "나머지"기능을 공통 작업으로 래핑 할 수 있습니다.

    def common(item):
        print "common (x**2):", item**2
    
    def wrap_common(func):
        """Wraps `func` with a common operation"""
        def wrapped(item):
            func(item)
            common(item)
        return wrapped
    
    @wrap_common
    def first(item):
        """Performed on first item"""
        print "first:", item+2
    
    @wrap_common
    def rest(item):
        """Performed on rest of items"""
        print "rest:", item+5
    
    items = iter(range(5))
    first(items.next())
    
    for item in items:
        rest(item)
    

    산출:

    first: 2
    common (x**2): 0
    rest: 6
    common (x**2): 1
    rest: 7
    common (x**2): 4
    rest: 8
    common (x**2): 9
    rest: 9
    common (x**2): 16
    

    또는 슬라이스를 할 수 있습니다.

    first(items[0])
    for item in items[1:]:
        rest(item)
    
  9. ==============================

    9.첫 번째 S.Lott 솔루션이 최고라고 생각하지만, 꽤 최근의 파이썬 (izip_longest는 그 버전 이전에는 사용 가능하지 않았기 때문에> = 2.6이라고 생각합니다.)을 사용하고 있다면 다른 선택이 있습니다. 첫 번째 요소와 연속적인 요소가 있으며 첫 번째, 두 번째, 세 번째 요소에 대해 고유 한 작업을 수행하도록 쉽게 수정할 수 있습니다.

    첫 번째 S.Lott 솔루션이 최고라고 생각하지만, 꽤 최근의 파이썬 (izip_longest는 그 버전 이전에는 사용 가능하지 않았기 때문에> = 2.6이라고 생각합니다.)을 사용하고 있다면 다른 선택이 있습니다. 첫 번째 요소와 연속적인 요소가 있으며 첫 번째, 두 번째, 세 번째 요소에 대해 고유 한 작업을 수행하도록 쉽게 수정할 수 있습니다.

    from itertools import izip_longest
    
    seq = [1, 2, 3, 4, 5]
    
    def headfunc(value):
        # do something
        print "1st value: %s" % value
    
    def tailfunc(value):
        # do something else
        print "this is another value: %s" % value
    
    def foo(value):
        print "perform this at ANY iteration."
    
    for member, func in izip_longest(seq, [headfunc], fillvalue=tailfunc):
        func(member)
        foo(member)
    
  10. ==============================

    10.루프 전에는 .copy (something.get ()) 할 수 없습니까?

    루프 전에는 .copy (something.get ()) 할 수 없습니까?

    편집 : 죄송합니다, 두 번째 비트 놓 쳤어. 그러나 당신은 일반적인 아이디어를 얻습니다. 그렇지 않으면 열거하고 0을 확인하십시오.

    EDIT2 : 좋아, 바보 같은 생각을 없앴습니다.

  11. ==============================

    11.나는 파이썬을 모른다. 그러나 나는 당신의 예제의 거의 정확한 패턴을 사용한다. 또한 if 조건이 가장 자주 발생하므로 if (first == false)를 자주 확인하십시오. 왜? 긴 루프의 경우, 처음에는 한 번만 true로되고 다른 모든 시간에 false가됩니다. 즉 모든 루프에서 첫 번째로 프로그램이 조건을 검사하고 else 부분으로 건너 뜁니다. 첫 번째가 거짓이라는 것을 검사함으로써 else 부분으로 단 하나의 점프 만있을 것입니다. 이것이 효율성을 높이는 지 모르겠지만 어쨌든, 내 안의 괴상한 사람들과 평화롭게 지내기 위해서입니다.

    나는 파이썬을 모른다. 그러나 나는 당신의 예제의 거의 정확한 패턴을 사용한다. 또한 if 조건이 가장 자주 발생하므로 if (first == false)를 자주 확인하십시오. 왜? 긴 루프의 경우, 처음에는 한 번만 true로되고 다른 모든 시간에 false가됩니다. 즉 모든 루프에서 첫 번째로 프로그램이 조건을 검사하고 else 부분으로 건너 뜁니다. 첫 번째가 거짓이라는 것을 검사함으로써 else 부분으로 단 하나의 점프 만있을 것입니다. 이것이 효율성을 높이는 지 모르겠지만 어쨌든, 내 안의 괴상한 사람들과 평화롭게 지내기 위해서입니다.

    추신 : 그렇습니다. if 부분을 입력 할 때 실행을 계속하기 위해 다른 부분으로 건너 뛰어야하므로 아마 내 방식은 쓸모가 없지만 멋지다고 느낍니다. :디

  12. ==============================

    12.귀하의 질문은 모순입니다. 실제로 첫 번째 / 후속 반복에서 다른 작업을 수행한다고 말하면서 "첫 번째 반복에서 만 수행하십시오"라고 말합니다. 이것이 내가 그것을 시도하는 방법이다 :

    귀하의 질문은 모순입니다. 실제로 첫 번째 / 후속 반복에서 다른 작업을 수행한다고 말하면서 "첫 번째 반복에서 만 수행하십시오"라고 말합니다. 이것이 내가 그것을 시도하는 방법이다 :

    copyfn = root.copy
    for member in something.get():
        copyfn(member)
        foo(member)
        copyfn = somewhereElse.copy
    
  13. from https://stackoverflow.com/questions/1927544/for-loop-first-iteration by cc-by-sa and MIT license