Potrebujem teda pre toto zadanie vytvoriť 3 funkcie. Prvý by mal urobiť nasledovné
numCol ():Pri práci s obyčajným textom (a s údajmi napísanými ako obyčajný text) môže byť užitočné mať „mierku“, ktorá označuje stĺpce, v ktorých sa znaky vyskytujú. Vytvoríme mierku pomocou dvoch línií (alebo „riadkov“). V druhom riadku opakovane tlačíme 1234567890. Do prvého riadku (tj. Riadok nad druhým riadkom) napíšeme „nuly“ číslice nad nuly do druhého riadku, ako je uvedené v zozname nižšie. Táto funkcia trvá jeden argument, celé číslo a vytlačí mierku po celej dĺžke vašej ponuky. Nič nevracia.
Druhý by mal
docQuote (): Berie tri argumenty: 1) citát ako reťazec, 2) začiatočná hodnota rezu a 3) koncová hodnota rezu. Vráti upravenú šnúru.
Tretí by mal
main (): Neberie žiadne argumenty a nič nevracia.Vyzve používateľa na pôvodnú ponuku a číslo potrebných plátkov. Potom v cykle for zavolá numCol () takým spôsobom, že mierka je dĺžkou ponuky, vyzve používateľa na začiatočné a koncové hodnoty rezu (pripomeňme, že koncová hodnota nie je zahrnutá do rezu), a potom zavolá docQuote (). Na záver sa vytlačí konečný upravený citát.
Ak je program správny, jeho výstup by mal vyzerať takto:
1. Enter quote: Money is the root of all evil.
2. Enter the number of slices needed: 2
3. 1 2
4. 012345678901234567890123456789
5. Money is the root of all evil.
6. Start and end for slicing separated by a comma: 8, 20
7. 1
8. 012345678901234567
9. Money is all evil.
10. Start and end for slicing separated by a comma: 12, 17
11. -> Money is all.
Čo zatiaľ mám: (Aktualizuje sa, ak na niečo prídem)
def numCol(x):
col=[]
for i in range(1,(round(n)//10)+1):
col.append(str(i))
print(" "," ".join(col),end="")
def docQuote(x,y,z):
return
def main():
x=input("Enter quote: ")
y=int(input("Enter the number of slices needed: "))
numCol(len(x)-1)
print(x)
main()
odpovede:
2 pre odpoveď č. 1Dobre: musíte definovať funkciu s názvom numCol
ktorý má jeden celočíselný argument:
def numCol(n):
potom musíte vytlačiť riadok pozostávajúci z n
znaky, kde každý desiaty znak je prírastkové celé číslo a každý ďalší znak je medzera.
chars = []
for i in range(1, n+1):
if i % 10:
chars.append(" ")
else:
chars.append(str((i % 100) // 10))
print("".join(chars))
a nakoniec riadok pozostávajúci z písmen „n“, ktoré opakujú 1234567890:
chars = []
for i in range(1, n+1):
chars.append(str(i % 10))
print("".join(chars))
ktorý potom beží ako
>>> numCol(65)
1 2 3 4 5 6
12345678901234567890123456789012345678901234567890123456789012345
editovať:
V reakcii na @AdamSmith:
Pozrime sa na niektoré skutočné čísla:
from textwrap import dedent
from timeit import Timer
test_statements = [
(
"n = 65",
"""
# as a for-loop
chars = []
for i in xrange(1, n+1):
if i % 10:
chars.append(" ")
else:
chars.append(str((i % 100) // 10))
"""
),
(
"n = 65",
"""
# as a list comprehension
chars = [" " if i%10 else str((i%100)//10) for i in xrange(1,n+1)]
"""
),
(
"n = 65",
"""
# extra cost of list-to-string
chars = [" " if i%10 else str((i%100)//10) for i in xrange(1,n+1)]
s = "".join(chars)
"""
),
(
"n = 65",
"""
# vs cost of generator-to-string
chars = (" " if i%10 else str((i%100)//10) for i in xrange(1,n+1))
s = "".join(chars)
"""
),
(
"s = " 1 2 3 4 5 6 "",
"""
# cost of actually displaying string
print(s)
"""
)
]
for setup,run in test_statements:
res = Timer(dedent(run), setup)
times = res.repeat() # 3 * 1000000 runs
print("{:7.1f}".format(min(times)) # time of one loop in microseconds
v mojom systéme (i5-760, Win7 x64, Python 2.7.5 64bit) to dáva
15.1 # for-loop -> list of chars
10.7 # list comprehension -> list of chars
11.4 # list comprehension -> string
13.6 # generator expression -> string
132.1 # print the string
záver:
porozumenie zoznamu je o 29% rýchlejšie ako cyklus for-loop pri zostavovaní zoznamu znakov
výraz generátora je 19,6% pomalšie než porozumenie zoznamu pri zostavovaní zoznamu znakov a pripojení k reťazcu
je to pekne irelevantné, pretože skutočná tlač výstupu trvá 9-krát dlhšie ako jeho generovanie pomocou programu akýkoľvek z týchto metód - v čase, keď reťazec vytlačíte, je použitie porozumenia zoznamu (najrýchlejšie) iba o 2,9% rýchlejšie ako cyklu for-loop (najpomalšie).
@ user3482104
Ak sa naozaj chcete vyhnúť if ... else
, môžete robiť
if stmt:
do_a()
if not stmt: # same effect as "else:"
do_b()
ale uvedomte si, že to treba vyhodnotiť stmt
dvakrát kde else
hodnotí to iba raz.
Pretože obe slučky iterujú v rovnakom rozsahu (rovnaké počiatočné a koncové hodnoty), môžete tieto slučky kombinovať:
def numCol(n):
firstline = []
secondline = []
for i in range(1, n+1):
i %= 100
tens, ones = i // 10, i % 10
if ones: # ones != 0
firstline.append(" ")
if not ones: # ones == 0 # <= "else:"
firstline.append(str(tens))
secondline.append(str(ones))
print("".join(firstline))
print("".join(secondline))