本章主要为大家介绍Python的一些语法,其中包括标识符、关键字、常量、变量、表达式、语句、注释、模块和包等内容。
标识符和关键字
任何一种计算机语言都离不开标识符和关键字,因此下面将详细介绍Python标识符和关键字。
标识符
标识符就是变量、常量、函数、属性、类、模块和包等由程序员指定的名字。构成标识符的字符均有一定的规范,Python语言中标识符的命名规则如下:
区分大小写:Myname与myname是两个不同的标识符。
首字符,可以是下划线(_)或字母,但不能是数字。
除首字符外其他字符,可以是下划线(_)、字母和数字。
关键字不能作为标识符。
不要使用Python内置函数作为自己的标识符。
例如,身高、identifier、userName、User_Name、_sys_val等为合法的标识符,注意中文“身高”命名的变量是合法的;而2mail、room#、$Name和class为非法的标识符,注意#和$不能构成标识符。
关键字
关键字是类似于标识符的保留字符序列,由语言本身定义好的,Python语言中有33关键字。只有三个,即False、None和True首字母大写,其他的全部小写。具体内容见表4-1所示。
表 4‑1 Python关键字
False | def | if | raise |
---|---|---|---|
None | del | import | return |
True | elif | in | try |
and | else | is | while |
as | except | lambda | with |
assert | finally | nonlocal | yield |
break | for | not | |
class | from | or | |
continue | global | pass |
变量和常量
上一章中介绍了如何使用编写一个Python小程序,其中就用到了变量。常量和变量是构成表达式的重要组成部分。
变量
在Python中声明变量时不需要指定它的数据类型,只要是给一个标识符赋值就声明了变量,示例代码如下:
# 代码文件:chapter4/src/ch4.2.1.kt
_hello = "HelloWorld" ①
score_for_student = 0.0 ②
y = 20 ③
y = True ④
代码第①行、第②行和第③行分别声明了三个变量,这些变量声明不需要指定数据类型,你赋给它什么数值,它就是该类型变量了。注意代码第④行是给y变量赋布尔值True,虽然y已经保存了整数类型20,但它也可以接收其他类型数据。
提示
Python是动态类型语言[1],它不会检查数据类型,在变量声明时不需要指定数据类型。这一点与Swift和Kotlin语言不同,Swift和Kotlin虽然在声明变量时也可以不指定数据类型,但是他们的编译器会自动推导出该变量的数据类型,一旦该变量确定了数据类型,就不能再接收其他类型数据了,这一点与Python不同。
常量
在很多语言中常量的定义是一旦初始化后就不能再被修改。而Python不能从语法层面上定义常量,Python没有提供一个关键字使得变量不能被修改。所以在Python中只能将变量当成常量使用,只是不要修改它。那么这就带来了一个安全隐患,可能会在无意中被修改,从而引发程序错误。解决此问题要么靠程序员自律和自查;要么通过一些技术手段使变量不能修改。
提示
Python作为解释性动态语言,代码安全很多情况下需要程序员自查的。而Java和C等静态类型语言,这些问题会在编译期检查出来。
注释
Python程序注释使用井号(#),使用时#位于注释行的开头,#后面有一个空格,接着是注释内容。
另外,在第3章还介绍过文档字符串,它也是一种注释,只是用来注释文档的,文档注释将在第5章详细介绍。
使用注释示例代码如下:
# coding=utf-8 ①
# 代码文件:chapter4/4.3/hello.py ②
# _hello = "HelloWorld" ③
# score_for_student = 0.0 ④
y = 20
y = "大家好"
print(y) # 打印y变量 ⑤
代码①和②行#号是进行单号注释,#号也可连续注释多行见代码第③行~第④行,可以在一条语句的尾端进行注释见代码第⑤行。注意代码①行#
coding=utf-8注释作用很特殊是设置Python代码文件的编码集,该注释语句必须放在文件的第一行或第二行才能有效。它还有替代写法:
#!/usr/bin/python
# -*- coding: utf-8 -*-
其中#!/usr/bin/python注释是在UNIX、Liunx和macOS等平台上安装多个Python版本时,具体指定哪个版本的Python解释器。
提示
在PyCharm工具中对连续多行的注释可以使用快捷键,具体步骤是:选择多行然后按住“Ctrl+斜杠”组合键进行注释。去掉注释也是按住“Ctrl+斜杠”组合键。
注意
在程序代码中,对容易引起误解的代码进行注释是必要的,但应避免对已清晰表达信息的代码进行注释。需要注意的是,频繁的注释有时反映了代码的低质量。当觉得被迫要加注释的时候,不妨考虑一下重写代码使其更清晰。
语句
Python代码是由关键字、标识符、表达式和语句等内容构成,语句是代码的重要组成部分。
语句关注的代码执行过程,如if、for和while等。在Python语言中,一行代码表示一条语句,语句结束可以加分号,也可以省略分号。
示例代码:
# coding=utf-8
# 代码文件:chapter4/4.4/hello.py
_hello = "HelloWorld"
score_for_student = 0.0; # 没有错误发生
y = 20
name1 = "Tom"; name2 = "Tony" ①
提示
从编程规范的角度讲语句结束不需要加分号,而且每行至多包含一条语句。代码第①行的写法是不规范的,推荐使用:
name1 = "Tom"
name2
Python还支持链式赋值语句,如果需要为多个变量赋相同的数值,可以这样表示:
a = b = c = 10
这条语句是把整数10赋值给a、b、c三个变量。
另外,在if、for和while有代码块的语句中,代码块不是通过大括号来界定的,而是通过缩进,缩进在一个级别的代码是在相同的代码块中。
# coding=utf-8
# 代码文件:chapter4/4.4/hello.py
_hello = "HelloWorld"
score_for_student = 10.0; # 没有错误发生
y = 20
name1 = "Tom"; name2 = "Tony"
# 链式赋值语句
a = b = c = 10
if y > 10:
print(y) ①
print(score_for_student) ②
else:
print(y * 10) ③
print(_hello) ④
代码第①行和第②行是一个同一个缩进级别,他们是在相同的代码块中。而代码第③行和第④行不是在同一个缩进级别中,他们是在不同的代码块中。
提示
一个缩进级别一般是一个制表符(Tab)或4个空格,考虑到不同的编辑器制表符显示的宽度不同,大部分编程语言规范推荐使用4个空格。
模块
Python中一个模块就是一个文件,模块是保存代码的最小单位,模块中可以声明变量、常量、函数、属性和类等Python程序元素。一个模块提供可以访问另外一个模块中的程序元素。
下面通过示例介绍模块的使用,现有两个模块:module1和hello。module1模块代码:
# coding=utf-8
# 代码文件:chapter4/4.5/module1.py
y = True
z = 10.10
print('进入module1模块')
hello模块会访问module1模块的变量,hello模块代码:
# coding=utf-8
# 代码文件:chapter4/4.5/hello.py
import module1 ①
from module1 import z ②
y = 20
print(y) # 访问当前模块变量y ③
print(module1.y) # 访问module1模块变量y ④
print(z) # 访问module1模块变量z ⑤
上述代码hello模块访问module1模块的变量y和z。为了实现这个目的,可以通过两种import语句导入模块module1中的代码元素:
import
<模块名>。代码第①行,这种方式会导入模块所有代码元素,访问时需要加“模块名.”,见代码第④行module1.y,module1是模块名,y是模块module1中的变量。from <模块名> import
<代码元素>。代码第②行,这种方式会只是导入特定的代码元素,访问时不需要加“模块名.”,见代码第⑤行z变量,但是需要注意如果z变量在当前模块中也有时,z不能导入,即z是当前模块中的变量。
运行hello.py代码输出结果如下:
进入module1模块
20
True
10.1
从运行结果可见import语句会运行导入的模块,注意示例中使用了两次import语句,但只执行一次模块内容。
模块事实上提供一种命名空间(namespace)[2]。同一个模块内部不能有相同名字的代码元素,但是不同模块可以,上述示例中的y命名的变量就是在两个模块中都有。
包
如果两个相同名字的模块,任何防止命名冲突呢?那就是使用(package),很多语言都提供了包,例如Java、Kotlin等,他们的作用都是一样的提供一种命名空间。
创建包
重构4.5节示例,现有两个模块hello,他们放在不同的包com.pkg1和com.pkg2中,如图4-1所示,从图中可见包是按照文件夹的层次结构管理的,而且每个包下面会有一个init.py文件,它告诉解释器这个这是一个包,这个文件内容一般情况下是空的,但可以编写代码。
既然包是一个文件夹加上一个空的init.py文件,那么开发人员就可以自己在资源管理器中创建包。笔者推荐使用PyCharm工具中创建,它会创建文件夹的同时还会创建一个空的init.py文件。
具体步骤:使用PyCharm打开创建的项目,右击项目选择New → Python
Package菜单,如图4-2所示,在弹出对话框中输入包名com.pkg,其中com是一个包,pkg是它的下一个层次的包,中间用点(.)符号分隔。
包导入
包创建好后,将两个模块hello放到不同的包com.pkg1和com.pkg2中。由于
com.pkg1的hello模块需要访问com.pkg2的hello模块中的元素。那么任何导入呢?事实上还是通过import语句,需要在模块前面加上包名。
重构4.5节示例,com.pkg2的hello模块代码:
# coding=utf-8
# 代码文件:chapter4/4.5/com/pkg2/hello.py
y = True
z = 10.10
print('进入com.pkg2.hello模块')
com.pkg1的hello模块代码:
# coding=utf-8
# 代码文件:chapter4/4.5/com/pkg1/hello.py
import com.pkg2.hello as module1 ①
from com.pkg2.hello import z ②
y = 20
print(y) # 访问当前模块变量y
print(module1.y) # 访问com.pkg2.hello模块变量y ③
print(z) # 访问com.pkg2.hello模块变量z
代码第①行是使用import语句com.pkg2.hello模块所有代码元素,由于com.pkg2.hello模块名hello与当前模块名冲突,因此需要as
module1语句为com.pkg2.hello模块提供一个别名module1,访问时需要使用module1.前缀。
代码第②行是导入com.pkg2.hello模块中z变量。from com.pkg2.hello import
z语句可以带有别名,该语句修改为如下代码:
from com.pkg2.hello import z as x
print(x) # 访问com.pkg2.hello模块变量z
使用别名的目的是防止发生命名冲突,也就是说要导入的z名字的变量在当前模块总已经存在了,所以给z一个别名x。
本章小结
本章主要介绍了Python语言中最基本的语法,首先介绍了标识符和关键字,读者需要掌握标识符构成,了解Python关键字。然后介绍了Python中的变量、常量、注释和语句。最后介绍了模块和包,其中理解模块和包的作用,熟悉模块和包导入方式。
配套视频
http://www.zhijieketang.com/classroom/10/courses
配套源代码
http://www.zhijieketang.com/group/8
纸质版电商
京东:https://item.jd.com/12468732.html
当当:http://product.dangdang.com/25574315.html
作者微博:@tony_关东升
邮箱:eorient@sina.com
智捷课堂微信公共号:zhijieketang
Python读者服务QQ群:565736812
-
动态类型语言会在运行期检查变量或表达式数据类型,主要有Python、PHP和Objective-C等。与动态语言对应的还有静态类型语言,静态类型语言会在编译期检查变量或表达式数据类型,如Java和C++等。 ↩
-
命名空间,也称名字空间、名称空间等,它表示着一个标识符(identifier)的可见范围。一个标识符可在多个命名空间中定义,它在不同命名空间中的含义是互不相干的。这样,在一个新的命名空间中可定义任何标识符,他们不会与任何已有的标识符发生冲突,因为已有的定义都处于其他命名空间中。
——引自于 维基百科 https://zh.wikipedia.org/wiki/命名空间 ↩