Python快速入门-第2章 算术、字符串与变量

Python快速入门-第2章 算术、字符串与变量
本章内容

交互式命令shell
整数算术
浮点数算术
其他数学函数
字符串
字符串拼接
获取帮助
类型转换
变量和值
赋值语句
变量如何引用值
多重赋值
要学习编程,首先要了解基本的Python数据类型:整型(整数)、浮点数(带小数点的数字)和字符串。所有程序都使用这些(及其他)数据类型,因此牢固掌握它们的用法至关重要。

使用字符串的程序如此之多,所以Python提供了强大的字符串支持。本章将介绍字符串的基本知识,而第6章还将回过头来更深入地介绍。

我们还将介绍最重要的编程概念——变量。变量用于存储和操作数据,如果不使用几个变量,就很难编写出有用的程序。

与学习弹钢琴或说外语一样,学习编程的最佳方式也是多练。因此,本章将利用交互式命令shell(IDLE)来介绍上述所有知识,你最好跟着做:在计算机上输入书里介绍的示例。

2.1 交互式命令shell
我们来看看如何与Python shell交互。首先,启动IDLE。在Windows系统中,它位于“开始”菜单的程序列表中;在Mac或Linux系统中,可直接在命令行输入python来启动它。这将打开Python交互式命令shell,它类似于图2-1。

术语说明

交互式命令shell常简称为交互式shell、命令shell、shell甚至命令行。

shell记录(transcript)有时称为记录、交互式会话(session)或会话。

在这里插入图片描述
图2-1 刚启动Python 交互式命令shell 时看到的内容。开头两行指出了你运行的是哪个Python 版本。这里的信息表明,运行的是Python 3.3.0,它是2012 年9 月29 日上午11 点之前的几分钟创建的

2.1.1 shell提示符
在Python记录中,>>>是Python shell提示符。>>>表示当前行是你(用户)的输入,而没有>>>的行是Python生成的。因此,一眼就能分辨出哪些内容来自Python,哪些内容来自用户。

2.1.2 记录
shell记录是命令行shell的快照,显示了一系列用户输入和Python的应答。我们将频繁使用shell记录。它们让你能够查看实际示例的运行情况,这是学习Python的绝佳方式。

2.2 整数算术
整数是不带小数部分的数字,如25、-86和0。Python支持4种基本算术运算:+(加)、-(减)、* (乘)和/(除)。Python还使用**和%来分别表示乘方和求余,例如,25 % 7的值为4,因为25除以7的余数为4。下面是一些示例。

>>> 5 + 9
14
>>> 22 - 6
16
>>> 12 * 14
168
>>> 22 / 7
3.1428571428571428
>>> 2 ** 4
16
>>> 25 % 7
4
>>> 1 + 2 * 3
7
>>> (1 + 2) * 3
9

2.2.1 整除
Python还有一个整除运算符//,其工作原理类似于/,但结果总是整数。例如,7 // 3的结果为2——将小数点后面的值丢弃(而不是四舍五入)。

2.2.2 求值顺序
表2-1总结了Python的基本算术运算符,并按优先级从低到高的顺序将它们编组。例如,计算表达式1 + 2 * 3,Python先执行* ,再执行+,因为*的优先级更高(因此,这个表达式的值为7,而不是9)。优先级相同的运算符按书写顺序计算。要改变计算顺序,可使用圆括号(),例如,(1 + 2) * 3的结果为9。换句话说,Python算术运算的规则与常规算术运算相同。

表2-1 基本算术运算符
在这里插入图片描述

2.2.3 长度不受限制
与其他大多数编程语言不同,Python对整数的长度没有限制,你可以执行数十位甚至数百数千位的整数运算。

>>> 27 ** 100
136891479058588375991326027382088315966463695625337436471480190078368997177499076593800206155688941388250484440597994042813512732765695774566001

2.3 浮点数算术
浮点数算术运行使用的是浮点数。在Python中,浮点数是带小数点的数字,例如,–3.1、2.999和–4.0都是浮点数。

所有适用于整数的算术运算都可用于浮点数,包括%(求余)和//(整除)。图2-2显示了一些示例。

