《Python从小白到大牛》已经上市!

本章主要为大家介绍Python的一些语法,其中包括标识符、关键字、常量、变量、表达式、语句、注释、模块和包等内容。

标识符和关键字

任何一种计算机语言都离不开标识符和关键字,因此下面将详细介绍Python标识符和关键字。

标识符

标识符就是变量、常量、函数、属性、类、模块和包等由程序员指定的名字。构成标识符的字符均有一定的规范,Python语言中标识符的命名规则如下:

  1. 区分大小写:Myname与myname是两个不同的标识符。

  2. 首字符,可以是下划线(_)或字母,但不能是数字。

  3. 除首字符外其他字符,可以是下划线(_)、字母和数字。

  4. 关键字不能作为标识符。

  5. 不要使用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命名的变量就是在两个模块中都有。

——引自于 维基百科 https://zh.wikipedia.org/wiki/命名空间

如果两个相同名字的模块,任何防止命名冲突呢?那就是使用(package),很多语言都提供了包,例如Java、Kotlin等,他们的作用都是一样的提供一种命名空间。

创建包

重构4.5节示例,现有两个模块hello,他们放在不同的包com.pkg1和com.pkg2中,如图4-1所示,从图中可见包是按照文件夹的层次结构管理的,而且每个包下面会有一个__init__.py文件,它告诉解释器这个这是一个包,这个文件内容一般情况下是空的,但可以编写代码。

图4-1 包层次

既然包是一个文件夹加上一个空的__init__.py文件,那么开发人员就可以自己在资源管理器中创建包。笔者推荐使用PyCharm工具中创建,它会创建文件夹的同时还会创建一个空的__init__.py文件。

具体步骤:使用PyCharm打开创建的项目,右击项目选择New → Python Package菜单,如图4-2所示,在弹出对话框中输入包名com.pkg,其中com是一个包,pkg是它的下一个层次的包,中间用点(.)符号分隔。

图4-2 PyCharm项目中创建包

包导入

包创建好后,将两个模块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://edu.51cto.com/sd/f907b

配套源代码

http://www.zhijieketang.com/group/8

电子书

https://yuedu.baidu.com/ebook/5823871e59fafab069dc5022aaea998fcc2240fc

作者微博:@tony_关东升 邮箱:eorient@sina.com 智捷课堂微信公共号:zhijieketang Python读者服务QQ群:628808216