Python学习笔记——类型注解基础知识

Python是动态类型语言,使用变量时不需要做任何类型声明,这是Python相比其它语言的一个重要优势:它减少了我们的心智负担,让写代码变得更容易。尤其对于我们很多新手来说,“不用声明类型”无疑会让学Python这件事变得简单很多。

但任何事务都有其两面性。动态类型所带来的缺点是代码的可读性会因此大打折扣。

读读下面这段代码:

def remove_invalid(items):"""剔除items里面的无效的元素"""...

对于使用者来说,函数接收的items参数是什么类型?是一个装满数字的列表,还是一个装满字符串的集合?还是一个用户字典?对于调用者,根本无从得知。甚至对于编写者,过很长时间后,也可能会搞不懂了。

为了解决动态类型的可读性问题,最常见的办法是在函数文档(docstring)里做文章,把每个函数参数的类型与说明全部都写到函数文档里。

下面是增加了Python官方推荐的Sphinx格式文档后的代码:

def remove_invalid(items):"""剔除items里面的无效的元素""":param items:待剔除对象:type items:包含整数的列表,[int,...]...

上面代码中,在函数文档里,用:type items 注明了items是一个整数列表。调用人员读到就清楚了参数的类型。

标注类型的方法不止于这一种,在Python3.5版本以后,可以使用类型注解功能直接注明变量类型。只需要在变量后添加类型,并用冒号隔开即可,比如func(value: str),表示函数func的参数value是字符串类型。

使用类型注解后的上面代码如下:

from typing import Listdef remove_invalid(items: List[int]):"""剔除items里面的无效的元素"""...

List表示参数为列表类型,[int]表示里面的成员是整形。

typing是类型注解用到的主要模块,除了List以外,该模块内还有许多与类型有关的特殊对象,举例如下:

  • Dict:字典类型,例如Dict[str,int]代表键为字符串,值为整形的字典。
  • Callable:可调用对象,例如Callable[[str,str],List[str]]表示接收两个字符串作为参数,返回字符串列表的可调用对象。
  • TextIO:使用文本协议的类文件类型,相应地,还有二进制类型BinaryIO.
  • Any:代表任何类型
  • 说明:“类型注解”只是一种有关类型的注释,不提供任何校验功能。要校验类型正确性,需要使用其他类型检查工具(如mypy等)。

不仅可以给变量加上类型注解,还可以给函数的返回值加上类型注解,如下代码做了演示:

1)下面代码没有任何类型注解:

class Duck:"""鸭子类:param color: 鸭子颜色"""def __init__(self,color):self.color = colordef quack(self):print(f"嗨,这是一只{self.color}的鸭子"}def create_random_ducks(number):"""创建一批随机颜色的鸭子:param number: 需要创建的鸭子数量"""ducks = []while number > 0:color = random.choice(['yellow','white','gray'])ducks.append(Duck(color=color))number -= 1return ducks

2)下面是添加了类型注解代码:

from typing import List  
import random  class Duck:  def __init__(self, color: str):   # 参数color类型为字符串  self.color = color  def quack(self) -> None:         # 函数返回值类型为None  print(f"嗨,这是一只{self.color}的鸭子")  def create_random_ducks(number: int) ->List[Duck]: # 参数number类型为整形  ducks: List[Duck] = []          # 变量ducks是一个列表,列表元素是Duck类型  while number > 0:  color = random.choice(['yellow', 'white', 'gray'])  # 这里对color变量进行类型注解  ducks.append(Duck(color=color))  number -= 1  return ducksducks = create_random_ducks(5)for duck in ducks:duck.quack()
  • 从上面代码可以看出,通过-> 给函数返回值添加类型注解
  • 可以用typing模块的特殊对象List来标注列表成员的具体类型,注意,这里用的是[],不是()
  • 声明变量时候,可以为其加上类型注解,但类型注解是可选的,非常自由,比如上面代码中如下这行的color变量就没有注解。

color = random.choice(['yellow','white','gray'])

如果加上注解是这样子的:

color: str = random.choice(['yellow','white','gray'])

可以把Python里的类型注解当成一种用于提升代码可读性的特殊注释,因为它就像注释一样,只提升代码的说明性,不会对程序的执行过程产生任何实际影响,Python并不会做校验。

至于函数文档好,还是类型注解好,仁者见仁智者见智。我学习这块内容的理解是,函数文档还是要有的,给调用者(包括自己)更好地阅读,尤其使用Pycharm这类工具调用,会有很好的提示,这一点特别好。在编写函数时,对参数及返回值做注解也很有意义,不仅提升代码的可读性,可以让自己写函数体内的具体逻辑代码更清晰,或者做必要的验证,增强代码的健壮性。

本文主要摘自朱雷老师《Python工匠》书中内容,修改了代码部分内容。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/656230.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【MySQL】创建用户时报错

目录 前言解决方法 前言 在使用mysql服务时,用root创建用户,出现如下错误 The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement 解决方法 在mysql服务中输入指令 flush privileges;重启mysqld服务器…

Qt开源版 vs 商业版 详细比较!!!!

简单整理Qt开源版与商业版有哪些差别,仅供参考。 简单对比 开源版商业版许可证大部分采用对商业使用不友好的LGPLv3具备商业许可证保护代码专有许可证相关大部分模块使用LGPLv3和部分模块使用GPL组成仅第三方开源组件使用Qt的其他许可证Qt模块功能支持支持技术支持…

海外云手机为什么吸引用户?

近年来,随着全球化的飞速发展,海外云手机逐渐成为各行各业关注的焦点。那么,究竟是什么让海外云手机如此吸引用户呢?本文将深入探讨海外云手机的三大吸引力,揭示海外云手机的优势所在。 1. 高效的社交媒体运营 海外云…

