热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Python是不是弱类型?如果是的话是不是仅仅因此就不需要泛型了?

回复内容:请先理解以下基本概念:python是强类型;泛型是啥。


回复内容:


请先理解以下基本概念:
  1. python是强类型;
  2. 泛型是啥。

  • Python 是强类型的
  • Python 不需要泛型是因为 Python 的变量签名是动态的,有 lazy binding 效果。比如一个函数传入 connection 参数,然后函数中调用 connection.close() 。直到你调用这个函数的时候(运行期),虚拟机才会去查找 close 方法,而不是像静态类型语言一样在编译期或装载期就事先建立符号表。

一句话:泛型是一种类型声明的表达方法。Python不声明类型,所以你想找泛型也没处找去。跟强/弱类型和静态/动态都没有直接联系。

一般的解释语言为了编程的灵活性,都没有类型声明。这是被变量都要声明类型的语言坑惨的程序汪的报复。比如说Java,一屏幕代码,四分之一都是没啥信息量的局部变量类型声明,光看都要瞎了有没有。

但是类型声明还是有好处的啊,写Python的程序员肯定遇到过处理exception(比如连不上服务器)的代码里类型错误,结果程序写的时候好好的,跑的时间一长就类型错误,简直吐血三升有木有。有类型声明的话,写的时候就能发现错误了。

所以呢,解释语言的程序汪们就又往语言里加可选的类型声明了。比如Python有mypy,既有泛型又有duck-typing,简直左牵黄右擎苍啊。以后再也不要说我们解释语言不做类型检查了,是我们不爱做而已。
mypy - Optional Static Typing for Python
“不需要泛型”和强/弱类型无关,另外一般认为Python是强类型

泛型属于多态的概念。广义的多态包括:Ad-hoc多态(函数重载),参数化多态(泛型),子类型多态。

泛型是指:函数的类型签名中可以包含类型变量,使用时类型变量会被静态地替换成具体类型,而针对不同具体类型的函数体是一模一样的。

如C++的template,T是类型变量

T max(T x, T y)
{
return x < y ? y : x;
}

先来看看为啥Java需要Generics?
官网有解答:docs.oracle.com/javase/
总的来说,Generics根据这个解释,主要作用就是在编译期做类型检查+避免不必要的类型转换。
Python(2.x)的确切的类型信息本身要等到运行时才会暴露出来,自然编译期做类型检查也就没有意义了。
Duck Typing, C++ 式的编译期泛型和 Java Collection Framework 1.4 之前的基于接口的做法,目的相似,手段不同而已。
en.wikipedia.org/wiki/D
因为Python是动态类型,所以天然就是支持泛型支持泛型的。但是动态类型语言,都自然支持泛型
python/ruby 都是强类型的……php是弱的
看了一些回答后,再次感叹python的确又是一个类似C++那般被国外再到国内被误解相当深的编程语言工具。
1. 为变量指定数据类型称为“强类型”,但此形式并不代表该编程语言类型系统一定更强大。Python有一个统一的、明确的、强大的类型系统,比Java的类型系统更强。
2. 见你这样问,显然对“泛型”的理解只是形式上的,建议你还是认真看看其定义和目的、意义:zh.wikipedia.org/zh-cn/


推荐阅读
  • 如何高效学习鸿蒙操作系统:开发者指南
    本文探讨了开发者如何更有效地学习鸿蒙操作系统,提供了来自行业专家的建议,包括系统化学习方法、职业规划建议以及具体的开发技巧。 ... [详细]
  • 本文探讨了如何使用Scrapy框架构建高效的数据采集系统,以及如何通过异步处理技术提升数据存储的效率。同时,文章还介绍了针对不同网站采用的不同采集策略。 ... [详细]
  • 本文介绍了使用Python和C语言编写程序来计算一个给定数值的平方根的方法。通过迭代算法,我们能够精确地得到所需的结果。 ... [详细]
  • C/C++ 应用程序的安装与卸载解决方案
    本文介绍了如何使用Inno Setup来创建C/C++应用程序的安装程序,包括自动检测并安装所需的运行库,确保应用能够顺利安装和卸载。 ... [详细]
  • Canopy环境安装与使用指南
    《利用Python进行数据分析》一书推荐使用EPDFree版本的环境,然而随着技术的发展,目前更多人倾向于使用Canopy。本文将详细介绍Canopy的安装及使用方法。 ... [详细]
  • 本报告记录了嵌入式软件设计课程中的第二次实验,主要探讨了使用KEIL V5开发环境和ST固件库进行GPIO控制及按键响应编程的方法。通过实际操作,加深了对嵌入式系统硬件接口编程的理解。 ... [详细]
  • 本文分享了作者在使用LaTeX过程中的几点心得,涵盖了从文档编辑、代码高亮、图形绘制到3D模型展示等多个方面的内容。适合希望深入了解LaTeX高级功能的用户。 ... [详细]
  • 本文探讨了使用Python实现监控信息收集的方法,涵盖从基础的日志记录到复杂的系统运维解决方案,旨在帮助开发者和运维人员提升工作效率。 ... [详细]
  • iOS如何实现手势
    这篇文章主要为大家展示了“iOS如何实现手势”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“iOS ... [详细]
  • Hadoop MapReduce 实战案例:手机流量使用统计分析
    本文通过一个具体的Hadoop MapReduce案例,详细介绍了如何利用MapReduce框架来统计和分析手机用户的流量使用情况,包括上行和下行流量的计算以及总流量的汇总。 ... [详细]
  • Adversarial Personalized Ranking for Recommendation
    目录概主要内容基础对抗扰动对抗训练细节代码HeX.,HeZ.,DuX.andChuaT.Adversarialpersonalizedrankingforrecommendatio ... [详细]
  • 本文详细探讨了如何根据不同的应用场景选择合适的PHP版本,包括多版本切换技巧、稳定性分析及针对WordPress等特定平台的版本建议。 ... [详细]
  • Python网络编程:深入探讨TCP粘包问题及解决方案
    本文详细探讨了TCP协议下的粘包现象及其产生的原因,并提供了通过自定义报头解决粘包问题的具体实现方案。同时,对比了TCP与UDP协议在数据传输上的不同特性。 ... [详细]
  • Gradle 是 Android Studio 中默认的构建工具,了解其基本配置对于开发效率的提升至关重要。本文将详细介绍如何在 Gradle 中定义和使用共享变量,以确保项目的一致性和可维护性。 ... [详细]
  • Go语言实现文件读取与终端输出
    本文介绍如何使用Go语言编写程序,通过命令行参数指定文件路径,读取文件内容并将其输出到控制台。代码示例中包含了错误处理和资源管理的最佳实践。 ... [详细]
author-avatar
双木子婷_893
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有