python: Attention à ces endroits.
python是一门非常有趣的语言。它提供了许多非常方便的标准库和许多内置命令是我们轻松完成任务.但是好东西太多了就有选择恐惧症了,以至于我们不能很好第利用这个标准库和它的基本机构。下面列出了一些对python新手来说很简单有效的陷阱。
Vous avez ignoré la version de Python
C'est un problème qui est constamment soulevé sur StackOverflow. Comme c'est une expérience de faire des erreurs lorsque votre code parfait s'exécute sur un ordinateur d'une autre personne, il est temps de vérifier si votre version de python est compatible. Assurez-vous que votre code s'exécute sur la version de python que vous connaissez.
$ python --version
Python 2.7.9
Gestion de version python
pyenv est un bon outil de gestion de version python. Malheureusement, il ne fonctionne que sur *nix. Sur Mac OS, vous pouvez simplement installer pyenv avec brew install.
Trouble à résoudre avec une seule ligne de code
Beaucoup de gens se vantent de résoudre tous les problèmes avec une seule ligne de code, même si leur code est moins efficace que celui écrit normalement, et que le code est plus difficile à lire et même ambigu; par exemple:
l = [m for a, b in zip(this, that) if b.method(a) != b for m in b if not m.method(a, b) and reduce(lambda x, y: a + y.method(), (m, a, b))]
Pour être honnête, j'ai écrit le code ci-dessus pour illustrer ce point. Mais j'ai vraiment vu beaucoup de gens le faire. Si vous vous montrez à résoudre des problèmes complexes en ajoutant simplement quelque chose à une liste ou à un ensemble, vous risquez de ne pas être payé.
Une ligne de code de contrôle n'est pas une grande réalisation, bien qu'elle puisse parfois sembler particulièrement intelligente. Le bon code est simple, mais plus axé sur l'efficacité et la lisibilité.
Ensemble initialement incorrect
这是一个更加微妙的问题,有时候会让你措手不及。set推导式起来有点像list推导式.
>>> { n for n in range(10) if n % 2 == 0 }
{0, 8, 2, 4, 6}
>>> type({ n for n in range(10) if n % 2 == 0 })
L'exemple ci-dessus illustre cela. La différence entre les deux est que le ensemble n'a pas de valeur répétée et est désordonné. On considère généralement {} comme un ensemble vide, mais ce n'est pas le cas, c'est un dictum vide.
>>> {}
{}
>>> type({})
Donc, si nous voulons initialement un ensemble vide, nous allons directement utiliser le ensemble (((
>>> set()
set()
>>> type(set())
Remarquez qu'un ensemble vide peut être défini comme un ensemble (((), mais qu'il s'agit d'un ensemble contenant des éléments qui doit être défini comme un ensemble (([1, 2]) ).
Le GIL est mal compris
GIL (global interpreter lock) signifie qu'un seul thread peut être exécuté à tout moment dans un programme Python. Cela signifie que lorsque nous ne pouvons pas créer un thread et l'attendre à ce qu'il fonctionne en parallèle, l'interpréteur Python ne fait en fait que passer rapidement d'un thread à l'autre. Mais c'est une version très simple.
Beaucoup de gens essaient de justifier à Python que ce sont tous de vrais threads.3. C'est vrai, mais cela ne change rien au fait que Python traite les threads différemment de ce à quoi vous vous attendez.
La solution proposée est d'utiliser des modules de multiprocessage. Les processus fournis par les modules de multiprocessage couvrent essentiellement bien les différences. Cependant, les différences sont beaucoup plus élevées que le coût du fil.
Cependant, ce n'est pas un problème rencontré par tous les programmes Python. PyPy-stm est un exemple d'implémentation de Python qui n'est pas affectée par GIL.
Dans tous les cas, faites attention à l'utilisation des classes de chaînes, vous n'obtiendrez peut-être pas ce que vous voulez.
Utiliser des classes de style obsolètes
Il y a deux types de classes en Python 2, les anciennes et les nouvelles classes. Si vous utilisez Python 3, vous utilisez les nouvelles classes par défaut. Pour vous assurer que vous utilisez les nouvelles classes en Python 2, vous devez hériter des objets ou de toute nouvelle classe que vous créez.
class MyNewObject(object): # stuff here
Ces nouvelles puces de classe réparent des problèmes très basiques qui apparaissaient dans les anciennes classes, et si vous êtes intéressé, vous pouvez consulter la documentation.
La mauvaise répétition
Les erreurs suivantes sont très courantes chez les débutants:
for name_index in range(len(names)):
print(names[name_index])
Il est évident qu'il n'est pas nécessaire d'utiliser le len, mais en fait, vous pouvez parcourir la liste en utilisant des phrases très simples:
for name in names:
print(name)
En outre, il existe une multitude d'autres outils que vous pouvez utiliser pour simplifier l'itération. Par exemple, zip peut être utilisé pour parcourir deux listes:
for cat, dog in zip(cats, dogs):
print(cat, dog)
Si nous voulons considérer les variables de l'index et de la liste de valeurs, nous pouvons utiliser l'énumération.
for index, cat in enumerate(cats):
print(cat, index)
Il y a beaucoup d'autres fonctionnalités à choisir dans iTools. Si iTools contient une fonctionnalité que vous voulez, il est facile de l'obtenir.
L'abus d'itertools a fait que l'un des dieux de StackOverflow a mis beaucoup de temps à le résoudre.
Utilisation de paramètres par défaut variables
J'ai vu beaucoup de choses comme:
def foo(a, b, c=[]):
# append to c
# do some more stuff
N'utilisez pas de paramètres par défaut variables, mais utilisez:
def foo(a, b, c=None):
if c is None:
c = []
# append to c
# do some more stuff
L'exemple ci-dessous nous aide à comprendre ce problème de manière très intuitive:
In[2]: def foo(a, b, c=[]):
... c.append(a)
... c.append(b)
... print(c)
...
In[3]: foo(1, 1)
[1, 1]
In[4]: foo(1, 1)
[1, 1, 1, 1]
In[5]: foo(1, 1)
[1, 1, 1, 1, 1, 1]
Le même c est cité encore et encore à chaque fois que la fonction est appelée. Cela peut avoir des conséquences très indésirables.