Technique Python pour ceux qui veulent se débarrasser des débutants

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!

introduction

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)

Notation d'inclusion

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)))

Gestionnaire de contexte et avec déclaration

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.

descripteur

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

Décorateur de propriété avec fonction de cache

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.

Métaprogrammation

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()  # 。。。

Petites histoires

Supprimer la valeur vide

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

Écrivez facilement des expressions conditionnelles qui correspondent à plusieurs valeurs

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

La fin

Python est vraiment utile. Nous espérons que vous pourrez contribuer autant que possible à l'amélioration de vos compétences.

Recommended Posts

Technique Python pour ceux qui veulent se débarrasser des débutants
Pour ceux qui veulent écrire Python avec vim
Pour ceux qui veulent apprendre Excel VBA et se lancer avec Python
5 raisons pour lesquelles le traitement est utile pour ceux qui veulent se lancer avec Python
La première étape de l'apprentissage automatique ~ Pour ceux qui veulent essayer l'implémentation avec python ~
Python pour les super débutants Super débutants Python # Facile à éliminer
Une procédure de création d'environnement moderne pour ceux qui veulent se lancer immédiatement avec Python
Points ennuyeux pour ceux qui veulent présenter Ansible
~ Conseils pour les débutants de Python présentés avec amour par Pythonista ③ ~
Construction d'environnement pour ceux qui veulent étudier Python facilement avec VSCode (pour Mac)
Pour ceux qui souhaitent démarrer l'apprentissage automatique avec TensorFlow2
Référence de référence pour ceux qui veulent coder avec Rhinoceros / Grasshopper
La première étape pour ceux qui sont amateurs de statistiques mais qui souhaitent implémenter des modèles d'apprentissage automatique en Python
Procédure d'inscription PyPI pour ceux qui veulent faire leurs débuts PyPI
Articles en vrac pour ceux qui veulent commencer le traitement du langage naturel
[Python] Compte-rendu de la réunion d'étude pour les débutants (7/15)
Comment se débarrasser des longues inclusions
[Phrase courte] easygui pour ceux qui veulent utiliser une interface graphique simple avec Python très facilement
Résumé des techniques utiles de Scrapy en Python
[Version 2020 pour les débutants] Méthode d'étude recommandée pour ceux qui souhaitent devenir eux-mêmes ingénieur en IA
Débarrassez-vous des images DICOM en Python
J'ai analysé les données Airbnb pour ceux qui veulent rester à Amsterdam
Procédure du développement AWS CDK (Python) à la construction de ressources AWS * Pour les débutants
[Pour les débutants] Je veux obtenir l'index d'un élément qui satisfait une certaine expression conditionnelle
Mémo n ° 4 que les débutants Python lisent "Explication détaillée de la grammaire Python"
Le moyen le plus rapide pour les débutants de maîtriser Python
Grammaire de fléchettes pour ceux qui ne connaissent que Python
Mémo n ° 3 que les débutants Python lisent "Explication détaillée de la grammaire Python"
Mémo n ° 1 que les débutants Python lisent "Explication détaillée de la grammaire Python"
[Python] Débarrassez-vous de la datation avec des expressions régulières
Essayez de calculer RPN avec Python (pour les débutants)
Je veux obtenir les données de League of Legends ③
Je veux obtenir les données de League of Legends ②
Mémo n ° 2 que les débutants Python lisent "Explication détaillée de la grammaire Python"
Mémo n ° 7 que les débutants Python lisent "Explication détaillée de la grammaire Python"
Introduction à la programmation (Python) TA Tendency pour les débutants
Je veux obtenir les données de League of Legends ①
Mémo n ° 6 pour les débutants Python à lire "Explication détaillée de la grammaire Python"
Comment rendre le Python des débutants plus rapide [numpy]
Mémo n ° 5 que les débutants Python lisent "Explication détaillée de la grammaire Python"
Histoire de base de l'héritage en Python (pour les débutants)
Analyse des données en Python Résumé des sources que les débutants devraient d'abord consulter
Conseils pour ceux qui ne savent pas comment utiliser is et == en Python
Rejoignez Azure avec Go ~ Pour ceux qui veulent démarrer et connaître Azure avec Go ~
Points à garder à l'esprit lors de l'utilisation de Python pour ceux qui utilisent MATLAB
Je veux obtenir / exécuter des variables / fonctions / classes de fichiers externes à partir de Python
Script Python pour obtenir une liste d'exemples d'entrée pour le concours AtCoder
[Introduction à Python] Comment obtenir l'index des données avec l'instruction for
[Pour les débutants] Comment utiliser la commande say avec python!
Même les débutants veulent dire "Je comprends parfaitement Python"
Comment convertir le type Python # pour les super débutants de Python: str
Comment obtenir le nombre de chiffres en Python
Je souhaite obtenir des attributs de données personnalisés de HTML sous forme d'éléments à l'aide de Python Selenium
[Pour les débutants] Comment étudier le test d'analyse de données Python3
[Pour ceux qui maîtrisent d'autres langages de programmation] 10 points pour rattraper les points Python
Résumé des méthodes de prétraitement pour les débutants en Python (trame de données Pandas)
Manuel python pour les débutants
Après avoir frappé l'API Qiita avec Python pour obtenir une liste d'articles pour les débutants, nous visiterons les articles divins
[Pour les débutants] Web scraping avec Python "Accédez à l'URL de la page pour obtenir le contenu"
❤️ Blogueurs ❤️ "Beloved BI" ❤️ Commençons ❤️ (pour ceux qui peuvent créer des graphiques avec Python)