>>> 3.8 + -43.2
-39.400000000000006
>>> 12.6 * 0.5
6.3
>>> 12.6 + 0.01
12.61
>>> 365.0 / 12
30.416666666666668
>>> 8.8 ** -5.4
7.939507629591553e-06
>>> 5.6 // 2
2.0
>>> 5.6 % 3.2
2.3999999999999995

图2-2  一些使用Python命令shell执行基本浮点数算术运算的示例。请注意,近似误差很常见,因此显示的通常不是准确值

2.3.1 浮点数字面量
对于非常大或非常小的浮点数,通常用科学记数法表示。

>>> 8.8 ** -5.4
7.939507629591553e-06

e-06表示将它前面的数字乘以10–6。如果愿意,你可以直接使用科学记数法。

>>> 2.3e02
230.0

在使用小数点方面,Python非常灵活。

>>> 3.
3.0
>>> 3.0
3.0

对于类似于0.5的数字,书写时可以包含前导零,也可以不包含。

>>> .5
0.5
>>> 0.5
0.5

提示 通常5.0比5.更清晰,因为后者可能令人迷惑,它看起来像句子结尾。

提示 区分5和5.0很重要,因为5是整数,而5.0是浮点数,它们的内部表示大相径庭。

2.3.2 溢出
与整数不同,浮点数存在上限和下限,超出上限或下限将导致溢出错误。溢出错误意味着计算结果太大或太小,Python无法将其表示为浮点数,如图2-3所示。面对溢出错误,Python可能沉默不语,即继续执行错误的计算,而不告诉你出了问题。一般而言,避免溢出错误的职责由程序员承担。

>>> 500.0 ** 10000
Traceback (most recent call last):
    File "<pyshell#7>", line 1, in <module>
        500.0 ** 10000
OverflowError: (34, 'Result too large')

图2-3 浮点数溢出:500.0 ** 10000的结果太大,无法存储为浮点数

2.3.3 精度有限
无论在哪种计算机上,浮点数的精度都是一个无法解决的难题。在计算机中,数字用二进制(基数为2)表示,但并非所有浮点数都可用二进制精确地表示。即便在最简单的情况下,也可能出现问题,比如下例。

>>> 1 - 2 / 3
0.33333333333333337

结果应该是小数点后面有无穷个3,但这里只包含17位。另外,最后一位也不对——应该是3而不是7。

这些细微的误差通常不是问题,对大多数程序来说,小数点后面包含17位足够了。然而,当你执行大量计算时,小误差会累积出大误差。例如,计算新设计的桥梁承受的压力时,必须考虑细微的浮点数误差,避免它们累积出大误差。

提示 一般而言,应优先考虑使用整数而不是浮点数,因为它们更精确且绝不会溢出。

2.3.4 复数
Python提供了内置的复数支持。复数是涉及-1的平方根的数字,在Python中,用1j表示–1的平方根。

>>> 1j
1j
>>> 1j * 1j
(-1+0j)

在有些工程和科学计算中,复数很有用,但本书不会再使用它们。

2.4 其他数学函数
Python自带了很多由编写好的代码组成的模块,math就是其中之一。表2-2列出了math模块中一些最常用的函数。

表2-2 模块math中的一些函数
在这里插入图片描述
在这里插入图片描述

2.4.1 使用返回值
这些函数返回一个值,这意味着它们的结果为整数或浮点数,具体随函数而异。

在可以使用数字的任何地方,都可使用这些函数。Python自动执行函数,并将函数调用替换为返回值。

2.4.2 导入模块
要使用模块math或其他任何Python模块,都必须先导入:

>>> import math

这样就可以访问任何数学函数了,方法是在函数前面加上math.。

>>> math.sqrt(5)
2.2360679774997898
>>> math.sqrt(2) * math.tan(22)
0.012518132023611912

下面是另一种导入模块的方式。

>>> from math import *

这样调用math模块中的任何函数时,都无需在前面加上math.。

>>> log(25 + 5)
3.4011973816621555
>>> sqrt(4) * sqrt(10 * 10)
20.0

