Une route vers Python intermédiaire

introduction

Programmez-vous en Python? Pour ceux qui ont une certaine compréhension de la grammaire de base de Python mais veulent aller plus loin, voici quelques techniques intermédiaires et méthodes d'écriture.

Si vous maîtrisez cet article, pouvez-vous devenir un utilisateur Python intermédiaire à partir de demain? Alors, commençons.

À propos de l'attribution de variables

En Python, il est possible de définir plusieurs variables sur une seule ligne.

Lors du remplacement normal:

x = 10
y = 12
z = 35

print(x, y, z)  # 10 12 35

Lors de la substitution sur une seule ligne:

x, y, z = 10, 12, 35

print(x, y, z)  # 10 12 35

Comme mentionné ci-dessus, il est possible de définir des variables sur une seule ligne. La lisibilité de toutes les définitions de variables est réduite d'une ligne, mais la lisibilité des définitions de variables avec certaines relations est améliorée d'une ligne.

De plus, lors de l'affectation de la même valeur à plusieurs variables, il est possible d'écrire comme suit. Cette méthode d'affectation requiert des précautions dans le cas d'objets mutables (variables). Pour plus de détails, veuillez vous référer à l'explication détaillée de M. shiracamus dans la section commentaires de cet article.

x = y = z = 10

print(x, y, z)  # 10 10 10

Permuter les variables

Lors du remplacement du contenu des variables, je pense qu'il est courant d'utiliser des variables temporaires, etc., mais dans le cas de Python, il est plus facile d'écrire.

Lors de l'échange de variables normalement:

x, y = 10, 23
tmp = x
x = y
y = tmp
print(x, y) # 23 10

Lors de l'échange de variables sur une seule ligne:

x, y = 10, 23
x, y = y, x
print(x, y) # 23 10

Je suis surpris que les variables puissent être échangées de cette manière. ..

Développer les variables

En Python, il est possible de développer des tableaux, des dictionnaires, etc. en utilisant le symbole * (astérisque).

test = [1, 2, 3]

print([test, 4, 5])  # [[1, 2, 3], 4, 5]
print([*test, 4, 5])  # [1, 2, 3, 4, 5]

Le code ci-dessus utilise un astérisque pour développer et affecter un tableau. Si vous n'utilisez pas l'astérisque, le tableau sera affecté dans un état imbriqué.

Pour les dictionnaires, utilisez deux astérisques.

test = {'apple': 'red', 'remon': 'yellow'}

print({**test,'cherrie': 'pink'}) # {'apple': 'red', 'remon': 'yellow', 'cherrie': 'pink'}

Comparaison du vrai et du faux

Je pense qu'il existe de nombreux cas où l'instruction IF détermine si la variable est 0 ou Aucune. Cependant, ce n'est pas du code pionique pour écrire la logique qui détermine réellement la valeur booléenne.

Pythonic signifie "comment écrire du code simple et facile à lire comme Python"

Lorsque vous jugez 0 normalement:

test = 0

if test == 0:
    print('NG')
else:
    print('OK')

Comment écrire des conditions de type Python:

test = 0

if not test:
    print('NG')
else:
    print('OK')

Dans le code pionique, ce qui est jugé faux est décidé à l'avance, nous n'écrivons donc pas explicitement la logique de jugement pour celui qui a été décidé. Les éléments suivants sont jugés faux. Jugement de valeur de vérité intégré

Comparaison avec None, est opérateur

