Zahlen zu römische Zahlen wandeln...

Code-Stücke können hier veröffentlicht werden.
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Python ist stark und dynamisch Typisiert.
Jedes Objekt hat einen festet Typ, der aber nicht überprüft wird (von Sprachwegen her jedenfalls, von manuellen Tests hält einen ja niemand ab.).
Benutzeravatar
BlackVivi
User
Beiträge: 762
Registriert: Samstag 9. Dezember 2006, 14:29
Kontaktdaten:

audax hat geschrieben:daher fehlt dir auch __radd__, etc....
Lässt sich wohl bei Bedarf recht flott hinzufügen, oder ;)? Hab jetzt nur die 4 Grundrechenarten und die Repräsention geändert, mehr nicht.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Nagila Hawa hat geschrieben:Dazu fällt mir dann aber eine eher allgemeine Frage ein: Ich komme nicht wirklich hinter das Typensystem von Python, oder allgemein dynamisch typisierten Sprachen. Inwiefern ist bei so einem Konstrukt denn eigentlich Typsicherheit gewährt? Wie funktioniert das, was macht der Interpreter? Gibt es irgendwo vielleicht eine Art Doku speziell über Typisierung und erstellen eigener Typen in Python? In Tutorials ist das meistens recht kurz gefasst.
Schau dir beliebige Tutorials zu OOP in Python an (vom Openbook vielleicht mal abgesehen). Generell hast du Klassen die Typen definieren und dann Instanzen dieser Klassen, die halt die Objekte sind (vereinfacht gesagt, es geht dann noch weiter, dass Klassen auch Objekte sind und diese Klassen auch Instanzen ihrer Metaklassen sind etc.). Diesen Objekten kann man dann Nachrichten schicken wie "gib mir den Wert von Attribut x" oder "setze den Indexwert 0 auf 'String'" und die Objekte reagieren darauf irgendwie.

Wenn dich die Hintergründe Interessieren kannst du dir das Descrintro ansehen und die C3 MRO. Zusätzlich zu den bereits angesprochenen Tutorials.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
name
User
Beiträge: 254
Registriert: Dienstag 5. September 2006, 16:35
Wohnort: Wien
Kontaktdaten:

BlackVivi hat geschrieben:
Leonidas hat geschrieben:
Nagila Hawa hat geschrieben:Ich finde das immer eine gute Übung. Ich bin auch gerade dabei (allerdings in Ada) einen eigenen Datentyp "Roman" zu schreiben, mit dem man dann ganz normal, wie mit jedem numerischen Datentyp rechnen kann (obwohl es technisch gesehen ein String ist).
Stimmt, mit Python wäre so eine Übung ja zugegebenermaßen auch etwas zu trivial 8)
http://paste.pocoo.org/show/97096/

Äußerst trivial, jop. Nicht perfekt, weit davon entfernt, aber einfach so ohne zu überlegen in nichmal 2 Minuten zusammenprogrammiert.
Naja, es sollt doch Roman("IV") + Roman("I") gehen, oder?

EDIT: Here we go: http://paste.pocoo.org/show/97252/
Ohloh | Mein Blog | Jabber: segfaulthunter@swissjabber.eu | asynchia – asynchrone Netzwerkbibliothek

In the beginning the Universe was created. This has made a lot of people very angry and has been widely regarded as a bad move.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Fehlen nur noch vergleiche ;)
Benutzeravatar
Trundle
User
Beiträge: 591
Registriert: Dienstag 3. Juli 2007, 16:45

Damit noch ein wenig Metamagie dabei ist: http://paste.pocoo.org/show/97258/
"Der Dumme erwartet viel. Der Denkende sagt wenig." ("Herr Keuner" -- Bertolt Brecht)
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

fmartin
User
Beiträge: 2
Registriert: Dienstag 1. Dezember 2009, 17:11

... eine ganz nette Idee: 1 - 5 -10 wiederholt sich in verschiedenen Zehnerpotenzen

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf8 -*-

## nette Idee: 1 -> 5 -> 10 wiederholt sich in den Einern, Zehnern, Hundertern
roemZahlen = [{1:'I', 5:'V', 10:'X'}, {1:'X', 5:'L', 10:'C'}, {1:'C', 5:'D', 10:'M'}]

