![人工智能开发语言:Python](https://wfqqreader-1252317822.image.myqcloud.com/cover/281/29974281/b_29974281.jpg)
3.2 基础语法
3.2.1 文件编码格式
Python 的文件编码格式可以参照下面几种语句形式指定。
![](https://epubservercos.yuewen.com/B65D95/16499757104598206/epubprivate/OEBPS/Images/55.jpg?sign=1739212070-AnvVgH8iStouufkdG7apnFIXFi6xjQyZ-0-3eef934cd8cba4c8a42a76ebd068892d)
例如指定Windows-1252编码格式,可采用语句:#-*- coding: cp-1252 -*-。
源代码编码格式设置必须在其他代码之前进行。如果没有设置,则默认为UTF-8编码。
3.2.2 代码注释
1)单行注释
Python中单行注释以 # 开头,实例如下:
![](https://epubservercos.yuewen.com/B65D95/16499757104598206/epubprivate/OEBPS/Images/56.jpg?sign=1739212070-E0AnkqewbLpj3Gf6J7bVIzfsss5dzoQN-0-9c3e0dc44171e1e878573e6517f5241c)
可以看到,单行注释可以独立一行,也可以放在语句后面。但是无论放在什么地方,都需要以 # 开始。
2)多行注释
Python中多行注释除了可以用多个 # 号外,还可以用三个连续的单引号或三个连续的双引号表示,实例如下:
![](https://epubservercos.yuewen.com/B65D95/16499757104598206/epubprivate/OEBPS/Images/57.jpg?sign=1739212070-27RoRj9nhY5AHw8mxcqZniahpBach1rK-0-db18a57c6cf5f324caa8b763bf755f79)
注意:在使用三个连续单引号或双引号时,需要配对使用,即如果以三个连续单引号开始,也必须以三个连续单引号结束,双引号亦然。
3.2.3 标识符命名规则
标识符是用来标识源代码中的变量、函数、类等对象的字符串,对标识符的命名,Python有一套规则,如下。
① 标识符是大小写敏感的,如numObject 和 NumObject是两个完全不同的对象;
② 标识符的第一个字符必须是字母或下划线_,不能以数字开头,其他部分可由字母、数字和下划线组成;
③ 标识符的长度不限;
④ 标识符不能与关键字同名;
⑤ 不能使用Python内置函数名或内置数据类型作为标识符名,如不能使用int、float等命名其他变量,因为它们是内置数据类型的名称;
⑥ 在3.x版本中,只要属于Unicode编码的字符,都可以充当标识符的组成部分,如“身高”也可以作为一个变量的名称;
⑦ 以下划线(_)开头的标识符具有一定的特殊含义,如下:
◆ 源代码文件中,以单下划线开始的变量(_var),属于本模块的私有变量,其他模块不能调用;
◆ 在类的定义中,以单下划线开始的成员变量(_var)是保护变量,意思是只有类和子类能访问到这些变量,外部模块需通过类提供的接口进行访问,不能通过“from ××× import *”等方式导入。不过,对于目前版本的Python来说,这条还只是一条约定,没有强制实施;
◆ 在类的定义中,以连续两个或以上下划线开始,且没有以两个或以上下划线结尾的成员变量(__var/___var)叫做私有变量,意思是只有类本身自己能访问,连子类也不能访问这个变量;
◆ 以连续两个下划线开头和结尾的变量(__var__),在Python里代表特殊方法或特定用途的标识,如__init__()代表了类的构造函数。开发者应尽量避免使用这种方式命名。
⑧ 常量名应为大写加下划线(如MAX_OVERFLOW)。
通过以上命名规范可以看出,Python标识符的规则和其他语言基本类似,也是比较好掌握的。只要稍加实践,很快就可写出符合规范的变量名。
Python中有一个机制称为私有变量矫直(Private name mangling),即私有变量会在代码生成之前被转换为公有,转换规则是在变量前端插入类名,再在类名前端加入一个下划线,如类A里的__private标识符将被转换为_A__private。
3.2.4 代码缩进
Python的一大特色就是使用缩进来表示代码块,缩进是Python语法的一部分。也许Guido van Rossum就是想让违反了缩进规则的程序不能通过编译,以此来强制开发者养成良好的编程习惯。在Python中,利用缩进表示语句块的开始和退出,而非使用花括号或者某种关键字。增加缩进表示语句块的开始,而减少缩进则表示语句块的退出。如下面if的语句块:
![](https://epubservercos.yuewen.com/B65D95/16499757104598206/epubprivate/OEBPS/Images/58.jpg?sign=1739212070-MJUaigS8dmxsym5L1FlXCSDt7Ijj7BqO-0-24be1c330365e09ec7258d1b1120aeb9)
根据PEP 8(Python Enhancement Proposals)的规定,建议使用4个空格来表示每级缩进,不过在实际编写中可以自定义空格数,不建议使用Tab键来设定缩进,更不建议Tab键和空格键混合使用。
虽然缩进的空格数是可变的,但是同一个代码块的语句必须包含相同的缩进空格数。Python对代码的缩进要求非常严格,如果不采用合理的代码缩进,将抛出语法异常错误。以下代码最后一行语句缩进的空格数与前面的语句不一致,会导致运行错误:
![](https://epubservercos.yuewen.com/B65D95/16499757104598206/epubprivate/OEBPS/Images/59.jpg?sign=1739212070-svekxovPC08JYr5OoZmxijljzPI24W2A-0-59e84b802aa9544ac400f438223b2eef)
再比如下面的代码块能够成功地编译运行,且在运行时不会提示任何异常或错误,但是输出却不是我们希望的结果。
![](https://epubservercos.yuewen.com/B65D95/16499757104598206/epubprivate/OEBPS/Images/60.jpg?sign=1739212070-ePQd4bSDKV182qOJYa2IVLKeRHKCIsXI-0-c7a271a4021f3d339fa93334fd344bc6)
运行之后,输出的结果如下:
![](https://epubservercos.yuewen.com/B65D95/16499757104598206/epubprivate/OEBPS/Images/61.jpg?sign=1739212070-7DD6yZmCfM1cYcs24cHKZfzXoFuVQDQb-0-81fad4d51a1d73ec59d9f420f40903ae)
这显然不是我们想要的输出结果,第三行的输出文字不应该出现。这是因为源代码第8行没有和第7行缩进同样的空格数,造成输出逻辑上的混乱。
可见Python的缩进差之毫厘,谬以千里,所以开发者一定要时刻牢记缩进的规则:同一个代码块的语句必须包含相同的缩进空格数,这个必须严格执行。可以这么说:在Python编程中,缩进的重要性怎么强调都不为过。
3.2.5 语句与行
一般情况下,Python中一行写一条语句,语句后面可不需要分号;也可以一行写多条语句,语句之间用分号分隔;如果一条语句很长,一行写不完,可以写在多行中,每行之间用反斜杠(\)来拼接,例如:
![](https://epubservercos.yuewen.com/B65D95/16499757104598206/epubprivate/OEBPS/Images/62.jpg?sign=1739212070-sOVsdUvZftkIN3DlcjCnbPKWGwm1cQbP-0-b32737228b6fdc1b3a8e3b008150bf4d)
第5、6、7三行通过反斜杠(\)拼接成一条语句。在实际开发过程中,这种一条语句写在多行的情况也是比较常见的,特别是对字符串进行多行拼接的时候。比如数据库查询会用到SQL语句,由于SQL的语句一般非常长,为了阅读方便,需要换行书写。如:
![](https://epubservercos.yuewen.com/B65D95/16499757104598206/epubprivate/OEBPS/Images/63.jpg?sign=1739212070-rfZgd5JfsCqTI1uV3fg9VfNecjPOvR5q-0-e864763808af1bcf72bdd79d3b3c2df7)
输出结果如下:
![](https://epubservercos.yuewen.com/B65D95/16499757104598206/epubprivate/OEBPS/Images/64.jpg?sign=1739212070-33vKqnMdAx0rxGifV5JoWhBjvelN63FO-0-8dda998d7e6bd5f63c077d7185a980ed)
上面的例子中,第一种方法只使用了一对双引号,把SQL语句分为SELECT、FROM、WHERE等3部分分别书写。注意,为了美观,第6、7行是以几个空格开始的。
第二种方法使用了三对双引号,SELECT、FROM、WHERE等3部分分别使用了一对双引号。也请注意,为了美观,第12、13行是以几个空格开始的。
上面第一种方法多输出了第6、7行开始的一些空格,而这些空格不是必需的。
在实践中,强烈建议使用第二种写法,不仅可读性更强,而且可以使用空格对齐语句,使代码显得更工整。
特别地,在 ( )、[ ]或{ }中的多行语句,不需要使用反斜杠(\)。如:
![](https://epubservercos.yuewen.com/B65D95/16499757104598206/epubprivate/OEBPS/Images/65.jpg?sign=1739212070-fFygrbYDabAQAiwWgFLL6O6p1nW5gwzy-0-d22ba1529c444a5e9d870b042da0217b)
这将在后面的章节中阐述。下面一段代码在一行中写有多条语句,这常见于多个简单变量赋值的情况。
![](https://epubservercos.yuewen.com/B65D95/16499757104598206/epubprivate/OEBPS/Images/66.jpg?sign=1739212070-cxQG0tQKhKthI5YKAhHUHt3r8VfGxxgi-0-264d121fb2b05385a4f095154dd84f61)
3.2.6 模块导入
在Python语言中,模块是一个包含已经定义的函数和变量以及可执行语句的源代码文件,其后缀名是.py。模块可以被别的程序导入,以便使用该模块中的函数等对象。如果要在一个源文件中导入别的模块,可以使用 import 或者 from… import 语句。这里我们先做初步介绍,读者可结合3.8.1节来学习。
1)import语句
import语句的语法如下:
![](https://epubservercos.yuewen.com/B65D95/16499757104598206/epubprivate/OEBPS/Images/67.jpg?sign=1739212070-IFUrRtMhflscUUOzqEhI3hScGUG5z3Lb-0-dc3c96ea2412d3c0ec3f676373a27d47)
其中[ ]标记表示可选项, 一条import语句可以同时导入多个模块。
import语句可以放在代码文件的任何地方,只要在使用被导入模块的对象前导入即可。当解释器遇到 import 语句时,会按照一定的搜索路径导入指定的模块。
比如有一个源文件model01.py,代码如下:
![](https://epubservercos.yuewen.com/B65D95/16499757104598206/epubprivate/OEBPS/Images/68.jpg?sign=1739212070-ECwIjvcKPvr1NoxeCa6m3LvDRJcFBCol-0-473fdd8f24478375f0744b47c1428610)
另外一个文件Test.py 需要引用model01.py中的函数print_Info(),则代码如下:
![](https://epubservercos.yuewen.com/B65D95/16499757104598206/epubprivate/OEBPS/Images/69.jpg?sign=1739212070-VRrdfUPCcVZh6O6eoZFa2MaCKVWgRNZt-0-c8208f1501a620318edd01423c7cb717)
一个模块只会被导入一次,不管执行了多少次import。如果导入模块的名称太长,可以通过as子句为导入的模块指定一个别名,注意所起的别名不要与系统关键字或者其他变量重名。语句格式如下:
![](https://epubservercos.yuewen.com/B65D95/16499757104598206/epubprivate/OEBPS/Images/70.jpg?sign=1739212070-tIZKdvlWplfRmr93ZAePcUizsfJZWzJU-0-6c89e5730667c133ce29640faf9dd5c9)
2)from ... import 语句
这个语句允许Python从模块中只导入指定的部分到当前命名空间中,语法如下:
![](https://epubservercos.yuewen.com/B65D95/16499757104598206/epubprivate/OEBPS/Images/71.jpg?sign=1739212070-Xm43dVxDXpFf9JXAer0lKQ1lCBou5ru9-0-2c7d9cebb7b2c57cd822a18337478b77)
在上面的例子中,如果只想导入cal_Average功能,则可以这样:
![](https://epubservercos.yuewen.com/B65D95/16499757104598206/epubprivate/OEBPS/Images/72.jpg?sign=1739212070-eMoUs1Je2fqpueUjBHDyMat65Uu0MHGi-0-42fe2ede153b6ac29dd9b8840ee60ce0)
3)from ... import * 语句
这个语句把一个模块中所有的功能全部导入到当前的命名空间,如:
![](https://epubservercos.yuewen.com/B65D95/16499757104598206/epubprivate/OEBPS/Images/73.jpg?sign=1739212070-O4c7NF6a2OE4xMstegQGT4khtbTkKTkG-0-58933989e3aed295ec1f193ed5aacbc6)
通过这种方式导入模块之后,在使用被导入模块中的函数时,只需要直接使用被导入模块中的方法/变量即可,不需要在前面添加模块名称。如上面例子中,在调用model01中的cal_Average函数时,直接使用cal_Average(3,4)就可以了。
Python在导入模块时,首先会在当前执行文件所在目录下寻找。如果没有找到,会按照Python安装时配置的路径列表搜索,如果找不到,就会提示导入模块的错误。
最后特别说明一下:当以from ... import 语句导入模块时,Python会在当前源码文件(模块)的命名空间中新建相应的命名,例如from model01 import cal_Average语句相当于:
![](https://epubservercos.yuewen.com/B65D95/16499757104598206/epubprivate/OEBPS/Images/74.jpg?sign=1739212070-5CvHBEmGdChInN2GAwB5oFEJxSInV1pk-0-17959e95fa54cec10ba197b204578d7c)
即多了一个赋值过程。这就隐含了一个陷阱:被导入的变量如果恰好和当前命名空间中现有的变量(本地变量)同名,本地变量就会被“悄悄地”覆盖掉。而使用import则没这个问题,所以建议使用import导入模块。