1 数字运算
编程是将问题数据化的一个过程,数据离不开数字,Python 的数字运算规则与我们学习 的四则运算规则是一样的,即使不使用 Python 来编写复杂的程序,也可以将其当作一个强大 的计算器。打开 Python,试运行以下命令:
>>> 2 + 2
4
>>> 50 - 5*6
20
>>> (50 - 5*6) / 4
5.0
>>> 8 / 5 # 总是返回一个浮点数
1.6 不同的机器上浮点运算的结果可能会不一样。
Python 数字类型转换:
- int(x) 将 x 转换为一个整数。
- float(x) 将 x 转换为一个浮点数。
- complex(x) 将 x 转换为一个复数,实数部分为 x,虚数部分为 0。
- complex(x, y) 将 x 和 y 转换为一个复数,实数部分为 x,虚数部分为 y。x 和 y 是 数字表达式。
常用的数学函数
- 内置函数
python 内置函数一览表:Built-in Functions,其中与数学有关的有:
| 函数 | 描述 | 实例 |
|---|---|---|
| abs(x) | 返回 x 的绝对值 | abs(-2) 返回 2, abs(-2.0) 返回 2.0 |
| max(x1,x2,...) | 返回给定参数的最大值 | max(1, 2) 返回2,max(1, 2, 3) 返回3 |
| min(x1,x2,...) | 返回给定参数的最小值 | min(1, 2) 返回1,min(1, 2, 3) 返回1 |
| oct(x) | 将 x 转换为以“0o”为前缀的八进制字符串 | oct(10) 返回 '0o12' |
| pow(base, exp) | 等效于使用幂运算符:base**exp。 | pow(2, 3) 返回 8 |
| round(x[, ndigits]) | 返回浮点数x四舍五入的值,若给出ndigits,则四舍五入到 ndigits 精度 | round(5.555) 返回 6round(5.555, 1) 返回 5.6 |
| sum(iterable, /, start=0) | 从 start 开始对 iterable 的各项求和并返回总数 | sum((1, 2, 3)) 返回 6 |
| sqrt(x) | 返回数字 x 的平方根 | sqrt(4)返回2 |
- math 模块
python 中数学运算常用的函数基本都在 math 模块中。math 模块中的函数不能用于复数,如需支持复数,可使用 cmath 模块中的同名函数。
查看 math 模块的内容:
>>> import math
>>> dir(math)
['__doc__', '__loader__', '__name__', '__package__', '__spec__', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'comb', 'copysign', 'cos', 'cosh', 'degrees', 'dist', 'e', 'erf', 'erfc', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'gcd', 'hypot', 'inf', 'isclose', 'isfinite', 'isinf', 'isnan', 'isqrt', 'lcm', 'ldexp', 'lgamma', 'log', 'log10', 'log1p', 'log2', 'modf', 'nan', 'nextafter', 'perm', 'pi', 'pow', 'prod', 'radians', 'remainder', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'tau', 'trunc', 'ulp']
>>> help(math)2 字符串的格式化
Python 支持格式化字符串的输出。尽管这样可能会用到非常复杂的表达式,但最基本的 用法是将一个值插入到一个有字符串格式符 %s 的字符串中。
>>> print ("我叫 %s 今年 %d 岁!" % ('小明', 10))#使用%
我叫 小明 今年 10 岁!
>>> print ("我叫 {} 今年 {} 岁!" .format('小明', 10))#使用字符串的 format 方法
我叫 小明 今年 10 岁!
>>> print ("我叫 {0} 今年 {1} 岁!" .format('小明', 10,20))#使用索引,整数 20 未用到
我叫 小明 今年 10 岁! 需要在字符中使用特殊字符时,Python 用反斜杠(\)转义字符,如表所示。
| 转义字符 | 描述 |
|---|---|
| \ (在行尾时) | 续行符 |
| \\ | 反斜杠符号 |
| \’ | 单引号 |
| \" | 双引号 |
| \a | 响铃 |
| \b | 退格(Backspace) |
| \000 | 空 |
| \n | 换行 |
| \v | 纵向制表符 |
| \t | 横向制表符 |
| \r | 回车 |
| \f | 换页 |
| \oyy | 八进制数,yy 代表的字符,例如:\o12 代表换行,其中 o 是字母,不是数字 0。 |
| \xyy | 十六进制数,yy代表的字符,例如:\x0a代表换行 |
| \other | 其它的字符以普通格式输出 |
print() 函数使用以%开头的转换说明符对各种类型的数据进行格式化输出,具体请看下表。
| 转换说明符 | 解释 |
|---|---|
| %d、%i | 转换为带符号的十进制整数 |
| %o | 转换为带符号的八进制整数 |
| %x、%X | 转换为带符号的十六进制整数 |
| %e | 转化为科学计数法表示的浮点数(e 小写) |
| %E | 转化为科学计数法表示的浮点数(E 大写) |
| %f、%F | 转化为十进制浮点数 |
| %g | 智能选择使用 %f 或 %e 格式 |
| %G | 智能选择使用 %F 或 %E 格式 |
| %c | 格式化字符及其 ASCII 码 |
| %r | 使用 repr() 函数将表达式转换为字符串 |
| %s | 使用 str() 函数将表达式转换为字符串 |
转换说明符(Conversion Specifier)只是一个占位符,它会被后面表达式(变量、常量、数字、字符串、加减乘除等各种形式)的值代替。
字符串的内建函数
3 可迭代对象、迭代器和生成器
迭代是 Python 最强大的功能之一,是访问集合元素的一种方式。迭代器是一个可以记住 遍历位置的对象。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问结束。迭 代器只能往前不会后退。迭代器有两个基本的方法:iter() 和 next()。字符串、列表或元组对 象都可用于创建迭代器。
首先来了解一下可迭代对象、迭代器和生成器的概念
(1)可迭代对象:如果一个对象拥有__iter__方法,这个对象就是一个可迭代对象。在 Python 中,我们经常使用 for 来对某个对象进行遍历,此时被遍历的对象就是可迭代对象,常 见的有列表、元组、字典。for 循环开始时自动调用可迭代对象的__iter__方法获取一个迭代器, for 循环时自动调用迭代器的 next 方法获取下一个元素,当调用可迭代器对象的 next 方法引发 StopIteration 异常时,结束 for 循环。
(2)迭代器:如果一个对象拥有__iter__方法和__next__方法,这个对象就是一个迭代器。
(3)生成器:生成器是一类特殊的迭代器,就是在需要时才产生结果,而不是立即产生 结果。这样可以同时节省 CPU 和内存。有两种方法可以实现生成器:
- 生成器函数。使用 def 定义函数,使用 yield 而不是 return 语句返回结果。yield 语句 一次返回一个结果,在每个结果中间挂起函数的状态,以便下次从它离开的地方继续 执行。
- 生成器表达式。类似于列表推导,只不过是把一对大括号[]变换为一对小括号()。但 是生成器表达式是按需产生一个生成器结果对象,要想拿到每一个元素,就需要循环 遍历。
三者之间的关系:

