파일을 생각해 봅시다 :
$ 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#iter 및 https://docs.python.org/3.6/library/functions.html#iter 중 많이 말하지 않습니다.
문서에 따라 :
반복기 객체를 반환합니다. 첫 번째 주장은 두 번째 주장의 존재 여부에 따라 매우 다르게 해석됩니다. 두 번째 인수가 없으면 object는 반복 프로토콜 ( iter () 메서드) 을 지원하는 컬렉션 개체 이거나 시퀀스 프로토콜 ( 0에서 시작하는 정수 인수가 있는 getitem () 메서드)을 지원해야합니다 . 이러한 프로토콜 중 하나를 지원하지 않으면 TypeError가 발생합니다. 두 번째 인수 인 sentinel이 주어지면 object는 호출 가능한 개체 여야합니다. 이 경우 생성 된 반복자는 next () 메서드에 대한 각 호출에 대해 인수없이 객체를 호출합니다 . 반환 된 값이 sentinel과 같으면 StopIteration이 발생하고 그렇지 않으면 값이 반환됩니다.
문서에 "복호화"가 필요하다고 생각합니다.
그게 출처가 필요하다는 뜻 collections
입니까? 아니면 객체에가있는 한 __iter__()
괜찮습니까?
그것은 다소 비밀 스럽습니다. 즉, 시퀀스가 인덱싱되어 쿼리가 가능한지 여부를 확인하고 인덱스가 0부터 시작해야 함을 의미합니까? 또한 인덱스가 0, 2, 8, 13, ...과 같은 것이 아니라 0, 1, 2, 3, ...과 같이 순차적이어야 함을 의미합니까?
예,이 부분은 이해합니다 =)
좋아, 이제 이것은 약간의 공상 과학을 얻습니다. 뭔가를 호출하는 것은 파이썬의 용어 sentinel
입니까? sentinel
Pythonically 는 무엇을 의미합니까? 그리고 "호출 가능한 객체"는 유형 객체가 아닌 함수처럼?
이 부분은 정말 이해가 안되지만 예가 도움이 될 것입니다.
좋아요, sentinel
여기에 몇 가지 위반 기준이 있습니까?
누군가가 위의 요점의 의미를 해독 / 명확하게 도울 수 있습니까 iter
?
하나의 인수로 특수 메소드 또는 특수 메소드 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] 삭제
몇 마디 만하겠습니다