prev_grade
爲立體字符串是在
for grade in grades:
循環的前一次迭代中。當我們第一次進入該循環時,grade
被設置爲(0, "FAIL")
,因此grade[0]
爲零。而且由於mark
總是> = 0下面的測試
if mark < grade[0]:
不能是真實的,所以我們沒有進入if
塊,所以它並不重要prev_grade
尚不存在因爲我們不打算在循環的這個迭代中打印它。所以我們跳過了if
塊來
prev_grade = grade[1]
這臺prev_grade
因此它可以在下一輪for
循環使用。我們需要prev_grade
,因爲我們不知道等級是什麼,直到我們看到一個grade
元組的grade[0]
大於mark
,然後我們知道正確的等級字符串是來自先前的grade
元組的字符串。
真正理解發生了什麼的最好方法是在紙上手動「執行」代碼。假裝你是Python解釋器,並按照代碼中的說明操作,看看會發生什麼。
但是如果你沒有耐心做,它可以幫助你添加了一些額外的打印語句代碼,就像這樣:
grades = (
(0, "FAIL"),
(50, "D"),
(60,"C"),
(70, "B"),
(80, "A"),
(101, "CHEAT!")
)
students = [
["Ben", {"Maths": 67, "English": 78, "Science": 72}],
["Mark", {"Maths": 56, "Art": 64, "History": 39, "Geography": 55}],
["Paul", {"English": 66, "History": 88}],
]
def print_report_card(report_student=None):
for student in students:
if (student[0] == report_student) or (report_student is None):
print("\nReport card for student ", student[0])
for subject, mark in student[1].items():
print('\nSUBJECT', subject, 'MARK', mark)
for grade in grades:
print('GRADE', grade)
if mark < grade[0]:
print(subject, " : ", prev_grade)
break
print('SETTING prev_grade TO', grade[1])
prev_grade = grade[1]
print_report_card("Paul")
輸出
Report card for student Paul
SUBJECT English MARK 66
GRADE (0, 'FAIL')
SETTING prev_grade TO FAIL
GRADE (50, 'D')
SETTING prev_grade TO D
GRADE (60, 'C')
SETTING prev_grade TO C
GRADE (70, 'B')
English : C
SUBJECT History MARK 88
GRADE (0, 'FAIL')
SETTING prev_grade TO FAIL
GRADE (50, 'D')
SETTING prev_grade TO D
GRADE (60, 'C')
SETTING prev_grade TO C
GRADE (70, 'B')
SETTING prev_grade TO B
GRADE (80, 'A')
SETTING prev_grade TO A
GRADE (101, 'CHEAT!')
History : A
可以爭辯說,在它之前沒有定義的情況下,在if
塊中引用prev_grade
的方式很糟糕。當然,我的分析表明它是安全的,它不應該讓有經驗的編碼員感到困惑,但它仍然會讓你放慢閱讀這些東西的速度。這將是很多更好(恕我直言)定義prev_grade
以外的循環,或至少有解釋發生了什麼評論。或者做兩個。 :)
for subject, mark in student[1].items():
prev_grade = None
for grade in grades:
# This condition can never be True on the first loop iteration
if mark < grade[0]:
print(subject, " : ", prev_grade)
break
prev_grade = grade[1]
您可能注意到,我改變(report_student == None)
到(report_student is None)
,後者是更有效和Python的風格指南,PEP-0008的建議。
如果其中一個答案解決了您的問題,您應該接受它(單擊相應答案旁邊的複選標記)。這有兩件事。它讓每個人都知道你的問題已經得到解決,讓你滿意,並且它可以幫助你幫助你。請參閱[此處](http://meta.stackexchange.com/a/5235)以獲取完整說明。 –