Ruby <-> Python

Alles, was nicht direkt mit Python-Problemen zu tun hat. Dies ist auch der perfekte Platz für Jobangebote.
Danie
User
Beiträge: 7
Registriert: Freitag 1. September 2006, 08:34
Wohnort: Nürnberg
Kontaktdaten:

Beitragvon Danie » Freitag 1. September 2006, 11:54

Mal eine Frage: An sich wirken ja Ruby und Python sehr ähnlich. Was sind eigentlich die genauen Unterschiede der beiden Sprachen neben Einrückung versus "end".
Milchreis schmeckt hervorragend, wenn man ihn kurz vor dem Verzehr durch ein saftiges Steak ersetzt.
Benutzeravatar
jens
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Freitag 1. September 2006, 11:59

Das ist wieder ein Thema für Sich, deswegen hab ich es mal vom ursprüngliche Thread abgetrennt...

Da du ja schon ruby kennst, schau dir mal die Fakten über Python an. Dann kannst du vergleichen:
[wiki]Python[/wiki]

Ansonsten schau mal hier:
http://www.python-forum.de/topic-5034.html
http://www.python-forum.de/topic-5414.html
http://www.python-forum.de/topic-308.html

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Danie
User
Beiträge: 7
Registriert: Freitag 1. September 2006, 08:34
Wohnort: Nürnberg
Kontaktdaten:

Beitragvon Danie » Freitag 1. September 2006, 12:08

Hmm ich meinte im vorherigen Thread, dass ich weder Erfahrung in Python noch in Ruby habe ^^
Milchreis schmeckt hervorragend, wenn man ihn kurz vor dem Verzehr durch ein saftiges Steak ersetzt.
Benutzeravatar
jens
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Freitag 1. September 2006, 12:09

Du hast doch geschrieben, das du Ruby on Rails kennst, oder nicht? ...Wie dem auch sei, schau die mal die anderen Threads an, oder duch mal nach "Python" und "Ruby" :)

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Danie
User
Beiträge: 7
Registriert: Freitag 1. September 2006, 08:34
Wohnort: Nürnberg
Kontaktdaten:

Beitragvon Danie » Freitag 1. September 2006, 12:20

ok mach ich :D
Milchreis schmeckt hervorragend, wenn man ihn kurz vor dem Verzehr durch ein saftiges Steak ersetzt.
Danie
User
Beiträge: 7
Registriert: Freitag 1. September 2006, 08:34
Wohnort: Nürnberg
Kontaktdaten:

Beitragvon Danie » Freitag 1. September 2006, 15:13

Hmm ich find nicht das, was ich Suche. Ich wüsste eben gerne, was die Vorteile von Python sind gegenüber Ruby.

Oder ist es gar nicht zu beschreiben und es ist einfach nur das Feeling? Was ich kaum glauben kann, denn ohne Grund nehmen große Unternehmen wie Google nicht gerade Python, oder?
Anders ausgedrückt: Ich liebe C und Objective-C. Ich liebe die Syntax davon und es gefällt mir, darin Programme zu schreiben, weil es mich glücklich macht. Wo denkt ihr, wäre ich besser aufgehoben?
Milchreis schmeckt hervorragend, wenn man ihn kurz vor dem Verzehr durch ein saftiges Steak ersetzt.
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Freitag 1. September 2006, 16:37

Danie hat geschrieben:Hmm ich find nicht das, was ich Suche. Ich wüsste eben gerne, was die Vorteile von Python sind gegenüber Ruby.

Vorteile: Performance, eine mir Angenehmere Denkweise (eben der ganze Zen of Python, zum beispiel "Explizit is better than implizit" wie es bei Ruby manchmal der Fall ist), die LCs, Generatoren, Einrücken, Syntax insgesammt, wesentlich bessere Dokumentation, Unterstützung von Unicode. Und auch Pythons Art des Principle of least Surprise ist für mich weniger überraschend als Rubys POLS. Daneben mag ich die Leute in der Community - was aber nicht heißen soll, das Rubys Community schlecht ist, aber ich fühl mich hier einfach mehr "daheim".

