파이썬에서 iter 함수에 대한 두 번째 인수는 무엇입니까?

자다

파일을 생각해 봅시다 :

$ echo -e """This is a foo bar sentence .\nAnd this is the first txtfile in the corpus .""" > test.txt
$ cat test.txt 
This is a foo bar sentence .
And this is the first txtfile in the corpus .

그리고 문자별로 파일을 읽고 싶을 때 https://stackoverflow.com/a/25071590/610569 할 수 있습니다 .

>>> fin = open('test.txt')
>>> while fin.read(1):
...     fin.seek(-1,1)
...     print fin.read(1),
... 
T h i s   i s   a   f o o   b a r   s e n t e n c e   . 
A n d   t h i s   i s   t h e   f i r s t   t x t f i l e   i n   t h e   c o r p u s   .

그러나 while 루프를 사용하면 약간 비 파이썬처럼 보일 수 있습니다. 내가 fin.read(1)EOF를 확인하고 현재 바이트를 읽기 위해 역 추적 하는 사용할 때 . 그래서 다음과 같이 할 수 있습니다 . 파이썬의 파일에서 한 번에 한 문자를 읽는 방법? :

>>> import functools
>>> fin = open('test.txt')
>>> fin_1byte = iter(functools.partial(fin.read, 1), '')
>>> for c in fin_1byte:
...     print c,
... 
T h i s   i s   a   f o o   b a r   s e n t e n c e   . 
A n d   t h i s   i s   t h e   f i r s t   t x t f i l e   i n   t h e   c o r p u s   .

하지만 두 번째 인수없이 시도하면 다음과 같은 오류가 발생합니다 TypeError.

>>> fin = open('test.txt')
>>> fin_1byte = functools.partial(fin.read, 1)
>>> for c in iter(fin_1byte):
...     print c,
... 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'functools.partial' object is not iterable

의 두 번째 인수는 iter무엇입니까? 문서는 https://docs.python.org/2/library/functions.html#iterhttps://docs.python.org/3.6/library/functions.html#iter 중 많이 말하지 않습니다.


문서에 따라 :

반복기 객체를 반환합니다. 첫 번째 주장은 두 번째 주장의 존재 여부에 따라 매우 다르게 해석됩니다. 두 번째 인수가 없으면 object는 반복 프로토콜 ( iter () 메서드) 을 지원하는 컬렉션 개체 이거나 시퀀스 프로토콜 ( 0에서 시작하는 정수 인수가 있는 getitem () 메서드)을 지원해야합니다 . 이러한 프로토콜 중 하나를 지원하지 않으면 TypeError가 발생합니다. 두 번째 인수 인 sentinel이 주어지면 object는 호출 가능한 개체 여야합니다. 이 경우 생성 된 반복자는 next () 메서드에 대한 각 호출에 대해 인수없이 객체를 호출합니다 . 반환 된 값이 sentinel과 같으면 StopIteration이 발생하고 그렇지 않으면 값이 반환됩니다.

문서에 "복호화"가 필요하다고 생각합니다.

  • 두 번째 인수가 없으면 객체는 반복 프로토콜을 지원하는 컬렉션 객체 여야합니다 ( iter () 메서드).

그게 출처가 필요하다는 뜻 collections입니까? 아니면 객체에가있는 한 __iter__()괜찮습니까?

  • , 또는 시퀀스 프로토콜 ( 0에서 시작하는 정수 인수가 있는 getitem () 메서드)을 지원해야합니다.

그것은 다소 비밀 스럽습니다. 즉, 시퀀스가 ​​인덱싱되어 쿼리가 가능한지 여부를 확인하고 인덱스가 0부터 시작해야 함을 의미합니까? 또한 인덱스가 0, 2, 8, 13, ...과 같은 것이 아니라 0, 1, 2, 3, ...과 같이 순차적이어야 함을 의미합니까?

  • 이러한 프로토콜 중 하나를 지원하지 않으면 TypeError가 발생합니다.

예,이 부분은 이해합니다 =)

  • 두 번째 인수 인 sentinel이 주어지면 object는 호출 가능한 개체 여야합니다.

