Vendredi I / O. Chez Wamuu Co., Ltd., chaque vendredi est un jour où nous travaillons sur ce qui nous intéresse et produisons les résultats d'une manière ou d'une autre. Tout le monde devrait faire ce qu'il veut le vendredi!
Les gens qui «s'habituent à Python» apprendront de plus en plus de nouvelles choses. Je pense qu'il y a encore beaucoup de choses que nous ne savons pas dans le monde de Python. (Plein de choses que je ne sais même pas)
Vous connaissez la notation d'inclusion de liste, mais vous pouvez en fait écrire autrement que la liste! !!
#Notation d'inclusion de dictionnaire
print({v: v * 10 for v in range(0, 10)})
#définir la notation d'inclusion
l = [1, 1, 1, 2, 2, 2, 3, 3, 3]
print({v * 10 for v in l})
«Non! J'écrirai la notation d'inclusion de tuple! Même si je dis «et écris ce qui suit, ça ne marche pas! !! !!
print((v * 10 for v in range(0, 10)))
Dans ce cas, «l'objet générateur» est renvoyé. Cela signifie que vous pouvez faire ce qui suit.
print(tuple(v * 10 for v in range(0, 10)))
Avez-vous déjà utilisé with
dans un exemple de fichier ouvert?
C'est tout.
with open(filepath) as f:
content = f.read(-1)
Lorsque vous quittez l'instruction with, le fichier est automatiquement fermé, mais cela utilise un mécanisme appelé gestionnaire de contexte.
class ContextManager(object):
def __enter__(self):
print('Oui! !! !!')
return 'balle de riz'
def __exit__(self, exc_type, exc_value, traceback):
print('Deta! !! !!')
with ContextManager() as value: # value == 'balle de riz'
print(value)
Lors de la saisie de l'instruction with, __enter__
est appelé, et à la sortie, __exit__
est appelé.
Très simple.
En Python, vous pouvez créer une classe qui se comporte spécialement uniquement si elle appartient à une certaine classe.
class Person(object):
def __init__(self, last_name, first_name):
self.last_name = last_name
self.first_name = first_name
self.parent = None
#C'est 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
Une classe normale lorsqu'elle est instanciée et utilisée normalement.
gakky = Person('Arakaki', 'Yui')
print(gakky.fullname) #Aragaki Yui
Cependant, si vous appartenez à une certaine classe, le comportement changera!
class Man(Person):
#La femme de tout le monde!
yome = Person('Arakaki', 'Yui')
#En ce moment, la femme de tout le monde est toujours là.
print(Man.yome.fullname) #Aragaki Yui
#JE!
ore = Man('Yamada', 'Taro')
#Kecorn! !! !! !!
print(ore.yome.fullname) #Yui Yamada! !! !! !! !!
Pour les références via des classes ou des instances, «get» est exécuté. C'est très pratique lors de la création d'une classe qui fait référence à la valeur de la classe à laquelle elle appartient.
Guide pratique des descripteurs
Il est implémenté comme Django Utility, mais la fonction cache du décorateur @ property
Un gars attaché.
Si vous l'appelez une fois, le résultat sera mis en cache, donc si vous effectuez un traitement intensif en interne, vous pouvez devenir une personne compatible avec les PC.
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 'C'était un processus lourd'
hoge = Hoge()
print(hoge.value)
print(hoge.value)
C'est la bonne façon d'utiliser le descripteur! !! !! Il existe également une bibliothèque unique.
C'est "Python Black Magic". C'est un mécanisme qui peut changer dynamiquement la définition de la classe, mais si vous l'implémentez comme suit, vous pouvez devenir un grand menteur.
class MetaClass(type):
def __new__(klass, name, bases, attrs):
"""
arguments:
klass --MetaClass lui-même
bases --Le nom de Hoge
bases --Classes parents de Hoge
attrs --Variables et fonctions de classe de Hoge
return:
Classe à utiliser réellement
"""
# new_la classe contient Hoge
new_class = super(MetaClass, klass).__new__(klass, name, bases, attrs)
#Je reviendrai int!
return int
#Hériter de la liste! !!
class Hoge(list, metaclass=MetaClass):
pass
#Ignorez le cancer! !! !!
print(Hoge) # <class 'int'>
Mis à part ce type d'implémentation matérielle, Metaclass est une technologie que la plupart des bibliothèques complexes utilisent, donc je pense que ce sera une expérience d'apprentissage de voir ceci et cela. C'est une utilisation planifiée car elle se comporte en ignorant diverses choses, mais l'implémentation est soignée, alors essayez-la.
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('Bonjour bonjour bonjour bonjour! !! !!')
class Ore(Person, metaclass=MetaClass):
silent = False
class Omae(Person, metaclass=MetaClass):
silent = True
Ore().say() #Bonjour bonjour bonjour bonjour! !! !!
Omae().say() # 。。。
Si vous souhaitez supprimer un élément vide du tableau, vous pouvez l'écrire comme suit.
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
Parfois, vous voulez créer un tableau multidimensionnel unidimensionnel! Dans le cas d'un tableau à deux dimensions, vous pouvez l'écrire exactement.
from itertools import chain
def flatten(l):
return list(chain.from_iterable(l))
print(flatten([
[1,2,3],
[4,5,6],
[7,8,9],
]))
Il semble que vous deviez le mettre en œuvre correctement s'il est plus multidimensionnel ou mixte.
Résumé de la procédure d'aplatissement d'une liste avec Python
Si vous écrivez une expression conditionnelle que le nom du fichier correspond à hoge.txt ou piyo.md
, ce sera comme suit.
if filename in ['hoge.txt', 'piyo.md']:
pass
Ensuite, j'ai voulu ajouter hige.text
et ʻiiyo.md` à cela, puis j'ai dû écrire un très long tableau qui ressemblerait à ça.
if filename in ['hoge.txt', 'hige.text', 'piyo.md', 'iiyo.md', ...]:
pass
Les fonctions suivantes sont utiles dans de tels cas.
Vous pouvez écrire de manière flexible comme Unix glob
.
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 est vraiment utile. Nous espérons que vous pourrez contribuer autant que possible à l'amélioration de vos compétences.