IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> python的词法结构(行、注释、文件编码、标识符、关键字和字面值) -> 正文阅读

[Python知识库]python的词法结构(行、注释、文件编码、标识符、关键字和字面值)

python3.6版本

1、行结构

1.1 物理行

python的物理行以一个行终止符为界限。在源文件中或者字符串中,支持使用任何标准平台上的行终止序列——Unix的LF(换行)或者Windows下的CRLF(回车加换行)或者一些老的机器上的CR(回车)。

如果在C中通过python的API来调用python,那么传给python API的source code字符串必须使用明确的\n来表示一行的结束。

1.2 逻辑行

python的逻辑行按照概念上来说,逻辑行以NEWLINE表示的。除了compound statments(符合语句),其它的语句都不能跨越逻辑行。

实际上来说,逻辑行由一行或多行物理行组成,组成方式有两种:显示与隐式。

显示方式:通过反斜杠(\)来将多个物理行联结成一个逻辑行。

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

隐士方式:这种方式往往出现在一些使用圆括号,方括号或者大括号的表达式中。

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

在逻辑行中,还可以穿插注释,这是非常有用的。

1.3 空白行

仅包含空格,tabs,formfeed(换行符,退纸符等),注释的行,这些行被词法检查的时候不会生成一个NEWLINE token。

PS:python在词法检查阶段,对于空白行会直接忽略,不会生成有关的tokens。

1.4?注释

python的注释实际上只有一种,那就是单行注释:

# 这是注释内容

其它的:这是需要注意的,下面不是注释。

"""

这里的内容是__doc__属性内容。

"""

'''

这里的内容是__doc__属性内容

'''

1.5 编码声明

编码声明直接影响python解释器以何种编码来解释python脚本文件,如果python脚本文件使用的编码python不能识别,那么就会出错。

在python脚本的开头以一行注释来表明当前脚本文件所使用的编码,必须符合正则表达式coding[=:]\s*([-\w.]+):

# -*- coding: <encoding-name> -*-

或者

# vim:fileencoding=<encoding-name>

当然,使用更多是第一种:

# -*- coding: utf-8 -*-

python3.6中,如果没有声明编码,则python默认以UTF-8来解释python脚本文件。

小结:最好在python的开头写上一行# -*- coding: utf-8 -*-

1.6 缩进

python通过缩进来确定语句块,处于同一缩进等级中的语句属于同一个语句块。

注意:如果混用了tab和空格,又导致了确定缩进等级需要依赖于tab对应的空格数量设置,那么就会报错,TabError。

笔记:

Tabs are replaced (from left to right) by one to eight spaces such that the total number of characters up to and including the replacement is a multiple of eight (this is intended to be the same rule as used by Unix). The total number of spaces preceding the first non-blank character then determines the line’s indentation. Indentation cannot be split over multiple physical lines using backslashes; the whitespace up to the first backslash determines the indentation.

这里所说的Tab会被替换为1到8个空格,应该是在混用Tab和空格情况下。例如:

Tab Space Space

这种情况下,Tab会被替换为6个空格,这样就保持了缩进的空格数总是8的倍数。

再例如:

Tab

这种情况下,Tab会被替换为8个空格。

但是需要注意的是,python3中混用Tab和空格如果导致了确定缩进等级需要依赖于tab对应的空格数量的设置,那么就报错TabError。

算法如下:

即算法的工作原理如下:

  • 如果行首缩进的Tab加空格的总数与前一行匹配(无论顺序),则此行属于与上一行相同的块,即缩进等级相同。

  • 如果(tab,空格)中的一个的数量大于前一行的数量,而另一个的数量至少等于前一行的数量,则这是一个缩进的块。

  • 如果(tabs, spaces)匹配之前的某一个块的缩进 ,那么该行与之前的那个块缩进等级相同。

  • 否则会引发IndentationError或TabError。

小结:不要混用tab和空格,PEB8编码标准建议,python的缩进采用4个空格。

1.7 空白符

出了逻辑行的开头或者字符串中,其他任意tokens之间的空白如空格,tab,以及formfeed(退纸符,换行符)都被认为是分隔符,用来分隔不同的tokens。

2 、标识符和关键字(identifier、keywords)

2.1 标识符

所有的标识符都会被转换为NFKC的unicode形式。

python3的标识符可以使用unicode字符,所以使用一些其他语言的符号以及中文都是可以作为标识符的。

具体的标准,可以查看python的标准文档。

为了简单,直接认为以下划线或者大小写英文字母开头,后面跟上下划线、大小写英文字母和0-9这些字符。例如_test,test,_test_1。

关键字不能作为标识符,否则报错。

被保留的一些特殊的标识符不要作为标识符。

2.2 关键字

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

2.3 被保留的特殊的标识符

_*:以下划线开头的标识符,不能通过from module import * 载入。交互模式下,_下划线被用来保存上一条计算结果。

