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:

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
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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

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:

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
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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" :)

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:

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:

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.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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 (former) Modvoice
BlackJack

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:

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:

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:

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:

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

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
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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:

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])

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
Zambo
User
Beiträge: 9
Registriert: Montag 11. September 2006, 06:48
Wohnort: Düsseldorf
Kontaktdaten:

Also zu Punkt 1 und 4 muß ich euch recht geben. Das geht in Python. Mal abgesehen davon, dass mir der Ruby-Code besser gefällt. Aber darum geht es nicht.

Das mit den Blöcken hat BlackJack schon zugegeben, dass das in Python so nicht möglich ist. Was natürlich schon für sich alleine ein Grund seien kann, Ruby vorzuziehen.

Aber bei den Mix-Ins muß ich doch widersprechen. Natürlich kann man Mix-Ins über Mehrfachvererbung realisieren. Aber das Konzept geht bei Ruby doch um einiges weiter, als es bei Python möglich ist. Zum Beispiel möchte ich schon gerne wissen, ob dies in Python auch so möglich wäre?

Code: Alles auswählen

module Summable
   def sum
       inject { |v,n| v+n }
   end
end

class Array
   include Summable
end

class Range
   include Summable
end

[1,2,3,4,5].sum      ->  15
('a'..'m').sum       -> "abcdefghijklm"
Nebenbei, was großes soll man auch nicht in den Beispielen entdecken. Es soll nur ein paar Konzepte aufzeigen, die ich in Ruby besonders gelungen finde.

mawe hat geschrieben: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
Also ich habe das mal benutzt, um eine Webanwendung während sie lief upzudaten.

Gruß Zambo
Zuletzt geändert von Zambo am Montag 11. September 2006, 10:26, insgesamt 2-mal geändert.
BlackJack

mawe hat geschrieben:
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?
Das ist eine nette Lösung wenn man einen Haufen Funktionen/Methoden hat, die man zur Laufzeit auf Grundlage von irgendwelchen externen Daten zu Klassen zusammensetzen möchte. Dann würde das Klassenobjekt selbst aber auch dynamisch erzeugt.

Beispiel wäre ein Spiel bei dem Elemente wie Spieler, Fahrzeuge, Gebäude etc. jeweils Durch eine Klasse repräsentiert werden, die einzelnen Funktionen/Fähigkeiten unabhängig definiert werden und dann per Code aus einer Beschreibungsdatei, z.B. in XML, Klassen zusammengestellt werden.

Zugegebenermassen ein sehr seltener Anwendungsfall. Allgemein, kann man sagen, man kann diese Technik anwenden wo man in anderen (statischeren) Sprachen zu einem Code-Generator greifen würde.
BlackJack

Zambo hat geschrieben:Das mit den Blöcken hat BlackJack schon zugegeben, dass das in Python so nicht möglich ist. Was natürlich schon für sich alleine ein Grund seien kann, Ruby vorzuziehen.
Das ist aber nur ein kosmetischer Unterschied. Man kann halt keine anonymen Blöcke definieren, na und, dann gibt man dem Kind halt einen Namen und definiert eine lokale Funktion.
Aber bei den Mix-Ins muß ich doch widersprechen. Natürlich kann man Mix-Ins über Mehrfachvererbung realisieren. Aber das Konzept geht bei Ruby doch um einiges weiter, als es bei Python möglich ist. Zum Beispiel möchte ich schon gerne wissen, ob dies in Python auch so möglich wäre?

Code: Alles auswählen

module Summable
   def sum
       inject { |v,n| v+n }
   end
end

class Array
   include Summable
end

class Range
   include Summable
end

[1,2,3,4,5].sum      ->  15
('a'..'m').sum       -> "abcdefghijklm"
Das sieht aus nach "zur Laufzeit Basisklassen hinzufügen". Das geht grundsätzlich schon:

Code: Alles auswählen

In [44]: class A:
   ....:     pass
   ....:

In [45]: class B:
   ....:     def test(self):
   ....:         print 'b'
   ....:

In [46]: a = A()

In [47]: a.test()
---------------------------------------------------------------------------
exceptions.AttributeError     Traceback (most recent call last)

/home/marc/<ipython console>

AttributeError: A instance has no attribute 'test'

In [48]: A.__bases__ += (B,)

In [49]: a.test()
b
Allerdings kann man bei Typen die in C implementiert sind, entscheiden ob die auf diese Weise verändert werden dürfen und das ist bei den eingebauten Typen ist nicht der Fall.

Und das wird in Python auch üblicherweise nicht so gemacht. Wie mawe schon sagte, man zersplittert so die Definition von Klassen.

Wenn man ein generisches Summieren haben möchte, dann definiert man eine entsprechende Funktion.

Code: Alles auswählen

import operator

NO_DEFAULT = object()

def my_sum(iterable, default=NO_DEFAULT):
    iterator = iter(iterable)
    try:
        first = iterator.next()
    except StopIteration:
        if default is NO_DEFAULT:
            raise TypeError('empty iterable without default')
        else:
            return default
    return reduce(operator.add, iterator, first)