Danie hat geschrieben:Oder ist es gar nicht zu beschreiben und es ist einfach nur das Feeling? Was ich kaum glauben kann, denn ohne Grund nehmen große Unternehmen wie Google nicht gerade Python, oder?

Es ist teilweise auch das Feeling - ich finde den Weg etwas auf Python zu lösen wesentlich eher zu meiner Denkweise passend als wie das in Ruby gelöst werden würde.

Danie hat geschrieben:Anders ausgedrückt: Ich liebe C und Objective-C. Ich liebe die Syntax davon und es gefällt mir, darin Programme zu schreiben, weil es mich glücklich macht. Wo denkt ihr, wäre ich besser aufgehoben?

Tcl? Blödsinn beiseite, aber Spass macht es sowohl in Ruby als auch in Python zu schreiben, vor allem wenn die Programme dann auch noch funktionieren.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
BlackJack

Beitragvon BlackJack » Freitag 1. September 2006, 18:11

Danie hat geschrieben:Anders ausgedrückt: Ich liebe C und Objective-C. Ich liebe die Syntax davon und es gefällt mir, darin Programme zu schreiben, weil es mich glücklich macht. Wo denkt ihr, wäre ich besser aufgehoben?


Vier von den Fünf Punkten des "Spirit of C" aus dem C Standard sind auch auf Python übertragbar. Ich denke Python ist näher an C als Ruby. Das ist vom "Feeling" eher in der Perl Ecke anzusiedeln.

Das "Spirit of C"

1. Trust the programmer.
2. Don't prevent the programmer from doing what needs to be done.
3. Keep the language small and simple.
4. Provide only one way to do an operation.
5. Make it fast, even if it is not guaranteed to be portable.

Der letzte Punkt gilt für Python eher nicht. Was für eine High Level Language natürlich als Vorteil zu sehen ist.
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Beitragvon CM » Mittwoch 6. September 2006, 12:14

Hoi Danie,

Danie hat geschrieben:Oder ist es gar nicht zu beschreiben und es ist einfach nur das Feeling? Was ich kaum glauben kann, denn ohne Grund nehmen große Unternehmen wie Google nicht gerade Python, oder?

Na ja, denke das hat eher historische Gründe: Es hat sich halt erst einmal nur Python angeboten.

Meine Meinung: Ich schätze zwar auch das Feeling von Python über dem von Ruby, aber das ist natürlich rein subjektiv - andere Leute sehen das eben anders und ich nehme ja sonst auch manchmal Sprachen, die ich nicht mag, wenn ich denn damit machen kann, was ich machen will. Aber was wirklich zählt: Python bietet alle Module, die ich brauche - Ruby (noch) nicht. Ruby holt zwar langsam auf (es gibt sogar wxRuby), aber es bietet eben nicht alles was ich brauche und nicht so ausgereift.

Gruß,
Christian

PS Andererseits finde ich "... on Rails" mittlerweile derart attraktiv, daß ich mir überlege mich damit einmal intensiever zu befassen ...
Zambo
User
Beiträge: 9
Registriert: Montag 11. September 2006, 06:48
Wohnort: Düsseldorf
Kontaktdaten:

Beitragvon Zambo » Montag 11. September 2006, 08:12

Hi,

jetzt oute ich mich einfach mal als bekennender Ruby-User und möchte mal ein wenig darstellen, warum ich Ruby doch ein wenig besser finde, als Python. Wobei mir Python natürlich auch ganz gut gefällt. Aber es fehlen für mich einfach die kleinen Besonderheiten von Ruby.

1.) Es ist z.B. ohne Probleme möglich, während der Laufzeit, Methoden zu einer Klasse hinzuzufügen.

z.B.

Code: Alles auswählen

class Info
  def hallo
    print "Hallo"
  end
end

x = Info.new
def x.welt
  print " Welt"
end

x.hallo
x.welt


2.) Es gibt Mix-Ins. Das heißt, man schreibt eine Funktion und kann diese zu einer Klasse hinzumischen.