提示 使用导入方式from math import*时,如果函数与math模块中的某个函数同名,将被math模块中的同名函数覆盖。

提示 因此,使用导入方式import math通常更安全,因为它不会覆盖任何既有函数。

提示 你还可导入模块math的特定函数,例如,from math import sqrt,tan只导入函数sqrt和tan。

2.5 字符串
字符串是一系列字符,如"cat!"、“567-45442"和"Up and Down”。字符包括字母、数字、标点符号以及数百个其他的特殊符号和不可打印的字符。

2.5.1 标识字符串
在Python中,可使用下列3种主要方式来表示字符串字面量。

单引号,如’http’、‘openhouse’或’cat’。
双引号,如"http"、“open house"或"cat”。
三引号,如"““http””“或多行字符串:
“””
Me and my monkey
Have something to hide
“”"
提示 很多Python程序员更喜欢使用单引号来标识字符串,这仅仅是因为输入量比使用双引号少(不需要按住Shift键)。

提示 单引号和双引号的一个主要用途是,让你能够在字符串中包含字符"和’。

“It’s great”
‘She said “Yes!”’
提示 如果在字符串中包含错误类型的引号,将导致错误。

提示 在需要创建多行的长字符串时,三引号很有用。在使用三引号括起的字符串中,还可包含字符"和’。

2.5.2 字符串的长度
要确定字符串包含多少个字符,可使用函数len(s),如下所示。

>>> len('pear')
4
>>> len('up, up, and away')
16
>>> len("moose")
5
>>> len("")
0

最后一个示例使用了空字符串。空字符串通常表示为’'或"",没有包含任何字符。

由于函数len返回一个整数,所以在任何可以使用整数的地方,都可使用函数len,例如:

>>> 5 + len('cat') * len('dog')
14

2.6 字符串拼接
可以将既有字符串“相加”来创建新的字符串,比如:

>>> 'hot ' + 'dog'
'hot dog'
>>> 'Once' + " " + 'Upon' + ' ' +"a Time"
'Once Upon a Time'

这种运算被称为拼接。

要将同一个字符串拼接很多次,可使用下面这种整洁的快捷方式。

>>> 10 * 'ha'
'hahahahahahahahahaha'
>>> 'hee' * 3
'heeheehee'
>>> 3 * 'hee' + 2 * "!"
'heeheehee!!'

字符串拼接的结果为另一个字符串,因此可在任何需要字符串的地方使用字符串拼接。

>>> len(12 * 'pizza pie!')
120
>>> len("house" + 'boat') * '12'
'121212121212121212'

2.7 获取帮助
从很大程度上说,Python是一种自文档化语言,大多数函数和模块都包含简短的解释,你无需求助于图书或网站就能搞明白如何使用它们。

2.7.1 列出模块中的函数
导入模块后,可使用函数dir(m)列出模块的所有函数。

>>> import math
>>> dir(math)
['__doc__', '__name__', '__package__', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'copysign', 'cos', 'cosh', 'degrees', 'e', 'exp', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'hypot', 'isinf', 'isnan', 'ldexp', 'log', 'log10', 'log1p', 'modf', 'pi', 'pow', 'radians', 'sin', 'sinh', 'sqrt', 'sum', 'tan', 'tanh', 'trunc']

这让你对模块包含的函数有了大致的了解,很多Python程序员经常使用dir(m)。

就现在而言,不用考虑以双下划线(__)打头的名称,因为它们只用于较复杂的Python编程。

提示 要查看完整的Python内置函数清单,可在命令提示符下输入dir(builtins)。

提示 你还可使用函数help(f)来查看函数f的文档字符串。

提示 要运行Python实用程序help,可在提示符下输入help()。这将向你显示各种有用的信息,如完整的模块清单、有关函数和关键字的帮助信息,等等。

提示 你还可从Python文档(www.python.org/doc/)获取帮助。在这里,可找到实用教程以及Python语言和标准模块的详情。

2.7.2 打印文档字符串
另一个实用技巧是打印函数的文档字符串。