可迭代对象包含迭代器、序列、字典;生成器是一种特殊的迭代器,下面分别举例说明。
创建一个迭代器对象(lx_iterator.py)
class MyListIterator(object): # 定义迭代器类,其是 MyList 可迭代对象的迭代器类
def __init__(self, data):
self.data = data # 上边界
self.now = 0 # 当前迭代值,初始为 0
def __iter__(self):
return self # 返回该对象的迭代器类的实例;因为自己就是迭代器,所以返回 self
def __next__(self): # 迭代器类必须实现的方法
while self.now < self.data:
self.now += 1
return self.now - 1 # 返回当前迭代值
raise StopIteration # 超出上边界,抛出异常
# 因为类MyListIterator实现了__iter__方法和__next__方法,所以它是一个迭代器对象。由于__iter__方法本返的是迭代器(本身),因此它也是可迭代对象。迭代器必然是一个可迭代 对象。
# 下面使用三种方法遍历迭代器MyListIterator。
my_list = MyListIterator(5) # 得到一个迭代器
print("使用 for 循环来遍历迭代器")
for i in my_list:
print(i)
my_list = MyListIterator(5) # 重新得到一个可迭代对象
print("使用 next 来遍历迭代器")
print(next(my_list))
print(next(my_list))
print(next(my_list))
print(next(my_list))
print(next(my_list))
my_list = MyListIterator(5) # 重新得到一个可迭代对象
print("同时使用 next 和 for 来遍历迭代器")
print("先使用两次 next")
print(next(my_list))
print(next(my_list))
print("再使用 for,会从第三个元素 2 开始输出")
for i in my_list:
print(i)
从代码结果可以看出,for 循环实际上就是调用了迭代器的__next__方法,当捕捉到 MyListIterator 异常时自动结束 for 循环。