2017-09-03 150 views
0

python中Beginning classes在多行上打印字符串

我在家採取edx課程將我的技能集擴展到編程中。我遇到的其中一項任務讓我難住。目標是能夠插入一個整數併爲其打印一個時間表。

該表將被分解爲列和行。我可以將所需的值組合成一個字符串,用於給定變量輸入的所有數字。我添加了在整數之間調用的選項卡。

現在這是一個字符串,我不能讓它打破到不同大小的chinks和基於最初輸入的不同值打印。

我試過文本打包,但無論如何我都把它放在不同的例子基礎上。

請幫我找到一個解決方案,並解釋其原因。我正試圖學習這一點,沒有一個可以解決問題的勺子代碼,但仍然讓我無法理解。

我在這門課的鬆懈中找到的提示都沒有包含到目前爲止課程中列出的術語或命令。很多沒有列出的。

下面是我所擁有的,請忽略嘗試不同解決方案時留下的額外費用。

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]) 
+1

您可以使用「\ n」而不是「\ t」來獲取新行而不是製表符。但是,從提示中可以看出,他們希望單獨打印這些行,即爲每行打印和打印一個單獨的字符串。 – RuthC

+0

謝謝。是的,它是如何將字符串分解成不同大小的部分以匹配初始變量,並以這種方式打印它們,以便讓我適合。 – rmcrow2

回答

1

就快,你只需要在內部循環的每次迭代後收集在一個列表中每一行的值,然後打印行值。

鑑於您基本上已經有了一個完整的解決方案,除了一些小錯誤,我將提供解決方案的完整演練和解釋。

符號:會,我們使用mystery_int代替a,我們會改變b(外環增量)來i,並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)以上列。
在每一個新行中,我們都需要一個新列表,row,它只有一個元素。第一個元素是我們將要做的倍數(因此第一行的第一個元素是1,第二行的第一個元素是2,依此類推)。

請注意,我們將所有整數轉換爲字符串(i - >str(i)),因爲我們最終希望將每行打印爲空白分隔的序列。

  • 無論何時使用空格打印,即使要打印的內容都是由數字組成,也需要將該內容轉換爲字符串表示形式。 (你已經在你的代碼中完成了這一點,但值得重申的一點是它是一個常見的絆腳石。)現在

,在內部循環(j),計算乘積的第(i*2i*3之後的每一列,...,i*mystery_int)。對於內循環中的每個通道,將新產品添加到row。當我們完成內部循環時,我們將有一個從整數i開始的行的乘法系列的完整列表。

此時,在移至下一行之前,打印出當前行。 join()方法是使用在.之前指定的分隔符連接列表中的元素的常用方法。

  • 例如,' '.join(row)將創建單空間分隔值的字符串:

    ' '.join(["1","2","3","4","5"]) 
    # '1 2 3 4 5' 
    
  • 我選擇使用製表符分隔的字符串,如打印的輸出具有更好的格式。 (由於一些行有雙位數字及其他只有個位數的號碼,一個單一的空間分隔,使列沒有對齊。)

注:

  • 從教學的角度來看,用「基本」整數irow = [str(i)]初始化每個新的row似乎更直觀。這爲內部循環內部的其餘行計算提供了可視化錨定。然而,它也是有效的(也許有點「清潔」)簡單地初始化一個空列表,row = [],然後開始用j = 1內環:

    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標準庫,這就是爲什麼我一直在基本解決方案中的基礎。但考慮到乘法表實際上是兩個相同的矢量的外積,還可以使用Numpy模塊,提供大量的快速數學運算:

    import numpy as np 
    print(np.array2string(np.outer(np.arange(1, mystery_int+1), 
               np.arange(1, mystery_int+1)), 
             separator='\t')) 
    

點是,當你開始使用Python更多的是爲了完成一個給定的任務,而不是簡單地學習編程基礎知識,所以假設有一個適合你的需求的模塊是合理的,這可以是一個真正的節省時間。有一個just about everything的Python模塊!

+0

非常感謝。這就是我需要能夠理解爲什麼會起作用的解釋。我很感激你花時間把所有東西都弄出來。我正在學習python學習編程,將我的職業道路轉變爲編程和軟件開發,所以我需要理解事情的原因不僅僅是解決每門課程的問題。我再一次感謝你。 – rmcrow2

+0

非常歡迎!祝你事業有所轉變。如果此答案是對您的問題的最佳答案,請單擊答案左側的複選標記將其標記爲已接受。 –