Code: Alles auswählen

module Debug
  def wer_bin_ich?
    "#{self.class.name} ; #{self.to_s}"
  end
end

class Phonograph
  include Debug     #Funktion wird hinzugefügt
  ...
end
class EightTrack
  include Debug
  ...
end

ph = Phonograph.new("Blues")
et = EightTrack.new("Surrealistic Pillow")

ph.wer_bin_ich?    -> "Phonograph : Blues"
et.wer_bin_ich?    -> "EightTrack : Surrealistic Pillow"


Besonders Cool ist das, wenn man fertige Funktionalität von Ruby zu einer Klasse hinzufügt.
Damit läßt sich natürlich auch Mehrfachvererbung realisieren.

3.) Es gibt Blöcke.
Diese Möglichkeit kommt aus der funktionalen Programmierung. Im Prinzip handelt es sich dabei um Listen von Anweisungen. Programmierer können Blöcke mit Parametern versehen und als Argumente von Methodenaufrufen verwenden:

Code: Alles auswählen

class BlockExample
  def m1(&b)
     b.call(42)  # Block wird mit den Wert 42 gestartet
  end
  def m2
     if block_given? then yield # Block wird ausgeführt
     end
  end
end

be = BlockExample.new
be.m1 {|arg1|,print arg1}    -> 42
be.m2 {print "Hallo"}        -> "Hallo"


Damit sind natürlich auch Closures(Über den Lambda-Befehl ) möglich.

4.) Ruby kann dynamisch Methoden aufrufen.

Code: Alles auswählen

class MyClass
  def info
    "I am alive"
  end
end

c = MyClass.new
print c.send(:info)    ->   I am alive


Ich könnte natürlich noch ein paar weitere Beispiele zeigen, aber ich denke es ist klar geworden, das Ruby schon ein paar Möglichkeiten hat, die Python nicht bietet.

Was mir an Python aber sehr gut gefällt, ist die ausgereifte WxWidgets Schnittstelle und die etwas höhere Verarbeitungsgeschwindigkeit. Ich denke aber, das sich dies mit den JIT-Compiler von Ruby 2.0 erledigen wird.
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Beitragvon Rebecca » Montag 11. September 2006, 08:51

Zu 1.)

Code: Alles auswählen

class Info:
    def hallo(self):
        print "Hallo"


x = Info()

def welt():
    print "Welt"

x.welt = welt

x.hallo()
x.welt()
Zambo
User
Beiträge: 9
Registriert: Montag 11. September 2006, 06:48
Wohnort: Düsseldorf
Kontaktdaten:

Beitragvon Zambo » Montag 11. September 2006, 08:58

Ok :wink:
Ich bin beeindruckt. Ich wußte nicht, dass das geht. Aber der Rest stimmt trotzdem 8)
BlackJack

Beitragvon BlackJack » Montag 11. September 2006, 09:05

Zambo hat geschrieben:1.) Es ist z.B. ohne Probleme möglich, während der Laufzeit, Methoden zu einer Klasse hinzuzufügen.

z.B.

Code: Alles auswählen

class Info
  def hallo
    print "Hallo"
  end
end

x = Info.new
def x.welt
  print " Welt"
end

x.hallo
x.welt


Du hast hier dem Objekt eine Methode hinzugefügt und nicht der Klasse. Das geht in Python auch:

Code: Alles auswählen

import new

class Info(object):
    def hallo(self):
        print 'Hallo'

x = Info()
def welt(self):
    print 'Welt'
x.welt = new.instancemethod(welt, x, Info)

x.hallo()
x.welt()


2.) Es gibt Mix-Ins. Das heißt, man schreibt eine Funktion und kann diese zu einer Klasse hinzumischen.

Code: Alles auswählen

module Debug
  def wer_bin_ich?
    "#{self.class.name} ; #{self.to_s}"
  end
end

class Phonograph
  include Debug     #Funktion wird hinzugefügt
  ...
end
class EightTrack
  include Debug
  ...
end

