2010-07-12 15 views
1

Possible en double:
Common Pitfalls in PythonPython Langue Nuances

J'apprends Python et je viens d'un milieu diversifié de langages de programmation. Au cours des cinq dernières années, j'ai écrit pas mal de Java, C++, VB.Net et PHP. Comme beaucoup d'entre vous peuvent être d'accord, une fois que vous apprenez un langage de programmation, en apprendre un autre est juste une matière pour apprendre les différences dans la syntaxe et les meilleures pratiques. En sortant de PHP, je suis devenu très habitué à beaucoup de fonctionnalités de langage script. Par exemple, des trucs comme ça me chatouille Insides:

# Retrieve the value from the cache; otherwise redownload. 
if(!($value = $cache->get($key))) 
    # Redownload the value and store in the cache. 
    $cache->set($key, $value = redownload($key)); 

Python, cependant, ne considère pas l'affectation à une expression. OTOH, il supporte de belles choses comme la construction in, que je trouve être l'une des plus grandes inventions de tous les temps. x in y est tellement plus agréable que !empty($y[$x]). Quelles autres nuances, les fonctionnalités «manquantes» et les goulets d'étranglement au niveau des performances dois-je surveiller? J'espère faire une transition aussi transparente que possible dans le développement de Python, et j'espère apprendre quelques-uns des secrets qui aideront à lisser le temps de développement et à éliminer les essais et les erreurs. Votre perspicacité est appréciée!

+3

Cela devrait être marqué wiki de la communauté, je pense. – detly

+1

dupe: http://stackoverflow.com/questions/1011431/common-pitfalls-in-python – SilentGhost

+0

Je reçois une ambiance assez négative de cette question. Pourquoi devriez-vous considérer la situation comme une découverte des "déficiences" de Python? Est-ce que le fait que php ne supporte pas quelque chose comme 'if 1 MAK

Répondre

3

Celui-ci m'a fallu quelques heures pour comprendre quand je ne rencontrais dans un véritable programme:

A défaut l'argument d'une fonction est une valeur statique mutable.

def foo(bar = []): 
    bar.append(1) 
    print(bar) 

foo() 
foo() 

Cette imprimera

[1] 
[1, 1] 
+0

Wow, ok. C'est plutôt inattendu. – mattbasta

2

Les threads ne font pas ce que vous pensez qu'ils font, et ne devraient probablement pas être utilisés comme vous avez l'habitude de les utiliser. Ceci est un énorme getcha pour beaucoup de gens, en particulier pour ceux qui sont habitués à Java où sous-classe Thread implémenter l'interface Runnable pour faire un travail asynchrone, et où il y a un support de langage pour exécuter des threads en parallèle (sur des machines avec plusieurs processeurs) noyaux).

En général, vous ne voulez probablement pas de threads du tout, mais des sous-processus. Voir my answer à la question .

(En plus général, il pourrait y avoir une meilleure façon tout à fait.)

+0

"en particulier pour ceux utilisés à Java où la coutume est de sous-classe Thread pour faire un travail asynchrone" - Sérieusement? Qui ferait une telle chose ?? – perp

0

exceptions sont vos amis. Contrairement à des langages comme C et PHP qui utilisent la valeur de retour pour indiquer des erreurs, Python utilise des exceptions pour interrompre le programme au lieu de permettre aux erreurs de causer d'autres problèmes sur toute la ligne.

3

Pour exemple, la manière habituelle serait quelque chose comme ça

try: 
    value = cache[key] 
except KeyError: 
    value = cache[key] = redownload(key) 
+0

... ou utilisez 'defaultdict' avec' redownload' comme fonction d'usine. – detly

+0

@detly, la fonction d'usine pour defaultdict est appelée sans arguments –

0

le code Pythonic est généralement beaucoup plus rapide que le code C-like.

Quelque chose comme:

new_list=[] 
for i in xrange(len(old_list)): 
    new_list.append(some_function(old_list[i])) 

est mieux écrit que:

new_list=[some_function(x) for x in old_list] 

ou

new_list=map(some_function,old_list)