Skip to main content
 首页 » 编程设计

python之在列表上映射 bool 函数

2025年05月04日15powertoolsteam

我是编程新手,所以这可能是个愚蠢的问题!

我正在尝试编写一个函数,该函数接受字母成绩列表并根据它是否及格成绩返回 bool 值 true 或 false

## Calculate total units passed 
 
def unitPassed(letterGrade): 
    if letterGrade == 'N': 
        passed = False 
    else: 
        if letterGrade == 'NCN': 
           passed = False 
        else: 
            if letterGrade == 'WN': 
                passed = False 
            else: 
                True 
    return passed 
 
unitsPassed = map(unitPassed,courseGradeLetter) 

我尝试通过创建一个函数来测试成绩是否为及格分数,然后将其映射到成绩列表来实现此目的。

问题是对于包含多个元素的列表,我得到以下错误:

local variable 'passed' referenced before assignment 

如果我尝试使用包含一个元素的列表,我会得到正确的结果。

知道这是为什么吗?

谢谢。

--

谢谢大家,你们的回答对我帮助很大!

请您参考如下方法:

有些人已经指出了您的错误并发布了最 pythonic 的解决方案,但无论如何 - 这是另一个代码审查,但这次是一步一步的:

第一点:学习使用elif而不是在else子句中嵌套if子句:

def unitPassed(letterGrade): 
    if letterGrade == 'N': 
        passed = False 
    elif letterGrade == 'NCN': 
        passed = False 
    elif letterGrade == 'WN': 
        passed = False 
    else: 
        passed = True 
    return passed 

如您所见,这已经更具可读性。

第二点:在 Python 中我们赞成“提前返回”——也就是说,在这种测试中,我们不是在所有分支中设置一个变量并在最后返回它,而是直接返回(这避免了 elif/else 链等):

def unitPassed(letterGrade): 
    if letterGrade == 'N': 
        return False 
    if letterGrade == 'NCN': 
        return False 
    if letterGrade == 'WN': 
        return False 
    return True 

这使得代码更加直接。

当然,最后的重构是尽可能避免多次测试,正如 Dadep 和 digitake 所发布的那样(但使用元组而不是列表,因为我们在这里不需要列表的开销):

def unitPassed(letterGrade): 
    return letterGrade not in ("N", "NCN", "WN") 

此外,您在代码片段中使用了 map(),但虽然 map() 仍然完全有效且合适,但更惯用(且速度稍快)的版本这是一个列表理解:

passed = [unitPassed(letter) for letter in courseGradeLetter] 

因为 unitPassed 现在基本上是一个简单的短表达式,你可以直接将它内联(当然除非你在其他地方需要这个函数):

passed = [letter not in ('N', 'NCN', 'NWN') for letter in courseGradeLetter]