文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Python中的变量类型标注怎么用

2023-07-06 00:36

关注

这篇文章主要讲解了“Python中的变量类型标注怎么用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python中的变量类型标注怎么用”吧!

一、概述

1、描述

变量类型注解是用来对变量和函数的参数返回值类型做注解,让调用方减少类型方面的错误,也可以提高代码的可读性和易用性。

但是,变量类型注解语法传入的类型表述能力有限,不能说明复杂的类型组成情况,因此引用了typing模块,来实现复杂的类型表达。

2、常用的数据类型

TypeDescription
int整型 integer
float浮点数字
bool布尔(int 的子类)
str字符 (unicode)
bytes8 位字符
object任意对象(公共基类)
List[str]字符组成的列表
Tuple[int, int]两个int对象的元组
Tuple[int, ...]任意数量的 int 对象的元组
Dict[str, int]键是 str 值是 int 的字典
Iterable[int]包含 int 的可迭代对象
Sequence[bool]布尔值序列(只读)
Mapping[str, int]从 str 键到 int 值的映射(只读)
Any具有任意类型的动态类型值
Union联合类型
Optional参数可以为空或已经声明的类型
Mapping映射,是 collections.abc.Mapping 的泛型
MutableMappingMapping 对象的子类,可变
Generator生成器类型, Generator[YieldType、SendType、ReturnType]
NoReturn函数没有返回结果
Set集合 set 的泛型, 推荐用于注解返回类型
AbstractSetcollections.abc.Set 的泛型,推荐用于注解参数
Sequencecollections.abc.Sequence 的泛型,list、tuple 等的泛化类型
TypeVar自定义兼容特定类型的变量
Generic自定义泛型类型
NewType声明一些具有特殊含义的类型
Callable可调用类型, Callable[[参数类型], 返回类型]
NoReturn没法返回值

3、mypy模块

mypy是Python的可选静态类型检查器

安装mypy模块 pip3 install mypy

使用mypy进行静态类型检查 mypy 执行 python 文件

二、使用

1、基本使用

from typing import List, Set, Dict, Tuple#对于简单的 Python 内置类型,只需使用类型的名称x1: int = 1x2: float = 1.0x3: bool = Truex4: str = "test"x5: bytes = b"test" # 对于 collections ,类型名称用大写字母表示,并且# collections 内类型的名称在方括号中x6: List[int] = [1]x7: Set[int] = {6, 7}#对于映射,需要键和值的类型x8: Dict[str, float] = {'field': 2.0}#对于固定大小的元祖,指定所有元素的类型x9: Tuple[int, str, float] = (3, "yes", 7.5)#对于可变大小的元祖,使用一种类型和省略号x10: Tuple[int, ...] = (1, 2, 3) '''在终端执行检查(venv) D:\python>mypy .\01.pySuccess: no issues found in 1 source file'''

2、函数参数返回值添加类型标注

1. 指定多个参数的方式

'''定义一个函数   参数 num int类型返回值 字符串类型使用mypy检测'''def num_fun(num: int) -> str:    return str(num) num_fun(100)print(num_fun(100)) # 指定多个参数的方式def plus(num1: int, num2: int) -> int:    return num1 + num2 # 在类型注释后为参数添加默认值,默认值需要添加在末尾'''声明函数参数时,所有带有默认值的参数必须放在非默认参数的后面。这是因为 Python 解释器需要确定参数传递的顺序,如果默认参数放在非默认参数前面,解释器就无法确定哪个参数是哪个'''def func1(num1: int, my_float: float = 3.5)-> float:    return num1 + my_floatprint(func1(10,20))f = func1print(f(10))

Callable

Callable 是一个抽象类,用于描述可调用对象的基本行为,例如函数、方法和类。当你声明一个函数变量并将其分配给一个变量时,这个变量只是一个普通的 Python 对象,并不是一个可调用对象,因此它没有默认值

带有默认值的参数可以放在任何位置,但是在声明函数参数时,所有带有默认值的参数必须放在非默认参数的后面。这是因为 Python 解释器需要确定参数传递的顺序,如果默认参数放在非默认参数前面,解释器就无法确定哪个参数是哪个。

from typing import  Callable#定义变量  指向一个函数def func2(num1:int, my_float=3.5) -> str:    return f'返回结果{num1 + my_float}'print(func2(10))#Callable指向可调用(函数)值的方式x: Callable[[int, float], str] = func2print(x(10, 3.5)) '''执行结果返回结果13.5返回结果13.5'''

3. Iterator

#定义函数,产生整数的生成器,每次返回一个from typing import Iterator# 产生整数的生成器函数安全地返回只是一个 整数迭代器的函数#,因此这就是我们对其进行注释的方式def g(n: int) -> Iterator[int]:    i = 0    while i < n:        yield i #下次迭代时,代码从 yield 的下一条语句(不是下一行)开始执行        i += 1 print(g(10))for i in g(10):    print(i) '''执行结果<generator object g at 0x00000000014E88E0>0123456789'''

3、混合类型检查改进

1.联合运算符

联合运算符使用 " | "  线来替代了旧版本中Union[] 方法,使得程序更简洁

#新版本def get_name(user: str | dict) -> str:    if isinstance(user, str):        return user    elif isinstance(user, dict):        return user.get('name', '')print(get_name({'name':'Bob'}))print(get_name("Alice"))

在这个例子中,函数get_name接受一个参数user,它可以是一个字符串或一个字典。如果user是一个字符串,函数会直接返回这个字符串;如果user是一个字典,函数会尝试从字典中获取name字段的值,并返回它。

在这个例子中,我们使用联合运算符将str和dict类型组合起来,表示user可以是这两种类型之一。

#旧版本,Union方法来实现相同的功能from typing import Uniondef get_name2(user: Union[str, dict]) -> str:    if isinstance(user, str):        return user    elif isinstance(user, dict):        return user.get('name', '') print(get_name2({'name':'Bob'}))print(get_name2("Alice"))'''执行结果BobAlice'''

4、类型别名更改

#旧版本oldname = strdef oldFunc(param:oldname) -> oldname:    return param + paramoldFunc('oldFunc:花非人陌')  #新版本,从3.10后开始支持from typing import TypeAlias newstr :TypeAlias = str    #定义类型别名newint :TypeAlias = intdef func_test(num:newint, msg:newstr)->newstr:    return str(num) + msgprint(func_test(100,"类型名称更改"))

感谢各位的阅读,以上就是“Python中的变量类型标注怎么用”的内容了,经过本文的学习后,相信大家对Python中的变量类型标注怎么用这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