Freitag I / O. Bei Wamuu Co., Ltd. ist jeder Freitag ein Tag, an dem wir an dem arbeiten, woran wir interessiert sind, und die Ergebnisse auf irgendeine Weise ausgeben. Jeder sollte am Freitag machen, was er will!
Leute, die sich "an Python gewöhnen", werden immer mehr neue Dinge lernen. Ich denke, es gibt noch viele Dinge, über die wir in der Welt von Python nichts wissen. (Voller Dinge, die ich nicht einmal weiß)
Sie kennen die Notation der Listeneinbeziehung, können aber auch eine andere als die Liste schreiben! !!
#Wörterbucheinschlussnotation
print({v: v * 10 for v in range(0, 10)})
#Einschlussnotation setzen
l = [1, 1, 1, 2, 2, 2, 3, 3, 3]
print({v * 10 for v in l})
Nein! Ich werde die Tupel-Einschlussnotation schreiben! Selbst wenn ich
sage und folgendes schreibe, funktioniert es nicht! !! !!
print((v * 10 for v in range(0, 10)))
In diesem Fall wird "Generatorobjekt" zurückgegeben. Das heißt, Sie können Folgendes tun.
print(tuple(v * 10 for v in range(0, 10)))
Haben Sie jemals "with" in einem Beispiel zum Öffnen einer Datei verwendet? Das ist es.
with open(filepath) as f:
content = f.read(-1)
Wenn Sie die with-Anweisung beenden, wird die Datei automatisch geschlossen, es wird jedoch ein Mechanismus verwendet, der als Kontextmanager bezeichnet wird.
class ContextManager(object):
def __enter__(self):
print('Ja! !! !!')
return 'Reisbällchen'
def __exit__(self, exc_type, exc_value, traceback):
print('Deta! !! !!')
with ContextManager() as value: # value == 'Reisbällchen'
print(value)
Bei der Eingabe der with-Anweisung wird "enter" aufgerufen, und beim Beenden wird "exit" aufgerufen. Sehr einfach.
In Python können Sie eine Klasse erstellen, die sich nur dann besonders verhält, wenn sie zu einer bestimmten Klasse gehört.
class Person(object):
def __init__(self, last_name, first_name):
self.last_name = last_name
self.first_name = first_name
self.parent = None
#Das ist Kimo!
def __get__(self, parent, klass):
self.parent = parent
return self
@property
def fullname(self):
if self.parent:
return self.parent.last_name + self.first_name
return self.last_name + self.first_name
Eine normale Klasse, wenn sie instanziiert und normal verwendet wird.
gakky = Person('Arakaki', 'Yui')
print(gakky.fullname) #Aragaki Yui
Wenn Sie jedoch einer bestimmten Klasse angehören, ändert sich das Verhalten!
class Man(Person):
#Jedermanns Frau!
yome = Person('Arakaki', 'Yui')
#Zu diesem Zeitpunkt ist noch jede Frau da.
print(Man.yome.fullname) #Aragaki Yui
#ICH!
ore = Man('Yamada', 'Taro')
#Kecorn! !! !! !!
print(ore.yome.fullname) #Yui Yamada! !! !! !! !!
Für Referenzen über Klassen oder Instanzen wird __get__
ausgeführt.
Dies ist sehr praktisch, wenn Sie eine Klasse erstellen, die sich auf den Wert der Klasse bezieht, zu der sie gehört.
Es ist als Django Utility implementiert, aber die Cache-Funktion des Dekorators "@ property" Ein angehängter Typ. Wenn Sie es einmal aufrufen, wird das Ergebnis zwischengespeichert. Wenn Sie also intern eine umfangreiche Verarbeitung durchführen, können Sie eine PC-freundliche Person werden.
class cached_property(object):
def __init__(self, func):
self.__doc__ = getattr(func, '__doc__')
self.func = func
def __get__(self, parent, klass):
if parent is None:
return self
value = parent.__dict__[self.func.__name__] = self.func(parent)
return value
class Hoge(object):
@cached_property
def value(self):
import time
time.sleep(10)
return 'Es war ein schwerer Prozess'
hoge = Hoge()
print(hoge.value)
print(hoge.value)
Dies ist der richtige Weg, um den Deskriptor zu verwenden! !! !! Es gibt auch eine einzelne Bibliothek.
Dies ist "Python Black Magic". Es ist ein Mechanismus, der die Definition der Klasse dynamisch ändern kann. Wenn Sie sie jedoch wie folgt implementieren, können Sie ein großer Lügner werden.
class MetaClass(type):
def __new__(klass, name, bases, attrs):
"""
arguments:
klass --MetaClass selbst
bases --Hoges Name
bases --Hoges Elternklassen
attrs --Hoges Klassenvariablen und Funktionen
return:
Klasse, die tatsächlich verwendet werden soll
"""
# new_Klasse enthält Hoge
new_class = super(MetaClass, klass).__new__(klass, name, bases, attrs)
#Ich werde int zurückkehren!
return int
#Liste erben! !!
class Hoge(list, metaclass=MetaClass):
pass
#Krebs ignorieren! !! !!
print(Hoge) # <class 'int'>
Abgesehen von dieser Art der Materialimplementierung ist Metaclass eine Technologie, die hauptsächlich für komplizierte Bibliotheken verwendet wird. Ich denke, es wird eine Lernerfahrung sein, dies und das zu sehen. Es ist eine geplante Verwendung, da es sich so verhält, als würde es verschiedene Dinge ignorieren, aber die Implementierung ist ordentlich, also versuchen Sie es bitte.
class MetaClass(type):
def __new__(klass, name, bases, attrs):
new_class = super(MetaClass, klass).__new__(klass, name, bases, attrs)
silent = attrs.get('silent', False)
if silent:
new_class.say = lambda s: print('。。。')
return new_class
class Person(object):
def say(self):
print('Hallo Hallo Hallo Hallo! !! !!')
class Ore(Person, metaclass=MetaClass):
silent = False
class Omae(Person, metaclass=MetaClass):
silent = True
Ore().say() #Hallo Hallo Hallo Hallo! !! !!
Omae().say() # 。。。
Wenn Sie ein leeres Element aus dem Array entfernen möchten, können Sie es wie folgt schreiben.
def ignore_empty(l):
return list(filter(None, l))
print(ignore_empty([1, None, 0, 2, '', 3]))
https://docs.python.jp/3/library/functions.html#filter
flatten
Manchmal möchten Sie ein mehrdimensionales Array eindimensional machen! Bei einem zweidimensionalen Array können Sie es genau schreiben.
from itertools import chain
def flatten(l):
return list(chain.from_iterable(l))
print(flatten([
[1,2,3],
[4,5,6],
[7,8,9],
]))
Es scheint, dass Sie es richtig implementieren müssen, wenn es mehrdimensional oder gemischt ist.
Zusammenfassung zum Reduzieren einer Liste mit Python
Wenn Sie einen bedingten Ausdruck schreiben, der besagt, dass der Dateiname mit hoge.txt oder piyo.md übereinstimmt, lautet er wie folgt.
if filename in ['hoge.txt', 'piyo.md']:
pass
Dann wollte ich "hige.text" und "iiyo.md" hinzufügen, und dann musste ich so ein sehr langes Array schreiben.
if filename in ['hoge.txt', 'hige.text', 'piyo.md', 'iiyo.md', ...]:
pass
Die folgenden Funktionen sind in solchen Fällen nützlich.
Sie können flexibel wie das Unix glob
schreiben.
from fnmatch import fnmatch
class glob_list(list):
def __contains__(self, value):
for pattern in self:
if fnmatch(value, pattern):
return True
return False
l = glob_list(['??ge.txt', '?iyo.md'])
assert 'hoge.txt' in l
assert 'hige.txt' in l
assert 'piyo.md' in l
assert 'iiyo.md' in l
Python ist wirklich nützlich. Wir hoffen, dass Sie dazu beitragen können, Ihre Fähigkeiten so weit wie möglich zu verbessern.