좋아, 이제 이것은 약간의 공상 과학을 얻습니다. 뭔가를 호출하는 것은 파이썬의 용어 sentinel입니까? sentinelPythonically 는 무엇을 의미합니까? 그리고 "호출 가능한 객체"는 유형 객체가 아닌 함수처럼?

  • 이 경우 생성 된 이터레이터는 next () 메서드를 호출 할 때마다 인수없이 객체를 호출합니다.

이 부분은 정말 이해가 안되지만 예가 도움이 될 것입니다.

  • 반환 된 값이 sentinel과 같으면 StopIteration이 발생하고 그렇지 않으면 값이 반환됩니다.

좋아요, sentinel여기에 몇 가지 위반 기준이 있습니까?

누군가가 위의 요점의 의미를 해독 / 명확하게 도울 수 있습니까 iter?

Antti Haapala

하나의 인수로 특수 메소드 또는 특수 메소드 iter가있는 객체를 제공해야합니다 . 그들 중 어느 것도 존재하면 됩니다 오류를 발생__iter__ __getitem__iter

>>> iter(None)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'NoneType' object is not iterable

반복을위한 2 개의 프로토콜이 있습니다. 이전 프로토콜은 __getitem__0부터 발생하는 정수까지 연속적인 정수를 호출하는 데 의존 합니다 IndexError. 새 프로토콜은에서 반환 된 반복기에 의존합니다 __iter__.

Python 2에서는 특별한 방법 str도 없습니다 __iter__.

Python 2.7.12+ (default, Sep 17 2016, 12:08:02) 
[GCC 6.2.0 20160914] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 'abc'.__iter__
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'str' object has no attribute '__iter__'

그러나 여전히 반복 가능합니다.

>>> iter('abc')
<iterator object at 0x7fcee9e89390>

사용자 정의 클래스를 반복 가능하게 만들려면 존재하지 않는 항목에 대해 또는 중 하나 가 발생해야 합니다.__iter____getitem__IndexError

class Foo:
    def __iter__(self):
        return iter(range(5))

class Bar:
    def __getitem__(self, i):
        if i >= 5:
            raise IndexError
        return i

이것을 사용하여 :

>>> list(iter(Foo()))
[0, 1, 2, 3, 4]
>>> list(iter(Bar()))
[0, 1, 2, 3, 4]

반복자 를 예상하는 루프와 메서드는 암시 적으로 반복자를 생성하므로 일반적으로 명시 적은iter 필요하지 않습니다 .for

>>> list(Foo())
[0, 1, 2, 3, 4]
>>> for i in Bar():
0
1
2
3
4

2 인수 형식의 경우 첫 번째 인수는를 구현하는 함수 또는 객체 여야합니다 __call__. 첫 번째 인수는 인수없이 호출됩니다. 반환 값은 반복기에서 생성됩니다. 다음과 같이 반복에 대한 함수 호출에서 반환 된 값이 주어진 센티넬 값과 같으면 반복이 중지됩니다 .

value = func()
if value == sentinel:
    return
else:
    yield value

예를 들어, 6을 던지기 전에 주사위 값을 얻으려면

>>> import random
>>> throw = lambda: random.randint(1, 6)
>>> list(iter(throw, 6))
[3, 2, 4, 5, 5]
>>> list(iter(throw, 6))
[1, 3, 1, 3, 5, 1, 4]

더 명확히하기 위해, 주어진 함수 (또는 __call__특별한 메소드를 가진 주어진 객체 )는 next()반복자에서이 사용될 때마다 인자없이 호출 됩니다 :

>>> def throw_die():
...     die = random.randint(1, 6)
...     print("returning {}".format(die))
...     return die
...
>>> throws = iter(throw_die, 6)
>>> next(throws)
returning 2
2
>>> next(throws)
returning 4
4
>>> next(throws)
returning 6
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

(즉, throw로 호출되고 throw()반환 된 값이 6과 같지 않으면 반환됩니다).

또는

>>> fin_1byte = iter(functools.partial(fin.read, 1), '')
>>> for c in fin_1byte:
...     print c,

파일 끝에서 파일을 읽으면 빈 문자열 (또는 바이너리 파일 인 경우 빈 바이트)이 반환됩니다.

>>> from io import StringIO
>>> fin = StringIO(u'ab')
>>> fin.read(1)
u'a'
>>> fin.read(1)
u'b'
>>> fin.read(1)
u''

