python 学习笔记

2.1.4 编码声明

    如果一个注释被放在Python脚本的第一行或者第二行,并且匹配正则表达式coding[=:]\s*([-\w.]+),  这个注释就会被视为一个编码的生命,第一组表达式被视作这个源代码文件的编码格式。推荐的格式为:

# -*- coding: <encoding-name> -*-
这种格式也会被GNU Emacs识别
# vim:fileencoding=<encoding-name>
上面这种格式会被Bram Moolenaar’s VIM识别。

如果没有编码生命,默认的编码格式是utf-8.一般的,如果文件的第一个字节是utf-8(b'\xef\xbb\xbf'),则文件的编码声明为utf-8(这也是支持的,尤其是微软的记事本)

如果一个文件有了编码声明,这个编码的名称必须被python识别,这个编码格式会被所有的语法分析使用,包含文字、注释、关键字。编码声明在文件内必须是一行。

2.1.5 显示的行连接

两行或者多行物理行可以用反斜杠连接成为一行逻辑行,像下面这种情况:如果一个物理行以反斜杠结束并且不是一个字符标签或者注释的一部分,他就会下面的一个物理行连接,并且在连接后删除换行符和反斜杠。例如:

if 1900 < year < 2100 and 1 <= month <= 12 \
   and 1 <= day <= 31 and 0 <= hour < 24 \
   and 0 <= minute < 60 and 0 <= second < 60:   # Looks like a valid date
        return 1
如果一个行以反斜杠结束的话,它后面不能给一个注释。反斜杠并不能连接注释。一个反斜杠不能让一个语法换行除了字符串。(语法并不像字符串一样允许跨域物理行)。在字符串以外,反斜杠是无效的。

2.1.6 隐式行连接

使用括号的表达式可以横跨多行而不必要使用反斜杠。例如:

month_names = ['Januari', 'Februari', 'Maart',      # These are the
               'April',   'Mei',      'Juni',       # Dutch names
               'Juli',    'Augustus', 'September',  # for the months
               'Oktober', 'November', 'December']   # of the year
隐式行连接可以在后面跟注释。而且行之间的缩进也是不重要的。空白行业是允许的。在隐式行连接里面没有新的一行标识。隐式行连接也可以发生在三个引号的地方,这种情况下,是不允许使用#号注释的。

2.1.7 空白行

一个物理行仅仅包含空格 制表符、分页或者仅仅是一个注释,是被忽略的。在语句的交互式输入过程中,处理空行会因实现读取处理并打印的实现不同而不同。在标准的交互式解析器中,一个彻底的空行会终止一个多行的语句。???

2.1.8 缩进

每个物理行之前的空格,会用来计算这个物理行的级别,这些级别就是用来计算在哪个语句块中。

制表符或被替换成8个空格。从第一个空格到第一个不是空格的字符之间的数目确定了这个行的缩进。缩进不能用空格分成多个物理行。从空白字符到第一个反斜杠确定了行的缩进。

如果一个缩进混合了制表符和空格使源代码失去了意义的话,会被认为是不合格的,并且一个TabError会产生。

跨平台兼容性提示:以为一般的文本编辑器都是在非Unix平台上,所以在一个源文件中混合使用空格和tab是不明智的。在不同的平台会有不同的最大缩进限制也是必须要知道的。

一个换页符可能会在一行开始的地方,它会被缩进忽略的。换页符在页面的其他地方可能会产生一个未知的影响。

缩进级别连续的行会生成连续的得体的语法。使用堆栈,如下所示。

在文件未被读取之前,一个单独的0会被放入堆栈。这个0永远也不会被出栈。入栈的数字会被严格的从底部到顶部进行控制。在每一个物理行的开始,这一行的缩进会和栈顶进行比较。如果是相等的,什么都不会发生。如果大于栈顶,会把他放入堆栈,并生成一个缩进。如果小于栈顶,它应该是一个在栈内的数字。所有在栈内大于它的数字都将会出栈,并且每一个出栈的数字都会生成一个缩进。在文件的末尾,会为仍然留在栈内的大于0的数字生成一个缩进。

下面是一个正确的缩进例子:


def perm(l):
        # Compute the list of all permutations of l
    if len(l) <= 1:
                  return [l]
    r = []
    for i in range(len(l)):
             s = l[:i] + l[i+1:]
             p = perm(s)
             for x in p:
              r.append(l[i:i+1] + x)
    return r
下面的例子展示了各种各样的错误:



 def perm(l):                       # error: first line indented
for i in range(len(l)):             # error: not indented
    s = l[:i] + l[i+1:]
        p = perm(l[:i] + l[i+1:])   # error: unexpected indent
        for x in p:
                r.append(l[i:i+1] + x)
            return r                # error: inconsistent dedent
(实际上,前三个错误是被解析器检测到的,只有最后一个错误是被语法分析程序发现的--return r的缩进和栈并不匹配)


2.1.9 语法之间的空格

除了一个物理行的开始和字符串之外,空格符,制表符和分页符可以交换使用来区分语法。两个语法之间的空格是必须的除非他们连接否则解析器会当成不同的语法。(e.g ab是一个标记,但是a b是两个标记)

2.2 其他语法

除了换行 缩进 非缩进,还有其他一些语法类别存在:标识符,关键字,常量,操作符和分隔符。空白字符(除了前面讨论的行结束符)并不是标记,但是用来划定语法的界限。从左往右读取,一个很长的字符串代表一个语法可能会带来歧义。

2.3 标识符和关键字

标识符用下面的语法定义来描述

python的标识符是基于Unicode standard annex UAX-31,加上细化和改变。详细信息参照pep3131。

在ascii的范围内,有效的标识符和python2.x版本里面的一致,从大写和小写的a到z,下划线_,除了以0-9开头的字符。

python3.0从ascii范围之外引入了传统的字符。这些字符,分类使用版本的Unicode字符数据库包含在unicodedata模块。

标识符是没有长度限制的.

2.3.1 关键字

下面的标识符被用来当作关键字。并且不能被当做标识符,他们必须被拼写的和下面的一样:

False      class      finally    is         return
None       continue   for        lambda     try
True       def        from       nonlocal   while
and        del        global     not        with
as         elif       if         or         yield
assert     else       import     pass
break      except     in         raise

你可能感兴趣的:(python,文档翻译)