Quelques fonctionnalités avancées de python

高洛峰
Libérer: 2017-02-15 14:45:29
original
982 Les gens l'ont consulté

Avant-propos

J'utilise Python depuis près de six mois. J'ai commencé à le contacter pendant les vacances d'été de l'année dernière, de la confusion initiale à l'écriture de quelques petits robots et enfin au démarrage, de nombreuses tâches peuvent être effectuées en utilisant Python. Fondamentalement, Python est utilisé. Mais je suis encore un peu trop impatient. Je peux écrire quelques codes courts, mais je ne connais pas ou j'ai oublié de nombreuses fonctionnalités de python. Je vais revenir sur le tutoriel de Liao Da pour le revoir, et enregistrer les choses que je pense. sont plus importants.

Démarrer

Cet article enregistre principalement le contenu de la section des fonctionnalités avancées du didacticiel de Liao Da et note une partie de ma compréhension. À mon avis, ces fonctionnalités sont très pythoniques, et elles sont très importantes lorsqu'elles sont utilisées dans le code ~

List Comprehensions (List Comprehensions)

Je ne parlerai pas de découpage et d'itération, ici je ira directement Jetons d'abord un coup d'œil à la génération de listes. D'après le nom, vous pouvez à peu près deviner qu'il s'agit de quelques méthodes de génération de listes, telles que : Comment générer [1*1, 2*2, ... ,10*10] ? Vous pouvez utiliser une boucle pour ajouter continuellement des éléments à la fin de la liste. Si vous utilisez la méthode pythonique, c'est-à-dire la formule de génération de liste, c'est :

>>> [x * x for x in range(1, 11)]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
Copier après la connexion

, qui peut également être suivi de. un jugement if, par exemple :

>>> [x * x for x in range(1, 11) if x%2==0]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
Copier après la connexion

De cette façon, vous devez à l'origine utiliser une boucle pour écrire 4 ou 5 lignes de code, mais vous pouvez le résoudre avec une seule ligne, ce qui est intuitif et clair .

Vous pouvez également utiliser deux boucles for pour générer la permutation complète :

>>> [m + n for m in 'ABC' for n in 'XYZ']
['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']
Copier après la connexion

Comment ajouter un jugement if de cette manière ? Vous pouvez l'ajouter après chaque instruction for, ou l'ajouter à la fin :

