没有合适的资源?快使用搜索试试~ 我知道了~
Python干货-27个问题告诉你 Python 为什么如此设计.pdf
0 下载量 44 浏览量
2024-09-18
17:23:11
上传
评论
收藏 1009KB PDF 举报
温馨提示
Python 内存管理的细节取决于实现。Python 的标准实现 CPython 使用引用计数来检测不可访问的对象,并使用另一种机制来收集引用循环,定期执行循环检测算法来查找不可访问的循环并删除所涉及的对象。gc 模块提供了执行垃圾回收、获取调试统计信息和优化收集器参数的函数。 但是,其他实现(如 Jython 或 PyPy ),)可以依赖不同的机制,如完全的垃圾回收器 。如果你的 Python 代码依赖于引用计数实现的行为,则这种差异可能会导致一些微妙的移植问题。 在一些 Python 实现中,以下代码(在 CPython 中工作的很好)可能会耗尽文件描述符
资源推荐
资源详情
资源评论
Python
干货-27个问题告诉你 Python 为什么
如此设计
2024-09-18
01.为什么使用缩进来分组语句?
Guido van Rossum 认为使用缩进进行分组非常优雅,并且大大提高了普通 Python 程序的清
晰度。大多数人在一段时间后就学会并喜欢上这个功能。
由于没有开始/结束括号,因此解析器感知的分组与人类读者之间不会存在分歧。偶尔 C 程序
员会遇到像这样的代码片段:
if (x <= y)
如果条件为真,则只执行 x++ 语句,但缩进会使你认为情况并非如此。即使是经验丰富的 C
程序员有时会长时间盯着它,想知道为什么即使 x > y , y 也在减少。
因为没有开始/结束括号,所以 Python 不太容易发生编码式冲突。在 C 中,括号可以放到许
多不同的位置。如果您习惯于阅读和编写使用一种风格的代码,那么在阅读(或被要求编写)
另一种风格时,您至少会感到有些不安。
许多编码风格将开始/结束括号单独放在一行上。这使得程序相当长,浪费了宝贵的屏幕空
间,使得更难以对程序进行全面的了解。理想情况下,函数应该适合一个屏幕(例如,
20--30 行)。20 行 Python 可以完成比 20 行 C 更多的工作。这不仅仅是由于缺少开始/结
束括号 -- 缺少声明和高级数据类型也是其中的原因 -- 但缩进基于语法肯定有帮助。
02.为什么简单的算术运算得到奇怪的结果?
请看下一个问题。
03.为什么浮点计算不准确?
用户经常对这样的结果感到惊讶:
并且认为这是 Python 中的一个 bug。其实不是这样。这与 Python 关系不大,而与底层平台
如何处理浮点数字关系更大。
x++;
y--;
z++;
>>> 1.2 - 1.0
0.19999999999999996
CPython 中的 float 类型使用 C 语言的 double 类型进行存储。float对象的值是以固定的精
度(通常为 53 位)存储的二进制浮点数,由于 Python 使用 C 操作,而后者依赖于处理器中
的硬件实现来执行浮点运算。这意味着就浮点运算而言,Python 的行为类似于许多流行的语
言,包括 C 和 Java。
许多可以轻松地用十进制表示的数字不能用二进制浮点表示。例如,在输入以下语句后:
为 x 存储的值是与十进制的值 1.2 (非常接近) 的近似值,但不完全等于它。在典型的机器上,
实际存储的值是:
它对应于十进制数值:
典型的 53 位精度为 Python 浮点数提供了 15-16 位小数的精度。
要获得更完整的解释,请参阅 Python 教程中的 浮点算术 一章。
04.为什么Python字符串是不可变的?
有几个优点。
一个是性能:知道字符串是不可变的,意味着我们可以在创建时为它分配空间,并且存储需求
是固定不变的。这也是元组和列表之间区别的原因之一。
另一个优点是,Python 中的字符串被视为与数字一样“基本”。任何动作都不会将值 8 更改
为其他值,在 Python 中,任何动作都不会将字符串 "8" 更改为其他值。
>>> x = 1.2
1.0011001100110011001100110011001100110011001100110011 (binary)
1.1999999999999999555910790149937383830547332763671875 (decimal)
05.为什么必须在方法定义和调用中显式使用“self”?
这个想法借鉴了 Modula-3 语言。出于多种原因它被证明是非常有用的。
首先,更明显的显示出,使用的是方法或实例属性而不是局部变量。阅读 self.x或 self.meth()
可以清楚地表明,即使您不知道类的定义,也会使用实例变量或方法。在 C++ 中,可以通过
缺少局部变量声明来判断(假设全局变量很少见或容易识别) —— 但是在 Python 中没有局
部变量声明,所以必须查找类定义才能确定。一些 C++ 和 Java 编码标准要求实例属性具有
m_ 前缀,因此这种显式性在这些语言中仍然有用。
其次,这意味着如果要显式引用或从特定类调用该方法,不需要特殊语法。在 C++ 中,如果
你想使用在派生类中重写基类中的方法,你必须使用 :: 运算符 -- 在 Python 中你可以编写
baseclass.methodname(self, <argumentlist>)。这对于 __init__() 方法非常有用,特别是在
派生类方法想要扩展同名的基类方法,而必须以某种方式调用基类方法时。
最后,它解决了变量赋值的语法问题:为了 Python 中的局部变量(根据定义!)在函数体中
赋值的那些变量(并且没有明确声明为全局)赋值,就必须以某种方式告诉解释器一个赋值是
为了分配一个实例变量而不是一个局部变量,它最好是通过语法实现的(出于效率原因)。
C++ 通过声明来做到这一点,但是 Python 没有声明,仅仅为了这个目的而引入它们会很可
惜。使用显式的 self.var 很好地解决了这个问题。类似地,对于使用实例变量,必须编写
self.var 意味着对方法内部的非限定名称的引用不必搜索实例的目录。换句话说,局部变量和
实例变量存在于两个不同的命名空间中,您需要告诉 Python 使用哪个命名空间。
06.为什么不能在表达式中赋值?
许多习惯于 C 或 Perl 的人抱怨,他们想要使用 C 的这个特性:
但在 Python 中被强制写成这样:
while (line = readline(f)) {
// do something with line
}
剩余18页未读,继续阅读
资源评论
soso1968
- 粉丝: 2112
- 资源: 1万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功