c#窗体捕捉方向键

方法1 实现方法参考代码: private void Form1_Load(object sender, EventArgs e){this.KeyPreview true;}protected override bool ProcessDialogKey(Keys keyData){if (keyData Keys.Left || keyData Keys.Right || keyData Keys.Up || keyData Keys.Down){s…

Kubernetes-资源限制

一、Pod资源限制 Kubernetes 对资源的限制实际上是通过 CGROUP 来控制的,CGROUP 是容器的一组用来控制内核如果运行进程的相关属性集合。针对内存、CPU、和各种设备都有对应的 CGROUP。 默认情况下,Pod 运行没有 CPU 和内存的限额。这意味着系统中任何 P…

工程经验分享 Incremental FastPitch

分享 NVIDIA 基于 GPU 的 TTS 解决方案介绍。 1. 基于 FastPitchHifi-GAN 的 Streaming TTS 效果优化 NVIDIA 在 TTS 领域也做了一些供大家参考的工作,例如提供了高效的流式 TTS 部署方案,利用 TensorRT 加速模型推理速度,并通过 Triton Inf…

Servlet基础之API

文章目录 Servlet API1. 概述2. 相关对象概述3. Servlet 接口4. GenericServlet 抽象类5. HTTPServlet 类6. ServletRequest 和 HTTPServletRequest7. HttpServletRequest8. ServletResponse 和 HTTPServletResponse9. ServletConfig 和 ServletContext10. 部署描述符 Servlet …

【软考- 系统集成项目管理工程师2】

第一章-信息化知识-信息与信息化 今日座右铭:最好的偷懒方式,就是一次做好。 文章目录 第一章-信息化知识-信息与信息化前言一、信息1、信息的基本概念2、信息的传输模型3、信息的质量属性 二、信息系统1、系统的基本概念2、信息系统的生命周期 三、信息…

js-cookie的使用方法

js-cookie是一个简单的,轻量级的处理cookies的API。 js-cookie网站 一、安装 npm install js-cookie 二、引入js-cookie 在需要使用的页面直接引用即可。 import Cookies from "js-cookie"; 三、使用示例 以利用js-cookie实现token持久化为例&#…

Android-System 常用adb 命令

1、adb导出logcat:adb logcat > D:/log.txt 2、adb导出anr文件:adb pull /data/anr/trances.txt 3、adb连接安卓设备:adb connect 192.168.129.11:5555 4、选择安卓设备:adb -s 192.168.11.55 5、查看日志状态:getprop | grep …

IP类接口大全,含免费次数

IP查询 IP归属地-IPv4高精版:根据IP地址查询归属地信息,支持到中国地区(不含港台地区)街道级别,包含国家、省、市、区县、详细地址和运营商等信息。IP归属地-IPv4区县级:根据IP地址查询归属地信息&#xf…

IDEA 安装阿里Java编码规范插件

1.File>Settings 2.安装之后重启 开发过程中如果有不符合规范的地方,会自动出现提示

Ubuntu如何安装使用Nginx反向代理?

在Ubuntu上安装Nginx并配置使其生效是相对简单的过程。以下是一步一步的指南: 步骤 1:安装 Nginx 打开终端,并执行以下命令来安装 Nginx: sudo apt update sudo apt install nginx步骤 2:启动 Nginx 服务 安装完成…

【C语言/数据结构】排序(归并排序|计数排序|排序算法复杂度)

🌈个人主页:秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343🔥 系列专栏:《数据结构》https://blog.csdn.net/qinjh_/category_12536791.html?spm1001.2014.3001.5482 ​​​​ 目录 归并排序 代码实现&#xf…

pin to pin替代TI DRV8872的GLOBALCHIP直流电机驱动芯片GC8872,低成本、宽电压,内置电荷泵,短地短电源保护,限流

在现如今电机驱动芯片处于持续涨价的状态下,并且供货期货期长,偶尔缺货的状态下。为了降低设计成本,第一时间设计出优秀的产品占据市场高位。我这边推荐使用浙江GLOBALCHIP国产电机驱动芯片进行替换设计。供货稳定、价格低廉。GC8872是GLOBAL…

Android Glide从网络加载图片 点击可放大查看效果

前言 通过url来获取bitmap 然后通过glide工具来加载bitmap 来实现图片点击放大 废话不多说,直接上代码 代码 String netPhoto "xxx";//从网络加载缓存try {Glide.with(TakePhotoSurveyActivity.this).asBitmap().load(photoDesign).into(new CustomTa…

Flink实战三_TableAPISQL

接上文:Flink实战二_DataStream API 1、Table API和SQL是什么? 接下来理解下Flink的整个客户端API体系,Flink为流式/批量处理应用程序提供了不同级别的抽象: 这四层API是一个依次向上支撑的关系。 Flink API 最底层的抽象就是有…

CSS之webkit内核中的属性text-stroke

让我为大家介绍一下text-stroke 大家是否想过要弄一个描边过的文字&#xff0c;接下来&#xff0c;text-stroke就可以为你解决 text-stroke是一个复合属性&#xff0c;里面有两个参数&#xff1a;描边的尺寸 描边的颜色 <!DOCTYPE html> <html lang"en">…

书生浦语大模型 笔记作业汇总

第一节课笔记&#xff1a;https://blog.csdn.net/2301_80618119/article/details/135376409?csdn_share_tail%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22135376409%22%2C%22source%22%3A%222301_80618119%22%7D 第二节课笔记&#xff1a; …

[AI]文心一言爆火的同时,ChatGPT带来了这么多的开源项目你了解吗

前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家&#xff1a;https://www.captainbed.cn/z ChatGPT体验地址 文章目录 前言4.5key价格泄漏ChatGPT4.0使用地址ChatGPT正确打开方式最新功能语音助手存档…