Les opérateurs de comparaison Python sont == et ʻis`, qui peuvent tous deux être utilisés pour vérifier si les variables à comparer sont les mêmes. Cependant, sachez que si vous ne comprenez pas la signification des deux, vous pouvez créer des bogues inattendus.

Q. Dois-je utiliser est pour la comparaison avec Aucun? R. Oui. Mais à moins que vous ne sachiez ce que vous faites, vous obtiendrez les mêmes résultats qu'en utilisant ==

Tout d'abord, le fonctionnement de l'opérateur is sera expliqué. L'opérateur is vérifie si les variables comparées ont le même ID. Quel est l'ID d'une variable est la destination de référence (pointeur) de la variable. Par exemple, si la valeur de destination de référence est la même mais que la destination de référence (pointeur) est différente, l'opérateur is détermine qu'elle est fausse.

Si les variables se réfèrent à la même destination:

test = 'my name is taro' + '.'
test2 = test
print(id(test)) # 140643210401160
print(id(test2)) # 140643210401160

Dans le cas ci-dessus, test2 se voit attribuer une variable appelée test, donc test et test2 pointent vers la même référence. Ainsi, lors de la comparaison avec l'opérateur is, test et test2 sont jugés identiques. Vérifions également l'ID de None (l'ID peut varier en fonction de l'environnement)

test = None
test2 = None
print(id(test)) # 9107296
print(id(test2)) # 9107296

Aucun fait référence au même objet, peu importe où il est défini. Donc, si vous voulez comparer si c'est None ou non, vous pouvez utiliser l'opérateur is pour vérifier si la cible de comparaison est vraiment None. Dans le cas de l'opérateur ==, vous pouvez modifier le comportement de l'opérateur lui-même en utilisant une fonction appelée surcharge d'opérateur, il peut donc ne pas être possible de déterminer exactement s'il s'agit de None ou non. (Sans surcharge d'opérateur, les comparaisons None auront le même résultat avec les opérateurs is et ==)

Q. Ne devrions-nous pas utiliser pour des comparaisons autres que Aucune? R. Oui. L'utilisation de is for non-None comparaisons peut entraîner des bogues inattendus.

En particulier, il est dangereux d'utiliser beaucoup l'opérateur is car il peut se comporter de manière inattendue lors de la comparaison de variables de chaîne de caractères. Par exemple, considérez le code suivant.

test = 'my name is taro' + '.'
test2 = 'my name is taro' + '.'
print(id(test)) # 140196053288256
print(id(test2)) # 140196053288328

print(test) # my name is taro.
print(test2) # my name is taro.

if test is test2:
    print('same')
else:
    #C'est la sortie
    print('not same')
    
if test == test2:
    #C'est la sortie
    print('same')
else:
    print('not same')

Bien que test et test2 contiennent la même chaîne, ils sont référencés différemment. Ainsi, par rapport à l'opérateur is, les deux variables sont jugées différentes, et l'opérateur == est jugé identique. L'opérateur == a l'inconvénient d'être plus lent que l'opérateur is car il vérifie et juge le contenu de la variable, mais l'utilisation de l'opérateur is prête à confusion pour les comparaisons autres que None. Donc je ne le recommande pas. Cependant, dans des cas exceptionnels, l'opérateur is peut être utilisé pour écrire du code proprement. (Voir le commentaire de justes dans la section commentaires)

Évaluation des courts-circuits

D'autres langages ont une méthode d'évaluation de court-circuit, mais Python en a également une. En faisant bon usage de l'évaluation des courts-circuits, il est possible d'écrire intelligemment la logique des instructions IF.

Par exemple, considérez le code suivant.

test = {'age': 20}

if 'age' in test:
    if test['age'] >= 20:
        print('Je suis adulte')

Tout d'abord, la première instruction IF vérifie si la variable de test a un attribut appelé age. Cela permet d'éviter une erreur si vous accédez à un attribut qui n'existe pas. La deuxième instruction IF confirme si la valeur de l'attribut age est de 20 ou plus.

Réécrivons-le en utilisant l'évaluation des courts-circuits.

test = {'age': 20}

if 'age' in test and test['age'] >= 20:
    print('Je suis adulte')

Vous pourriez penser que vous avez simplement connecté les instructions IF avec l'opérateur and. Cependant, si vous permutez la gauche et la droite de l'opérateur and, le comportement que vous entendez changera. Le comportement exact de l'évaluation du court-circuit (et de l'opérateur et / ou de l'opérateur) est que si la première condition est vraie (ou opérateur) ou fausse (et opérateur), le traitement suivant n'est pas effectué. Devenir. Dans le cas ci-dessus, si le résultat de l'évaluation de «'age' in test» est faux, «test ['age']> = 20» ne sera pas évalué. Par conséquent, il est possible de réaliser la condition selon laquelle «test ['age']> = 20» n'est évalué que lorsque l'attribut age existe dans la variable de test.

Combinaison d'opérateurs de comparaison

Je pense qu'il existe de nombreux cas où les valeurs numériques sont comparées comme suit.

x = 10
if x >= 0 and x <= 20:
    print('OK')
else:
    print('NG')

Cependant, dans le cas de Python, il est possible d'écrire comme suit.

x = 10
if 0 <= x <= 20:
    print('OK')
else:
    print('NG')

Opérateur triangulaire

Lors de l'attribution d'une valeur à une variable, je pense qu'il existe de nombreuses situations dans lesquelles vous souhaitez modifier la valeur à attribuer en fonction des conditions. Par exemple, si la variable est None ou s'il s'agit d'une clé spécifique. À ce moment-là, vous pouvez écrire intelligemment en affectant des variables à l'aide de l'opérateur ternaire. La méthode de description de l'opérateur ternaire en Python est la suivante.

(variable) = (Valeur lorsque la condition est vraie) if (Expression conditionnelle) else (Valeur lorsque la condition est fausse) 

Code sans l'opérateur ternaire

test = 15

if test >= 0:
    message = 'Nombre positif ou 0'
else:
    message = 'Est un nombre négatif'
print(message)

Code lors de l'utilisation de l'opérateur ternaire

test = 15

message = 'Nombre positif ou 0' if test >= 0 else 'Est un nombre négatif'
print(message)

Comme mentionné ci-dessus, puisque la partie de l'instruction IF peut être décrite sur une seule ligne, la partie attribuée devient une ligne et la lisibilité du code est améliorée. Notez que dans l'opérateur ternaire, si vous souhaitez créer une branche avec plusieurs conditions (si vous souhaitez utiliser elif), vous devez imbriquer l'opérateur ternaire. Cependant, l'imbrication d'opérateurs ternaires réduit considérablement la lisibilité du code et n'est pas recommandée. Si la condition est compliquée, l'instruction IF peut être utilisée à la place de l'opérateur ternaire.

Incorporer la valeur d'une variable dans une chaîne

Je pense qu'il existe quatre façons d'intégrer la valeur d'une variable dans une chaîne en Python.

name = 'taro'

#Chaîne+Concaténer avec l'opérateur
print('je' + name + 'est')

#Utiliser une chaîne f
print(f'je{name}est')

#utiliser la fonction format
print('je{}est'.format(name))

# %Comment utiliser
print('je%s' % name)

La méthode concaténer les chaînes avec l'opérateur + n'est pas recommandée car elle rend le code moins lisible et moins modifiable. (L'opérateur + utilisé pour la concaténation n'a pas de sens en premier lieu, et vous devez écrire l'opérateur + lors de l'ajout d'un nouveau.) Je me demande si cela n'a pas d'importance si vous utilisez la f string ou la fonction de format. Cependant, vous ne souhaitez pas que les deux descriptions soient utilisées dans le code de votre projet. Je pense qu'il devrait être unifié pour l'un ou l'autre.

Instruction FOR du tableau

Je pense qu'il existe de nombreux cas où un tableau est traité par une instruction FOR. Voici quelques techniques utiles à utiliser dans ce cas.

UTILISER POUR CHAQUE

Lorsque vous utilisez l'instruction FOR normalement:

test = [1, 10, 15, 16]

for index in range(len(test)):
    print(test[index], end=' ') # 1 10 15 16 

Lors de l'utilisation POUR CHAQUE:

test = [1, 10, 15, 16]

for value in test:
    print(value, end=' ') # 1 10 15 16

Avec FOR EACH, la cible à boucler dans l'instruction FOR est l'élément du tableau de l'index. Donc, si vous avez besoin de traiter les éléments d'un tableau un par un, l'utilisation de la notation FOR EACH améliorera la lisibilité de votre code.

Nous rencontrons également souvent des cas où nous voulons utiliser des index dans FOR EACH. Dans ce cas, vous pouvez obtenir à la fois l'élément et l'index du tableau en procédant comme suit, afin que vous puissiez écrire intelligemment.

test = [1, 10, 15, 16]

for index, value in enumerate(test):
    # index: 0 value: 1 , index: 1 value: 10 , index: 2 value: 15 , index: 3 value: 16 , 
    print('index:', index, 'value:', value, ',', end=' ')

Obtenir les éléments du tableau dans l'ordre inverse

C'est rarement rencontré, mais il mentionne également lorsque vous souhaitez obtenir les éléments d'un tableau dans l'ordre inverse.

Si vous obtenez normalement les éléments d'un tableau dans l'ordre inverse:

test = [1, 10, 15, 16]

for i in range(len(test)-1, -1, -1):
    print(test[i], end=' ') # 16 15 10 1 

Lors de l'utilisation de la fonction inversée:

test = [1, 10, 15, 16]

for value in reversed(test):
    print(value, end=' ') # 16 15 10 1 

En plus d'utiliser la fonction inversée, vous pouvez également utiliser des tranches pour inverser les éléments du tableau. Veuillez vous référer au commentaire de c-yan pour plus de détails.

Pour programmer intelligemment en Python, il est important d'avoir une certaine compréhension des fonctions intégrées. Il décrit la fonction de plage, la fonction len, la fonction inversée, etc. utilisées dans cet article. Fonctions intégrées

Instruction FOR dans le dictionnaire

Je pense que le dictionnaire est souvent traité par l'instruction FOR. Il existe de nombreuses façons d'écrire une instruction FOR dans un dictionnaire, mais fondamentalement, il n'y a pas de problème si vous vous souvenez comment utiliser la fonction items.

Lors du traitement normal d'un dictionnaire avec une instruction FOR:

test = {'apple': 'red', 'remon': 'yellow'}

for key in test:
    print('key:', key, 'value:', test[key], ',', end=' ') # key: apple value: red , key: remon value: yellow , 

Lors de l'utilisation de la fonction éléments:

test = {'apple': 'red', 'remon': 'yellow'}

for key,value in test.items():
    print('key:', key, 'value:', value, ',', end=' ')

Supprimer les séquences en double

Je ne le rencontre pas très souvent, mais je pense que je le rencontrerai plusieurs fois. Vous pouvez vérifier le contenu du tableau et créer votre propre fonction pour éliminer les doublons, mais vous pouvez supprimer les doublons plus facilement.

test = [1, 2, 3, 3, 5, 1]
test2 = ['a', 'b', 'a', 'd', 'aa']

print(list(set(test))) # [1, 2, 3, 5]
print(list(set(test2))) # ['a', 'd', 'b', 'aa']

Le fait est que la duplication peut être automatiquement éliminée en convertissant en type Set. Après la conversion en type Set, il est de nouveau retourné au type List.

Trier le tableau

Vous n'implémentez pas vous-même le tri par tableau. Le tri peut être réalisé à l'aide des fonctions existantes.

test = [10, 25, 4, 100, 69]
print(sorted(test)) # [4, 10, 25, 69, 100]
print(sorted(test, reverse=True)) # [100, 69, 25, 10, 4]

Il est également possible de spécifier explicitement ce que vous souhaitez utiliser comme clé de tri.

test = [[10, 25], [4, 100], [69, 71]]
print(sorted(test, key=lambda item: item[1])) # [[10, 25], [69, 71], [4, 100]]

Le code ci-dessus est trié par le deuxième élément du tableau en tant que clé.

Le tri de la fonction triée n'est pas très rapide. Si vous rencontrez des problèmes de vitesse, nous vous recommandons d'utiliser une bibliothèque telle que numpy.

Trier le tableau du dictionnaire

Vous souhaiterez peut-être trier le tableau du dictionnaire. Dans ce cas, vous pouvez le gérer en spécifiant explicitement la clé comme indiqué ci-dessous.

test = [{'name': 'taro', 'age': 18},{'name': 'jiro', 'age': 12}]

# [{'name': 'jiro', 'age': 12}, {'name': 'taro', 'age': 18}]
print(sorted(test, key=lambda item: item['age']))

Notation d'inclusion de liste

La notation d'inclusion de liste est très pratique et c'est une méthode de description avec une vitesse de traitement rapide, c'est donc un style d'écriture que vous voulez absolument apprendre. La notation d'inclusion de liste est décrite comme suit.

[(Valeur à ajouter au tableau) for (Un élément de l'objet itérateur) in (Objet Iterator)]

Si vous créez normalement une liste paire:

test = []
for index in range(5):
    test.append(index * 2)
print(test) # [0, 2, 4, 6, 8]

Lors de la création d'une liste en notation d'inclusion de liste:

# [0, 2, 4, 6, 8]
print([index * 2 for index in range(5)])

J'ai pu écrire en une seule ligne. Il est également possible d'affiner les conditions en utilisant l'instruction IF (postfix IF).

#Créez un tableau pair qui ne contient pas de multiples de 10
# [2, 4, 6, 8, 12, 14, 16, 18, 22, 24, 26, 28, 32, 34, 36, 38]
print([index * 2 for index in range(20) if (index * 2) % 10])

Dans la notation d'inclusion de liste, il est également possible de brancher la condition avec IF et ELSE. De plus, le dictionnaire a également une notation inclusive, mais cette fois, elle sera omise.

toutes les fonctions et toutes les fonctions

Python a une fonction all qui détermine si tous les éléments sont True et une fonction any qui détermine si un élément est True. En faisant bon usage de toutes et toutes les fonctions, vous pouvez écrire des programmes intelligents.

Par exemple, supposons que vous écriviez un programme qui détermine si le contenu d'un tableau est égal ou supérieur à 0.

Lors de la mise en œuvre normale:

test = [-1, 5, 2]
judge = True
for value in test:
    if value < 0:
        judge = False
result = 'Tous les contenus sont 0 ou plus' if judge else 'Contient des nombres négatifs'
print(result)

Lors de l'utilisation de la fonction all:

test = [-1, 5, 2]
judge = all(map(lambda item: item >= 0, test))
result = 'Tous les contenus sont 0 ou plus' if judge else 'Contient des nombres négatifs'
print(result) #Contient des nombres négatifs

J'ai pu écrire 3 lignes en 1 ligne. Maintenant, passons à l'explication du programme. Tout d'abord, la fonction map est une fonction qui vous permet d'appliquer une fonction à chaque élément du tableau. Lorsque map (élément lambda: élément> = 0, test) est appliqué, un nouvel objet de carte est créé qui détermine si chaque élément est égal à 0 ou plus. Cela signifie qu'un objet de carte «False, True, True» sera créé. Ensuite, la fonction all est utilisée pour déterminer si tous les éléments sont True. Une mise en garde est que la fonction all renvoie un tableau vide comme True, vous devez donc écrire une branche distincte pour voir si le tableau est vide. (Merci pour ton commentaire, marmalade_boy)

Renvoie True si tous les éléments de iterable sont vrais (ou si iterable est vide)

Fonctions intégrées toutes

Gestionnaire de contexte et avec bloc

Nous n'entrerons pas dans les détails du gestionnaire de contexte, mais c'est une bonne idée d'en savoir plus sur le bloc with.

Par exemple, supposons que vous souhaitiez ouvrir un fichier. Pour gérer la situation où une exception se produit lors du traitement du fichier et que le fichier n'est pas fermé, placez-le dans une clause try et fermez le fichier définitivement.

fd = open("filename", "r")
try:
    file_content = file.read()
    raise Exception('test')
finally:
   fd.close()

Cependant, il est difficile d'écrire une clause try à chaque fois et de fermer le fichier, donc j'utilise le bloc with.

with open("filename", "r") as fd:
  file_content = file.read()
  raise Exception('test')

En écrivant comme ci-dessus, le fichier sera automatiquement fermé même si une exception se produit dans le bloc with.

finalement

Merci d'avoir lu le long texte. Python est toujours un langage profond, donc ceux présentés ci-dessus ne sont que quelques-uns. Cependant, j'espère que cela vous aidera. Puis (^^ ♪

Recommended Posts

Une route vers Python intermédiaire
[Road to Intermediate] Comprendre les propriétés Python
[Route vers Python intermédiaire] Utiliser des opérateurs ternaires
[Route vers Python intermédiaire] Utiliser des expressions lambda
[Route vers Python intermédiaire] Résumé du lien de l'article
[Road to Intermediate Python] Appelez une instance de classe comme une fonction avec __call__
[Python] La route du serpent (4) Numpy
[Python] La route du serpent (6) Manipuler les pandas
[Road to Intermediate] Python semble être tous des objets
[Route vers Python intermédiaire] Définir la fonction __getattr__ dans la classe
[Road to Intermediate Python] Définissez dans votre propre classe
[Python] Road to the Serpent (5) Jouez avec Matplotlib
[Python] Road to the Serpent (3) Classe Python
Road to Intermediate Linux: Network Edition
5 façons de créer un chatbot Python
[Road to Intermediate Python] Installer des packages en masse avec pip
[Route vers Python intermédiaire] Utiliser l'instruction if dans la notation d'inclusion de liste
[Road to Intermediate Python] Permet des opérations de comparaison pour des classes uniques
Mis à jour vers Python 2.7.9
[Python] Comment rendre une classe itérable
[Python] Comment convertir une liste bidimensionnelle en liste unidimensionnelle
[Route vers Python intermédiaire] Spécifiez dynamiquement la méthode d'exécution par nom de variable
Super Introduction Arithmétique Bit Python
[Python] Road to snakes (1) Construction de l'environnement
Je veux créer un environnement Python
[Python] Comment inverser une chaîne de caractères
Comment obtenir stacktrace en python
Ajouter un environnement virtuel Python à VSCode
Comment exécuter des scripts Maya Python
La route de la compilation vers Python 3 avec Thrift
"Backport" vers python 2
Envoyer un message de Slack à un serveur Python
Modifier Excel à partir de Python pour créer un tableau croisé dynamique
Comment lire un fichier CSV avec Python 2/3
Envoyer un message à LINE avec Python (LINE Notify)
Calculons en fait le problème statistique avec Python
Comment effacer un taple dans une liste (Python)
Comment incorporer des variables dans des chaînes python
Je veux créer une fenêtre avec Python
Porté un compilateur de langage homebrew naïf sur Python
Comment créer un fichier JSON en Python
Essayez de dessiner une courbe de vie avec python
Je veux faire un jeu avec Python
Comment générer un objet Python à partir de JSON
Essayez de créer un code de "décryptage" en Python
Une manière intelligente de chronométrer le traitement avec Python
Comment ajouter un chemin de recherche de module Python
Étapes pour développer une application Web en Python
Décidez d'une mission de laboratoire avec Python (fiction)
[Introduction à Python3, Jour 23] Chapitre 12 Devenir un Paisonista (12.1 à 12.6)
Remarque Python: lors de l'attribution d'une valeur à une chaîne
Pourquoi Python doit-il écrire un deux-points?
Étapes pour créer un bot Twitter avec Python
Pour ajouter un module à python que vous mettez dans Julialang
Comment notifier les canaux Discord en Python
Exporter la version Python3 OpenCV KeyPoint dans un fichier
Essayez de créer un groupe de dièdre avec Python