파일 끝에 아직 없으면 한 문자가 반환됩니다.

반복되는 함수 호출에서 무한 반복자를 만드는데도 사용할 수 있습니다.

>>> dice = iter(throw, 7)

반환 된 값은 7과 같을 수 없으므로 반복기는 영원히 실행됩니다. 일반적인 관용구는 익명을 사용하여 object상상할 수있는 값에 대해 비교가 성공하지 못하도록하는 것입니다.

>>> dice = iter(throw, object())

때문에

>>> object() != object()
True

센티넬 이라는 단어 는 일반적으로 일부 데이터에서 끝 마커로 사용되는 값에 사용 되며이 Java 답변 에서와 같이 데이터 내에서 자연스럽게 발생하지 않습니다 .

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

Kaiser의 필터에 대한 두 번째 매개 변수는 무엇입니까?

분류에서Dev

Kaiser의 필터에 대한 두 번째 매개 변수는 무엇입니까?

분류에서Dev

두 번째에서 함수의 첫 번째 인수를 참조하는 방법은 무엇입니까? (파이썬 2.7)

분류에서Dev

node.js에서 함수에 대한 두 번째 호출이 첫 번째 것보다 훨씬 적은 시간이 걸리는 이유는 무엇입니까?

분류에서Dev

파이썬에서 두 번째 줄을 첫 번째 줄 끝에 연결하는 방법은 무엇입니까?

분류에서Dev

배열의 첫 번째 인수의 각 값에 대한 두 번째 인수는 어떻게합니까?

분류에서Dev

haskell seq 함수가 WHNF에 대한 첫 번째 인수를 만드는 이유는 무엇입니까?

분류에서Dev

Javascript의 체인 함수에서 두 번째 함수를 먼저 실행하는 방법은 무엇입니까?

분류에서Dev

부모 메서드에 대한 함수가 두 번 선언되는 이유는 무엇입니까?

분류에서Dev

플롯을 사용하여 산점도에서 세 번째 변수에 대한 두 번째 범례를 표시하는 방법은 무엇입니까?

분류에서Dev

Bootstrap에서 두 번째 행의 두 번째 열을 동일한 첫 번째 열 또는 첫 번째 행에 정렬하는 방법은 무엇입니까?

분류에서Dev

템플릿 함수 선언에서 함수 이름 뒤의 두 번째 <>는 무엇입니까?

분류에서Dev

* 포인터를 사용하여 함수에서 두 번째 값을 얻는 방법은 무엇입니까?

분류에서Dev

파이썬의 튜플에서 두 번째 요소를 얻는 방법은 무엇입니까?

분류에서Dev

Tracert에서 두 번째 홉을 볼 수없는 이유는 무엇입니까?

분류에서Dev

수신에 대한 두 번째 호출이 Erlang 쉘에서 메시지를 검색하지 않는 이유는 무엇입니까?

분류에서Dev

첫 번째 Docker exec에서 파일이 누락되었지만 두 번째에서 사용 가능한 이유는 무엇입니까?

분류에서Dev

ActiveRecord에서 첫 번째와 두 번째에 대한 대체 구문은 무엇입니까?

분류에서Dev

Bash 함수에서 getopts를 사용할 때 두 번째 호출에서 인수를 무시하는 이유는 무엇입니까?

분류에서Dev

이 ffmpeg 명령에서 두 번째 인수는 무엇을합니까?

분류에서Dev

재귀 함수가 두 번째 인수를받지 않는 이유는 무엇입니까?

분류에서Dev

테스트 케이스의 두 번째 인수가 파이썬에 없는지 확인하는 방법은 무엇입니까?

분류에서Dev

텍스트 파일에서 두 번째 및 세 번째 열을 잘라내는 방법은 무엇입니까? 파이썬

분류에서Dev

Landscape Autopilot에 대한 두 번째 NIC의 목적은 무엇입니까?

분류에서Dev

파이썬에서 두 변수에 대한 테이블 함수

분류에서Dev

두 번째 합의 상한이 첫 번째 합의 하한 인 Matlab에서 이중 합을 계산하는 방법은 무엇입니까?

분류에서Dev