__*__:被双下划线包括的标识符,这是系统定义的一些名字。

__*:类的私有属性名字。

这些特殊的标识符最好不要使用,避免引起一些错误。

小结

  • 为了简便,标识符以下划线或者大小写字母开头,后面跟上下划线、大小写字母以及数字即可。
  • 不能使用关键字作为标识符。
  • 为了减少错误,不要使用保留的特殊标识符。

3、字面值(literal)

python中的字面值主要表示一些内置类型的常量。

3.1 字符串

stringliteral   ::=  [stringprefix](shortstring | longstring)
stringprefix    ::=  "r" | "u" | "R" | "U" | "f" | "F"
                     | "fr" | "Fr" | "fR" | "FR" | "rf" | "rF" | "Rf" | "RF"
shortstring     ::=  "'" shortstringitem* "'" | '"' shortstringitem* '"'
longstring      ::=  "'''" longstringitem* "'''" | '"""' longstringitem* '"""'
shortstringitem ::=  shortstringchar | stringescapeseq
longstringitem  ::=  longstringchar | stringescapeseq
shortstringchar ::=  <any source character except "\" or newline or the quote>
longstringchar  ::=  <any source character except "\">
stringescapeseq ::=  "\" <any source character>

字符串分为短字符串和长字符串。

短字符串由单引号或者双引号包围,如:‘这是一个字符串’或者"这是一个字符串"。

短字符串注意点:

单引号和双引号字符串都不能跨越多个逻辑行。

单引号字符串不能包含引号,双引号字符串不能包含双引号。

单引号和双引号字符串都不能以反斜杠结尾,这是因为反斜杠一般用来进行对特殊含义的字符进行转义,例如引号和反斜杠本身。当以反斜杠结尾的时候,最后的单引号或者双引号就会被转义成字符,从而导致字符串没有引号结尾而出错。

长字符串由三个单引号或者三个双引号包围。

长字符串注意点:

长字符串不能以反斜杠结尾,这是因为反斜杠一般用来进行对特殊含义的字符进行转义,例如引号和反斜杠本身。当以反斜杠结尾的时候,最后的单引号或者双引号就会被转义成字符,从而导致字符串没有引号结尾而出错。

长字符串与段字符串的一个最大区别就在于,长字符串可以跨越多个逻辑行,也就是说,长字符串实际上相当于一个多行字符串。

字符串中可以使用转义序列来表示一个字符。

可用的字符串转义序列:

转义序列

含义

注释

\newline

反斜杠加换行全被忽略

\\

反斜杠 (\)

\'

