Python编程
Python 有五个基本概念。
分号
Python 通常不使用分号,但它允许在同一行上用分号分隔语句。如果你的代码中有分号,那么它就不是“Pythonic”代码了。
区分大小写
所有变量都是区分大小写的。Python 将 'number' 和 'Number' 视为不同的、不相关的实体。
空格和制表符不能混用
Python 使用缩进来表示块的开始和结束,而不是像 C 语言系列中使用的块定界符(大括号 "{}")。由于空白字符有重要意义,请记住,空格和制表符不能混用,因此缩进时只使用其中之一。一个常见的错误是将它们混合使用。尽管它们在编辑器中看起来相同,但解释器会以不同的方式读取它们,这会导致错误或意外的行为。大多数优秀的文本编辑器可以配置为让 Tab 键输入空格。
Python 的风格指南建议使用 4 个空格作为缩进。
提示:如果你从命令行启动 Python,可以给 Python 添加 -t
或 -tt
参数,以便让 Python 在使用不一致的 Tab 时发出警告或错误。
pythonprogrammer@wikibook:~$ python -tt myscript.py
如果混用了空格和制表符,这将发出错误。
对象
在 Python 中,像所有面向对象的语言一样,代码和数据的聚合被称为对象,它们通常表示系统概念模型中的组成部分。
Python 中的对象是从被称为类的模板中创建(即实例化)的(类将在稍后讨论,因为即使不理解类,仍然可以使用大部分语言功能)。它们具有属性,这些属性表示构成对象的各种代码和数据。要访问属性,可以写出对象的名字,后跟一个点(从此以后称为“点号”),然后是属性的名称。
例如,字符串的 upper
属性指的是返回该字符串的副本,其中所有字母都变为大写的代码。要访问这个属性,需要有一种方法来引用对象(在以下示例中,引用对象的方法是通过文字字符串来构造对象的)。
'bob'.upper
代码中的属性被称为方法。因此,在这个例子中,upper
是 'bob' 的一个方法(它也是所有字符串的一个方法)。要执行方法中的代码,使用一对匹配的括号,并在括号内列出方法接受的所有参数(upper
方法不接受任何参数)。因此,要获得字符串 'bob' 的大写版本,可以使用以下代码:
'bob'.upper()
范围
在一个大型系统中,确保一段代码不会以难以预测的方式影响另一段代码非常重要。实现这一目标的最简单方法之一是防止一个程序员选择的名称阻止其他程序员使用相同的名称。为此,发明了“范围”的概念。范围是指在其中可以使用名称的代码区域,超出该区域外的代码无法轻易访问该名称。Python 中有两种方式来限定区域:函数和模块。它们提供其内容到外部的方式不同。函数通过执行返回数据,而模块则通过命名空间提供其内容。
命名空间
实际上,可以在没有命名空间概念的情况下教授 Python,因为它们与我们已经提到的属性非常相似,但是命名空间的概念超越了任何特定的编程语言,因此很重要。在开始时,有一个内建函数 dir()
,它可以帮助我们理解命名空间的概念。当你第一次启动 Python 解释器(即在交互模式下)时,可以使用此函数列出当前(或默认)命名空间中的对象。
Python 2.3.4 (#53, Oct 18 2004, 20:35:07) [MSC v.1200 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> dir()
['__builtins__', '__doc__', '__name__']
这个函数也可以用来显示模块命名空间中的名称。首先,我们可以使用 type()
函数来显示 __builtins__
是什么类型的对象:
>>> type(__builtins__)
<type 'module'>
由于它是一个模块,它有一个命名空间。我们可以再次使用 dir()
函数列出 __builtins__
命名空间中的名称(注意,完整的名称列表被缩写了):
>>> dir(__builtins__)
['ArithmeticError', ... 'copyright', 'credits', ... 'help', ... 'license', ... 'zip']
命名空间是一个简单的概念。命名空间是一个特定的地方,在这里存储了某个模块特有的名称。每个命名空间中的名称与其他命名空间中的名称是不同的。这种命名空间的层次结构叫做作用域。当给一个名称赋值时,该名称就被放入一个命名空间中。例如:
>>> dir()
['__builtins__', '__doc__', '__name__']
>>> name = "Bob"
>>> import math
>>> dir()
['__builtins__', '__doc__', '__name__', 'math', 'name']
注意,我能够通过简单的赋值语句将变量 "name" 添加到命名空间中。使用 import
语句将 "math" 名称添加到当前命名空间。要查看 math
是什么,我们可以简单地执行:
>>> math
<module 'math' (built-in)>
由于它是一个模块,它也有一个命名空间。要显示该命名空间中的名称,我们使用:
>>> dir(math)
['__doc__', '__name__', 'acos', 'asin', 'atan', 'atan2', 'ceil', 'cos', 'cosh', 'degrees', 'e',
'exp', 'fabs', 'floor', 'fmod', 'frexp', 'hypot', 'ldexp', 'log', 'log10', 'modf', 'pi', 'pow',
'radians', 'sin', 'sinh', 'sqrt', 'tan', 'tanh']
仔细观察,你会发现默认命名空间和 math
模块命名空间都有一个 __name__
对象。每一层中可以包含一个同名的对象,这就是作用域的含义。要访问命名空间中的对象,只需使用模块名,后跟一个点,再后跟对象的名称。这使我们能够区分当前命名空间中的 __name__
对象与 math
模块中同名的对象。例如:
>>> print (__name__)
__main__
>>> print (math.__name__)
math
>>> print (math.__doc__)
This module is always available. It provides access to the
mathematical functions defined by the C standard.
>>> print (math.pi)
3.1415926535897931