Előző - #4 Terület és kötet | Tartalomjegyzék | Következő - 6. sorszámú utótag
fizzBuzz(5) → 1 2 Fizz 4 Buzz
A Fizz buzz egy szójáték, amelyet egyszerű programként is megvalósíthat. Híressé vált a kódolási interjúk szűrőkérdéseként, hogy gyorsan megállapítsák, hogy a jelöltek rendelkeznek-e bármilyen programozási képességgel, így a gyors megoldás jó első benyomást eredményez.
Ez a gyakorlat folytatja a modulo operátor használatát annak meghatározására, hogy a számok oszthatók-e 3-mal, 5-tel vagy 3-mal és 5-tel is. Az „ n- nel osztható” azt jelenti, hogy maradék nélkül osztható n számmal. Például a 10 osztható 5-tel, de a 11 nem osztható 5-tel.
Gyakorlat leírása
Írjon egy fizzBuzz()függvényt egyetlen egész paraméterrel, melynek neve upTo. 1A -ig terjedő számok esetén upToa függvény négy dolog egyikét írja ki:
Ahelyett, hogy minden egyes karakterláncot vagy számot külön sorba nyomtatna, nyomtassa ki őket újsorok nélkül. Például a megoldás helyes, ha a fizzBuzz(35) meghívása a következő kimenetet eredményezi:
1 2 Pezsgés 4 Buzz Pezsgés 7 8 Pezsgés 11 Pezsgés 13 14 Pezsgés 16 17 Pezsgés 19 Buzz Pezsgés 22 23 Pezsgés 26 Pezsgés 28 29 Pezsgés 31 32 Pezsgés 34 Buzz
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ételek: modulo operátor, end kulcsszó argumentum print(), for ciklusokhoz, range() két argumentummal
Megoldás tervezése
Ehhez a függvényhez egy ciklusra van szükség, amely lefedi az 1- től a upTo paramétert is tartalmazó egész számokat. A %modulo operátor (amelyet a 3. gyakorlatban használtunk, „Páratlan és páros”) ellenőrizheti, hogy egy szám osztható-e 3-mal vagy 5-tel. Ha egy szám mod 3 0, akkor a szám osztható 3-mal. Az 5 az 0, akkor a szám osztható 5-tel. Például írja be a következőket az interaktív shellbe:
>>> 9 % 3
0
>>> 10 % 3
1
>>> 11 % 3
2
9 % 3kiértékeli 0 -ra , tehát a 9 osztható 3-mal. Eközben 10% 3 kiértékeli -re , 11% 31 pedig -ra , tehát 10 és 11 nem osztható 3-mal. A modulo operátor mögötti minta megtekintéséhez írja be a következő kódot a interaktív shell:2
>>> i tartományban (20):
... print(str(i).rjust(2), i % 3, i % 5)
...
0 0 0
1 1 1
2 2 2
3 0 3
4 1 4
5 2 0
6 0 1
7 1 2
8 2 3
9 0 4
10 1 0
11 2 1
12 0 2
13 1 3
14 2 4
15 0 0
16 1 1
17 2 2
18 0 3
19 1 4
A három szám oszlopa egy 0-tól 19-ig terjedő szám, a modulo 3 és a modulo 5. Figyeljük meg, hogy a modulo 3 oszlop 0-tól 2-ig, a modulo 5 oszlopciklus pedig 0-tól 4-ig terjed. A modulo eredmény: 0 minden 3. és 5. szám. És mindkettő 0 minden 15. számban (erről bővebben a Speciális esetek és Gotchák részben.)
Visszatérve a megoldásunkhoz, a hurkon belüli kód ellenőrzi, hogy az aktuális szám hatására a program a „Fizz”, „Buzz”, „FizzBuzz” vagy a szám valamelyikét jelenítse-e meg. Ez egy sor if - elif- elif- else utasítással kezelhető .
Ha azt szeretné, hogy a print()függvény automatikusan szóközt nyomtasson újsor karakter helyett, adja át az end=' ' kulcsszó argumentumot. Például print('FizzBuzz', end=' ')
Különleges esetek és Gotchák
Az egyik gyakori hiba a Fizz Buzz program írásakor, hogy ellenőrzi, hogy a szám osztható-e 3-mal vagy 5-tel, mielőtt ellenőrzi, hogy osztható-e 3-mal és 5-tel. Először ellenőrizni kell, hogy egy szám osztható-e 3-mal és 5-tel, mert ezek a számok oszthatóak 3és 5-tel is . De biztos szeretne lenni abban, hogy a vagy 'FizzBuzz' helyett inkább megjelenik .'Fizz''Buzz'
Egy másik módszer annak meghatározására, hogy egy szám osztható-e 3-mal és 5-tel, ha ellenőrizzük, osztható-e 15-tel. Ennek az az oka, hogy a 15 a 3 és 5 legkisebb közös többszöröse (LCM). A feltételt felírhatja % 3 számként is. == 0 és szám % 5 == 0 vagy írja be a feltételt számként % 15 == 0 .
A range()függvény megmondja a ciklusoknak , hogy menjenek fel, de nem tartalmazza az argumentumukat. A kód i - t 9 - igfor i in range(10): állítja be , nem 10 - ig . Megadhat két argumentumot, hogy a range()- nek egy számmal kezdõdjön a mellett . A kód i - re állítja be . Gyakorlatunkban a számot bele szeretné foglalni a -ba , ezért adja hozzá: range(1, upTo + 1)000for i in range(1, 10):19upTo1
A Python függvény egy tartományobjektumotlist() vehet vissza, amelyből egész számok listáját állíthatja elő. Például, ha egy 1- től ig terjedő egész számok listájára van szüksége , meghívhatja a list(tartomány(1, 11)) parancsot . Ha minden páros számra szüksége van 150 és 150 között , hívja :range()10200list(range(150, 202, 2))
>>> lista(tartomány(1, 11))
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> list(range(150, 202, 2))
[150, 152, 154, 156, 158, 160, 162, 164, 166, 168, 170, 172, 174, 176, 178, 180, 182, 184, 186, 188, 190, 192, 194, 196, 198, 200]
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/fizzbuzz-template.py and paste it into your code editor. Replace the underscores with code to make a working program:
def fizzBuzz(upTo):
# Loop from 1 up to (and including) the upTo parameter:
for number in range(1, ____):
# If the loop number is divisible by 3 and 5, print 'FizzBuzz':
if number % 3 == ____ and number % 5 == ____:
____(____, end=' ')
# Otherwise the loop number is divisible by only 3, print 'Fizz':
elif ____ % 3 == 0:
____(____, end=' ')
# Otherwise the loop number is divisible by only 5, print 'Buzz':
elif number % 5 ____ 0:
____(____, end=' ')
# Otherwise, print the loop number:
else:
____(____, end=' ')
The complete solution for this exercise is given in Appendix A and https://invpy.com/fizzbuzz.py. You can view each step of this program as it runs under a debugger at https://invpy.com/fizzbuzz-debug/.
Prev - #4 Area & Volume | Table of Contents | Next - #6 Ordinal Suffix