单引号 (')

\"

双引号 (")

\a

ASCII 响铃 (BEL)

\b

ASCII 退格 (BS)

\f

ASCII 进纸 (FF)

\n

ASCII 换行 (LF)

\r

ASCII 回车 (CR)

\t

ASCII 水平制表 (TAB)

\v

ASCII 垂直制表 (VT)

\ooo

八进制数?ooo?码位的字符

(1,3)

\xhh

十六进制数?hh?码位的字符

(2,3)

字符串还可以使用unicode转义字符序列:

转义序列

含义

注释

\N{name}

Unicode 数据库中名称为?name?的字符

(4)

\uxxxx

16位十六进制数?xxxx?码位的字符

(5)

\Uxxxxxxxx

32位16进制数?xxxxxxxx?码位的字符

(6)

另外,不管是短字符串还是长字符串,都可以包含一个可选的字符串前缀。

前缀:

r或R:表示这是一个原始字符串,该字符串的转义序列会被当做普通字符。

u或U:表示这是一个unicode字符串。

f或F:表示这是一个格式化字符串。

其中,r(R)和f(F)可以组合使用。

注意点:

前缀和字符串之间不能有空白符。

最后,在定义一个字符串的时候,相邻的字符串会被python自动的组合为一个字符串。

例如:

test1="1""2""3" #test1实际结果为:123

test2="""1

2

3""""4""5"?

#test2的实际结果为:

1

2

3

45

3.1.2 格式化字符串字面值

  • printf风格的字符串格式化
  • f-string风格的字符串格式化(就是以f开头的字符串)

小结

  • 短字符串最好使用双引号包围。
  • 不要在字符串的末尾使用反斜杠。
  • 除了特殊字符,不要在字符串中使用转义的unicode序列。
  • 需要使用多行字符串的时候,可以考虑长字符串。

3.2 字节串

bytesliteral   ::=  bytesprefix(shortbytes | longbytes)
bytesprefix    ::=  "b" | "B" | "br" | "Br" | "bR" | "BR" | "rb" | "rB" | "Rb" | "RB"
shortbytes     ::=  "'" shortbytesitem* "'" | '"' shortbytesitem* '"'
longbytes      ::=  "'''" longbytesitem* "'''" | '"""' longbytesitem* '"""'
shortbytesitem ::=  shortbyteschar | bytesescapeseq
longbytesitem  ::=  longbyteschar | bytesescapeseq
shortbyteschar ::=  <any ASCII character except "\" or newline or the quote>
longbyteschar  ::=  <any ASCII character except "\">
bytesescapeseq ::=  "\" <any ASCII character>

字节串也分为两种:短字节串和长字节串。

短字节串采用单引号或者双引号包围。

长字节串采用三个单引号或者三个双引号包围。

与字符串不同的是:

字节串必须以b或者B前缀开头。

字节串只能包含ASCII字符。

?字节对应的数值超过128及以上需要使用转义形式。

其他的地方:

字节串还可以使用r或者R前缀,表示这是原始的字节串,这种情况下,转义序列不会被转义。可以与b或B组合使用。

注意点:

短字节串注意点:

单引号和双引号字符串都不能跨越多个逻辑行。

单引号字符串不能包含引号,双引号字符串不能包含双引号。

单引号和双引号字符串都不能以反斜杠结尾,这是因为反斜杠一般用来进行对特殊含义的字符进行转义,例如引号和反斜杠本身。当以反斜杠结尾的时候,最后的单引号或者双引号就会被转义成字符,从而导致字符串没有引号结尾而出错。

长字节串注意点:

长字符串不能以反斜杠结尾,这是因为反斜杠一般用来进行对特殊含义的字符进行转义,例如引号和反斜杠本身。当以反斜杠结尾的时候,最后的单引号或者双引号就会被转义成字符,从而导致字符串没有引号结尾而出错。

3.3?整数

python允许4种类型的整数字面值:十进制、二进制、八进制、十六进制。

python3.6引入了下划线可以用于分组。

3.3.1 十进制

decinteger   ::=  nonzerodigit (["_"] digit)* | "0"+ (["_"] "0")*

十进制以非零的数字开头,后面跟上跟上十进制数字以及可选的下划线分组。或者以1个或多个0开头,后面跟上一连串的0以及可选的下划线分组。

例如:

90000

90_000

00000

0_00000

000_000

3.3.2 二进制?

bininteger   ::=  "0" ("b" | "B") (["_"] bindigit)+

二进制以0b或者0B开头,后面跟上二进制数字以及可选的下划线分组。

例如:

0b0101

0B0101_1011

3.3.3 八进制?

octinteger   ::=  "0" ("o" | "O") (["_"] octdigit)+

八进制以0o或者0O开头,后面跟上八进制数字以及可选的下划线分组。

例如:

0o7065

0O70_65

3.3.4 十六进制?

hexinteger   ::=  "0" ("x" | "X") (["_"] hexdigit)+

十六进制以0x或0X开头,后面跟上十六进制数字以及可选的下划线分组。

例如:

0xfeff

0Xfe_ff

3.4 浮点数

浮点数其实有两种类型:普通小数的浮点数和指数形式的浮点数。

普通小数形式

pointfloat ? ?::= ?[digitpart] "." digitpart | digitpart "."
?digitpart ? ? ::= ?digit (["_"] digit)*

这种形式的浮点数的一种形式:整数部分是可选的,而且整数部分包含可选的下划线分组。整数部分后面跟上一个小数点,后面实现小数部分。数字可以使用10进制数字。

例如:

3.14    10.    .001   3.14_15_93

指数形式的浮点数

exponentfloat ::= ?(digitpart | pointfloat) exponent

exponent ? ? ?::= ?("e" | "E") ["+" | "-"] digitpart

这种形式的浮点数就是由普通小数形式或者整数作为底数加上指数部分组成的。数字可以使用十进制数字。

例如:

1e100    3.14e-10    0e0    3.14_15_93E10

3.5 虚数

imagnumber ::= ?(floatnumber | digitpart) ("j" | "J")

虚数由浮点数或者十进制整数后面跟上一个j或者J组成。一个虚数可以看作是一个实部为0的复数。

例如:

3.14j   10.j    10j     .001J   1e100j   3.14e-10j   3.14_15_93j

4、符号

4.1 运算符

+       -       *       **(指数运算符)      /(除法)       //(向下取整)      %(取余)      @(矩阵乘法)
<<      >>      &       |       ^       ~(按位取反)
<       >       <=      >=      ==      !=

4.2 分隔符

(       )       [       ]       {       }
,       :       .       ;       @       =       ->(函数的返回类型注释符)
+=      -=      *=      /=      //=     %=      @=
&=      |=      ^=      >>=     <<=     **=

这里的赋值运算符号,既可以算运算符,也可以算分隔符。为了方便,将它们放在了分隔符中。

一些其他的符号,例如单引号、双引号、#和\都是python的标记符号。

另外的一些符号,$,?,`等,这些符号只能出现在字符串和注释中,出现在其他地方将非法。

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2022-04-26 11:38:17  更:2022-04-26 11:40:32 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/28 11:37:04-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计