Une version de film d'action en direct de "Tout ce dont vous avez besoin est tuer" est sortie [diffusée dans tout le Japon le 4 juillet 2014](http: //wwws.warnerbros) .co.jp / edgeoftomorrow /) Pour commémorer cela, j'ai écrit la classe ʻAllYouNeedIsKill` en Python.
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 = []
Une instance de la classe ʻAllYouNeedIsKill se comporte comme un itérateur avec la méthode
rewind () pour le rembobinage et la méthode
reset ()` pour partir de l'état au moment de l'exécution ajoutée à l'itérateur de l'objet argument. ..
L'échantillon est ci-dessous.
>>> from itertools import count # count()Est un itérateur qui ne cesse de compter
>>> from aynik import AllYouNeedIsKill
>>> counter = AllYouNeedIsKill(count(1))
>>> next(counter)
1
>>> next(counter)
2
>>> counter.rewind() #Effectuer le rembobinage
>>> next(counter) #Rewound pour qu'il devienne 1
1
>>> next(counter)
2
>>> counter.reset() #À partir de l'état actuel
>>> next(counter)
3
>>> counter.rewind() #Effectuer le rembobinage
>>> next(counter) #La valeur de retour sera 3 au lieu de 1
3
>>>
La classe ʻAllYouNeedIsKill me permet également de gérer des itérateurs de longueur infinie, mais elle est implémentée comme une classe plutôt qu'une fonction, et elle est entrée comme certains outils dans la bibliothèque standard ʻitertools
. Veuillez noter que le code n'est pas semblable à Python en raison de performances médiocres dues au non déploiement d'itérateurs sur taples.
ʻAynik.py` sera publié sous une licence BSD à deux clauses, alors n'hésitez pas à l'utiliser.
Recommended Posts