파이썬에서 정규식을 사용하여 두 특정 문자 사이의 첫 번째 정수를 얻는 방법은 무엇입니까?

분류에서Dev

"Hello Dojo!"에서 require ()에 대한 두 번째 매개 변수의 실행을 트리거하는 것은 무엇입니까? 지도 시간

분류에서Dev

두 번째 인수는 std :: string myString { "Hello", "World"}에서 무엇을합니까?

Related 관련 기사

  1. 1

    Kaiser의 필터에 대한 두 번째 매개 변수는 무엇입니까?

  2. 2

    Kaiser의 필터에 대한 두 번째 매개 변수는 무엇입니까?

  3. 3

    두 번째에서 함수의 첫 번째 인수를 참조하는 방법은 무엇입니까? (파이썬 2.7)

  4. 4

    node.js에서 함수에 대한 두 번째 호출이 첫 번째 것보다 훨씬 적은 시간이 걸리는 이유는 무엇입니까?

  5. 5

    파이썬에서 두 번째 줄을 첫 번째 줄 끝에 연결하는 방법은 무엇입니까?

  6. 6

    배열의 첫 번째 인수의 각 값에 대한 두 번째 인수는 어떻게합니까?

  7. 7

    haskell seq 함수가 WHNF에 대한 첫 번째 인수를 만드는 이유는 무엇입니까?

  8. 8

    Javascript의 체인 함수에서 두 번째 함수를 먼저 실행하는 방법은 무엇입니까?

  9. 9

    부모 메서드에 대한 함수가 두 번 선언되는 이유는 무엇입니까?

  10. 10

    플롯을 사용하여 산점도에서 세 번째 변수에 대한 두 번째 범례를 표시하는 방법은 무엇입니까?

  11. 11

    Bootstrap에서 두 번째 행의 두 번째 열을 동일한 첫 번째 열 또는 첫 번째 행에 정렬하는 방법은 무엇입니까?

  12. 12

    템플릿 함수 선언에서 함수 이름 뒤의 두 번째 <>는 무엇입니까?

  13. 13

    * 포인터를 사용하여 함수에서 두 번째 값을 얻는 방법은 무엇입니까?

  14. 14

    파이썬의 튜플에서 두 번째 요소를 얻는 방법은 무엇입니까?

  15. 15

    Tracert에서 두 번째 홉을 볼 수없는 이유는 무엇입니까?

  16. 16

    수신에 대한 두 번째 호출이 Erlang 쉘에서 메시지를 검색하지 않는 이유는 무엇입니까?

  17. 17

    첫 번째 Docker exec에서 파일이 누락되었지만 두 번째에서 사용 가능한 이유는 무엇입니까?

  18. 18

    ActiveRecord에서 첫 번째와 두 번째에 대한 대체 구문은 무엇입니까?

  19. 19

    Bash 함수에서 getopts를 사용할 때 두 번째 호출에서 인수를 무시하는 이유는 무엇입니까?

  20. 20

    이 ffmpeg 명령에서 두 번째 인수는 무엇을합니까?

  21. 21

    재귀 함수가 두 번째 인수를받지 않는 이유는 무엇입니까?

  22. 22

    테스트 케이스의 두 번째 인수가 파이썬에 없는지 확인하는 방법은 무엇입니까?

  23. 23

    텍스트 파일에서 두 번째 및 세 번째 열을 잘라내는 방법은 무엇입니까? 파이썬

  24. 24

    Landscape Autopilot에 대한 두 번째 NIC의 목적은 무엇입니까?

  25. 25

    파이썬에서 두 변수에 대한 테이블 함수

  26. 26

    두 번째 합의 상한이 첫 번째 합의 하한 인 Matlab에서 이중 합을 계산하는 방법은 무엇입니까?

  27. 27

    파이썬에서 정규식을 사용하여 두 특정 문자 사이의 첫 번째 정수를 얻는 방법은 무엇입니까?

  28. 28

    "Hello Dojo!"에서 require ()에 대한 두 번째 매개 변수의 실행을 트리거하는 것은 무엇입니까? 지도 시간

  29. 29

    두 번째 인수는 std :: string myString { "Hello", "World"}에서 무엇을합니까?

뜨겁다태그

보관