print my_sum(('H', 'a', 'l', 'l', 'o')) # -> 'Hallo'
print my_sum(xrange(6))                 # -> 15
print my_sum([], 0.0)                   # -> 0.0
print my_sum('')                        # Raises Exception.
Nebenbei, was großes soll man auch nicht in den Beispielen entdecken. Es soll nur ein paar Konzepte aufzeigen, die ich in Ruby besonders gelungen finde.
Du hast gesagt Dir fehlen ein paar Dinge in Python, die in Ruby möglich sind und es stellte sich heraus, das vieles davon in Python auch möglich ist.
Zambo
User
Beiträge: 9
Registriert: Montag 11. September 2006, 06:48
Wohnort: Düsseldorf
Kontaktdaten:

BlackJack hat geschrieben:
Zambo hat geschrieben:Das mit den Blöcken hat BlackJack schon zugegeben, dass das in Python so nicht möglich ist. Was natürlich schon für sich alleine ein Grund seien kann, Ruby vorzuziehen.
Das ist aber nur ein kosmetischer Unterschied. Man kann halt keine anonymen Blöcke definieren, na und, dann gibt man dem Kind halt einen Namen und definiert eine lokale Funktion.
Es ist einfach eine Frage des Geschmacks. Durch die Blöcke wird meiner Meinung nach der Code besser lesbar und dadurch natürlich leichter zu warten. Aber man muß es natürlich nicht verwenden. Jeder wie er will. Natürlich kann man kann man alles was man in Ruby programmiert auch in Python machen. Das ist doch klar. Aber um es überspitzt zu sagen; Man kann auch alles in Assembler programmieren. Aber wer will das schon.
Aber bei den Mix-Ins muß ich doch widersprechen. Natürlich kann man Mix-Ins über Mehrfachvererbung realisieren. Aber das Konzept geht bei Ruby doch um einiges weiter, als es bei Python möglich ist. Zum Beispiel möchte ich schon gerne wissen, ob dies in Python auch so möglich wäre?

Code: Alles auswählen

module Summable
   def sum
       inject { |v,n| v+n }
   end
end

class Array
   include Summable
end

class Range
   include Summable
end

[1,2,3,4,5].sum      ->  15
('a'..'m').sum       -> "abcdefghijklm"
Das sieht aus nach "zur Laufzeit Basisklassen hinzufügen". Das geht grundsätzlich schon:

Code: Alles auswählen

In [44]: class A:
   ....:     pass
   ....:

In [45]: class B:
   ....:     def test(self):
   ....:         print 'b'
   ....:

In [46]: a = A()

In [47]: a.test()
---------------------------------------------------------------------------
exceptions.AttributeError     Traceback (most recent call last)

/home/marc/<ipython console>

AttributeError: A instance has no attribute 'test'

In [48]: A.__bases__ += (B,)

In [49]: a.test()
b
Allerdings kann man bei Typen die in C implementiert sind, entscheiden ob die auf diese Weise verändert werden dürfen und das ist bei den eingebauten Typen ist nicht der Fall.

Und das wird in Python auch üblicherweise nicht so gemacht. Wie mawe schon sagte, man zersplittert so die Definition von Klassen.

Wenn man ein generisches Summieren haben möchte, dann definiert man eine entsprechende Funktion.

Code: Alles auswählen

import operator

NO_DEFAULT = object()

def my_sum(iterable, default=NO_DEFAULT):
    iterator = iter(iterable)
    try:
        first = iterator.next()
    except StopIteration:
        if default is NO_DEFAULT:
            raise TypeError('empty iterable without default')
        else:
            return default
    return reduce(operator.add, iterator, first)

print my_sum(('H', 'a', 'l', 'l', 'o')) # -> 'Hallo'
print my_sum(xrange(6))                 # -> 15
print my_sum([], 0.0)                   # -> 0.0
print my_sum('')                        # Raises Exception.
Also was du an Code geschrieben hast, ist eher ein Argument für Ruby :wink: Nicht böse nehmen :D
Aber Ruby ist doch um einiges leichter zu lesen und zu verstehen. Was du da für einen Aufwand treiben mußt ist schon jenseits von gut und böse.

Nebenbei, was großes soll man auch nicht in den Beispielen entdecken. Es soll nur ein paar Konzepte aufzeigen, die ich in Ruby besonders gelungen finde.
Du hast gesagt Dir fehlen ein paar Dinge in Python, die in Ruby möglich sind und es stellte sich heraus, das vieles davon in Python auch möglich ist.
Ja, die Hälfte. Der Rest geht entweder nicht oder nur durch einen so hohen Aufwand, dass die Verwendung von Phython kaum zu rechtfertigen ist.

Aber um die Sache zu beenden. Ich denke, die Leute sollen sich selbst ein Urteil bilden. Die Fakten stehen hier in diesen Beiträgen und jeder kann selbst entscheiden was für ihn wichtiger ist. Ich denke, das Ruby und Python tolle Programmiersprachen sind. Zumindest im Vergleich zu Java oder Pascal. 8)
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

mawe hat geschrieben: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?
Das mach IMHO zum Beispiel dann Sinn, wenn du in deinem Programm ein externes Modul verwendest und dem einfach eine Sinnvolle Methode noch fehlt. Nun kann man es einfach hinzufügen, ohne das Ursprüngliche Modul zu "patchen"...
Wobei man das meist durch einfaches Erben erledigen kann...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Antworten