开始类在多行上打印字符串

时间:2017-09-03 18:01:40

标签: python edx

在python中

我正在家里学习edx课程,将我的技能扩展到编程。我遇到的任务之一让我难过。目标是能够插入一个整数并打印出时间表。

此表将分为列和行。在给定变量输入的情况下,我可以将所需的值组合成一个字符串,用于所有数字的时间。我添加了整数之间调用的选项卡。

现在这是一个字符串,我不能让它分成不同大小的缝隙并根据最初输入的不同值进行打印。

我尝试了文字换行,但无论我如何根据不同的例子说明它都会出错。

请帮我找一个解决方案并解释它的工作原理。我试图了解这没有一个能够解决问题但却让我无知的代码。

我在该课程的松弛中找到的所有提示都没有包含到目前为止课程中列出的术语或命令。虽然没有列出很多。

这是我所拥有的,请忽略尝试不同解决方案所留下的额外内容。

   mystery_int = 5

#You may modify the lines of code above, but don't move them!
#When you Submit your code, we'll change these lines to
#assign different values to the variables.

#This is a tough one! Stick with it, you can do it!
#
#Write a program that will print the times table for the
#value given by mystery_int. The times table should print a
#two-column table of the products of every combination of
#two numbers from 1 through mystery_int. Separate consecutive
#numbers with either spaces or tabs, whichever you prefer.
#
#For example, if mystery_int is 5, this could print:
#
#1  2   3   4   5
#2  4   6   8   10
#3  6   9   12  15
#4  8   12  16  20
#5  10  15  20  25
#
#To do this, you'll want to use two nested for loops; the
#first one will print rows, and the second will print columns
#within each row.
#
#Hint: How can you print the numbers across the row without
#starting a new line each time? With what you know now, you
#could build the string for the row, but only print it once
#you've finished the row. There are other ways, but that's
#how to do it using only what we've covered so far.
#
#Hint 2: To insert a tab into a string, use the character
#sequence "\t". For example, "1\t2" will print as "1    2".
#
#Hint 3: Need to just start a new line without printing
#anything else? Just call print() with no arguments in the
#parentheses.
#
#Hint 4: If you're stuck, try first just printing out all
#the products in one flat list, each on its own line. Once
#that's working, then worry about how to organize it into
#a table.


#Add your code here!
import textwrap
a = mystery_int
b = 1
c = 0
d = 1
e = ""
f = ""
g = "" 
h = "\t"
j = 1
k = a*2

for b in range(1,a + 1):
    for c in range(1,a+1):
        d = b * c
        e +=str(d)+","
        f = str(e)

g = str.replace(f,"," ,"\t")

#textwrap.wrap(g,10)
#print(g[0:int(k)])
print(g[:k])

2 个答案:

答案 0 :(得分:1)

你几乎就在那里,你只需要收集列表中每一行的值,然后在内循环的每次迭代后打印行值。

鉴于您基本上已经有了完整的解决方案,除了一些小错误之外,我将提供解决方案的完整演练,并提供解释。

表示法:我们将使用mystery_int代替a,我们会将b(外部循环增量)更改为i,并{ {1}}(内循环增量)到c,符合惯例:

j

输出:

mystery_int = 5

for i in range(1, mystery_int+1):
    row = [str(i)]
    for j in range(2, mystery_int+1):
        row = row + [str(i*j)]
    print('\t'.join(row))

外部循环(1 2 3 4 5 2 4 6 8 10 3 6 9 12 15 4 8 12 16 20 5 10 15 20 25 )遍历行,内部循环(i)遍历列。
在每个新行,我们需要一个新列表j,它只有一个元素。第一个元素是我们要生成的倍数(因此第1行的第一个元素是row,第2行的第一个元素是1,依此类推。)

请注意,我们会将所有整数转换为字符串(2 - > i),因为我们最终希望将每一行打印为空格 - 分开的序列。

  • 只要您使用空格打印,即使您要打印的内容由数字组成,您也需要将该内容转换为字符串表示形式。 (您已经在代码中完成了此操作,但重点是值得重申,因为它是一个常见的绊脚石。)

现在,在内部循环(str(i))中,计算第一个(ji*2,...,i*3之后的每个列的产品。对于内循环的每次传递,将新产品添加到i*mystery_int。当我们完成内循环时,我们将有一个以整数row开头的行的乘法序列的完整列表。

此时,在移动到下一行之前,打印出当前行。 join()方法是使用i之前指定的分隔符连接列表中元素的常用方法。

  • 例如,.将创建一个由单个空格分隔的值的字符串:

    ' '.join(row)
  • 我选择使用制表符分隔的字符串,因为打印输出具有更好的格式。 (由于某些行具有两位数字而其他行仅具有一位数字,因此单空格分隔符会使列显示未对齐。)

注意:

  • 从教学的角度来看,使用" base"初始化每个新的' '.join(["1","2","3","4","5"]) # '1 2 3 4 5' 似乎更直观。整数rowi。这为内循环内的其余行计算提供了可视化锚定。但是,只需初始化一个空列表row = [str(i)],然后用row = []开始内循环,它也是有效的(也许有点"更清洁") / p>

    j = 1
  • 使用其他模块,可以通过更简单,通常更快的代码实现相同的目标。您似乎正在使用Python标准库,这就是我在主要解决方案中保持基础的原因。但考虑到乘法表实际上是两个相同向量的外积,我们也可以使用Numpy模块,它提供了许多快速的数学运算:

    for i in range(1, mystery_int+1):
        row = []
        for j in range(1, mystery_int+1):
            row = row + [str(i*j)]
        print('\t'.join(row))
    

重点是,当你开始更多地使用Python来完成一个给定的任务时,而不是简单地学习编程基础知识,可以合理地假设那里有一个定制适合你的模块。需要,这可以节省时间。有just about everything的Python模块!

答案 1 :(得分:0)

for i in range(1, mystery_int + 1):
    row_string = ""
    for j in range(1, mystery_int + 1):
        product = i * j
        row_string += str(product) + "\t"
    print(row_string)