Python的一些基础知识
一、变量
在改进猜数小游戏之前,有些Python基础知识需要掌握一下。
当为一个值起名字的时候,它将会存储在内存中,我们把这块内存称为变量variable
。在大多数语言中,把这种行为称为给变量赋值或把值存储在变量中。变量就是一个名字,通过这个名字,可以找到我们想到的东西。
变量为什么不叫“恒量”而叫“变量”?正是因为它是可变的。再看另一个例子:
该例子先创建一个变量,名字叫x,给它初始化赋值为3,然后又给它赋值为5(此时3就被5替换掉);接下来创建另外一个变量y,并初始化赋值为8;最后创建第三个变量z,它的值是变量x和y的和。
同样的方式也可以运用到字符串(由数字、字母、下划线组成的一串字符)中:
这种字符串加字符串的语法,在Python里称为字符串的拼接。
使用变量需要注意:
1. 在使用变量之前,需要对其先赋值。
2. 变量名可以包括字母、数字、下画线,但变量名不能以数字开头,这与大多数高级语言是一样的。
3. 字母可以是大写或小写,但大、小写是不同的。也就是说,YANCONG
和yancong
对于Python来说是完全不同的两个名字。
4. 等号(=)是赋值的意思,左边是名字,右边是值,不能写反了。
二、字符串
到目前为止,所了解到的字符串就是引号内的一切东西。字符串也称为文本,文本和数字是截然不同的。如果直接让两个数字相加,那么Python会直接将数字相加后的结果告诉你:
但是如果在数字的两边加上了引号,就变成了字符串的拼接,这正是引号带来的差别:
要告诉Python你在创建一个字符串,就要在字符两边加上引号,可以是单引号或双引号。但必须成对,不能一边用单引号,另一边却用双引号,这样Python就不知道你到底想干嘛了:
那如果字符串内容中需要出现单引号或双引号,怎么办?
像上面这样写,Python会误解你的意思(认为’Let’是一个字符串,而s go’是另一个不完整的字符串),从而产生错误。有两种方法来改进。第一种比较常用,就是使用转义符号(\)对字符串中的引号进行转义,这样Python就知道这个引号是要直接输出的:
还有一种方法,就是利用Python既可以用单引号也可以用双引号表示字符串这一特点,只要用上不同的引号表示字符串,那么Python就不会误解你的意思。
三、改进小游戏
改进要求:
1. 当用户猜错的时候程序应该给点提示,例如,告诉用户当前输入的值和答案相比是大了还是小了。
2. 每运行一次程序只能猜一次,应该提供多次机会给用户猜测,至少要三次。
3. 每次运行程序,答案可以是随机的。
四、条件分支
第一个改进要求:当用户猜错的时候程序应该给点提示,例如告诉用户当前输入的值和答案相比是大了还是小了。程序改进后(假如答案是8):
1. 如果用户输入3,程序应该提示比答案小了。
2. 如果用户输入9,程序应该提示比答案大了。
这就涉及比较的问题了:大于号(>)、小于号(<)、等于号(==)以及不等于号(!=)。
Python的比较操作符为:<
、<=
、>
、>=
、==
、!=
。
在IDLE中输入两个数以及比较操作符,Python会直接返回比较后的结果:
这里1和3进行比较,判断1是否小于3,在小于号左右两边分别留了一个空格,这不是必需的,但代码量一多,看上去会美观很多。
还记得if-else
吧?如果程序只是一个命令清单,那么只需要笔直地一条路走到黑,但至少应该把程序设计得更聪明点——可以根据不同的条件执行不同的任务,这就是条件分支。
if 条件:
条件为真(True)执行的操作
else:
条件为假(False)执行的操作
第一个改进要求的代码:
if guess == secret:
print ("你是我心里的蛔虫吗!")
else:
if guess > secret:
print ("大啦大啦")
else:
print ("小啦小啦")
分析:当guess
和secret
变量的值相等的时候,执行print
语句;否则判断guess
大还是secret
大,并print
相应的提示信息。
五、初始循环
第一个改进要求实现了,可是用户还是不高兴,他们会抱怨道:“为什么我要不停地重新运行这个程序呢?难道不能每次运行多给几次输入的机会吗?”
我们这个程序还好,几次尝试就可以成功了,但如果范围扩大为1~100,那么尝试的次数就要随之增加,总让用户不断地重新打开程序,这种程序的体验未免就太差了。
第二个改进要求:程序应该提供多次机会给用户猜测,专业点儿来讲就是程序需要重复运行某些代码。下面介绍Python的while循环语法。
while 条件:
条件为真(True)
修改好的代码如下:
分析:先接收一次用户的输入,把值转换成整数后赋值给guess
变量,然后判断该值是否为正确答案(8),如果是就不会执行循环体的内容(因为while
循环执行的条件是guess
不等于8);否则进入循环体,依次判断用户输入的数是大于8还是小于8,并分别给出提示信息。最后,要求用户再一次尝试。
但是这样改的话,程序的逻辑变成了:只有用户输入正确的数字,循环才能够结束。这就与第二个改进要求有点不同了。
其实可以使用and
逻辑操作符(可以理解为串联电路,and
左右两边都为1时,结果才为1,但凡有一个为0,结果就为0),Python的逻辑操作符可以将任意表达式连接在一起,并得到一个布尔类型的值。布尔类型只有两个值:True
和False
,就是真与假。来看例子:
很明显1 > 2
客观上是不存在的,所以这个条件是个伪命题,因此and
的结果为False
。使用and
逻辑操作符将左右两个条件串起来的时候,只有当两者同时成立,结果才能是True
;否则均为False
。
六、引入外援
第三个改进要求:为了防止答案外泄,需要每次运行程序时答案均是随机生成的。需要引入一个“外援”帮忙才行:random
模块。
Python附带了非常多实用的模块供调用。其中,random
模块就是与生成随机数相关的模块,这个模块里边有一个函数为randint()
,它会返回一个随机的整数:
在使用一个外部模块之前,需要先导入。import random
就是将random
模块导入到当前文件中。然后调用random.randint(1, 10)
函数,随机获取一个1~10的整数。
可以利用这个函数来进一步改进小游戏:
分析:该代码中,while
语句使用and
逻辑操作符将两个条件串联起来,只有当guess
和secret
变量的值不同,并且times
的值小于3的时候,才会执行循环体的内容。而只要其中一个条件不成立,就会果断地退出循环。最后,只需要检查times
是否小于3,即可判断用户是猜中了答案还是超过了允许的尝试次数。
七、闲聊数据类型
Python有很多重要的数据类型,字符串类型已经简单讲过,后面还会对字符串进行深入的探讨,下面介绍一些Python的数据类型(数值型):如整型、浮点型、布尔类型、复数类型等。
整型
整型就是平时所见的整数,Python 3的整型已经与长整型进行了无缝结合,它的长度不受限制,如果说非要有个限制,那只限于计算机的虚拟内存总数。所以,使用Python 3可以很容易地进行大数运算:
浮点型
浮点型就是平时所说的小数,例如,圆周率3.14就是一个浮点型数据。Python区分整型和浮点型的唯一方式,就是看有没有小数点。
谈到浮点型,就不得不说一下E记法
。E记法
也就是平时所说的科学计数法,用于表示特别大和特别小的数。打个比方,如果给Python提供一个非常极端的数据,那么它可能会采用E记法
来表示:
布尔类型
布尔类型是计算机中最基本的类型,它是计算机二进制世界的体现,一切都是0和1。Python中的布尔类型只有两种值:True
和False
。(注意:首字母都是大写,与C++、JavaScript中的小写有所不同)
例如,1 + 1 > 3,我们都知道是错的,Python也知道:
布尔类型事实上是特殊的整型,尽管布尔类型用True
和False
来表示“真”与“假”,但布尔类型可以当作整数来对待,True
相当于整型值1,False
相当于整型值0,因此下面这些运算都是可以的(最后的例子报错是因为False
相当于0,而0不能作为除数)。
注意:把布尔类型当成1和0来参与运算这种做法是不妥的,容易引起代码的混乱。
类型转换
接下来介绍几个与数据类型紧密相关的函数:int()
、float()
和str()
。
int()
的作用是将一个字符串或浮点数转换为一个整数,如果是浮点数转换为整数,Python会采取“截断”处理,就是把小数点后的数据直接砍掉,而不是四舍五入:
float()
的作用是将一个字符串或整数转换成一个浮点数(就是小数):
str()
的作用是将一个数或任何其他类型转换成一个字符串:
获得关于类型的信息
有时候可能需要判断一个变量的数据类型,例如,程序需要从用户那里获取一个整数,但用户却输入了一个字符串,就有可能引发一些意想不到的错误或导致程序崩溃。Python其实提供了一个函数,可以明确告诉我们变量的类型,这就是type()
函数:
八、常用操作符
算数操作符
Python的算术操作符大多数和数学运算符一样:+
-
*
/
%
**
//
前面四个就是加、减、乘、除。
此外,当想对一个变量本身进行算术运算的时候,写a = a + 1
或b = b - 3
这类操作符特别麻烦,在Python中可以做一些简化:
//
表示地板除法,计算结果取比商小的最大整型值(也就是舍弃小数,取整的意思),使用地板除法,无论是整型还是浮点型,都将舍弃小数部分:
%
表示求余数的意思,也叫取模运算:
优先级问题
当多个运算符同时出现在一个表达式的时候,需要严格按照优先级规定的级别来进行运算。
先乘、除,后加、减,如有括号先运行括号里边的。
举个例子:-3 * 2 + 5 / -2 - 4
相当于:(-3) * 2 + 5 / (-2) - 4
Python还有一个特殊的乘法,就是双星号**
,也称为幂运算操作符。
例如3**2
,双星号左侧的3称为底数,右侧的2称为指数,把这样的算式称为3的2次幂。
在使用Python进行幂运算的时候,需要注意的一点是优先级问题。
从上面的结果可以看出:幂运算操作符比其左侧的一元操作符优先级高,比其右侧的一元操作符优先级低。
比较操作符
比较运算符包括:<
<=
>
>=
==
!=
比较操作符根据表达式的值的真假返回布尔类型值:
逻辑操作符
逻辑操作符包括:and
or
not
and
操作符之前已经介绍过,在实例中也多次使用。当只有and
操作符左边的操作数为True
,且右边的操作符同时为True
的时候,结果才为True
:
or
操作符(可以理解为并联电路)与and
操作符不同,or
操作符只需要左边或者右边任意一边为真,结果都为真;只有当两边同时为假,结果才为假:
not
操作符是一个一元操作符,它的作用是得到一个和操作数相反的布尔类型的值:
另外,可能还会看到下面这样的表达式:
5 > 3 < 4
这在其他编程语言中可能是不合法的,但在Python中是行得通的,它事实上被解释为:
5 > 3 and 3 < 4
将目前接触过的所有操作符优先级合并在一起,如图所示。