def einsFuenfZehn(zehnerPotenz,  zahl):
	global roZa
	if zahl == 9:
		roZa += roemZahlen[zehnerPotenz][1]+roemZahlen[zehnerPotenz][10]
	elif zahl == 4:
		roZa += roemZahlen[zehnerPotenz][1]+roemZahlen[zehnerPotenz][5]
	elif zahl >= 5:
		roZa += roemZahlen[zehnerPotenz][5]+(zahl-5)*roemZahlen[zehnerPotenz][1]
	else:
		roZa += zahl*roemZahlen[zehnerPotenz][1]


decZahl = input('Natürliche Zahl im Dezimalsystem eingeben: ')
roZa = ''
while decZahl > 1000:
	decZahl -= 1000
	roZa += roemZahlen[2][10]

(decHun,  decHunRest) = divmod(decZahl,  100)
(decZeh,  decEin) = divmod(decHunRest,  10)

einsFuenfZehn(2, decHun)
einsFuenfZehn(1, decZeh)
einsFuenfZehn(0, decEin)

print roZa
In a world without walls and fences:

who needs Windows and Gates?
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Ein paar Hinweise:
- PEP8 beachten (Variablen - und Funktionsnamen klein_mit_unterstrich, Klassennamen CamelCase)
- "global" vermeiden, zuwas gibt es "return"
- Die gesamten Lookups ( [x] ) sind IMHO viel zu magisch, für diese Konstante (Zeile 6) solltest du dir eine sinnvollere und verständlichere Datenstruktur ausdenken.
- Die Klammern beim Tuple-Unpacking in Zeile 26/27 sind unnötig und auch unschön.
- "Einsfünfzehn" ist ein völlig nichtssagender Funktionsbezeichner.
- Statt "input" "raw_input" verwenden (bei Python < 3, und das hast du ja wegen dem "print"-Statement)
- Eine längere Folge von "elifs" (bzw. Switch-Case in anderen Sprachen) lässt sich geschickt durch ein Dictionary ersetzen.

Das war's erstmal ;)

Edit:
- Den "raw_input" musst du dann natürlich zu "int" konvertieren
- Statt deiner "while"-Schleife geht folgendes:

Code: Alles auswählen

roman_number = ''.join('M' for i in xrange(decimal_number/1000))
- Du solltest keine deutschen und englischen Variablennamen mischen, sondern dich auf eine Sprache festlegen (dec ist z.B. englisch)
fmartin
User
Beiträge: 2
Registriert: Dienstag 1. Dezember 2009, 17:11

ice2k3 hat geschrieben:Ein paar Hinweise:
- PEP8 beachten (Variablen - und Funktionsnamen klein_mit_unterstrich, Klassennamen CamelCase)
- "global" vermeiden, zuwas gibt es "return"
- Die gesamten Lookups ( [x] ) sind IMHO viel zu magisch, für diese Konstante (Zeile 6) solltest du dir eine sinnvollere und verständlichere Datenstruktur ausdenken.
- Die Klammern beim Tuple-Unpacking in Zeile 26/27 sind unnötig und auch unschön.
- "Einsfünfzehn" ist ein völlig nichtssagender Funktionsbezeichner.
- Statt "input" "raw_input" verwenden (bei Python < 3, und das hast du ja wegen dem "print"-Statement)
- Eine längere Folge von "elifs" (bzw. Switch-Case in anderen Sprachen) lässt sich geschickt durch ein Dictionary ersetzen.

Das war's erstmal ;)

Edit:
- Den "raw_input" musst du dann natürlich zu "int" konvertieren
- Statt deiner "while"-Schleife geht folgendes:

Code: Alles auswählen

roman_number = ''.join('M' for i in xrange(decimal_number/1000))
- Du solltest keine deutschen und englischen Variablennamen mischen, sondern dich auf eine Sprache festlegen (dec ist z.B. englisch)
Naja, das hab ich einfach mal so runtergeschrieben, ohne auf die PEP8-Richtlinien einzugehen. Variablennamen und die if-elif-Folge sind deswegen nicht konform, einverstanden. (Das 'dec' find ich übrigens nicht so schlimm, weil dezZ... einfach doof aussieht.)

Hauptziel war es, die nette Idee mit der sich wiederholenden Logik bei den Zehnerpotenzen zu zeigen, deswegen auch die Datenstruktur in Zeile 6.

Und wem die Idee gefällt, der kann das ja gerne schöner und PEP-konformer schreiben, ist ja schließlich nur ein Entwurf. Und dafür ist dieses Forum ja auch da, oder?
In a world without walls and fences:

who needs Windows and Gates?
BlackJack

@ice2k3: Könnte man das nicht noch einfacher schreiben?

Code: Alles auswählen

roman_number = 'M' * (decimal_number // 1000)
Antworten