Eine Live-Action-Filmversion von "Alles was du brauchst ist töten" wurde veröffentlicht [veröffentlicht in ganz Japan am 4. Juli 2014](http: //wwws.warnerbros) .co.jp / edgeoftomorrow /) Ich habe die Klasse "AllYouNeedIsKill" in Python geschrieben, um daran zu erinnern.
aynik.py
#!/usr/bin/env python3
# vim:fileencoding=utf-8
# Copyright (c) 2014 Masami HIRATA <[email protected]>
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# 1. Redistributions of source code must retain the above copyright notice,
# this list of conditions and the following disclaimer.
#
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
__all__ = ['AllYouNeedIsKill']
class AllYouNeedIsKill:
def __init__(self, iterable):
self._iter_source = iter(iterable)
self._buffer = []
self._iter_buffer = None
def __iter__(self):
return self
def __next__(self):
if self._iter_buffer is not None:
try:
return next(self._iter_buffer)
except StopIteration:
self._iter_buffer = None
value = next(self._iter_source)
self._buffer.append(value)
return value
def rewind(self):
if self._buffer:
self._iter_buffer = iter(self._buffer)
else:
self._iter_buffer = None
def reset(self):
if self._iter_buffer is not None:
self._buffer = list(self._iter_buffer)
self.rewind()
else:
self._buffer = []
Eine Instanz der Klasse "AllYouNeedIsKill" verhält sich wie ein Iterator mit der Methode "rewind ()" zum Zurückspulen und der Methode "reset ()" zum Starten vom Status zum Zeitpunkt der Ausführung, die dem Iterator des Argumentobjekts hinzugefügt wurde. ..
Das Beispiel ist unten.
>>> from itertools import count # count()Ist ein Iterator, der einfach weiter zählt
>>> from aynik import AllYouNeedIsKill
>>> counter = AllYouNeedIsKill(count(1))
>>> next(counter)
1
>>> next(counter)
2
>>> counter.rewind() #Rücklauf durchführen
>>> next(counter) #Zurückgespult, so dass es 1 wird
1
>>> next(counter)
2
>>> counter.reset() #Ausgehend vom aktuellen Status
>>> next(counter)
3
>>> counter.rewind() #Rücklauf durchführen
>>> next(counter) #Der Rückgabewert ist 3 anstelle von 1
3
>>>
Mit der Klasse "AllYouNeedIsKill" kann ich auch Iteratoren mit unendlicher Länge verarbeiten, sie ist jedoch eher in einer Klasse als in einer Funktion implementiert und wie einige Tools in der Standardbibliothek "itertools" typisiert. Beachten Sie, dass der Code aufgrund der schlechten Leistung nicht Python-ähnlich ist, da keine Iteratoren für Taples bereitgestellt werden.
aynik.py
wird unter einer BSD-Lizenz mit zwei Klauseln veröffentlicht. Sie können sie also gerne verwenden.
Recommended Posts