用刻度切片句子的字符串

时间:2014-03-31 17:35:11

标签: python string python-3.x slice

所以我需要为这个作业创建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()

1 个答案:

答案 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))