ph = Phonograph.new("Blues")
et = EightTrack.new("Surrealistic Pillow")

ph.wer_bin_ich?    -> "Phonograph : Blues"
et.wer_bin_ich?    -> "EightTrack : Surrealistic Pillow"


Besonders Cool ist das, wenn man fertige Funktionalität von Ruby zu einer Klasse hinzufügt.
Damit läßt sich natürlich auch Mehrfachvererbung realisieren.


Dreh den letzten Satz mal um: Mix-Ins lassen sich durch Mehrfachvererbung realisieren.

Code: Alles auswählen

class Debug(object):
    def wer_bin_ich(self):
        return '%s : %s' % (self.__class__.__name__, self)

class Sound(object):
    pass

class Phonograph(Sound, Debug):
    def __init__(self, data):
        self.data = data
    def __str__(self):
        return self.data

class EightTrack(Sound, Debug):
    def __init__(self, data):
        self.data = data
    def __str__(self):
        return self.data

ph = Phonograph('Blues')
et = EightTrack('Surrealistic Pillow')

print ph.wer_bin_ich()
print et.wer_bin_ich()


Die `Sound` Klasse dient nur zur Verdeutlichung das nicht einfach nur von `Debug` geerbt wird.

3.) Es gibt Blöcke.
Diese Möglichkeit kommt aus der funktionalen Programmierung. Im Prinzip handelt es sich dabei um Listen von Anweisungen.


Im Prinzip handelt es sich einfach um anonyme Funktionen.

Programmierer können Blöcke mit Parametern versehen und als Argumente von Methodenaufrufen verwenden:

Code: Alles auswählen

class BlockExample
  def m1(&b)
     b.call(42)  # Block wird mit den Wert 42 gestartet
  end
  def m2
     if block_given? then yield # Block wird ausgeführt
     end
  end
end

be = BlockExample.new
be.m1 {|arg1|,print arg1}    -> 42
be.m2 {print "Hallo"}        -> "Hallo"


An dieser Stelle hat Python den Nachteil, dass in ``lambda``-Ausdrücken keine Anweisungen möglich sind. Das heisst, ``print`` ist nicht drin und muss durch einen Funktionsaufruf ersetzt werden.

Code: Alles auswählen

import sys

def m1(func):
    func(42)

def m2(func):
    func()

m1(lambda arg1: sys.stdout.write(str(arg1) + '\n'))
m2(lambda: sys.stdout.write('Hallo\n'))


Damit sind natürlich auch Closures(Über den Lambda-Befehl ) möglich.


Closures sind in Python auch möglich.

4.) Ruby kann dynamisch Methoden aufrufen.

Code: Alles auswählen

class MyClass
  def info
    "I am alive"
  end
end

c = MyClass.new
print c.send(:info)    ->   I am alive


Das geht auch in Python:

Code: Alles auswählen

class MyClass(object):
    def info(self):
        return 'I am alive'

c = MyClass()
print getattr(c, 'info')()


Ich könnte natürlich noch ein paar weitere Beispiele zeigen, aber ich denke es ist klar geworden, das Ruby schon ein paar Möglichkeiten hat, die Python nicht bietet.


Ausser Anweisungen in Blöcken habe ich nichts grosses in Deinen Beispielen entdecken können.
Benutzeravatar
jens
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Montag 11. September 2006, 09:06

Zambo hat geschrieben:2.) Es gibt Mix-Ins. Das heißt, man schreibt eine Funktion und kann diese zu einer Klasse hinzumischen.

Das geht durch erben. :lol:

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Beitragvon mawe » Montag 11. September 2006, 09:47

Hi!

1.) Es ist z.B. ohne Probleme möglich, während der Laufzeit, Methoden zu einer Klasse hinzuzufügen.

Mich würde mal interessieren: Wann braucht man das? Hat das schon mal jemand verwendet? IMO wird der Code dadurch unübersichtlich (weil der Code der Klasse verstreut wird), oder übersehe ich einen gravierenden Vorteil?

Gruß, mawe

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder