与其他常见的编程语言相比,Python最突出的特点就是简洁。它用更直观的、符合人们思维习惯的代码,代替了C语言和Fortran语言的冗长代码。本节简要介绍Python的基本语法。
每行代码尽量不超过80个字符,便于在控制台查看代码,增强代码可读性。
空行并不是Python语法的一部分,其作用主要是分隔两段不同功能或含义的代码,便于代码的维护或重构。
通常,函数之间或类的方法之间用空行分隔,表示一段新的代码的开始。类和函数入口之间也用一行空行分隔,以突出函数入口的开始。其他使用空行的情况如下:
● 模块级函数和定义类之间空两行;
● 类成员方法之间空一行;
● 函数中使用空行分隔逻辑相关的代码。
例如:
class A:
def __init__(self):
pass
def hello(self):
pass
def main():
pass
(1)在二元运算符两边各空一格,二元运算符如=、−、+=、==、>、in、is not、and等。例如:
# 规范
i = i + 1
x = x * 2 - 1
# 不规范
i=i+1
x = x*2-1
(2)在函数的参数列表中,逗号、#和冒号之后要有空格。例如:
# 规范
def complex(real, imag):
pass
#不规范
def complex(real,imag):
pass
(3)函数的参数列表中,默认值的等号两边不要添加空格。例如:
# 规范
def complex(real, imag=0.0):
pass
# 不规范
def complex(real, imag = 0.0):
pass
(4)左圆括号之后、右圆括号之前不要加多余的空格。例如:
# 规范
spam(ham[1], {eggs: 2})
# 不规范
spam( ham[1], { eggs : 2 } )
(5)字典对象的左方括号之前不要加多余的空格。例如:
# 规范
dict['key'] = list[index]
# 不规范
dict ['key'] = list [index]
(6)不要使用额外的空格。例如:
# 规范
x = 1
y = 2
# 不规范
x = 1
y = 2
在程序中自定义的类名、函数名、变量名等名称和符号,称为标识符。在Python中,命名标识符应遵循以下规则。
(1)由ISO Latin-1字符集中的字符(A~Z、a~z)、下画线、数字组成,且第一个字符不能是数字。
(2)标识符中不能包含空格、@、#、¥等特殊字符。
(3)标识符区分字母大小写。
(4)不能使用Python中的保留字。
保留字(reserved word)是指在高级语言中已经定义过的标识符,不能再用于命名变量、函数、类、模块和其他对象,否则会报错。Python中的保留字也区分字母大小写。执行下面的命令,可以查看Python的所有保留字。
>> > import keyword
>> > print(keyword. kwlist)
['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']
(5)以下画线(_)开头的标识符具有特殊的意义,一般应避免使用相似的标识符。
以单下画线开头(_×××)的标识符表示不能直接访问的类属性,也不能通过from…import…语句导入;以双下画线开头(__×××)的标识符表示类的私有成员;以双下画线开头和结尾(__××__)的是Python中专用的标识符,表示构造函数。
(6)不使用汉字作为标识符,虽然不会报错,但是不建议使用。
下面举例介绍几种标识符:
No_1=103 # 合法标识符
age#$=18 # 包含特殊符号,不合法
32name="a" # 以数字开头,不合法
type="month" # type是Python关键字,不合法
a=1 # 合法的标识符,但不建议使用,最好使用具有特定意义的变量名
Python语言基于C++,因此语法特征与C++语言的极为相似,而且更加简单,更加符合科技人员对数学表达式的书写格式。
Python中不同的数字、字符、符号代表不同的含义,可以组成丰富的表达式,能满足用户的各种需求。本节将按照不同的命令生成方法简要介绍各种符号的功能。
命令行“头首”的“>>>”是自动生成的命令提示符,表示Python处于准备就绪状态,如图1-38所示。在命令提示符后输入一条命令或一段程序后按Enter键,Python将给出相应的结果,然后再次显示一个命令提示符,为输入下一段程序做准备。在脚本文件中,指令前没有命令提示符,如图1-39所示。
图1-38 命令编辑窗口
图1-39 脚本文件
下面介绍几种常见的命令输入过程中的错误及显示的警告与错误信息。
(1)输入的圆括号为中文格式,例如:
>>> range(5)
SyntaxError: invalid character '(' (U+FF08)
在输入命令时,应在英文状态下输入。
(2)函数使用格式错误,例如:
>>> range(5]
SyntaxError: closing parenthesis ']' does not match opening parenthesis '('
(3)未定义变量,例如:
>>> range(data)
Traceback (most recent call last):
File "<pyshell#9>", line 1, in <module>
range(data)
NameError: name 'data' is not defined
与一些编程语言不同,在Python中,换行与缩进不仅是为了增强代码的可读性,而且是Python语法规范的一部分。
Python支持在圆括号内换行,有以下5种情况。
(1)第二行缩进到圆括号的起始处,例如:
foo = long_function_name(var_one, var_two,
var_three, var_four)
(2)第二行缩进 4 个空格,适用于起始圆括号后就换行的情况,例如:
def long_function_name(
var_one, var_two, var_three,
var_four):
pass
(3)使用反斜线\(续行符号)换行。二元运算符+和.等应出现在行末。当代码行较长时,也可以用这种方法换行,例如:
session.query(MyTable).\
filter_by(id=1).\
one()
print 'Hello, '\
'%s %s!' %\
('Harry', 'Potter')
(4)避免同一行出现多条语句,例如:
# 规范
do_first()
do_second()
do_third()
# 不规范
do_first();do_second();do_third();
(5)在选择结构中要换行,例如:
# 规范
if foo == 'blah':
do_blah_thing()
# 不规范
if foo == 'blah': do_blash_thing()
在Python中,缩进量是可变的,但是所有代码块语句必须包含相同的缩进量。通常统一使用4个空格进行缩进,例如:
if True:
print ("True")
else:
print ("False")
有时也按1次Tab键进行缩进,但由于按Tab键不一定输出4个空格,因此有时会出错。在缩进代码时,应使用统一的形式进行缩进,尽量避免有的地方使用Tab键进行缩进,有的地方使用空格缩进。
除了命令输入必需的符号外,Python为了解决命令输入过于烦琐、复杂的问题,提供了注释符号和续行符号。
注释用于对代码功能进行解释说明,以增强代码的可读性。注释可以出现在代码中的任何位置。Python解释器在执行代码时会忽略注释,不做任何处理。
利用注释符号的特点,在调试程序时,可以使用注释符号屏蔽可能存在错误的代码,让Python解释器忽略这段代码运行,以此缩小错误所在的范围,提高程序调试效率。
Python支持两种类型的注释:单行注释和多行注释。
1)单行注释
Python使用井号(#)作为单行注释符号,语法格式为:
# 注释内容
从井号开始,直到这行行末的所有内容都是注释。对多行代码的功能进行说明时,一般将注释放在代码的上一行;对单行代码的功能进行说明时,通常将注释放在代码的右侧。
2)多行注释
多行注释内有多行内容(包含一行),通常用于为Python文件、模块、类或者函数等添加版权或者功能描述信息。
Python使用英文状态下3个连续的单引号'''或者3个连续的双引号"""创建多行注释,引号内的内容全部是注释内容,例如:
"""
第一行注释
第二行注释
"""
Python多行注释不支持嵌套,因此下面的写法是错误的:
'''
外层注释
'''
内层注释
'''
'''
不管是单行注释还是多行注释,当注释符号作为字符串的一部分出现时,就不能再将它们视为注释符号,而应该看作正常代码的一部分,例如:
>>> print('''Hello, Python!''')
>>> print("""Welcome to Python!""")
运行结果如下:
Hello, Python!
Welcome to Python!
在编写Python语句时,如果语句太长或出于某种需要,可使用续行符号(\)将长语句进行多行书写,例如:
>>> content = [' 销售产品、提供劳务收到的现金', ' 收到其他与经营活动有关的现金',\
' 购买原材料、接受劳务支付的现金', ' 支付的职工薪酬', ' 支付的税费']
>>> print(content)
运行结果如下:
[' 销售产品、提供劳务收到的现金', ' 收到其他与经营活动有关的现金', ' 购买原材料、接受劳务支付的现金', ' 支付的职工薪酬', ' 支付的税费']
数据类型是用一组属性描述其定义、标识、表示和允许值的数据单元。
按照数据的结构进行分类,Python中的数据类型主要包括number(数值)、string(字符串)、list(列表)、tuple(元组)、range(区间)、set(集合)、dictionary(字典)。
这里的数值指由阿拉伯数字和一些特殊字符组成的单个的数值,而不是由一组组的数值组成的对象。
字符串主要由26个英文字母及空格等一些特殊符号组成,在Python中使用单引号或双引号创建,例如'Python'和"my hometown"。Python不支持单字符类型,单字符(例如'P')也是作为一个字符串使用的。
单引号与双引号的作用其实是一样的,如果引号中要包含单引号或双引号,可以使用转义字符\'或\"。例如,''字母\''x\''要加粗''。
如果要创建一个包含换行符、制表符以及其他特殊字符的跨多行的复杂字符串,可以使用三引号。例如,'''hello.
Nice to meet you'''表示创建一个包含换行符,占据两行的字符串。
Python的字符串有2种取值顺序:
● 从左到右索引默认从0开始,最大值是字符串长度−1;
● 从右到左索引默认从−1开始,最小值是字符串长度的负数。
例如:
>>> name = 'James Zhou' # 创建字符串变量
>>> name # 显示字符串变量
'James Zhou'
>>> name[0] # 显示变量从左到右索引为0的元素,即第1个元素
'J'
>>> name[-4] # 显示变量从右到左索引为-4的元素,即从右到左第4个元素
'Z'
Python列表是任意对象的有序集合,列表通常由方括号“[]”创建,元素之间用逗号分隔。这里的任意对象,既可以是列表,也可以是字符串,例如:
>>> student = ['name',['Wang','Li'],'Age',[20,23]]
>>> student
运行结果如下:
['name', ['Wang', 'Li'], 'Age', [20, 23]]
每个列表变量中的元素从0开始计数,利用方括号引用索引,可以选取列表中的特定元素。例如,下面的代码分别用于选取列表student的第1个和第3个元素。
>>> student[0]
'name'
>>> student[2]
'Age'
如果要移除列表中某个值的第一个匹配项,可以使用remove函数,在变量名称后使用圆点表示法即可轻松调用,语法格式如下:
list.remove(obj)
其中,list为列表变量的名称,参数obj为列表中要移除的对象。该语法格式不返回值,但是会移除列表list中与指定值匹配的第一项。
本实例通过创建一个列表,然后删除列表中的指定元素,帮助读者进一步掌握创建列表以及引用列表元素的方法。
启动Python解释器IDLE Shell 3.11.0,在命令编辑窗口执行以下程序:
>>> A="lunch" # 创建字符串A
>>> B='panda' # 创建字符串B
>>> C= "lunch" # 创建字符串C
>>> ls=[A,B,C] # 创建列表变量ls
>>> ls # 显示列表变量ls
['lunch', 'panda', 'lunch']
>>> ls[1] # 显示列表变量ls中索引为1的元素,即第2个元素
'panda'
>>> ls.remove('lunch') # 删除列表变量ls中值为'lunch'的第一个匹配项
>>> ls
['panda', 'lunch']
>>> ls=[ls,"box"] # 嵌套列表
>>> ls
[['panda', 'lunch'], 'box']
元组与列表类似,其不同之处在于元组的元素不能修改。元组变量通过圆括号“()”创建,元素之间用逗号分隔。
例如,下面的代码用于创建一个元组变量info,然后显示变量info的类型:
# 创建元组变量
>>> info = ('trade mark',('A','B','C','D'),'price',(18,21,20,19))
>>> type(info) # 显示变量的类型
运行结果如下:
<class 'tuple'>
显示创建的变量类型为元组“tuple”。
区间类似于一个整数列表,使用range函数创建。该函数的调用格式如下:
range(start, stop[, step])
参数说明如下。
● start:起始值为start,默认从0开始。使用默认起始值时,该参数可省略。例如,range(6)等价于range(0,6)。
● stop:结束值为stop−1。例如,range(2,6)的值为[2,3,4,5]。
● step:步长值,默认为1。使用默认步长值时,该参数可省略。例如,range(2,6)等价于range(2,6,1)。
在Python 3.x中,range函数返回的是一个可迭代对象(类型是对象),而不是列表,因此输出时不会输出列表。
集合是一个没有重复元素的无序序列,可以使用花括号“{}”或者set函数创建。
空集不能使用花括号创建,必须使用set函数创建。
例如,下面的代码用于创建一个集合变量fruits,并显示变量的类型:
# 创建集合变量
>>> fruits = {'orange','peach','banana','pear'}
>>> type(fruits) # 显示变量的类型
运行结果如下:
<class 'set'>
显示创建的变量类型为集合“set”。
字典是一种可存储任意类型对象的可变容器模型。在Python中,字典是除列表以外,最灵活的内置数据类型。
字典通常由“{}”创建,是一个无序的键(key)值(value)对的集合,语法格式如下:
dic = {key1 : value1, key2:value2}
例如,下面的代码用于创建一个字典information,并输出该变量的值:
>>> information = {'name':'Alice', 'age':'21'}
>>> print(information)
其中,name和age是键,Alice和21是对应的值。
运行结果如下:
{'name': 'Alice', 'age': '21'}
程序结构是指程序的流程控制结构。Python的程序结构大致可分为图1-40所示的顺序结构、选择结构与循环结构。
顺序结构 选择结构 循环结构
图1-40 3种程序结构
顺序结构是最简单、最易学的一种程序结构。它由多个Python语句顺序构成,各语句之间用分号“;”隔开,若不加分号,则必须分行编写。程序执行时也是由上至下进行的。
选择结构也称为分支结构,根据条件是否满足执行不同的分支,较常用的是if-else结构。根据分支的多少,Python分支结构可分为单分支结构、二分支结构、多分支结构。它的一般形式为:
if 表达式:
语句块
在利用Python进行数值实验或工程计算时,用得最多的是循环结构。循环结构是指为在程序中反复执行某个语句块而设置的一种程序结构。它根据循环体中的条件判断是继续执行某个语句块还是退出循环。在循环结构中,被重复执行的语句块称为循环体。Python常用的循环结构有两种:for循环与while循环。
1)for循环
在for循环中,循环次数一般情况下是已知的,除非用其他语句提前终止循环。这种循环以for开头,其一般形式为:
for <variable> in <sequence>:
<statements>
else:
<statements>
在每次循环中,迭代变量<variable>用于接收迭代对象<sequence>中元素的值,变量每取一次值,循环便执行一次,直到迭代完对象的最后一项。
如果需要遍历数字序列,可以使用range函数生成数字序列作为迭代对象,执行有限次数的循环。如果迭代对象是列表或者字典,此时迭代变量表示列表或者字典中的元素。
2)while循环
如果不知道所需要的循环到底要执行多少次,可以选择while循环,这种循环以while开头,其一般形式如下:
while 表达式:
可执行语句1
…
可执行语句n
其中的表达式即循环控制语句,它一般是由逻辑运算或关系运算,以及一般运算组成的表达式。如果表达式的值非0,则执行一次循环,否则停止循环。一般来说,能用for循环实现的程序也能用while循环实现。
本实例利用选择结构求分段函数 的值。
操作步骤如下。
(1)在PyCharm中打开项目ch01。然后在项目中新建一个名为piecewiseFunction.py的Python文件。
(2)在piecewiseFunction.py的命令编辑窗口中编写如下程序:
# 这个文件使用 if-elif-else结构求分段函数f(x)的值
# 当x<−1时,f(x)=3x+2
# 当−1≤x≤1时,f(x)=x
# 当x>1时,f(x)=2x+3
x = 2 # 定义变量
if x < -1:
y = 3 * x + 2
elif -1 <= x & x <= 1:
y = x
else:
y = 2 * x + 3
print('当x=', x, '时,y=', y)
在文件functionValue.py上右击,从弹出的右键快捷菜单中选择“Run”命令,运行文件,即可打开“Run”面板,显示运行结果,如图1-41所示。
图1-41 运行结果
选择菜单栏中的“Tools”→“Python or Debug Console”命令,在PyCharm中打开“Python Console”,并显示命令提示符“>>>”,如图1-42所示。
图1-42 “Python Console”编辑环境
在这里可以输入命令并运行。例如,输入如下命令:
>>> x=-2
>>> y=3*x+2
>>> print('当x=',x,'时,f(x)=',y)
运行结果如图1-43所示。
图1-43 运行结果
在编写程序时,经常会需要接收用户输入、输出计算结果,以实现程序与用户的交互。本节介绍Python常用的输入输出函数。
input函数用于提示用户从键盘输入数据、字符串或者表达式,并接收输入值。其调用格式如下:
input(prompt)
这种格式是以文本字符串prompt为信息给出用户提示,将用户输入的内容赋值给变量,返回字符串。
本实例使用input函数接收用户从键盘输入的商品信息。
操作步骤如下。
(1)启动PyCharm,打开名为ch01的项目。然后在该项目中新建一个名为productsInfo.py的Python文件。
(2)在productsInfo.py的命令编辑窗口中输入如下程序:
# 这个文件演示input函数的用法
print('*'*20, '商品信息录入', '*'*20)
name = input('商品名称:')
num = input('数量:')
price = input('单价:')
(3)运行程序,结果如图1-44所示。
图1-44 运行结果
在运行程序时,首先输出标题信息,并输出第一条提示信息“商品名称:”,用户从键盘输入“保温杯”,按Enter键,输出第二条提示信息“数量:”。用户从键盘输入商品数量后,按Enter键,输出第三条提示信息“单价:”,等待用户输入。输入单价后,按Enter键,程序结束。
print函数用于输出。其调用格式如下:
print(objects, sep=' ', end='\n', file=sys.stdout, flush=False)
参数说明如下。
● objects:表示输出的多个对象。输出多个对象时,各个对象之间需要用逗号(,)分隔。
● sep:指定输出的多个对象之间的分隔符,默认值是一个空格。
● end:指定用于结束输出内容的字符,默认值是换行符(\n)。
● file:指定要写入的文件对象。
● flush:输出是否被缓存通常取决于file参数,但如果flush关键字参数为True,内容会被强制刷新。
本实例使用print函数输出上一个实例中录入的商品信息。
操作步骤如下。
(1)启动PyCharm,打开名为ch01的项目。然后在该项目中新建一个名为printInfo.py的Python文件。
(2)在printInfo.py的命令编辑窗口中输入如下程序:
# 这个文件演示print函数的用法
print('*'*20, '商品信息录入', '*'*20)
# 录入信息
name = input('商品名称:')
num = input('数量:')
price = input('单价:')
# 输出明细
print('*'*20, '商品明细', '*'*20)
print('名称', '数量', '单价', sep='\t'*2)
print(name, '\t', num, '\t', price)
(3)运行程序,结果如图1-45所示。
图1-45 运行结果
使用print函数输出数据时,还可以像其他编程语言(如C)一样,自定义数据输出格式,实现数据的格式化输出。在这里要提请使用过C语言的读者注意,Python中的格式控制符和转换说明符用%分隔,而不是逗号。例如:
print('字符串%s的长度为%d' % (s1, n))
其中,'字符串%s的长度为%d'称为格式控制符,(s1, n)称为转换说明符,转换说明符左侧的%用于标记转换说明符的开始。
Python格式控制符如表1-1所示。
表1-1 Python格式控制符
在格式控制符中通常还指定最小字段宽度、精度和转换标志。最小字段宽度用于指定转换后的字符串至少应该具有的宽度(小数点也占一位)。如果最小字段宽度是*(星号),则从元组中读取宽度。圆点(.)后跟精度值,如果要输出实数,精度值表示出现在小数点后的位数;如果要输出字符串,精度值表示最大字段宽度;如果是*,则从元组中读取精度。例如:
r = 5.142536
# 指定最小字段宽度为6,精度为2
print('半径为%6.2f ' % r) # 半径为 5.14
print("半径为%*.4f" % (6,r)) # 半径为5.1425
转换标志可以设置数据输出的对齐方式,是否添加符号、空格或0。其中,负号(−)表示左对齐;加号(+)表示在数值前要加上正负号;" "(空格)表示正数之前保留空格;0表示如果转换值位数不够就用0填充。
本实例使用print函数按指定格式输出某产品的销售额。
操作步骤如下。
(1)启动PyCharm,打开名为ch01的项目。然后在该项目中新建一个名为salesPrint.py的Python文件。
(2)在salesPrint.py的命令编辑窗口中输入如下程序:
# 此文件输出某产品的销售额,演示数据的格式化输出
print('*'*20, 'A产品销售额', '*'*20)
print('产品名称:', 'A')
print('销量(kg):245.32', '单价(元):36.89', sep='\n')
# 计算销售额
sales = 245.32 * 36.89
# 输出结果
print('销售额(元):', sales) # 使用默认格式
print(' 保留2位小数为:%10.2f' % sales) # 指定最小字段宽度为10,精度为2
print(" 保留3位小数为:%.*f" % (3, sales)) # 从元组读取精度3
print(" 保留2位小数,数据左对齐为:%-10.2f" % sales)
print(" 保留2位小数,显示正负号:%+10.2f" % sales)
print(" 保留2位小数,保留空格:% 10.2f" % sales)
print(" 保留2位小数,用0填补:%010.2f" % sales)
(3)运行程序,结果如图1-46所示。
图1-46 运行结果
从运行结果中可以看到,在输出精度为2的销售额时,由于指定最小字段宽度为10,而销售额的位数为7,小于10,所以在输出值左边填补了3个空格。输出保留3位小数的销售额时,在格式控制符中使用了星号(*),因此从后面的元组(3, sales)读取精度3。由于没有指定最小字段宽度,因此输出时不会额外填补空格进行缩进。
如果指定了转换标志负号(−),输出数据时左对齐,即使数据位数小于指定的最小字段宽度,也不会自动填补空格。如果指定了转换标志0,则在转换值位数小于指定的最小字段宽度时,在数据左侧用0填补。