>>> [m + n for m in 'ABC' if m < &#39;C&#39; for n in &#39;XYZ&#39; if n < &#39;Z&#39;]
[&#39;AX&#39;, &#39;AY&#39;, &#39;BX&#39;, &#39;BY&#39;]
>>> [m + n for m in 'ABC' for n in 'XYZ' if n < &#39;Z&#39; and m < &#39;C&#39;]
[&#39;AX&#39;, &#39;AY&#39;, &#39;BX&#39;, &#39;BY&#39;]
Copier après la connexion

Vous pouvez également itérer plusieurs variables dans une instruction for en même temps. Par exemple, les éléments de dict() peuvent itérer la clé. et valoriser en même temps :

>>> d = {'x': 'A', 'y': 'B', 'z': 'C' }
>>> [k + '=' + v for k, v in d.items()]
['y=B', 'x=A', 'z=C']
Copier après la connexion

C'est presque ça~

Mais j'ai toujours écrit C dans le passé. Ce genre de mode de pensée est difficile à changer, je ne peux le devenir que lentement. familier avec cette syntaxe utilisée et m'y habituer, je peux l'écrire inconsciemment.

Générateur

Pourquoi utiliser un générateur ? Le tutoriel de Liao Da l'explique en détail, voici un bref résumé :

  1. Le contenu de la liste étant placé en mémoire et soumis à des restrictions de mémoire, la capacité de la liste est limitée. .

  2. Si on n'accède qu'à très peu d'éléments, il y a une énorme perte d'espace.

  3. Le générateur peut calculer la valeur suivante en itérant. En théorie, le processus peut continuer indéfiniment et n'occupera pas beaucoup de mémoire.

Voici juste une brève introduction, veuillez Google pour plus de détails~

Comment créer un générateur ? La première méthode est similaire à la génération de liste mentionnée précédemment. Il vous suffit de remplacer [] par ():

>>> L = [x * x for x in range(10)]
>>> L
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> g = (x * x for x in range(10))
>>> g
<generator object <genexpr> at 0x1022ef630>
Copier après la connexion

Comme vous pouvez le voir, la méthode est à peu près la même. Ce que [] obtient est un. Une liste de toutes les valeurs a été obtenue, et ce que () a obtenu est un générateur, qui peut être itéré à l'aide d'une boucle for, mais le générateur n'est pas accessible à l'aide d'indices et ne peut être itéré qu'une seule fois s'il est itéré. encore une fois, une exception StopIteration se produira :

>>> for i in g:
...     print(i)
...
0
1
4
9
16
25
36
49
64
81
>>> for i in g:
...     print(i)
...
>>> next(g)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration
Copier après la connexion

Cependant, lorsque nous créons un générateur, nous n'appellerons fondamentalement jamais next(), mais nous le parcourrons dans une boucle for et n'avons pas besoin de nous soucier de StopIteration erreurs.

Si l'algorithme de calcul est plus complexe et ne peut pas être implémenté à l'aide d'une boucle for similaire à la génération de liste, vous pouvez également utiliser une fonction pour l'implémenter. Par exemple, la fameuse séquence de Fibonacci :

def fib(max):
    n, a, b = 0, 0, 1
    while n < max:
        yield b
        a, b = b, a + b
        n = n + 1
    return &#39;done&#39;
Copier après la connexion
.

Concernant le mot-clé rendement, j'ai longtemps eu du mal avec lui lorsque j'ai appris Python pour la première fois. Je ne l'ai pas compris jusqu'à ce que j'ai vu le générateur. Vous pouvez le comprendre à peu près en effectuant une recherche. donc je dirai simplement que j'ai peur de dire quelque chose de mal en une ou deux phrases. Le tutoriel de Liao Da dit ceci :

Les fonctions sont exécutées séquentiellement et reviennent lorsqu'elles rencontrent une instruction return ou la dernière ligne d'instructions de fonction. La fonction qui devient un générateur est exécutée à chaque fois que next() est appelée, revient lorsqu'elle rencontre une instruction rendement et continue l'exécution à partir de l'instruction rendement renvoyée la dernière fois lors de sa nouvelle exécution.

C’est peut-être un peu difficile à comprendre, mais une fois que vous l’avez compris, c’est facile à expliquer.

Bien sûr, vous pouvez également ajouter un retour à la fonction. Dans une fonction génératrice, s'il n'y a pas de retour, elle s'exécutera jusqu'à ce que la fonction soit terminée par défaut. Si elle revient pendant l'exécution, StopIteration sera lancée. directement pour terminer l’itération.

Par exemple, dans l'exemple ci-dessus, nous avons constaté que la chaîne de caractères « done » n'apparaissait pas lors de l'itération, car la valeur de retour était traitée comme une valeur d'exception. Si vous souhaitez l'afficher, vous pouvez. faites ceci :

>>> g = fib(6)
>>> while True:
...     try:
...         x = next(g)
...         print('g:', x)
...     except StopIteration as e:
...         print('Generator return value:', e.value)
...         break
...
g: 1
g: 1
g: 2
g: 3
g: 5
g: 8
Generator return value: done
Copier après la connexion

Iterator (Iterator)

Les objets qui peuvent être directement utilisés dans les boucles for sont appelés objets itérables. Vous pouvez utiliser la fonction isinstance() pour déterminer s'il s'agit d'un objet itérable. objet itérable :

>>> from collections import Iterable
>>> isinstance([], Iterable)
True
>>> isinstance({}, Iterable)
True
>>> isinstance('abc', Iterable)
True
>>> isinstance((x for x in range(10)), Iterable)
True
>>> isinstance(100, Iterable)
False
Copier après la connexion

L'objet qui peut être appelé par la fonction next() et qui renvoie en continu la valeur suivante est appelé un itérateur : Iterator. Bien sûr, vous pouvez toujours utiliser isinstance() pour déterminer si un objet est un objet Iterator :

>>> from collections import Iterator
>>> isinstance((x for x in range(10)), Iterator)
True
>>> isinstance([], Iterator)
False
>>> isinstance({}, Iterator)
False
>>> isinstance('abc', Iterator)
False
Copier après la connexion

A travers les deux exemples ci-dessus, vous pouvez le comprendre de cette façon : générateurs et listes, tuples, str, etc. sont tous des objets itérables. Générer Un itérateur est également un objet Iterator, alors qu'une liste, etc. ne l'est pas. Alors, peut-il être directement converti d'objets Iterable en objets Iterator ?

Vous pouvez utiliser la fonction iter() :

>>> isinstance(iter([]), Iterator)
True
>>> isinstance(iter('abc'), Iterator)
True
Copier après la connexion

其实,Iterator 对象表示的是一个数据流,我们可以把这个数据流看做是一个有序序列,但却不能提前知道序列的长度,只能不断通过next()函数实现按需计算下一个数据,所以 Iterator 的计算是惰性的,只有在需要返回下一个数据时它才会计算。Iterator甚至可以表示一个无限大的数据流,但 list,tuple 什么的是不可能这样的。

更多关于 python 的一些高级特性相关文章请关注PHP中文网!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal