Előző - #5 Fizz Buzz | Tartalomjegyzék | Következő - #7 ASCII-tábla
ordinalSuffix(42) → '42.'
Míg a kardinális számok egy objektumcsoport méretére utalnak, például „négy alma” vagy „1000 jegy”, addig a sorszámok egy objektum helyét egy rendezett sorrendben, például „első hely” vagy „30. születésnap” jelzik. Ez a gyakorlat számokat tartalmaz, de inkább szövegfeldolgozás, mint matematika.
Gyakorlat leírása
Az angol nyelvben a sorszámnevekhez olyan utótagok tartoznak, mint a „th” a „30th”-ban vagy az „nd” a „2nd”-ban. Írjon egy ordinalSuffix() függvényt egy egész szám paraméterrel, numberés egy számsort ad vissza annak sorszámú utótagjával. Például az ordinalSuffix(42) a '42nd' karakterláncot adja vissza .
Használhatja a Python str()függvényt az egész argumentum karakterláncsá alakításához. A Python endswith() karakterlánc-módszere hasznos lehet ebben a gyakorlatban, de a kihívás megtartása érdekében ne használja a megoldás részeként.
Ezek a Python- assertutasítások leállítják a programot, ha feltételük False. Másolja őket a megoldási program aljára. Az Ön megoldása akkor helyes, ha a következő assertállítások feltételei mind igazak :
assert ordinalSuffix(0) == '0.'
assert ordinalSuffix(1) == '1st'
assert ordinalSuffix(2) == '2nd'
assert ordinalSuffix(3) == '3.'
assert ordinalSuffix(4) == '4.'
assert ordinalSuffix(10) == '10.'
assert ordinalSuffix(11) == '11.'
assert ordinalSuffix(12) == '12.'
assert ordinalSuffix(13) == '13.'
assert ordinalSuffix(14) == '14.'
assert ordinalSuffix(101) == '101.'
Próbáljon megoldást írni a leírásban szereplő információk alapján. Ha továbbra is problémái vannak ennek a gyakorlatnak a megoldásával, további tippekért olvassa el a Megoldástervezés és a Különleges esetek és Gotchák című részt.
Előfeltétel fogalmak: karakterláncok, in operátor, szeletek, karakterlánc-összefűzés
Megoldás tervezése
A sorszám utótagja a szám utolsó két számjegyétől függ:
A kódunk sokkal könnyebben írhatóvá válik, ha meghívjuk az str() függvényt, hogy az egész számot számban alakítsuk át karakterláncsá. Ezután negatív indexeket használhat a Pythonban, hogy megkeresse a karakterlánc utolsó számjegyét. A karakterlánc formát egy változóban tárolhatja numberStr. Csakúgy, mint a numberStr[0] és numberStr[1] kiértékeli az első és második karaktert a -ban numberStr, numberStr[-1]és numberStr[-2] kiértékeli az utolsó és második karakterig -ban numberStr. Ezért a segítségével ellenőrizheti, numberStr[-1]hogy az utolsó számjegy 1, 2 vagy 3.
Az utolsó két számjegy megkereséséhez a Python-szeleteket használhatja, hogy a szelet kezdő- és végindexének megadásával egy karakterláncból részkarakterláncot kapjon. Például numberStr[0:3]kiértékeli a karaktereket numberStraz indextől 0 egészen az indexig, de nem tartalmazza az indexet 3. Írja be a következőket az interaktív shellbe:
>>> numberStr = '41096'
>>> numberStr[0:3]
'410'
Ha numberStrlenne '41096', numberStr[0:3]akkor a következőre értékeli '410'. Ha elhagyja az első indexet, a Python azt feltételezi, hogy „a karakterlánc kezdetére” gondol. Például numberStr[:3]ugyanazt jelenti, mint numberStr[0:3]. Ha elhagyja a második indexet, a Python azt feltételezi, hogy „a karakterlánc végére” gondol. Például a numberStr[3:] ugyanazt jelenti, mint numberStr[3:len(numberStr)] a vagy '96'. Írja be a következőket az interaktív shellbe:
>>> numberStr = '41096'
>>> numberStr[:3]
'410'
>>> numberStr[3:]
'96'
Kombinálhatja a szeleteket és a negatív indexeket. Például a numberStr[-2:] azt jelenti, hogy a szelet a második karaktertől az utolsóig kezdődik, numberStrés a karakterlánc végéig tart. Így numberStr[-2:]válik a rövidítés az „utolsó két karakter a következőhöz numberStr”. Ezzel meghatározhatja, hogy a szám 11-re, 12-re vagy 13-ra végződjön. Írja be a következőket az interaktív shellbe:
>>> numberStr = '41096'
>>> numberStr[-2:]
'96'
>>> numberStr = '987654321'
>>> numberStr[-2:]
'21'
Ha egy változót több értékkel kell összehasonlítani, használhatja az in kulcsszót, és az értékeket sorba helyezheti. Például a numberStr[-2:] == '11' vagy numberStr[-2:] == '12' vagy numberStr[-2:] == '13' feltétel helyett használhatod a megfelelőt és tömörebb numberStr[-2:] in ('11', '12', '13') . Írja be a következőket az interaktív shellbe:
>>> numberStr = '41096'
>>> numberStr[-2:] in ('11', '12', '13')
Hamis
>>> numberStr = '512'
>>> numberStr[-2:] in ('11', '12', '13')
Igaz
Hasonló kifejezést fog használni a gyakorlat megoldásában.
Különleges esetek és Gotchák
Ensure that the number ends with 11, 12, or 13 before checking if it ends with 1, 2, or 3. Otherwise, you may end up programming your function to return '213rd' instead of '213th'. Also, notice that '0' has an ordinal suffix of “th”: '0th'.
Now try to write a solution based on the information in the previous sections. If you still have trouble solving this exercise, read the Solution Template section for additional hints.
Solution Template
Try to first write a solution from scratch. But if you have difficulty, you can use the following partial program as a starting place. Copy the following code from https://invpy.com/ordinalsuffix-template.py and paste it into your code editor. Replace the underscores with code to make a working program:
def ordinalSuffix(number):
numberStr = str(number)
# 11, 12, and 13 have the suffix th:
if numberStr[____:] in ('11', ____, ____):
return numberStr + 'th'
# Numbers that end with 1 have the suffix st:
if numberStr[____] == '1':
return numberStr + 'st'
# Numbers that end with 2 have the suffix nd:
if numberStr[____] == ____:
return numberStr + 'nd'
# Numbers that end with 3 have the suffix rd:
if numberStr[____] == ____:
return numberStr + 'rd'
# All other numbers end with th:
return ____ + ____
The complete solution for this exercise is given in Appendix A and https://invpy.com/ordinalsuffix.py. You can view each step of this program as it runs under a debugger at https://invpy.com/ordinalsuffix-debug/.
Another Solution Design
Instead of using the str() function to convert the number to a string and examining the digits at the end, you could leave it as an integer and determine the last digit with the % modulo operator.
Any number modulo 10 evaluates to the digit in the one’s place of the number. You can use modulo 100 to get the last two digits. For example, enter the following into the interactive shell:
>>> 42 % 10
2
>>> 12345 % 10
5
>>> 12345 % 100
45
Using this information, write an alternative solution for this exercise using modulo. If you need additional hints, replace the underscores in the following solution template with code:
def ordinalSuffix(number):
# 11, 12, and 13 have the suffix th:
if ____ % 100 in (11, ____, ____):
return str(number) + 'th'
# Numbers that end with 1 have the suffix st:
if ____ % 10 == ____:
return str(number) + 'st'
# Numbers that end with 2 have the suffix nd:
if ____ % 10 == ____:
return str(number) + 'nd'
# Numbers that end with 3 have the suffix rd:
if ____ % 10 == ____:
return str(number) + 'rd'
# All other numbers end with th:
return ____(____) + ____
The complete solution for this exercise is given in Appendix A and https://invpy.com/ordinalsuffix2.py. You can view each step of this program as it runs under a debugger at https://invpy.com/ordinalsuffix2-debug/.
Prev - #5 Fizz Buzz | Table of Contents | Next - #7 ASCII Table