2013-05-29 75 views
1

所以這可能是一個關於使用'.format'的python輸出格式的非常基本的問題,因爲我是初學者,所以我無法弄清楚這是否適合我的生活。我試圖儘可能詳細,只是爲了確保沒有混淆。輸出格式化Python 3.3

讓我舉個例子,讓你更好地理解我的困境。考慮下面的程序

list = (['wer', 'werwe', 'werwe' ,'wer we']) # list[0], list[1], list[2], list[3] 
list.append(['vbcv', 'cvnc', 'bnfhn', 'mjyh']) # list[4] 
list.append(['yth', 'rnhn', 'mjyu', 'mujym']) # list[5] 
list.append(['cxzz', 'bncz', 'nhrt', 'qweq']) # list[6] 

first = 'bill' 
last = 'gates' 

print ('{:10} {:10} {:10} {:10}'.format(first,last,list[5], list[6]))  

可以理解的是,這將使輸出:

bill  gates  ['yth', 'rnhn', 'mjyu', 'mujym'] ['cxzz', 'bncz', 'nhrt', 'qweq'] 

因此,這裏是我的真正的問題。我正在從書中解決這個練習題,我不明白答案。下面的程序會給你什麼樣的輸出,我們會爲一個好主意:

students = [] 
students.append(['DeMoines', 'Jim', 'Sophomore', 3.45]) #students[0] 
students.append(['Pierre', 'Sophie', 'Sophomore', 4.0]) #students[1] 
students.append(['Columbus', 'Maria', 'Senior', 2.5]) #students[2] 
students.append(['Phoenix', 'River', 'Junior', 2.45]) #students[3] 
students.append(['Olympis', 'Edgar', 'Junior', 3.99]) #students[4] 
students.append(['van','john', 'junior', 3.56])   #students[5] 
def Grades(students): 
    print ('Last  First  Standing  GPA') 
    for students in students: 
     print('{0:10} {1:10} {2:10} {3:8.2f}'.format(students[0],students[1],students[2],students[3])) 

我們正在試圖獲得的輸出是一種,讓所有學生的所有統計數據表的 -

Last  First  Standing  GPA 
DeMoines Jim  Sophomore  3.45 
Pierre  Sophie  Sophomore  4.00 
Columbus Maria  Senior   2.50 
Phoenix River  Junior   2.45 
Olympis Edgar  Junior   3.99 
van  john  junior   3.56 

所以這裏是我不明白。在這兩個例子中,我們正在處理基本相同的事情,即列表中的列表。對於我的第一個例子,print語句是:

print('{:10} {:10} {:10} {:10}'.format(first, last, list[5], list[6])) 

其中list[5]list[6]是列出自己和他們是印在整體,你可以從輸出中看到。 但這並不發生在書本問題。在那裏,打印聲明說

print('{0:10} {1:10} {2:10} {3:8.2f}'.format(students[0], students[1], students[2], students[3])) 

正如你從上表輸出中看到,這裏students[0]僅指「DeMoines」。但是,如果您只是在Python解釋器中運行語句students[0],則它應該給出整個子列表。

['DeMoines', 'Jim', 'Sophomore', 3.45] 

所以,基本上,我有兩個問題,爲什麼students[0]有兩種不同的含義,爲什麼不students[0]像我們與list[5]list[6]沒有打印整個列表?

+0

如果我可以提供一個建議:儘量縮短你的例子,並澄清問題陳述。如果你的問題更重要,你會得到更多的關注。 – cfi

+0

我會牢記這一點。謝謝。 – Kye

回答

3

看那for循環

for students in students: 
# ^^^^^^^^ 

所以,students(內循環)並不真正是指列表的名單。 students[0]指的是第一個元素元素列表清單,如預期的那樣。

我建議從函數參數替換students,比如說,與all_students或類似的東西。

+0

)謝謝,我想我現在理解了一點,所以如果我錯了,當我們對列表應用一個for循環時(或者在我們的例子中,就是列表列表) ,它會在for循環內部以某種方式改變'students [0]'的含義(指絕對第一個ELEMENT),但在for循環之外'學生[0]'仍然指子列表 – Kye

+0

有點更正:_「它以某種方式改變'學生[0]'」_的含義 - 不以某種方式改變。再次查看for循環。它在'中具有for 的形式,主要問題是case'element_name'和'iterable_object'具有相同的名字 – soon

+0

@Kye在'x'中使用'for x是一個非常令人困惑的構造。我猜你會更好地看到發生了什麼,如果你改寫它爲'學生('{0:10} {1:10} {2:10} {3:8.2f}'。格式(學生[0],學生[1] ,斯圖登t [2],學生[3]))' –

1

嘗試將變量list重命名爲不是保留字或內置函數或類型的內容。

對初學者來說什麼讓人困惑 - 遲早會發生在每個人身上 - 如果重新定義或以非預期方式使用保留字或內置函數,會發生什麼情況。

如果你

list = [1, 2, 3, 4] 

你重新綁定名稱list不再指向內置list數據類型,但在目前的範圍內實際列表[1, 2, 3, 4]。這幾乎總是不是你打算做的。使用變量dir是一個類似的陷阱。

也不要在列表分配的方括號周圍使用附加的禁忌物()。像words = ['wer', 'werwe', 'werwe' ,'wer we']就足夠了。

通常考慮爲變量選擇哪個名稱。 students是描述性的,有用的評論,list不是。另外,如果list當前擁有一個列表,那麼稍後您的算法可能會更改,其變量將保留set或任何其他容器類型。那麼基於類型的變量名稱甚至會引起誤解。

+0

「您將覆蓋定義,從而覆蓋內置'list'數據類型的含義。」 - 錯了。當你命名一個像內建變量這樣的函數時,你所做的唯一一件事就是在變量的範圍內映射內建函數(這對於'list'來說大多數情況下不是問題,因爲這個類型的用例不是很多用列表理解或文字解決)。調用變量list的最重要的問題是名稱根本不具有描述性,除了明顯的事實是它是一個列表之外,並沒有給讀者任何有關變量或其內容的信息。 – l4mpi

+0

@ l4mpi:內建列表的含義僅在該變量的範圍內被覆蓋是正確的。但它確實得到了重新定義。在回答初學者的問題時,最好不要提供過多的細節。關於不準確和無用的變量名稱也是一個很好的觀點,所以我編輯了兩個答案。請重新考慮downvote(如果它是由你完成的)。請記住,所有關於提供最佳答案和建設性批評。你可以自己輕鬆地將「範圍」編輯成答案...... – cfi

+0

@ l4mpi:我再次編輯了我的短語,因爲我使用的「重新定義」一詞確實是誤導人的。感謝您的評論。 – cfi