作业6 | 豆包MarsCode AI刷题

130 阅读5分钟
def solution(n: int, l: int, r: int, a: list) -> int:
    count = 0
    for num in a:
        if num % 2 == 0 and l <= num <= r:
            count += 1
    return count
  • 这个函数首先初始化一个计数器count为。然后遍历数组a中的每个元素num,检查num是否是偶数并且在区间内。如果是,则将计数器count加。最后返回计数器count的值,即数组中完美偶数的个数。

  1. 测试代码

    • 原有的测试代码已经在if __name__ == '__main__':块中给出。当运行这段代码时,它会调用solution函数并检查函数的返回值是否与预期值相等。如果相等,则打印True,否则打印False

    • 使用修改后的solution函数,这些测试用例应该都能通过,即打印出True

总的来说,通过上述修改,solution函数能够正确地计算出给定数组中完美偶数的个数。 在 Python 中,if __name__ == '__main__':是一种常见的代码结构,它具有以下含义和作用:

1. __name__变量

  • 当一个 Python 脚本被执行时,__name__是一个内置变量。

    • 如果脚本是作为主程序运行(直接执行),那么__name__的值为'__main__'
    • 如果脚本是被导入(import)到其他脚本中作为模块使用,那么__name__的值为模块的名称(即脚本文件名去掉.py扩展名)。

2. if __name__ == '__main__':的作用

LangChain 中的输出解析器

语言模型输出的是文本,这是给人类阅读的。但很多时候,你可能想要获得的是程序能够处理的结构化信息。这就是输出解析器发挥作用的地方。

输出解析器是一种专用于处理和构建语言模型响应的类。一个基本的输出解析器类通常需要实现两个核心方法。

  • get_format_instructions:这个方法需要返回一个字符串,用于指导如何格式化语言模型的输出,告诉它应该如何组织并构建它的回答。
  • parse:这个方法接收一个字符串(也就是语言模型的输出)并将其解析为特定的数据结构或格式。这一步通常用于确保模型的输出符合我们的预期,并且能够以我们需要的形式进行后续处理。

还有一个可选的方法。

  • parse_with_prompt:这个方法接收一个字符串(也就是语言模型的输出)和一个提示(用于生成这个输出的提示),并将其解析为特定的数据结构。这样,你可以根据原始提示来修正或重新解析模型的输出,确保输出的信息更加准确和贴合要求。

下面是一个基于上述描述的简单伪代码示例:

plain
复制代码
AI练中学
class OutputParser:
    def __init__(self):
        pass

    def get_format_instructions(self):
        # 返回一个字符串,指导如何格式化模型的输出
        pass

    def parse(self, model_output):
        # 解析模型的输出,转换为某种数据结构或格式
        pass

    def parse_with_prompt(self, model_output, prompt):
        # 基于原始提示解析模型的输出,转换为某种数据结构或格式
        pass

在LangChain中,通过实现get_format_instructions、parse 和 parse_with_prompt 这些方法,针对不同的使用场景和目标,设计了各种输出解析器。让我们来逐一认识一下。

  1. 列表解析器(List Parser):这个解析器用于处理模型生成的输出,当需要模型的输出是一个列表的时候使用。例如,如果你询问模型“列出所有鲜花的库存”,模型的回答应该是一个列表。
  2. 日期时间解析器(Datetime Parser):这个解析器用于处理日期和时间相关的输出,确保模型的输出是正确的日期或时间格式。
  3. 枚举解析器(Enum Parser):这个解析器用于处理预定义的一组值,当模型的输出应该是这组预定义值之一时使用。例如,如果你定义了一个问题的答案只能是“是”或“否”,那么枚举解析器可以确保模型的回答是这两个选项之一。
  4. 结构化输出解析器(Structured Output Parser):这个解析器用于处理复杂的、结构化的输出。如果你的应用需要模型生成具有特定结构的复杂回答(例如一份报告、一篇文章等),那么可以使用结构化输出解析器来实现。
  5. Pydantic(JSON)解析器:这个解析器用于处理模型的输出,当模型的输出应该是一个符合特定格式的JSON对象时使用。它使用Pydantic库,这是一个数据验证库,可以用于构建复杂的数据模型,并确保模型的输出符合预期的数据模型。
  6. 自动修复解析器(Auto-Fixing Parser):这个解析器可以自动修复某些常见的模型输出错误。例如,如果模型的输出应该是一段文本,但是模型返回了一段包含语法或拼写错误的文本,自动修复解析器可以自动纠正这些错误。
  7. 重试解析器(RetryWithErrorOutputParser):这个解析器用于在模型的初次输出不符合预期时,尝试修复或重新生成新的输出。例如,如果模型的输出应该是一个日期,但是模型返回了一个字符串,那么重试解析器可以重新提示模型生成正确的日期格式。

上面的各种解析器中,前三种很容易理解,而结构化输出解析器你已经用过了。所以接下来我们重点讲一讲Pydantic(JSON)解析器、自动修复解析器和重试解析器。

  • 作为程序入口点

    • 当你希望某些代码只在脚本直接运行时执行,而在被其他脚本导入时不执行,就可以把这些代码放在if __name__ == '__main__':语句块内。

    • 例如,在测试函数时,你可能会在脚本中直接调用函数来进行测试。如果没有if __name__ == '__main__':保护,当其他脚本导入这个脚本时,这些测试代码也会被执行,这可能会导致意外的结果。

以下是一个简单的示例来说明:

假设有一个名为test.py的脚本: