所以我需要为这个作业创建3个函数。 第一个应该做以下
numCol():处理纯文本(以及以纯文本格式写入的数据)时,有一个“比例”可以指示出现字符的列。我们使用两行(或“行”)创建一个比例。在第二行,我们反复打印1234567890。在第一行(即第二行上方的行)中,我们在第二行的零上方写入“十位”数字,如下面的清单所示。此函数接受一个参数,一个整数,并打印一个缩放报价的长度。它没有返回任何东西。
第二个
docQuote():采用三个参数:1)作为字符串的引用,2)切片起始值,以及3)切片结束值。它返回被修改的字符串。
第三个应该
main():不带参数,不返回任何内容。提示用户提供原始报价和编号 需要切片。然后在for循环中,以这样的方式调用numCol(),使得scale是引用的长度,提示用户输入开始和结束切片值(回想一下切片中没有包含结束值),然后调用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()
答案 0 :(得分:2)
好的:你必须定义一个名为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 64位),这给出了
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
结论:
列表理解比构建字符列表的for循环快29%
生成器表达式比构建字符列表并连接到字符串时的列表理解值<19.6%更慢
它非常不相关,因为实际打印输出所需的时间比使用任何这些方法生成输出要长9倍 - 当您打印字符串时out,使用列表理解(最快)比for-loop(最慢)快2.9%。
@ 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))