跳转到内容

Python 编程/基本语法

来自维基教科书,开放世界中的开放书籍


Python 中有五个基本概念。

Python 通常不使用分号,但允许它们在同一行上分隔语句,如果你的代码中有分号;你的代码就不是“Pythonic”的。

区分大小写

[编辑 | 编辑源代码]

所有变量都区分大小写。Python 将“number”和“Number”视为独立的、不相关的实体。

空格和制表符不混用

[编辑 | 编辑源代码]

代替块定界符(在 C 语言系列中为大括号 → "{}"),缩进用于指示块的开始和结束位置。因为空白很重要,请记住空格和制表符不混用,所以在缩进程序时只使用其中一个。一个常见的错误是混合使用它们。虽然它们在编辑器中看起来可能一样,但解释器会以不同的方式读取它们,这会导致错误或意外行为。大多数优秀的文本编辑器可以配置为让 Tab 键发出空格代替。

Python 的风格指南描述了首选方法是使用 4 个空格。

提示:如果你从命令行调用了 python,你可以给 python 传递 -t 或 -tt 参数来让 python 在不一致的制表符使用情况下发出警告或错误。

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
华夏公益教科书