结合Leetcode代码示例,Python中导入typing.List的作用是什么?
两段代码说明
第一段是无类型提示的标准实现,逻辑为遍历有序数组,原地删除重复元素:
class Solution(): def removeDuplicates(self, nums): i = 0 while i < len(nums)-1: if nums[i] == nums[i+1]: del nums[i] else: i += 1 return (len(nums), nums) numbers = [1, 1, 1, 3, 4, 5, 5, 5, 5, 7, 7, 7, 9, 9] some_object = Solution() ask_me = some_object.removeDuplicates(numbers) print (ask_me)
这段代码完全符合题目要求,运行后会输出去重后的数组长度和数组本身。要注意的是Leetcode原题只要求返回去重后的数组长度,这里返回元组是为了方便本地调试查看结果。
第二段是添加了类型提示的版本,唯一区别是给removeDuplicates方法的参数和返回值加了类型标注:
from typing import List class Solution(object): def removeDuplicates(self, nums: List[int]) -> int: i = 0 while i < len(nums)-1: if nums[i] == nums[i+1]: del nums[i] else: i += 1 return (len(nums), nums) numbers = [1, 1, 1, 3, 4, 5, 5, 5, 5, 7, 7, 7, 9, 9] some_object = Solution() ask_me = some_object.removeDuplicates(numbers) print (ask_me)
注意这段代码的类型标注存在小问题:标注的返回值类型是int,但实际返回的是包含长度和数组的元组,不过因为类型提示不参与运行逻辑,所以代码依然可以正常执行。
typing模块List的作用
Python是动态类型语言,运行时不会强制校验变量类型,哪怕你给nums传一个字符串、字典,只要运行时逻辑能走通就不会报错,这种特性虽然灵活,但在大型项目、多人协作场景下很容易出现隐藏的类型错误。typing模块提供的类型标注就是为了解决这个问题,其中List的作用如下:
- 用来标注列表类型的参数/返回值,且明确指定列表内的元素类型,比如
List[int]就表示该参数必须是元素全为整数的列表,List[str]就表示元素全为字符串的列表 - 类型标注仅用于静态检查,不会对运行效率产生任何影响,也不会限制运行时的参数类型,所以你加了
List[int]标注之后,代码依然可以正常运行 - 静态检查工具(比如PyCharm等IDE自带的检查工具、mypy)可以根据类型标注提前发现类型错误:比如你给标注了
List[int]的nums参数传了一个字符串列表,IDE会直接标红提醒,不用等到代码运行到对应位置才发现问题 - 可以提升代码可读性:其他开发者不用通读函数内部逻辑,只要看参数的类型标注就知道需要传什么类型的参数;同时IDE可以基于类型标注给出更准确的代码补全提示,提升开发效率
内容的提问来源于stack exchange,提问作者Olgierd Wiśniewski
相关产品推荐
相关产品推荐

