Zanurkuj w Pythonie/roman.py, etap 3: Różnice pomiędzy wersjami

Usunięta treść Dodana treść
zamiana {{Nawigacja|Python|->{{Nawigacja|Zanurkuj w Pythonie| [[Python/->[[../
Beau (dyskusja | edycje)
sprzątanie kodu
Linia 1:
{{Podświetl|py}}
== <tt>roman.py</tt>, etap 3 ==
 
Teraz już <tt>toRoman</tt> odpowiednio sobie radzi z dobrym wejściem (liczbami całkowitymi od 1 do 3999), więc teraz jest czas zając się niepoprawnym wejściem (wszystkim innym).
 
Linia 10 ⟶ 8:
Jeśli jeszcze tego nie zrobiłeś, możesz pobrać [http://diveintopython.org/download/diveintopython-examples-5.4.zip ten i inne przykłady wykorzystane w tej książce].
 
<source lang="python">"""Convert to and from Roman numerals"""
 
#Define exceptions
class RomanError(Exception): pass
class OutOfRangeError(RomanError): pass
class NotIntegerError(RomanError): pass
class InvalidRomanNumeralError(RomanError): pass
 
#Define digit mapping
romanNumeralMap = (('M', 1000),
('CM', 900),
('D', 500),
('CD', 400),
('C', 100),
('XC', 90),
('L', 50),
('XL', 40),
('X', 10),
('IX', 9),
('V', 5),
('IV', 4),
('I', 1))
 
def toRoman(n):
"""convert integer to Roman numeral"""
if not (0 < n < 4000): #(1)
raise OutOfRangeError, "number out of range (must be 1..3999)" #(2)
if int(n) <> n: #(3)
raise NotIntegerError, "non-integers can not be converted"
 
result = "" #(4)
for numeral, integer in romanNumeralMap:
while n >= integer:
result += numeral
n -= integer
return result
 
def fromRoman(s):
"""convert Roman numeral to integer"""
pass</source>
# Jest to przyjemny pythonowy skrót: wielokrotne porównanie. Jest to odpowiedniek do <tt>if not ((0 < n) and (n < 4000))</tt>, jednak łatwiejszy do odczytu. Za pomocą tego kontrolujemy zakres wartości i sprawdzamy, czy wprowadzona liczba nie jest za duża, ujemna, czy też równa zero.