要想掌握一门编程语言,首先需要学会其基本的语法和语义规范。Python的语言特性是简洁明了,当运行一个功能时,Python通常只使用一种固定的方式。虽然不像其他计算机语言有丰富的语法格式,但是Python也可以完成其他计算机语言所能完成的功能,而且更容易。本章主要讲解Python的一些基本语法。
标识符用来识别变量、函数、类、模块及对象的名称。Python的标识符可以包含英文字母(A~Z、a~z)、数字(0~9)及下画线符号(_),但它有以下几个方面的限制:
(1)首字符可以是下画线(_)或字母,但不能是数字,并且变量名称之间不能有空格。
(2)除首字符外的其他字符必须是下画线、字母和数字。
(3)Python的标识符有大小写之分,如Data与data是不同的标识符。
(4)由于Python 3.x的字符采用了双字节Unicode编码,因此中文等亚洲文字也可以作为标识符。
(5)关键字不可以当作标识符。
使用交互方式执行以下命令可以查看Python的关键字:
import keyword print(keyword.kwlist)
输出35个关键字,结果如下:
['False', 'None', 'True', 'and', 'as', 'assert', 'async', 'await', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield']
(6)不要使用Python的内置函数名作为自己的标识符。
例如查看以下标识符哪些是合法的:
名称 _price pass name@ 8goods Price$ _price# goods6 _news Uers_name
这里只有名称_price、goods6、_news和Uers_name是合法的,@、$和#不能构成标识符,关键字pass也不能作为标识符。
在Python解释器内可以直接声明变量的名称,不必声明变量的类型。为一个变量赋值的同时就声明了该变量,该变量的数据类型就是赋值数据所属的类型。该变量还可以接收其他类型的数据。
例如使用交互方式执行以下代码,运行结果如图2-1所示。
图2-1 声明变量并赋值
注意: 虽然Python这种变量声明方式非常灵活,但也会给开发带来一些麻烦。例如图2-1代码中本来想把字符串“苹果”赋值给y,却不小心赋值给了x。由于Python默认所有变量都可以接收不同类型的数据,因此也不容易发现这个错误。
Python允许用户同时为多个变量赋值。例如使用交互方式执行以下代码,运行结果如图2-2所示。
图2-2 同时为多个变量赋值
如果创建变量时没有赋值,会提示错误,例如执行以下代码:
u
输出结果如下:
Traceback (most recent call last): File "<pyshell#0>", line 1, in <module> u NameError: name 'u' is not defined
学习Python开发之前,首先需要了解Python的程序结构。
与其他常见的语言不同,Python的代码块不使用大括号({})来控制类、函数及其他逻辑判断。Python语言的主要特色就是用缩进分层来写模块。
【例2.1】严格执行缩进(源代码\ch02\2.1.py)。
if True: print ("牧童骑黄牛") print ("歌声振林樾") #严格执行缩进 else: print ("意欲捕鸣蝉") print ("忽然闭口立")
保存并运行程序,结果如下:
牧童骑黄牛 歌声振林樾
Python程序中缩进的空白数量虽然是可变的,但是所有代码块语句必须包含相同的缩进空白数量,这个要严格执行。
【例2.2】没有严格执行缩进(源代码\ch02\2.2.py)。
if True: print ("牧童骑黄牛") print ("歌声振林樾") #没有严格执行缩进 else: print ("意欲捕鸣蝉") print ("忽然闭口立")
保存并运行程序,结果报错,信息如下:
SyntaxError: invalid syntax
除了要保证相同的缩进空白数量外,还要保证相同的缩进方式,有的使用Tab键缩进,有的使用2个或4个空格缩进,需要改为相同的缩进方式。
注意: Python的编程规范指出:缩进最好采用空格的形式,每一层向右缩进4个空格。
在Python语言中,常见的换行问题如下。
如果是Linux/UNIX操作系统,换行字符为ASCII LF(linefeed);如果是DOS/Windows操作系统,换行字符为ASCII CR LF(return + linefeed);如果是Mac OS操作系统,换行字符为ASCII CR(return)。
例如,在Windows操作系统中换行,运行命令结果如图2-3所示。
图2-3 在Windows操作系统中换行
如果程序代码超过一行,可以在每一行的结尾添加反斜杠(\),继续下一行,这与C/C++的语法相同。例如:
if 1900 < year < 2100 and 1 <=month <=12\ and 1 <= day <= 31 and 0 <= hour < 24 \ and 0 <= minute < 60 and 0 <= second < 60: #多个判断条件
注意: 每个行末的反斜杠(\)之后不加注释文字。
如果是以小括号(())、中括号([])或大括号({})包含起来的语句,不必使用反斜杠(\)就可以直接分成数行。例如:
month_names = ['Januari', 'Februari', 'Maart', 'April', 'Mei', 'Juni', 'Juli', 'Augustus', 'September', 'Oktober', 'November', 'December']
如果要将数行表达式写成一行,只需在每一行的结尾添加上分号(;)即可。例如:
x = 100; y = 200; z = 300
Python中的注释有单行注释和多行注释。Python中单行注释以#开头。例如:
# 这是一个注释 print("Hello, World!")
多行注释用3个单引号(''')或3个双引号(""")将注释括起来。
(1)3个单引号:
''' 这是多行注释,用3个单引号 这是多行注释,用3个单引号 这是多行注释,用3个单引号 ''' print("这是Python语言的注释")
(2)3个双引号:
""" 这是多行注释,用3个双引号 这是多行注释,用3个双引号 这是多行注释,用3个双引号 """ print("这是Python语言的注释")
Python的内置函数input()和print()用于输入和输出数据。下面将讲解这两个函数的使用方法。
Python提供的input()函数从标准输入读入一行文本,默认的标准输入是键盘。input()函数的基本语法格式如下:
input([prompt])
其中,prompt是可选参数,用来显示用户输入的提示信息字符串。用户输入程序所需要的数据会以字符串的形式返回。
【例2.3】测试键盘的输入(源代码\ch02\2.3.py)。
x= input("请输入最喜欢的水果:")
上述代码用于提示用户输入水果的名称,然后将名称以字符串的形式返回并保存在x变量中,以后可以随时调用这个变量。
当运行此句代码时,会立即显示提示信息“请输入最喜欢的水果:”,之后等待用户输入信息。当用户输入“葡萄”并按Enter键时,程序就接收了用户的输入。最后调用x变量,就会显示变量所引用的对象——用户输入的水果名称。
测试结果如图2-4所示。
图2-4 测试键盘的输入
从结果可以看出,添加提示用户输入信息是比较友好的,这对编程时所需要的友好界面非常有帮助。
注意: 用户输入的数据全部以字符串形式返回,如果需要输入数值,就必须进行类型转换。
print()函数可以输出格式化的数据,与C/C++的printf()函数功能和格式相似。print()函数的基本语法格式如下:
print(value,…,sep=' ' ,end='\n') #此处只说明了部分参数
上述参数的含义如下:
(1)value是用户要输出的信息,后面的省略号表示可以有多个要输出的信息。
(2)sep用于设置多个要输出信息之间的分隔符,其默认的分隔符为一个空格。
(3)end是一个print()函数中所有要输出信息之后添加的符号,默认值为换行符。
【例2.4】测试处理结果的输出(源代码\ch02\2.4.py)。
print("牧童骑黄牛","歌声振林樾") #输出测试的内容 print("牧童骑黄牛","歌声振林樾",sep='*') #将默认的分隔符修改为'*' print("牧童骑黄牛","歌声振林樾",end='>') #将默认的结束符修改为'>' print("牧童骑黄牛","歌声振林樾") #再次输出测试的内容
保存并运行程序,结果如下所示。这里调用了4次print()函数。其中,第1次为默认输出,第2次将默认的分隔符修改为“*”,第3次将默认的结束符修改为“>”,第4次再次调用默认的输出。
牧童骑黄牛 歌声振林樾 牧童骑黄牛*歌声振林樾 牧童骑黄牛 歌声振林樾>牧童骑黄牛 歌声振林樾
从运行结果可以看出,第一行为默认输出方式,数据之间用空格分开,结束后添加了一个换行符;第二行输出的数据项之间以“*”分开;第三行输出结束后添加了一个“>”,与第4条语句的输出放在了同一行中。
注意: 从Python 3开始,不再支持print输出语句,例如print "Hello Python",解释器将会报错。
如果输出的内容既包括字符串,又包含变量值,就需要将变量值格式化处理。例如:
>>> x = 100 >>> print ("x = %d" % x) x = 100
这里要将字符串与变量之间以%符号隔开。
如果没有使用%符号将字符串与变量隔开,Python就会输出字符串的完整内容,而不会输出格式化字符串。例如以下代码:
>>> x = 100 >>> print ("x = %d",x) x = %d 100
【例2.5】实现不换行输出(源代码\ch02\2.5.py)。
a="春风又绿江南岸," b="明月何时照我还。" #换行输出 print( a ) print( b ) print('---------') # 不换行输出 print( a, end=" " ) print( b, end=" " ) print()
保存并运行程序,结果如下:
春风又绿江南岸, 明月何时照我还。 --------- 春风又绿江南岸, 明月何时照我还。
在本示例中,通过在变量末尾添加end="",可以实现不换行输出的效果。读者从结果可以看出换行和不换行的不同之处。
在Python中,一个模块就是一个文件,模块是保存代码的最小单位,在模块中可以声明变量、函数、属性和类等Python代码元素。一个模块可以访问另一个模块中的元素,这里需要使用导入语句的帮助,导入语句有以下3种形式。
在使用某个模块之前,必须先使用import语句加载这个模块。语法格式如下:
import <模块名称>
当解释器遇到import语句时,会在当前路径下搜索该模块文件。
例如,定义一个文件a.py为模块,然后在b.py文件中导入。通过这种方式会导入a模块的所有代码元素,在访问时需要加前缀“a.”。
a.py文件的代码如下:
x=360
b.py引入a模块,代码如下:
#导入模块 import a #现在可以调用a模块中包含的元素 print("本次考试分数为:%d分" % a.x)
将a.py和b.py文件保存在同一目录下。运行b.py,输出结果如下:
本次考试分数为:360分
无论用户执行多少次import,一个模块只会被导入一次,这样可以防止导入模块被一遍又一遍地执行。
通过这种方式导入模块中的指定元素,在访问时不需要加前缀“a.”。
c.py引入a模块中的x元素,代码如下:
#导入模块中的元素 from a import x #现在可以调用a模块中包含的元素x print("本次商品的采购量:%d台" % x)
运行c.py,输出结果如下:
本次商品的采购量:360台
这种方式和第2种类似。通过as设置代码元素的别名,可以避免两个模块中出现重名的问题。
d.py引入a模块中的x元素,代码如下:
#导入模块中的元素 from a import x as ax x=660 # 现在可以调用a模块中包含的元素x print("洗衣机还剩%d台" % ax)
运行d.py,输出结果如下:
洗衣机还剩360台
综上所述,在实际的项目开发中,如果想导入所有内容,则使用import语句;如果只是导入一个元素,则使用from import语句;如果名称有冲突,则使用from import as语句。