Ebben a bejegyzésben szeretném megmutatni, hogyan oldjunk meg egy feladatot különböző módokon. A leghosszabb megoldás használható az alacsonyabb szintű programnyelvekben is (C, Java stb.), viszont a Python rövidítési lehetőségeit kihasználva gyors és rövid programot kapunk.
A feladat: írassuk ki egymás után, vesszővel és helyközzel elválasztva a négyzetszámokat ezerig.
Első körben elemezzük a feladatot: mi az a négyzetszám, mennyi lehet belőle, megtalálom-e máshol is a megoldást, hogy tudjam majd magam ellenőrizni stb. Lényeg az, hogy 1, 2, 3... négyzetéről, vagyis 1, 4, 9, ... számokról van szó, egészen 1000-ig.
Ezt az alacsony szintű programnyelvekben úgy tudjuk megoldani, hogy listába gyűjtjük a négyzetszámokat ezerig, utána kiírjuk őket figyelve arra, hogy az utolsó után ne legyen vessző. Van olyan programozó, aki úgy írja a programot, hogy csak 1000-re legyen jó és van aki úgy, hogy ha másik számot adnak meg, akkor is működjön.
cel = 1000 negyzet = [] i = 1 while i**2<=cel: negyzet.append(i**2) i += 1 for j in range(len(negyzet)-1): print(negyzet[j],end=", ") print(negyzet[-1])
Ez szépen működik, az eredmény
Van egy olyan verzió is, ahol végtelen ciklust hozunk létre és ha a négyzetszám meghaladja a célt, kiugrunk a ciklusból:
cel = 1000 negyzet = [] i = 1 while True: if i**2>cel: break negyzet.append(i**2) i += 1 for j in range(len(negyzet)-1): print(negyzet[j],end=", ") print(negyzet[-1])
Megcsinálhatjuk
cel = 1000 negyzet = [] for i in range(1,int(cel**0.5)+1): negyzet.append(i**2) for j in range(len(negyzet)-1): print(negyzet[j],end=", ") print(negyzet[-1])
Tovább rövidíthetünk, ha kihasználjuk a Python egyik rövidítési lehetőségét, vagyis hogy listát közvetlenül tudunk for-ral létrehozni. Ez a Python egy magas szintű lehetősége, aknázzuk kis a benne rejlő lehetőséget!
cel = 1000 negyzet = [i**2 for i in range(1,int(cel**0.5)+1)] for j in range(len(negyzet)-1): print(negyzet[j],end=", ") print(negyzet[-1])
A fenti megoldásoknál figyelni kellett a vesszőre kiíráskor: külön kellett kezelni az utolsó elemet. Ezt megteszi helyettünk a
cel = 1000 negyzet = [str(i**2) for i in range(1,int(cel**0.5)+1)] print(", ".join(negyzet))
Ha nem vezetünk be külön változót a célnak és a lista létrehozását berakjuk a join utasításba, egy sorban megoldható a program:
print(", ".join([str(i**2) for i in range(1,int(1000**0.5)+1)]))
Van aki azt gondolja, hogy a magas szintű jellemzők alkalmazása lelassítja a program futását. Hát nem! Az utolsó verzió 0,0156 másodperc alatt fut le, a legelső 0,156 alatt. Tízszeres időkülönbség!