对于Python语言的14个疑问

  介绍

这期内容当中小编将会给大家带来有关对于Python语言的14个疑问,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

<强> 01。为什么使用缩进来分组语句?

Guido van Rossum认为使用缩进进行分组非常优雅,并且大大提高了普通Python程序的清晰度。大多数人在一段时间后就学会并喜欢上这个功能。

由于没有开始/结束括号,因此解析器感知的分组与人类读者之间不会存在分歧。偶尔C程序员会遇到像这样的代码片段:

if  (x  & lt;=, y)   x + +;   y -;   z + +;

如果条件为真,则只执行x + +语句,但缩进会使你认为情况并非如此。即使是经验丰富的C程序员有时会长时间盯着它,想知道为什么即使x比;y, y也在减少。

因为没有开始/结束括号,所以Python不太容易发生编码式冲突。在C中,括号可以放到许多不同的位置。如果您习惯于阅读和编写使用一种风格的代码,那么在阅读(或被要求编写)另一种风格时,您至少会感到有些不安。

许多编码风格将开始/结束括号单独放在一行上。这使得程序相当长,浪费了宝贵的屏幕空间,使得更难以对程序进行全面的了解。理想情况下,函数应该适合一个屏幕(例如,20——30行).20行Python可以完成比20行C更多的工作。这不仅仅是由于缺少开始/结束括号——缺少声明和高级数据类型也是其中的原因,但缩进基于语法肯定有帮助。

<强> 02。为什么简单的算术运算得到奇怪的结果?

请看下一个问题。

<强> 03。为什么浮点计算不准确?

用户经常对这样的结果感到惊讶:

在祝辞祝辞,1.2,安康;1.0   0.19999999999999996

并且认为这是Python中的一个错误。其实不是这样。这与Python关系不大,而与底层平台如何处理浮点数字关系更大。

CPython中浮动的类型使用C语言的两类型进行存储.float对象的值是以固定的精度(通常为53位)存储的二进制浮点数,由于Python使用C操作,而后者依赖于处理器中的硬件实现来执行浮点运算。这意味着就浮点运算而言,Python的行为类似于许多流行的语言,包括C和Java。

许多可以轻松地用十进制表示的数字不能用二进制浮点表示,例如,在输入以下语句后:

在祝辞祝辞,x =,

1.2为x存储的值是与十进制的值1.2(非常接近)的近似值,但不完全等于它。在典型的机器上,实际存储的值是:

1.0011001100110011001100110011001100110011001100110011,(二进制)

它对应于十进制数值:

1.1999999999999999555910790149937383830547332763671875,(十进制)

典型的53位精度为Python浮点数提供了16位小数的精度。

要获得更完整的解释,请参阅Python教程中的浮点算术一章。

<强> 04。为什么Python字符串是不可变的?

有几个优点。

一个是性能:知道字符串是不可变的,意味着我们可以在创建时为它分配空间,并且存储需求是固定不变的。这也是元组和列表之间区别的原因之一。

另一个优点是,Python中的字符串被视为与数字一样”基本”。任何动作都不会将值8更改为其他值,在Python中,任何动作都不会将字符串“8”;更改为其他值。

<强> 05。为什么必须在方法定义和调用中显式使用“自我”?

这个想法借鉴了Modula-3语言。出于多种原因它被证明是非常有用的。

首先,更明显的显示出,使用的是方法或实例属性而不是局部变量。阅读自我。x或self.meth()可以清楚地表明,即使您不知道类的定义,也会使用实例变量或方法。在c++中,可以通过缺少局部变量声明来判断(假设全局变量很少见或容易识别)——但是在Python中没有局部变量声明,所以必须查找类定义才能确定。一些c++和Java编码标准要求实例属性具有m_前缀,因此这种显式性在这些语言中仍然有用。

其次,这意味着如果要显式引用或从特定类调用该方法,不需要特殊语法。在c++中,如果你想使用在派生类中重写基类中的方法,你必须使用::运算符,在Python中你可以编写baseclass。methodname(自我,& lt; argumentlist>)。这对于__init__()方法非常有用,特别是在派生类方法想要扩展同名的基类方法,而必须以某种方式调用基类方法时。

最后,它解决了变量赋值的语法问题:为了Python中的局部变量(根据定义!)在函数体中赋值的那些变量(并且没有明确声明为全局)赋值,就必须以某种方式告诉解释器一个赋值是为了分配一个实例变量而不是一个局部变量,它最好是通过语法实现的(出于效率原因). c + +通过声明来做到这一点,但Python是没有声明,仅仅为了这个目的而引入它们会很可惜。使用显式的自我。var很好地解决了这个问题。类似地,对于使用实例变量,必须编写自我。var意味着对方法内部的非限定名称的引用不必搜索实例的目录。换句话说,局部变量和实例变量存在于两个不同的命名空间中,您需要告诉Python使用哪个命名空间。

对于Python语言的14个疑问