《Python从小白到大牛》第4章 Python语法基础

《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命名的变量就是在两个模块中都有。

如果两个相同名字的模块,任何防止命名冲突呢?那就是使用(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://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


  1. 动态类型语言会在运行期检查变量或表达式数据类型,主要有Python、PHP和Objective-C等。与动态语言对应的还有静态类型语言,静态类型语言会在编译期检查变量或表达式数据类型,如Java和C++等。

  2. 命名空间,也称名字空间、名称空间等,它表示着一个标识符(identifier)的可见范围。一个标识符可在多个命名空间中定义,它在不同命名空间中的含义是互不相干的。这样,在一个新的命名空间中可定义任何标识符,他们不会与任何已有的标识符发生冲突,因为已有的定义都处于其他命名空间中。
    ——引自于 维基百科 https://zh.wikipedia.org/wiki/命名空间

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容