第2章 Python基础知识
学习一门语言,最基础的就是语法,一般就是数据类型、流程控制等。学习过其他语言的读者,可以在本章看看Python语言与其他语言的区别;没有学习过其他语言的读者,则需要在本章加强代码的练习。
本章的主要内容是:
- PyShell的使用。
- Python中的数值、字符串。
- 列表的使用。
- 流程控制。
- 函数的学习。
2.1 Python的基础简介
前面学习了很多Python的理论知识,本节开始增加动手能力,先从1+1开始吧!
2.1.1 启动Python解释器
打开IDEL后,会出现主提示符“>>>”,表示Python解释器已经启动起来了,解释器的行为就像是一个计算器。我们可以向它输入一个表达式,它会返回结果,例如:
>>> 1+1 2 >>> 2*3 6 >>> 4-5 -1
表达式的语法和大多数计算机语言是一样的,具有各种数字类型和四则运算,也可以使用括号来划分表达式的优先级,例如:
>>> (1+2)*3 9 >>> 3-(2+4)*2 -9
2.1.2 数值类型
可以尝试在Python解释器下输入各种类型的数值,不只是整数,也可以是小数,甚至可以是复数,例如:
>>> a=3 >>> b=3.246 >>> c=5+1j >>> print(c) (5+1j) >>> print(b) 3.246 >>> print(a) 3
在上面的代码中,a是整数,b是小数,c是复数,复数由两部分组成,虚部由一个后缀“j”或者“J”来表示。带有非零实部的复数记为“(real+imagj)”,符号“=”是绑定的意思,意思就是说,a以后和数字3绑定在一起了,只要提到a,就知道它是数字3,当然绑定是可以随时改变的,a可以和数字3绑定在一起,也可以和其他数绑定在一起,例如:
>>> a=3 >>> a=3.5
同一个值可以同时赋给几个变量:
>>> x = y = z = 0 # x、y、z都是0 >>> x 0 >>> y 0 >>> z 0
不同的值也可以方便和几个不同的变量相绑定,例如:
>>> a,b,c=4,5,6 >>> a 4 >>> b 5 >>> c 6
2.1.3 字符串
在Python中,带单引号或者双引号的都是字符串,在Python中没有字符这个概念,单个字符也认为是字符串,例如:
>>> bb='china' >>> aa="china" >>> aa 'china' >>> bb 'china'
字符串可以通过几种方式分行。可以在行尾加反斜杠作为继续符,这表示下一行是当前行的逻辑延续,例如:
>>> hello = "这是第1行\n\ ...这是第2行\n\ ...这是第3行\ ...结束。" >>>
或者字符串可以用一对三重引号""""或'''来标识。三重引号中的字符串在行尾不需要换行标记,所有的格式都会包括在字符串中,例如:
>>> hello = """希望你学的开心 Python并不难。 一个小小的提示: 开心就好。""" >>>
字符串可以用+号连接(或者说黏合),也可以用*号循环,例如:
>>> word = 'Help' + 'A' >>> word 'HelpA' >>> '<' + word*5 + '>' '<HelpAHelpAHelpAHelpAHelpA>'
也可以使用字符串自带的方法来进行英文大小写转换。例如,upper()是转换成大写,而lower()是转换成小写:
>>> e_str='china' >>> e_str.upper() 'CHINA' >>> hh=e_str.upper() >>> print(hh) CHINA >>> hh.lower() 'china'
字符串可以用下标(索引)查询;就像C一样,字符串的第一个字符下标是0。这里没有独立的字符类型,字符仅仅是大小为一的字符串。就像在Icon中那样,字符串的子串可以通过切片标志来表示,两个由冒号隔开的索引,例如:
>>> hh.lower() 'china' >>> word='Help' >>> word[3] 'p' >>> word[0:2] 'He' >>> word[2:4] 'lp'
说明
切片(Slice),简单理解的话可以是截取,比如10个字母只截取中间的3个。Python中的切片操作符是[],里面使用数字,用冒号间隔,表示从第几位到第几位。如果没有冒号,只有1个数字,表示从第1个(下标为0)开始截取。
需要注意的是,字符串是不可以更改的,可以创建新的字符串,但是绝不能更改存在的字符串,例如:
>>> word[3]='P' Traceback (most recent call last): File "<stdio>", line 1, in <module> TypeError: 'str' object does not support item assignment >>> word[0]='h' Traceback (most recent call last): File "<stdio>", line 1, in <module> TypeError: 'str' object does not support item assignment
可以使用已经存在的字符串去合并新的字符串,例如:
>>> 'h'+word[1:] 'help'
2.1.4 列表
列表是Python中的容器,用于组织其他的值,为中括号之间用逗号分隔的一列值(子项)。列表的子项不一定是同一类型的值,例如:
>>> aa=['china',2,3,4] >>> aa ['china', 2, 3, 4]
像字符串一样,列表也以0开始,可以被切片、连接等:
>>> a=['spam', 'eggs', 100, 1234] >>> a[0] 'spam' >>> a[3] 1234 >>> a[-2] 100 >>> a[1:-1] ['eggs', 100] >>> a[:2] + ['bacon', 2*2] ['spam', 'eggs', 'bacon', 4] >>> 3*a[:3] + ['Boe!'] ['spam', 'eggs', 100, 'spam', 'eggs', 100, 'spam', 'eggs', 100, 'Boe!']
与不变的字符串不同,列表可以改变每个独立元素的值:
>>> a[2] = a[2] + 23 >>> a ['spam', 'eggs', 123, 1234]
列表可以进行切片操作,甚至可以改变列表的大小:
>>> #替换列表项 ... a[0:2] = [1, 12] >>> a=[1, 12, 123, 1234] >>> # 移动列表项 ... a[0:2] = [] >>> a [123, 1234] >>> # Insert some: ... a[1:1] = ['bletch', 'xy777'] >>> a [123, 'bletch', 'xy777', 1234] >>> a[:0] = a #在开始处插入 >>> a [123, 'bletch', 'xy777', 1234, 123, 'bletch', 'xy777', 1234]
说明
本书第3章会详细介绍列表类型的使用,在这里简略介绍,也是因为后面的例子会用到。
2.1.5 流程控制
流程控制最重要的是两种流程控制方式:
- 选择语句
- 循环语句
提示
本章的流程控制和函数等相关技术点只是方便本章后面的案例编码,让读者可以有简单的了解,详细技术点的分析会在后面的章节逐步展开。
1. 选择语句
Python提供了if...elif...else语句进行选择分支,例如:
>>> x = int(input("输入一个数字: ")) >>> if x < 0: ... x = 0 ... print('不能小于0') ... elif x == 0: ... print(0) ... elif x %2 == 1: ... print("单数") ... else: ... print("其他") ...
关键字“elif”是“else if”的缩写,可以有效避免过深的缩进。
2. 循环语句
Python提供了几个不同的循环语句,最主要的有for和while语句。通常的循环可能会依据一个等差数值步进过程(如Pascal)或由用户来定义迭代步骤和中止条件(如C),Python的for语句依据任意序列(列表或字符串)中的子项,按它们在序列中的顺序来进行迭代。例如:
>>> a = ['cat', 'Windows', 'defenestrate'] >>> for x in a: ... print(x, len(x)) ... cat 3 Windows 7 defenestrate 12
在迭代过程中修改迭代序列不安全(只有在使用列表这样的可变序列时,才会有这样的情况)。如果想要修改迭代的序列(例如,复制选择项),可以迭代它的复本。通常使用切片标识就可以很方便地做到这一点:
>>> for x in a[:]: ... if len(x) > 6: ... a.insert(0, x) ... >>> a ['defenestrate', 'cat', 'Windows', 'defenestrate']
Python中的while语句和C中使用的很相似,都是在while关键字后加一个循环表达式,当循环表达式为真或者True的时候,会一直循环着,当循环表达式为False的时候,会退出循环,例如:
>>> i=0 >>> while i<5: ... print(i) ... i+=1 ... 0 1 2 3 4
2.1.6 函数
函数定义的关键字是def,在其后必须跟有函数名和包括形式参数的圆括号。函数体语句从下一行开始,必须是缩进的。函数体的第一行可以是一个字符串值,这个字符串是该函数的文档字符串,也可称作docstring,相当于代码的注释,代码中加入文档字符串是一个好的做法,应该养成习惯。
调用函数时会为局部变量引入一个新的符号表。所有的局部变量都存储在这个局部符号表中。引用参数时,会先从局部符号表中查找,再是全局符号表,然后是内置命名表。因此,全局参数虽然可以被引用,但是不能在函数中直接赋值(除非它们用global语句命名)。
函数引用的实际参数在函数调用时引入局部符号表,因此实参总是传值调用(这里的值总是一个对象引用,而不是该对象的值)。一个函数被另一个函数调用时,一个新的局部符号表在调用过程中被创建。
函数定义在当前符号表中引入函数名。作为用户定义函数,函数名有一个为解释器认可的类型值。这个值可以赋给其他命名,使其能够作为一个函数来使用。这就像一个重命名机制,例如定义一个计算斐波那契数列的函数:
>>> def fib(n): a, b = 0, 1 while b < n: print(b) a, b = b, a+b
提示
斐波那契数列(Fibonacci sequence)又称为黄金分割数列,指的是这样一个数列:1、1、2、3、5、8、13、21、34……
既可以直接调用该函数,也可以将函数作为值赋给其他变量:
>>> fib <function object at 10042ed0> >>> f = fib >>> f(100) 1 1 2 3 5 8 13 21 34 55 89
2.2 开始编程:九九乘法表
在2.1节中,初步介绍了Python编程的一些基础语法知识,本节将应用Python的这些基础知识来编程实现一个简单的九九乘法表。
【本节代码参考:C02\py_2.1.py】
2.2.1 九九乘法表
九九乘法表是将10之内的数互相相乘的结果以三角形的样式打印出来,在本节的应用中,不只是要将九九乘法表以三角形的样式打印出来,还需要以倒三角形来打印九九乘法表。
2.2.2 编程思路
要以三角形、倒三角形的样式来打印九九乘法表,关键的编程要点有两个:
- 获得所有10之内乘法的运算式和结果。
- 将运算式和结果排版成正三角和倒三角的形式。
要获得所有10之内的乘法运算式和结果,最简单的方法是通过循环来实现,通过两个变量,让它们都在10之内双重循环,然后计算它们的结果,这样就可以得到10之内所有的运算式和结果,代码如下:
>>> def getall(): ... lis=[] ... for i in range(1,10): ... for j in range(1,i+!): ... lis.append(str(i)+"*"+str(j)+"="+str(i*j)) ... return lis
函数getall使用了一个双重循环,该循环的作用就是将10之内互乘的运算式和结果都存放到列表lis中,这样就可以使用getall的返回值获得所有的互乘的运算式和结果,例如:
>>> getall() ['1*1=1', '2*1=2', '2*2=4', '3*1=3', '3*2=6', '3*3=9', '4*1=4', '4*2=8', '4*3=12', '4*4=16', '5*1=5', '5*2=10', '5*3=15', '5*4=20', '5*5=25', '6*1=6', '6*2=12', '6*3=18', '6*4=24', '6*5=30', '6*6=36', '7*1=7', '7*2=14', '7*3=21', '7*4=28', '7*5=35', '7*6=42', '7*7=49', '8*1=8', '8*2=16', '8*3=24', '8*4=32', '8*5=40', '8*6=48', '8*7=56', '8*8=64', '9*1=9', '9*2=18', '9*3=27', '9*4=36', '9*5=45', '9*6=54', '9*7=63', '9*8=72', '9*9=81']
有了所有的互乘的运算式和结果,下面的工作就是如何组织这些运算式来排列成三角形和倒三角形,也就是说,要将列表lis的元素按照一定的规律输出到屏幕就可以了。
2.2.3 编程实现
九九乘法表使用最简单的for循环,还利用了Python特有的变量类型——列表。程序很简单,保存为py_2.1.py,运行例子2.1将九九乘法表输出到终端。
例子2.1 Python打印九九乘法表
可以在命令行执行命令:
python py_2.1.py
也可以在IDEL中单击File|New File打开编辑器,输入上述内容,保存为py_2.1.py后,按F5键运行。
执行结果如图2.1所示。
图2.1 九九乘法表
在例子2.1的第13行中,利用list列表的reverse()将列表中的元素倒置,然后利用pop()将元素逐个“吐”出并输出到屏幕上。
注意
第1行一般应用在多个Python版本的环境下,指明使用的具体Python解释器。如果读者机器上只有一个Python版本,或者是通过IDEL进行编辑,就可以省略这1行。
2.3 本章小结
本章介绍了Python的基本知识,并安装好了Python的环境,用一个简单的程序展示了Python程序的流程控制。