Затова трябва да създам 3 функции за това задание. Първият трябва да направи следното
numCol (): Когато се занимава с обикновен текст (и данни, написани с обикновен текст), може да бъде полезно да имате "скала", която показва колоните, в които се появяват знаци. Създаваме мащаб с помощта на два реда (или „редове“). Във втория ред отпечатваме 1234567890 многократно. В първия ред (т.е. реда над втория ред) пишем цифрите „десетки“ над нулите на втория ред, както е показано в списъка по-долу. Тази функция взема един аргумент, цяло число и отпечатва мащаб дължината на вашия цитат. Не връща нищо.
Вторият трябва
docQuote (): Взема три аргумента: 1) цитата като низ, 2) началната стойност на среза и 3) крайната стойност на среза. Той връща докторирания низ.
Третият трябва
main (): Не взема аргументи и не връща нищо. Подканва потребителя за оригинална оферта и номер от необходимите филийки. След това в for-loop извиква numCol () по такъв начин, че мащабът е дължината на цитата, подканва потребителя за стойностите на началния и крайния отрязък (припомнете, че крайната стойност не е включена в среза), и след това извиква docQuote (). И накрая, тя отпечатва окончателния докторантиран цитат.
Ако програмата е правилна, нейният изход трябва да изглежда по следния начин:
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.
Какво имам досега: (Ще актуализирам, ако разбера нещо)
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()
Отговори:
2 за отговор № 1Добре: трябва да дефинирате наречена функция numCol
което взема един цяло число аргумент:
def numCol(n):
тогава трябва да отпечатате ред, състоящ се от n
символи, където всеки десети знак е нарастващо цяло число, а всеки друг символ е интервал.
chars = []
for i in range(1, n+1):
if i % 10:
chars.append(" ")
else:
chars.append(str((i % 100) // 10))
print("".join(chars))
и накрая ред, състоящ се от „n“ символи, като 1234567890 повтаря:
chars = []
for i in range(1, n+1):
chars.append(str(i % 10))
print("".join(chars))
която след това работи като
>>> numCol(65)
1 2 3 4 5 6
12345678901234567890123456789012345678901234567890123456789012345
редактиране:
В отговор на @AdamSmith:
Нека видим някои действителни числа:
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
на моята система (i5-760, Win7 x64, Python 2.7.5 64bit) това дава
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
Изводи:
разбирането на списъка е с 29% по-бързо от формиращия цикъл при съставяне на списък от знаци
израз на генератор е 19.6% по-бавно отколкото разбиране на списък при съставяне на списък от знаци и присъединяване към низ
това е доста неуместен, защото всъщност отпечатването на изхода отнема 9 пъти повече от генерирането му който и да е от тези методи - до момента, в който отпечатате низа, използването на разбиране на списъка (най-бързо) е само с 2,9% по-бързо от for-loop (най-бавно).
@ user3482104
Ако наистина искате да се избегне if ... else
, можете да направите
if stmt:
do_a()
if not stmt: # same effect as "else:"
do_b()
но имайте предвид, че това трябва да оцените stmt
два пъти къде else
оценява го само веднъж.
Също така, тъй като и двете цикли се повтарят в един и същ диапазон (едни и същи начални / крайни стойности), можете да комбинирате контурите:
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))