使用;“用树莓皮学习Python”;从威利那里来的上一级来自哪里?

使用;“用树莓皮学习Python”;从威利那里来的上一级来自哪里?,python,Python,但不知道上一级位来自何处以及它是如何工作的,有什么帮助吗?在我看来,这段代码是不必要的复杂。这取决于这样一个事实,即如果标记1打印报告卡() 打印成绩单(学生成绩单) 6.按等级划分的等级: 7如果标记8打印(科目:“:”,上一年级) 9休息 10上一级=等级[1] UnboundLocalError:赋值前引用的局部变量“prev_grade” 我们得到了您可能期望的UnboundLocalError。在我看来,这段代码是不必要的复杂。这取决于这样一个事实,即如果标记1打印报告卡() 打印成

但不知道上一级位来自何处以及它是如何工作的,有什么帮助吗?

在我看来,这段代码是不必要的复杂。这取决于这样一个事实,即如果标记在第一次迭代中总是错误的,因为
grades
中的第一项:

students = [["Ben", {"Maths": 67, "English": 78, "Science": 72}],
            ["Mark", {"Maths": 56, "Art": 64, "History": 39, "Geography": 55}],
            ["Paul", {"English": 66, "History": 88}]]
等级[0]
0
。而且
学生
中的每个数字都大于
0
。因此,跳过
if
主体,我们得出:

grades = ((0, "FAIL"),(50, "D"),(60,"C"),(70, "B"), (80," A"), (101, "CHEAT!"))
因此,下次循环并进入
if
body时,将定义
prev_grade
。如果成绩低于0,该怎么办:

prev_grade = grade[1]
现在我们尝试调用函数:

In [3]: students = [["Ben", {"Maths": -1, "English": 78, "Science": 72}],
   ...:             ["Mark", {"Maths": 56, "Art": 64, "History": 39, "Geography": 55}],
   ...:             ["Paul", {"English": 66, "History": 88}]]
   ...:
[4]中的
:打印报告卡()
学生班成绩单
---------------------------------------------------------------------------
取消绑定LocalError回溯(最近一次调用上次)
在()
---->1打印报告卡()
打印成绩单(学生成绩单)
6.按等级划分的等级:
7如果标记<等级[0]:
---->8打印(科目:“:”,上一年级)
9休息
10上一级=等级[1]
UnboundLocalError:赋值前引用的局部变量“prev_grade”

我们得到了您可能期望的
UnboundLocalError

在我看来,这段代码是不必要的复杂。这取决于这样一个事实,即如果标记在第一次迭代中总是错误的,因为
grades
中的第一项:

students = [["Ben", {"Maths": 67, "English": 78, "Science": 72}],
            ["Mark", {"Maths": 56, "Art": 64, "History": 39, "Geography": 55}],
            ["Paul", {"English": 66, "History": 88}]]
等级[0]
0
。而且
学生
中的每个数字都大于
0
。因此,跳过
if
主体,我们得出:

grades = ((0, "FAIL"),(50, "D"),(60,"C"),(70, "B"), (80," A"), (101, "CHEAT!"))
因此,下次循环并进入
if
body时,将定义
prev_grade
。如果成绩低于0,该怎么办:

prev_grade = grade[1]
现在我们尝试调用函数:

In [3]: students = [["Ben", {"Maths": -1, "English": 78, "Science": 72}],
   ...:             ["Mark", {"Maths": 56, "Art": 64, "History": 39, "Geography": 55}],
   ...:             ["Paul", {"English": 66, "History": 88}]]
   ...:
[4]中的
:打印报告卡()
学生班成绩单
---------------------------------------------------------------------------
取消绑定LocalError回溯(最近一次调用上次)
在()
---->1打印报告卡()
打印成绩单(学生成绩单)
6.按等级划分的等级:
7如果标记<等级[0]:
---->8打印(科目:“:”,上一年级)
9休息
10上一级=等级[1]
UnboundLocalError:赋值前引用的局部变量“prev_grade”

我们得到了您可能期望的
UnboundLocalError

上一个等级用于记住在if语句中输入代码之前检查的上一个等级[1]:

In [4]: print_report_card()
Report card for student  Ben
---------------------------------------------------------------------------
UnboundLocalError                         Traceback (most recent call last)
<ipython-input-6-aa68f0bb7206> in <module>()
----> 1 print_report_card()

<ipython-input-2-9f9e72e91ef4> in print_report_card(report_student)
      6                 for grade in grades:
      7                     if mark < grade[0]:
----> 8                         print(subject, " : ", prev_grade)
      9                         break
     10                     prev_grade = grade[1]

UnboundLocalError: local variable 'prev_grade' referenced before assignment
如果标记<等级[0]:
打印(科目“:”,上一年级)
打破
如果等级值大于标记值,将执行if语句中的代码。当该值大于分数时,表示上一个成绩值是学生收到的成绩值


如果在输入If语句时打印了当前等级[1],则显示的等级值是错误的值,因为它的一个等级值太大。通过将代码中的“prev_grade”更改为“grade[1]”,可以在代码中测试这一点。打印值时,您将看到,对于等级[0]值“67”,所需的值“C”改为值“B”

prev_等级用于记住在if语句中输入代码之前检查的上一个等级[1]:

In [4]: print_report_card()
Report card for student  Ben
---------------------------------------------------------------------------
UnboundLocalError                         Traceback (most recent call last)
<ipython-input-6-aa68f0bb7206> in <module>()
----> 1 print_report_card()

<ipython-input-2-9f9e72e91ef4> in print_report_card(report_student)
      6                 for grade in grades:
      7                     if mark < grade[0]:
----> 8                         print(subject, " : ", prev_grade)
      9                         break
     10                     prev_grade = grade[1]

UnboundLocalError: local variable 'prev_grade' referenced before assignment
如果标记<等级[0]:
打印(科目“:”,上一年级)
打破
如果等级值大于标记值,将执行if语句中的代码。当该值大于分数时,表示上一个成绩值是学生收到的成绩值


如果在输入If语句时打印了当前等级[1],则显示的等级值是错误的值,因为它的一个等级值太大。通过将代码中的“prev_grade”更改为“grade[1]”,可以在代码中测试这一点。打印值时,您将看到,对于等级[0]值“67”,所需的值“C”改为值“B”

prev_grade
是在上一次迭代中找到的等级字符串

if mark < grade[0]:
      print(subject, " : ", prev_grade)
break
循环。当我们第一次进入循环时,
grade
被设置为
(0,“FAIL”)
,因此
grade[0]
为零。由于
标记
总是>=0,因此下面的测试

for grade in grades:
它设置
prev_grade
,以便在
for
循环的下一轮中使用。我们需要
prev_grade
,因为只有看到
grade
元组的
grade[0]
大于
mark
,我们才知道正确的年级字符串是前一个
grade
元组中的字符串

真正理解正在发生的事情的最好方法是在纸上手动“执行”代码。假设您是Python解释器,按照代码中的说明进行操作,看看会发生什么

但是,如果您没有耐心这样做,那么在代码中添加一些额外的打印语句会有所帮助,如下所示:

prev_grade = grade[1]

可以说,在
if
块中引用
prev_grade
是一种糟糕的风格,因为之前没有定义它。当然,我的分析表明它是安全的,它不应该让一个有经验的程序员感到不安,但它仍然会减慢你阅读类似内容的速度。最好(IMHO)在循环之外定义
prev_grade
,或者至少有一条注释解释发生了什么。或者两者都做。:)

对于主题,在学生[1]中标记。项()
上一级=无
按年级划分的年级:
#在第一个循环i上,此条件永远不可能为真
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]