>>> print(math.tanh.__doc__)
tanh(x)
Return the hyperbolic tangent of x.

大多数Python内置函数都有简短的文档字符串,Python标准模块(如math)中的大部分函数亦如此;你可使用前述方式来访问这些文档字符串。

再来看一个例子,下面是内置函数bin的文档字符串。

>>> print(bin.__doc__)
bin(number) -> string
Return the binary representation of an integer or long integer.
>>> bin(25)
'0b11001'

2.8 类型转换
类型转换是一种常见任务,Python提供了很多简化这种工作的内置函数。

2.8.1 将整数和字符串转换为浮点数
要将整数3转换为浮点数,可使用函数float(x)。

>>> float(3)
3.0

将字符串转换为浮点数的方式与此类似。

>>> float('3.2')
3.2000000000000002
>>> float('3')
3.0

2.8.2 将整数和浮点数转换为字符串
函数str(n)将指定的数字转换为相应的字符串。

>>> str(85)
'85'
>>> str(-9.78)
'-9.78'

隐式转换

有时候Python会自动在数值类型之间转换,而不要求你显式地调用转换函数,例如:

>>> 25 * 8.5
212.5

这里自动将25转换为25.0,再将其与8.5相乘。一般而言,表达式同时包含整数和浮点数时,Python会自动将整数转换为浮点数。

2.8.3 将浮点数转换为整数
这有点棘手,因为你必须决定如何处理浮点数的小数部分。函数int(x)将小数部分删除,而round(x)采用如下标准圆整方式。

>>> int(8.64)
8
>>> round(8.64)
9
>>> round(8.5)
8

圆整

在Python中,round(8.5)的结果为8而不是9,对此很多人都感到惊讶。你在小学可能学过,对于小数部分为.5的数字,总是应该向上圆整的。

然而,总是向上圆整带来的偏差可能导致计算不准确,因此Python采用了另一种圆整策略:将小数部分为.5的数字圆整到最接近的偶数(有时被称为银行家圆整)。因此,小数部分为.5的数字可能向下圆整,也可能向上圆整。

乍一看,这种策略有点奇怪,也不同于Python 2的圆整方式。然而,这是在计算机上圆整数字的标准方式,为大家普遍接受。如果你想了解其中的细节,请参阅维基百科的相关词条,其网址为http://en.wikipedia.org/wiki/Rounding。

2.8.4 将字符串转换为数字
这很容易,只需使用函数int(s)或float(s)即可。

>>> int('5')
5
>>> float('5.1')
5.1

提示 对于大多数应用程序,使用int(x)、float(x)和round(x)就能满足数值转换需求。然而,为处理更具体的转换,Python模块math提供了很多将小数部分删除的函数:math.trunc(x)、math.ceil(x)和math.floor(x)。

提示 函数int(s)和float(s)将字符串转换为整数/浮点数,它们假定字符串看起来像Python整数/浮点数,如果不是这样,将出现一条错误消息,指出不能执行转换。

2.9 变量和值
变量是最重要的编程概念之一。在Python中,变量标记(label)或指向一个值。

术语说明

与变量一样,函数、模块和类也都有名称。我们将这些名称统称为标识符。

例如:

>>> fruit = "cherry"
>>> fruit
'cherry'

其中,fruit是一个变量名,它指向字符串值"cherry"。请注意,变量名无需用引号括起。

代码行fruit = "cherry"被称为赋值语句;=(等号)被称为赋值运算符,用于让变量指向一个值。

遇到变量时,Python将其替换为指向的值,因此:

>>> cost = 2.99
>>> 0.1 * cost
0.29900000000000004
>>> 1.06 * cost + 5.99
9.1594000000000015

变量命名规则
变量名必须遵守下面几条基本规则(表2-3提供了一些示例)。

表2-3 合法和非法的变量名

合法变量名 非法变量名
M “m”
x1 1x
tax_rate tax rate
taxRate taxRate!
Else else
变量名的长度不受限制,但其中的字符必须是字母、数字或下划线(_),而不能使用空格、连字符、标点符号、引号或其他字符。

变量名的第一个字符不能是数字,而必须是字母或下划线。

