Il y a beaucoup de discussions sur Python vs Ruby, et je les trouve tous complètement inutiles, car ils tournent tous autour de la raison pour laquelle la fonctionnalité X aspire dans la langue Y, ou qui prétendent que la langue Y n'a pas X, bien qu'en fait, elle le soit. Je sais aussi exactement pourquoi je préfère Python, mais c'est aussi subjectif, et cela n'aiderait personne à choisir, car ils pourraient ne pas avoir les mêmes goûts en développement que moi.
Il serait donc intéressant d'énumérer objectivement les différences. Donc pas de "lambdas de Python craint". Expliquez plutôt ce que les lambdas de Ruby peuvent faire que Python ne peut pas. Aucune subjectivité. L'exemple de code est bon!
N'ayez pas plusieurs différences dans une réponse, s'il vous plaît. Et votez pour ceux que vous savez être corrects et pour ceux que vous savez incorrects (ou subjectifs). De plus, les différences de syntaxe ne sont pas intéressantes. Nous savons que Python fait avec indentation ce que Ruby fait avec les crochets et les extrémités, et que @ est appelé self en Python.
MISE À JOUR: Ceci est maintenant un wiki communautaire, nous pouvons donc ajouter les grandes différences ici.
Ruby a une référence de classe dans le corps de classe
Dans Ruby, vous avez une référence à la classe (self) déjà dans le corps de la classe. En Python, vous n'avez pas de référence à la classe tant que la construction de la classe n'est pas terminée.
Un exemple:
class Kaka
puts self
end
self dans ce cas est la classe, et ce code afficherait "Kaka". Il n'y a aucun moyen d'imprimer le nom de la classe ou autrement d'accéder à la classe à partir du corps de définition de classe en Python (en dehors des définitions de méthode).
Toutes les classes sont modifiables en Ruby
Cela vous permet de développer des extensions pour les classes principales. Voici un exemple d'extension de rails:
class String
def starts_with?(other)
head = self[0, other.length]
head == other
end
end
Python (imaginez qu'il n'y avait pas de ''.startswith
méthode):
def starts_with(s, prefix):
return s[:len(prefix)] == prefix
Vous pouvez l'utiliser sur n'importe quelle séquence (pas seulement sur des chaînes). Pour l' utiliser, vous devez l' importer explicitement par exemple from some_module import starts_with
.
Ruby a des fonctionnalités de script de type Perl
Ruby a des regexps de première classe, des variables $, la boucle d'entrée ligne par ligne awk / perl et d'autres fonctionnalités qui le rendent plus adapté à l'écriture de petits scripts shell qui fusionnent les fichiers texte ou agissent comme du code de collage pour d'autres programmes.
Ruby a des continuations de première classe
Merci à la déclaration callcc. En Python, vous pouvez créer des suites par diverses techniques, mais il n'y a pas de support intégré au langage.
Ruby a des blocs
Avec l'instruction "do", vous pouvez créer une fonction anonyme multi-lignes dans Ruby, qui sera passée comme argument dans la méthode devant do, et appelée à partir de là. En Python, vous feriez plutôt cela en passant une méthode ou avec des générateurs.
Rubis:
amethod { |here|
many=lines+of+code
goes(here)
}
Python (les blocs Ruby correspondent à différentes constructions en Python):
with amethod() as here: # `amethod() is a context manager
many=lines+of+code
goes(here)
Ou
for here in amethod(): # `amethod()` is an iterable
many=lines+of+code
goes(here)
Ou
def function(here):
many=lines+of+code
goes(here)
amethod(function) # `function` is a callback
Fait intéressant, l'instruction de commodité dans Ruby pour appeler un bloc est appelée "yield", ce qui en Python créera un générateur.
Rubis:
def themethod
yield 5
end
themethod do |foo|
puts foo
end
Python:
def themethod():
yield 5
for foo in themethod():
print foo
Bien que les principes soient différents, le résultat est étonnamment similaire.
Ruby prend en charge plus facilement la programmation de style fonctionnel (de type pipe)
myList.map(&:description).reject(&:empty?).join("\n")
Python:
descriptions = (f.description() for f in mylist)
"\n".join(filter(len, descriptions))
Python a des générateurs intégrés (qui sont utilisés comme des blocs Ruby, comme indiqué ci-dessus)
Python prend en charge les générateurs dans le langage. Dans Ruby 1.8, vous pouvez utiliser le module générateur qui utilise des continuations pour créer un générateur à partir d'un bloc. Ou, vous pouvez simplement utiliser un bloc / proc / lambda! De plus, dans Ruby 1.9, les fibres sont et peuvent être utilisées comme des générateurs, et la classe Enumerator est un générateur intégré 4
docs.python.org a cet exemple de générateur:
def reverse(data):
for index in range(len(data)-1, -1, -1):
yield data[index]
Comparez cela aux exemples de blocs ci-dessus.
Python a une gestion flexible de l'espace de noms
Dans Ruby, lorsque vous importez un fichier avec require
, toutes les choses définies dans ce fichier se retrouveront dans votre espace de noms global. Cela provoque une pollution de l'espace de noms. La solution à cela est les modules Rubys. Mais si vous créez un espace de noms avec un module, vous devez utiliser cet espace de noms pour accéder aux classes contenues.
En Python, le fichier est un module, et vous pouvez importer ses noms contenus avec from themodule import *
, polluant ainsi l'espace de noms si vous le souhaitez. Mais vous pouvez également importer uniquement les noms sélectionnés avec from themodule import aname, another
ou vous pouvez simplement import themodule
accéder aux noms avec themodule.aname
. Si vous voulez plus de niveaux dans votre espace de noms, vous pouvez avoir des packages, qui sont des répertoires avec des modules et un __init__.py
fichier.
Python a des docstrings
Les docstrings sont des chaînes qui sont attachées aux modules, fonctions et méthodes et peuvent être examinées lors de l'exécution. Cela aide à créer des éléments tels que la commande d'aide et la documentation automatique.
def frobnicate(bar):
"""frobnicate takes a bar and frobnicates it
>>> bar = Bar()
>>> bar.is_frobnicated()
False
>>> frobnicate(bar)
>>> bar.is_frobnicated()
True
"""
L'équivalent de Ruby est similaire aux javadocs, et situé au-dessus de la méthode plutôt qu'en son sein. Ils peuvent être récupérés à l'exécution à partir des fichiers à l'aide de l' exemple de méthode # source_location de la méthode 1.9.
Python a un héritage multiple
Ruby ne le fait pas ("exprès" - voir le site Web de Ruby, voir ici comment cela se fait dans Ruby ). Il réutilise le concept de module comme un type de classes abstraites.
Python a des compréhensions list / dict
Python:
res = [x*x for x in range(1, 10)]
Rubis:
res = (0..9).map { |x| x * x }
Python:
>>> (x*x for x in range(10))
<generator object <genexpr> at 0xb7c1ccd4>
>>> list(_)
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
Rubis:
p = proc { |x| x * x }
(0..9).map(&p)
Python 2.7+ :
>>> {x:str(y*y) for x,y in {1:2, 3:4}.items()}
{1: '4', 3: '16'}
Rubis:
>> Hash[{1=>2, 3=>4}.map{|x,y| [x,(y*y).to_s]}]
=> {1=>"4", 3=>"16"}
Python a des décorateurs
Des choses similaires aux décorateurs peuvent également être créées dans Ruby, et on peut également affirmer qu'elles ne sont pas aussi nécessaires qu'en Python.
Différences de syntaxe
Ruby requiert "end" ou "}" pour fermer toutes ses étendues, tandis que Python utilise uniquement des espaces blancs. Il y a eu récemment des tentatives dans Ruby pour autoriser uniquement l'indentation des espaces blancs http://github.com/michaeledgar/seamless
Réponses:
Ruby a les concepts de blocs , qui sont essentiellement du sucre syntaxique autour d'une section de code; ils sont un moyen de créer des fermetures et de les passer à une autre méthode qui peut ou non utiliser le bloc. Un bloc peut être invoqué ultérieurement via une
yield
instruction.Par exemple, une définition simple d'une
each
méthode surArray
pourrait être quelque chose comme:Ensuite, vous pouvez invoquer ceci comme ceci:
Python a des fonctions / fermetures / lambdas anonymes, mais il n'a pas tout à fait de blocs car il manque une partie du sucre syntaxique utile. Cependant, il existe au moins un moyen de l'obtenir de façon ponctuelle. Voir, par exemple, ici .
la source
Exemple Python
Les fonctions sont des variables de première classe en Python. Vous pouvez déclarer une fonction, la passer comme un objet et la remplacer:
Il s'agit d'une caractéristique fondamentale des langages de script modernes. JavaScript et Lua le font aussi. Ruby ne traite pas les fonctions de cette façon; nommer une fonction l'appelle.
Bien sûr, il existe des moyens de faire ces choses dans Ruby, mais ce ne sont pas des opérations de première classe. Par exemple, vous pouvez encapsuler une fonction avec Proc.new pour la traiter comme une variable - mais alors ce n'est plus une fonction; c'est un objet avec une méthode "call".
Les fonctions de Ruby ne sont pas des objets de première classe
Les fonctions Ruby ne sont pas des objets de première classe. Les fonctions doivent être enveloppées dans un objet pour les faire circuler; l'objet résultant ne peut pas être traité comme une fonction. Les fonctions ne peuvent pas être attribuées de manière optimale. à la place, une fonction dans son objet conteneur doit être appelée pour les modifier.
la source
x = y
et non par appelself.class.send(:define_method, :func, method(:func2))
. Votre "contre-exemple" montre à quel point les fonctions de Ruby ne sont pas de première classe. Si vous n'êtes pas d'accord, n'hésitez pas à poster votre propre réponse; ne collez pas votre confusion dans la mienne.def ... end
in ruby ne sont pas des fonctions. Ce sont des méthodes (comme vous les avez définies, deKernel
). Les méthodes peuvent être non liées (en utilisant la#method
méthode), qui sont alors des objets. La chose la plus proche que ruby a des fonctions sont lesProc
instances, qui sont également des objets, et peuvent être transmises ou invoquées. Il a également une syntaxe spéciale pour passer un seul rappelProc
à une méthode, comme l'explique John Feminella dans sa réponse .UnboundMethod
peut être un PITA, tho.En fin de compte, toutes les réponses vont être subjectives à un certain niveau, et les réponses publiées jusqu'à présent prouvent à peu près que vous ne pouvez pas pointer vers une fonctionnalité qui n'est pas faisable dans l'autre langue d'une manière tout aussi agréable (sinon similaire) , car les deux langues sont très concises et expressives.
J'aime la syntaxe de Python. Cependant, vous devez creuser un peu plus profondément que la syntaxe pour trouver la vraie beauté de Ruby. Il y a une beauté zen dans la consistance de Ruby. Bien qu'aucun exemple trivial ne puisse expliquer cela complètement, je vais essayer d'en trouver un ici juste pour expliquer ce que je veux dire.
Inversez les mots de cette chaîne:
Lorsque vous réfléchissez à la façon dont vous le feriez, vous procédez comme suit:
Dans Ruby, vous feriez ceci:
Exactement comme vous y pensez, dans la même séquence, un appel de méthode après l'autre.
En python, cela ressemblerait plus à ceci:
Ce n'est pas difficile à comprendre, mais il n'a pas tout à fait le même flux. Le sujet (phrase) est enterré au milieu. Les opérations sont un mélange de fonctions et de méthodes d'objet. C'est un exemple trivial, mais on découvre de nombreux exemples différents lorsque l'on travaille et comprend vraiment Ruby, en particulier sur des tâches non triviales.
la source
Python a une mentalité "nous sommes tous des adultes ici". Ainsi, vous constaterez que Ruby a des choses comme des constantes alors que Python n'en a pas (bien que les constantes de Ruby ne déclenchent qu'un avertissement). La façon de penser Python est que si vous voulez rendre quelque chose constant, vous devez mettre les noms des variables dans toutes les majuscules et ne pas les changer.
Par exemple, Ruby:
Python:
la source
Vous ne pouvez importer que des fonctions spécifiques à partir d'un module en Python. Dans Ruby, vous importez toute la liste des méthodes. Vous pouvez les "désimporter" dans Ruby, mais ce n'est pas de cela qu'il s'agit.
ÉDITER:
prenons ce module Ruby:
si vous l'incluez dans votre code:
vous verrez que les méthodes method1 et method2 ont été ajoutées à votre espace de noms. Vous ne pouvez pas importer uniquement method1 . Soit vous les importez tous les deux, soit vous ne les importez pas du tout. En Python, vous ne pouvez importer que les méthodes de votre choix. Si cela avait un nom, ce serait peut-être appelé importation sélective?
la source
import bla; bla.foo()
en Ruby?module
est en fait un peu inapproprié. Les modules sont essentiellement les classes sans lanew
,allocate
méthodes. Ils fonctionnent mieux comme moyen de partager du code par classe / objet, pas comme mécanisme de partitionnement de bibliothèques ou pour partager du code entre programmes.Du site Web de Ruby :
Similitudes Comme avec Python, en Ruby, ...
Différences Contrairement à Python, en Ruby, ...
la source
Ce que Ruby a sur Python, ce sont ses capacités de langage de script. Langage de script dans ce contexte signifiant à utiliser pour le "code de colle" dans les scripts shell et la manipulation générale du texte
Ceux-ci sont principalement partagés avec Perl. Expressions régulières intégrées de première classe, $ -Variables, options de ligne de commande utiles comme Perl (-a, -e) etc.
Avec sa syntaxe concise mais épique, il est parfait pour ce genre de tâches.
Pour moi, Python est plus un langage commercial typé dynamiquement qui est très facile à apprendre et a une syntaxe soignée. Pas aussi "cool" que Ruby mais soigné. Ce que Python a sur Ruby pour moi, c'est le grand nombre de liaisons pour d'autres bibliothèques. Liaisons à Qt et à d'autres bibliothèques GUI, de nombreuses bibliothèques de support de jeux et et et. Ruby en a beaucoup moins. Bien que les liaisons très utilisées, par exemple aux bases de données, soient de bonne qualité, j'ai trouvé que les bibliothèques de niche étaient mieux prises en charge en Python même si pour la même bibliothèque, il existe également une liaison Ruby.
Donc, je dirais que les deux langues ont leur utilisation et c'est la tâche qui définit celle à utiliser. Les deux sont assez faciles à apprendre. Je les utilise côte à côte. Ruby pour les scripts et Python pour les applications autonomes.
la source
Je ne pense pas que "Ruby a X et Python pas, alors que Python a Y et Ruby n'a pas" est la façon la plus utile de le voir. Ce sont des langues assez similaires, avec de nombreuses capacités partagées.
Dans une large mesure, la différence réside dans ce que la langue rend élégant et lisible. Pour utiliser un exemple que vous avez cité, les deux ont théoriquement des lambdas, mais les programmeurs Python ont tendance à les éviter, et les constructions faites en les utilisant ne semblent pas aussi lisibles ou idiomatiques que dans Ruby. Donc, en Python, un bon programmeur voudra prendre une voie différente pour résoudre le problème qu'il ne le ferait en Ruby, simplement parce que c'est en fait la meilleure façon de le faire.
la source
for format in respond_to()
. Larespond_to
méthode ne renvoie rien de significatif - elle répond simplement à la requête HTTP actuelle. L'do
entréerespond_to do
est le début d'un bloc. Dans ce bloc, nous parlons à un objet temporaire (étiquetéformat
dans cet exemple) qui implémente un DSL très basique pour répondre à une requête HTTP.Je voudrais suggérer une variante de la question d'origine, "Qu'est-ce que Ruby a que Python n'a pas, et vice versa?" qui admet la réponse décevante, "Eh bien, que pouvez-vous faire avec Ruby ou Python qui ne peut pas être fait en Intercal?" Rien à ce niveau, car Python et Ruby font tous deux partie de la vaste famille royale assise sur le trône d'être Turing approximant.
Mais qu'en est-il:
Que peut-on faire gracieusement et bien en Python qui ne peut pas être fait en Ruby avec une telle beauté et une bonne ingénierie, ou vice versa?
Cela peut être beaucoup plus intéressant qu'une simple comparaison de fonctionnalités.
la source
Python a une syntaxe intégrée explicite pour les listes de compréhension et les générateurs alors que dans Ruby, vous utiliseriez des blocs de carte et de code.
Comparer
à
la source
res=map(2 .__rpow__, range(1,10))
"Les variables qui commencent par une majuscule deviennent des constantes et ne peuvent pas être modifiées"
Faux. Ils peuvent.
Vous ne recevez un avertissement que si vous le faites.
la source
Un peu plus du côté des infrastructures:
Python a une bien meilleure intégration avec C ++ (via des choses comme Boost.Python , SIP et Py ++ ) que Ruby, où les options semblent être soit écrites directement sur l'API de l'interpréteur Ruby (ce que vous pouvez également faire avec Python, bien sûr, mais dans les deux cas, le faire est de bas niveau, fastidieux et sujet aux erreurs) ou utilisez SWIG (qui, bien que cela fonctionne et est certainement génial si vous souhaitez prendre en charge de nombreuses langues, n'est pas aussi agréable que Boost.Python ou SIP si vous cherchez spécifiquement à lier C ++).
Python a un certain nombre d'environnements d'applications Web (Django, Pylons / Turbogears, web.py, probablement au moins une demi-douzaine d'autres), tandis que Ruby en a un: Rails. (D'autres frameworks Web Ruby existent, mais semblent avoir du mal à obtenir beaucoup de traction contre Rails). Cet aspect est-il bon ou mauvais? Difficile à dire et probablement assez subjectif; Je peux facilement imaginer des arguments selon lesquels la situation Python est meilleure et que la situation Ruby est meilleure.
Culturellement, les communautés Python et Ruby semblent quelque peu différentes, mais je ne peux que faire allusion à cela car je n'ai pas beaucoup d'expérience en interaction avec la communauté Ruby. J'ajoute cela principalement dans l'espoir que quelqu'un qui a beaucoup d'expérience avec les deux puisse amplifier (ou rejeter) cette déclaration.
la source
Copier / coller sans vergogne à partir de: Alex Martelli répond sur " Quoi de mieux sur Ruby que sur Python " de la liste de diffusion comp.lang.python .
la source
Quelques autres de:
http://www.ruby-lang.org/en/documentation/ruby-from-other-languages/to-ruby-from-python/
(Si j'ai mal interprété quoi que ce soit ou si l'un d'eux a changé du côté Ruby depuis la mise à jour de cette page, quelqu'un se sent libre de modifier ...)
Les chaînes sont modifiables en Ruby, pas en Python (où de nouvelles chaînes sont créées par des «changements»).
Ruby a quelques conventions de cas forcées, pas Python.
Python a à la fois des listes et des tuples (listes immuables). Ruby a des tableaux correspondant aux listes Python, mais aucune variante immuable de ceux-ci.
En Python, vous pouvez accéder directement aux attributs d'objet. Dans Ruby, c'est toujours via des méthodes.
En Ruby, les parenthèses pour les appels de méthode sont généralement facultatives, mais pas en Python.
Ruby est public, privé et protégé pour imposer l'accès, au lieu de la convention de Python d'utiliser des traits de soulignement et des changements de nom.
Python a un héritage multiple. Ruby a des "mixins".
Et un autre lien très pertinent:
http://c2.com/cgi/wiki?PythonVsRuby
Ce qui, en particulier, renvoie à un autre bon par Alex Martelli , qui a également publié beaucoup de bonnes choses ici sur SO:
http://groups.google.com/group/comp.lang.python/msg/028422d707512283
la source
Je ne suis pas sûr de cela, alors je l'ajoute d'abord comme réponse.
Python traite les méthodes non liées comme des fonctions
Cela signifie que vous pouvez appeler une méthode comme
theobject.themethod()
ou parTheClass.themethod(anobject)
.Edit: Bien que la différence entre les méthodes et les fonctions soit petite en Python et inexistante en Python 3, elle n'existe pas non plus dans Ruby, simplement parce que Ruby n'a pas de fonctions. Lorsque vous définissez des fonctions, vous définissez en fait des méthodes sur Object.
Mais vous ne pouvez toujours pas prendre la méthode d'une classe et l'appeler en tant que fonction, vous devrez la lier à l'objet que vous souhaitez appeler, ce qui est beaucoup plus obstiné.
la source
TheClass.instance_method(:themethod).bind(anobject).call
serait le rubis équivalent.Object
.Je voudrais mentionner l'API de descripteur Python qui permet de personnaliser la "communication" objet à attribut. Il est également à noter qu'en Python, on est libre d'implémenter un protocole alternatif en remplaçant la valeur par défaut donnée par l'implémentation par défaut de la
__getattribute__
méthode. Permettez-moi de donner plus de détails sur ce qui précède. Descripteurs sont des classes régulières avec__get__
,__set__
et / ou__delete__
méthodes. Lorsque l'interpréteur rencontre quelque chose commeanObj.anAttr
, les opérations suivantes sont effectuées:__getattribute__
la méthode deanObj
est invoquée__getattribute__
récupère un objet anAttr de la classe dict__get__
,__set__
ou des__delete__
objets appelablesComme cela a été mentionné, c'est le comportement par défaut. On est libre de changer le protocole en réimplémentant
__getattribute__
.Cette technique est beaucoup plus puissante que les décorateurs.
la source
Ruby a intégré la prise en charge de la continuation à l'aide de
callcc
.Par conséquent, vous pouvez implémenter des choses intéressantes comme l' opérateur amb
la source
À ce stade, Python a toujours un meilleur support Unicode
la source
Python a des docstrings et ruby n'en a pas ... Ou si ce n'est pas le cas, ils ne sont pas accessibles aussi facilement qu'en python.
Ps. Si je me trompe, je vous en prie, laissez un exemple? J'ai une solution de contournement que je pourrais facilement monkeypatch dans les classes, mais je voudrais avoir une sorte de fonctionnalité docstring de "manière native".
la source
Ruby a une boucle ligne par ligne sur les fichiers d'entrée (l'indicateur '-n') de la ligne de commande afin qu'il puisse être utilisé comme AWK. Ce Ruby one-liner:
comptera les lignes comme l'AWK one-liner:
Ruby obtient cette fonctionnalité via Perl, qui l'a emprunté à AWK comme moyen d'obtenir des administrateurs système avec Perl sans avoir à changer leur façon de faire.
la source
python -c "import sys; print len(list(sys.stdin))"
Ruby a des sceaux et des brindilles, Python non.
Edit : Et une chose très importante que j'ai oubliée (après tout, la précédente était juste de flamber un peu :-p):
Python a un compilateur JIT ( Psyco ), un langage de niveau nettement inférieur pour écrire du code plus rapide ( Pyrex ) et la possibilité d'ajouter du code C ++ en ligne ( Weave ).
la source
Mon python est rouillé, donc certains d'entre eux peuvent être en python et je ne me souviens pas / jamais appris en premier lieu, mais voici les premiers auxquels j'ai pensé:
Espace blanc
Ruby gère les espaces complètement différents. Pour commencer, vous n'avez rien à mettre en retrait (ce qui signifie que peu importe si vous utilisez 4 espaces ou 1 tabulation). Il fait également la continuation de la ligne intelligente, donc ce qui suit est valide:
Fondamentalement, si vous vous retrouvez avec un opérateur, il comprend ce qui se passe.
Mixins
Ruby a des mixins qui peuvent étendre les instances au lieu des classes complètes:
Enums
Je ne sais pas si c'est la même chose que les générateurs, mais à partir de Ruby 1.9 ruby comme enums, donc
Référence: http://blog.nuclearsquid.com/writings/ruby-1-9-what-s-new-what-s-changed
"Arguments relatifs aux mots clés"
Les deux éléments répertoriés ici sont pris en charge dans Ruby, bien que vous ne puissiez pas ignorer les valeurs par défaut comme ça. Vous pouvez soit aller dans l'ordre
Notez que c = 5 attribue en fait la variable c dans la portée appelante la valeur 5, et définit le paramètre b la valeur 5.
ou vous pouvez le faire avec des hachages, qui répondent au deuxième problème
Référence: Le guide du programmeur pragmatique de Ruby
la source
(
,[
ou{
Vous pouvez avoir du code dans la définition de classe dans Ruby et Python. Cependant, dans Ruby, vous avez une référence à la classe (self). En Python, vous n'avez pas de référence à la classe, car la classe n'est pas encore définie.
Un exemple:
self dans ce cas est la classe, et ce code afficherait "Kaka". Il n'y a aucun moyen d'imprimer le nom de la classe ou autrement d'accéder à la classe à partir du corps de définition de classe en Python.
la source
class
instruction.La syntaxe n'est pas une chose mineure, elle a un impact direct sur notre façon de penser. Il a également un effet direct sur les règles que nous créons pour les systèmes que nous utilisons. Par exemple, nous avons l'ordre des opérations en raison de la façon dont nous écrivons des équations ou des phrases mathématiques. La notation standard pour les mathématiques permet aux gens de la lire de plusieurs façons et d'arriver à des réponses différentes selon la même équation. Si nous avions utilisé la notation préfixe ou postfixe, nous aurions créé des règles pour distinguer les nombres à manipuler plutôt que d'avoir uniquement des règles pour l'ordre dans lequel calculer les valeurs.
La notation standard indique clairement les nombres dont nous parlons tout en rendant ambiguë l'ordre dans lequel les calculer. La notation des préfixes et des suffixes rend l'ordre de calcul simple tout en rendant les nombres ambigus. Python aurait déjà des lambdas multilignes sans les difficultés causées par les espaces syntaxiques. (Il existe des propositions pour retirer ce genre de chose sans nécessairement ajouter des délimiteurs de bloc explicites.)
Je trouve plus facile d'écrire des conditions où je veux que quelque chose se produise si une condition est fausse beaucoup plus facile à écrire avec l'instruction à moins en Ruby que la construction sémantiquement équivalente "sinon" en Ruby ou dans d'autres langages par exemple. Si la plupart des langues que les gens utilisent aujourd'hui sont de puissance égale, comment la syntaxe de chaque langue peut-elle être considérée comme une chose banale? Après des fonctionnalités spécifiques comme les blocs et les mécanismes d'héritage, etc., la syntaxe est la partie la plus importante d'un langage, à peine une chose superficielle.
Ce qui est superficiel, ce sont les qualités esthétiques de la beauté que nous attribuons à la syntaxe. L'esthétique n'a rien à voir avec le fonctionnement de notre cognition, la syntaxe le fait.
la source
Surpris de ne rien voir du mécanisme de "méthode manquante" de Ruby. Je donnerais des exemples des méthodes find_by _... dans Rails, comme un exemple de la puissance de cette fonctionnalité de langage. Je suppose que quelque chose de similaire pourrait être implémenté en Python, mais à ma connaissance, il n'y est pas nativement.
la source
method_missing
peut être émulé en Python dans certains cas:class M(): def __getattr__(self, n): return lambda: "Missing! " + n; M().hi()
. Cependant, il y a de légères différences et je doute que ce soit idiomatique en Python :-)Une autre différence de lambdas entre Python et Ruby est démontrée par le problème du générateur d'accumulateurs de Paul Graham . Réimprimé ici:
Dans Ruby, vous pouvez le faire:
En Python, vous créez un objet pour conserver l'état de n:
Certaines personnes pourraient préférer l'approche Python explicite comme étant plus claire conceptuellement, même si elle est un peu plus verbeuse. Vous stockez l'état comme vous le faites pour autre chose. Vous avez juste besoin d'envelopper votre tête autour de l'idée d'objets appelables. Mais quelle que soit l'approche que l'on préfère esthétiquement, cela montre un respect dans lequel les lambdas Ruby sont des constructions plus puissantes que celles de Python.
la source
def foo(n): def f(i): return n + i return f
.def foo(n): L=[n] def f(i): L[0] += i return L[0] return f
. En Python3, vous pouvez utiliser unnonlocal
mot-clé.python a nommé des arguments facultatifs
AFAIK Ruby n'a positionné que des arguments car b = 2 dans la déclaration de fonction est une affectation qui s'ajoute toujours.
la source
def my_method(param1, optional = false)
fonctionne dans Ruby 1.8.6, 1.8.7 et probablement 1.9!b
paramètre dans l'func
appel et il conserve toujours sa valeur par défaut. Autrement dit,b
est le deuxième argument de la signature, mais il peut l'ignorer en préfixant le deuxième paramètre avecc=
. Ruby utilise des hachages pour simuler cela, mais ce n'est pas exactement la même chose.Ruby a une documentation intégrée:
la source
http://c2.com/cgi/wiki?PythonVsRuby
http://c2.com/cgi/wiki?SwitchedFromPythonToRuby
http://c2.com/cgi/wiki?SwitchedFromRubyToPython
http://c2.com/cgi/wiki ? UsingPythonDontNeedRuby
http://c2.com/cgi/wiki?UsingRubyDontNeedPython
la source
Avec Cargo, vous pouvez " exiger des bibliothèques sans encombrer votre espace de noms ".
la source