Python 编程/基本语法
在 Python 中有五个基本概念。
Python 通常不使用分号,但允许它们在同一行上分隔语句,如果你的代码中有分号;你的代码就不是“Pythonic”的。
所有变量都是大小写敏感的。Python 将 'number' 和 'Number' 视为不同的、不相关的实体。
与使用块分隔符(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