Python区分大小写,因此TAX、Tax和tax是截然不同的变量名。

不能将Python关键字用作变量名。例如,if、else、while、def、or、and、not、in和is都是Python关键字(本书后面将介绍它们的用途),试图将它们用作变量名将导致错误,如图2-4所示。

>>> else = 25
SyntaxError: invalid syntax

图2-4 else是Python关键字,不能用作变量名

2.10 赋值语句
赋值语句包含3个主要部分:左值、赋值运算符和右值。

enter image description here
赋值语句剖析。这条语句让var指向value。左值必须是变量,而右值可以是变量、值或结果为值的任何表达式

赋值语句有两个用途:定义新的变量;让已定义的变量指向特定值。例如:

>>> x = 5
>>> 2 * x + 1
11
>>> x = 99

第一条赋值语句(x = 5)完成了两项职责,是一条初始化语句。它让Python创建新变量x,并将值5赋给它。然后,在可以使用整数的任何地方,都可使用变量x了。

第二条赋值语句(x = 99)给x重新赋值,让它指向另一个值。它没有创建变量x,因为这个变量已经存在,这是前一条赋值语句的功劳。

如果你不对变量初始化,Python将报错:

>>> 2 * y + 1
Traceback (most recent call last):
File "", line 1, in 
2 * y + 1
NameError: name 'y' is not defined

术语说明

常用于描述变量和值的术语很多。我们有时候说将值赋给变量或给变量指定值。

对于已经赋值的变量,说它指向、标记或拥有相应的值。

程序员有时说变量包含其值,好像变量是桶,而值在桶内。这种说法的问题在于,Python变量并不符合你以为的“包含”模型。例如,在Python中,同一个对象不能同时出现在多个桶内,但可以有多个变量同时指向它。

上述错误消息指出变量y未定义,因此Python不知道该使用什么值来替换表达式2 * y + 1中的y。

可以将任何值赋给变量,包括其他变量的值。请看下面的一系列赋值语句:

>>> x = 5
>>> x
5
>>> y = 'cat'
>>> y
'cat'
>>> x = y
>>> x
'cat'
>>> y
'cat'

2.11 变量如何引用值
对于x = expr这样的Python赋值语句,可以这样解读:让x指向表达式expr的值。

别忘了,expr可以是任何结果为值的Python表达式。

2.11.1 赋值时不复制
你必须明白,赋值语句并不会复制指向的值,而只是标记和重新标记既有值。因此,无论变量指向的对象有多大、多复杂,赋值语句的效率都非常高。

2.11.2 数字和字符串是不可变的
在Python中,数字和字符串的一个重要特征是不可变,即不能以任何方式修改它们。在看起来是修改数字或字符串的情况下,Python实际上是在创建修改版本的拷贝,如图2-9所示。

>>> s = 'apple'
>>> s + 's'
'apples'
>>> s
'apple'
>>> 5 = 1

SyntaxError: can't assign to literal

图2-9 在看起来是修改字符串的情况下,Python实际上是在创建拷贝。在Python中,根本不可能修改数字和字符串

2.12 多重赋值
在Python中,有一种便利的技巧,让你能够同时给多个变量赋值:

>>> x, y, z = 1, 'two', 3.0
>>> x
1
>>> y
'two'
>>> z
3.0
>>> x, y, z
(1, 'two', 3.0)

正如最后一条语句演示的,还可以在一行显示多个值,方法是将它们作为元组。元组总是以左圆括号(开始,以右圆括号)结尾。

交换变量的值
多重赋值的一个很实用的用途是交换两个变量的值:

>>> a, b = 5, 9
>>> a, b
(5, 9)
>>> a, b = b, a
>>> a, b
(9, 5)

语句a, b = b, a的含义是,同时给变量a和b赋值。如果不使用多重赋值,将两个变量的值互换的标准方式如下:

>>> a, b = 5, 9
>>> temp = a
>>> a = b
>>> b = temp
>>> a, b
(9, 5)

多重赋值的功能并不比常规赋值多,它只是一种偶尔使用的比较便利的快捷方式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值