core python 2 - QLGQ/learning-python GitHub Wiki
Python有一个特殊的类型,被称为Null对象或者NoneType,它只有一个值,那就是None。它不支持任何运算也没有任何内建方法。None没有什么有用的属性,它的布尔值总是False。
所有标准对象均可用于布尔测试,同类型的对象之间可以比较大小。每个对象天生具有布尔True或False值。尽管布尔值看上去是“True”和“False”,但是事实上是整型的子类,对应与整型的1和0。空对象、值为零的任何数字或者Null对象None的布尔值都是False。下列对象的布尔值是False。
- None;
- False(布尔类型);
- 所有的值为零的数;
- 0(整形);
- 0.0(浮点型);
- 0L(长整型);
- 0.0+0.0j(复数);
- ""(空字符串);
- [](空列表);
- ()(空元组);
- {}(空字典)。
值不是上面列出来的任何值的对象的布尔值都是True,例如non-empty、non-zero等。用户创建的类实例如果定义了nonzero(__nonzero__())或length(__len__())且值为0,那么它们的布尔值就是False。
- 没有__nonzero__方法的对象的默认值是True。
- 布尔型是整型的子类,但是不能再被继承而生成它的子类。
- 在数学运算中,Boolean值的True和False分别对应于1和0。
调用内建函数xrange()会生成一个Xrange对象,xrange()是内建函数range()的兄弟版本,用于需要节省内存使用或range()无法完成的超大数据集场合。
比较操作符用来判断同类型对象是否相等,所有的内建类型均支持比较运算,比较运算返回布尔值True或False。注意,实际进行的比较运算因类型而异。换言之,数字类型根据数值的大小和符号比较,字符串按照字符序列值进行比较,等等。
5+4j >= 2-3j
True
'abc' < 'xyz'
True
[3, 'abc'] == ['abc', 3]
False
['abc', 3] == ['abc', 3]
True
3 < 4 < 7 # same as (3 < 4) and (4 < 7)
True
作为对值比较的补充,Python也支持对象本身的比较。对象可以被赋值到另一个变量(通过引用)。因为每个变量都指向同一个(共享的)数据对象,只要任何一个引用发生改变,该对象的其他引用也会随之改变。
例1:foo1和foo2指向相同的对象
foo1 = foo2 = 4.3
例2:foo1和foo2指向不同的对象
foo1 = 4.3
foo2 = 4.3
每个对象都天生具有一个计数器,记录它自己的引用次数。这个数目表示有多少个变量指向该对象。Python提供了 is
和is not
操作符来测试两个变量是否指向同一个对象。像下面这样执行一个测试。
a is b
这个表达式等价于下面的表达式。
id(a) == id(b)
在下面这个例子里,我们创建了一个变量,然后将第二个变量指向同一个对象。
a = [5, 'hat', -9.3]
b = a
a is b
True
a is not b
False
整型对象和字符串对象是不可变对象,所以Python会很高效地缓存它们。这会造成我们认为Python应该创建新对象时,它却没有创建新对象的假象。请看下面的例子。
a = 1
id(a)
8402824
b = 1
id(b)
8402824
a is b
True
c = 1.0
id(c)
8651220
d = 1.0
id(d)
8651204
c is d
False
布尔逻辑操作符and、or和not都是Python关键字,这些操作符的优先级按从高到低的顺序依次为not, and, or。not操作符拥有最高优先级,只比所有比较操作符低一级。and和or操作符则相应地再低一级。
x, y = 3.1415926536, -1024
not (x is y)
True
函数 | 功能 |
---|---|
cmp(obj1, obj2) | 比较obj1和obj2,根据比较结果返回整型i: |
i < 0 if obj1 < obj2 | |
i > 0 if obj1 > obj2 | |
i = 0 if obj1 == obj2 | |
repr()或'obj' | 返回一个对象的字符串表示 |
str(obj) | 返回对象适合可读性好的字符串表示 |
type(obj) | 得到一个对象的类型,并返回相应的type对象 |
内建函数str()和repr()或反引号操作符(``)可以方便地以字符串的方式获取对象的内容、类型、数值属性等信息。str()函数得到的字符串可读性好,而repr()函数得到的字符串通常可以用来重新获得该对象,通常情况obj==eval(repr(obj)) 这个等式是成立的。这两个函数接受一个对象作为其参数,返回适当的字符串。 |
|
尽管str(),repr()和``运算在特性和功能方面都非常相似,事实上repr()和“做的是完全一样的事情,它们返回的是一个对象的“官方“字符串表示,也就是说绝大多数情况下可以通过求值运算(使用内建函数eval())重新得到该对象,但str()则有所不同。str()致力于生成一个对象的可读性好的字符串表示,它的返回结果通常无法用于eval()求值,但很适合用于print语句输出。需要再次提醒的是,并不是所有repr()返回的字符串都能够用eval()内建函数得到原来的对象。 | |
Python不支持方法或函数重载,因此你必须自己保证调用的就是你想要的函数或对象。 |
下表列出了所有操作符和内建函数,其中操作符顺序是按优先级从高到低排列的。
操作符/函数 | 描述 | 结果 |
---|---|---|
字符串表示 | ||
`` | 对象的字符串表示 | str |
内建函数 | ||
cmp(obj1, obj2) | 比较两个对象 | int |
repr(obj) | 对象的字符串表示 | str |
str(obj) | 对象的字符串表示 | str |
type(obj) | 检测对象的类型 | type |
值比较 | ||
< | 小于 | bool |
> | 大于 | bool |
<= | 小于或等于 | bool |
>= | 大于或等于 | bool |
== | 等于 | bool |
!= | 不等于 | bool |
<> | 不等于 | bool |
对象比较 | ||
is | 是 | bool |
is not | 不是 | bool |
布尔操作符 | ||
not | 逻辑非 | bool |
and | 逻辑与 | bool |
or | 逻辑或 | bool |
数据类型 | 存储模型 | 更新模型 | 访问模型 |
---|---|---|---|
数字 | 标量/原子 | 不可更改 | 直接访问 |
字符串 | 标量/原子 | 不可更改 | 顺序访问 |
列表 | 容器 | 可更改 | 顺序访问 |
元组 | 容器 | 不可更改 | 顺序访问 |
字典 | 容器 | 可更改 | 映射访问 |
- 所有的Python容器对象都能够容纳不同类型的对象
数字提供了标量贮存和直接访问。它是不可更改类型,也就是说变更数字的值会生成新的对象。
Python支持多种数字类型:整型、长整型、布尔型、双精度浮点型、十进制浮点型和复数。
按照Python的法则,你无法真正删除一个数值对象,你仅仅是不再使用它而已。如果你确实想删除一个数值对象的引用,使用del语句即可)。删除对象的引用之后,你就不能再使用这个引用(变量名),除非你给它赋一个新值。如果试图使用一个已经被删除的对象引用,会引发NameError异常。
a = 12
del a
- 布尔型:
该类型的取值范围只有两个值,也就是布尔值True和布尔值False。 - 标准整型:
Python的标准整型类型是最通用的数字类型。在大多数32位机器上,标准整型类型的取值范围是-231到231-1,也就是-2 147 483 648〜2 147 483 647。如果在64位机器上使用64位编译器编译Python,那么在这个系统上的整型将是64位。
Python标准整型类型等价于C的(有符号)长整型。整型一般以十进制表示,但是Python也支持八进制或十六进制来表示整型。如果八进制整型以数字“0”开始,十六进制整型则以“0x”或“0X”幵始。 - 长整型:
关于Python长整型类型我们必须要提的是,请不要将它和C或其他编译型语言的长整型类型混淆。那些语言的长整型典型的取值范围是32位或64位。Python的长整型类型能表达的数值仅仅与你的机器支持的(虚拟)内存大小有关,换句话说,Python能轻松表达很大的整型。 长整型类型是标准整型类型的超集,当你的程序需要使用比标准整型类型更大的整型时,长整型类型就有用武之地了。在一个整型值后面加个L (大写或小写都可以),表示这个整型是长整型。这个整型可以是十进制、八进制、或十六进制。
虽然我们不能让一个数字和一个字符串相加,但Python确实支持不同的数字类型相加。
- 如果有一个操作数是复数,另一个操作数被转换为复数;
- 否则,如果有一个操作数是浮点型,另一个操作数被转换为浮点型;
- 否则,如果有一个操作数是长整型,则另一个操作数被转换为长整型;
- 否则,两者必然都是普通整型,无须类型转换。
字符串A+字符串B并不表示加法操作,它表示的是把这两个字符串连接起来,生成一个新的字符串。
操作符 | 2.1x及更早版本 | 2.2及更新版本(No import division) | 2.2及更新版本(import division) |
---|---|---|---|
/ | 传统除 | 传统除 | 真正除 |
// | 无 | 地板除 | 地板除 |
- 传统除:如果是整型除法,传统除法会舍去小数部分,返回一个整型(地板除)。如果操作数之一是浮点型,则执行真正的除法。
- 真正除:除法运算总是返回真实的商,不管操作数是整型还是浮点型。
- 地板除:除法不管操作数为何种数值类型,总是舍去小数部分,返回数字序列中比真正的商小的最接近的数字。
- import division:from future import division
- 浮点型:商取小于等于精确值的最大整型的乘积之差。即:x-(math.floor(x/y)*y)或者
- 复数:取余的定义类似于浮点型,不同之处在于商仅取其实数部分,即x-(math.floor<(x/y).real)*y)。
所谓工厂函数就是指这些内建函数都是类对象,当你调用它们时,实际上是创建了一个类实例。不过不用担心,这些函数的使用方法并没有什么改变。虽然他们看上去有点像函数,实质上他们是类。当你调用它们时,实际上是生成了该类型的一个实例,就像工厂生产货物一样。如:int()、type()、list()等。
函数 | 功能 |
---|---|
abs(num) | 返回num的绝对值 |
coercr(num1, num2) | 将num1和num2转换为同一类型,然后以一个元组的形式返回 |
divmod(num1, num2) | 除法-取余运算的结合。返回一个元组(num1/num2, num1%num2),对浮点型和复数的商进行舍入(复数仅取实数部分的商) |
pow(num1, num2, mod=1) | 取num1的num2次方,如果提供mod参数,则计算结果再对mod进行取余运算 |
round(flt, ndig=0) | 接受一个浮点型flt并对其四舍五入,保存ndig位小数,若不提供ndig参数,则默认小数点后0位 |
abs()函数: | |
abs()返回给定参数的绝对值。如果参数是一个复数,那么就返回math.sqrt(num.real2+num.imag2)。 | |
coerce()函数: |
- 如果有一个操作数是复数, 另一个操作数被转换为复数。
- 否则,如果有一个操作数是浮点数, 另一个操作数被转换为浮点数。
- 否则, 如果有一个操作数是长整数,则另一个操作数被转换为长整数;
- 否则,两者必然都是普通整数,无须类型转换。
divmod()函数:
divmod()内建函数把除法和取余运算结合起来,返回一个包含商和余数的元组。对整型来说,它的返回值就是地板除和取余操作的结果。对浮点型来说,返回的商部分是math.floor(num1/num2),对复数来说,商部分是math.floor((num1/num2).real)。
pow()函数:
内建函数pow()还接受第三个可选的参数,即一个余数参数。如果有这个参数的,pow()先进行指数运算,然后将运算结果和第三个参数进行取余运算。
round()函数:
内建函数mund()用于对浮点型进行四舍五入运算。它有一个可选的小数位数参数。如果不提供小数位参数,它返回与第一个参数最接近的整型(但仍然是浮点类型)。第二个参数告诉round函数将结果精确到小数点后指定位数。
- 函数int()直接截去小数部分(返回值为整型)。
- 函数floor()得到最接近原数但小于原数的整型(返回值为浮点型)。
- 函数round()得到最接近原数的整型(返回值为浮点型)。
abs(1.2-2.1j)
2.41867732449
coerce(1.3, 134L)
(1.3, 134.0)
divmod(10, 2.5)
(4.0, 0.0)
pow(2, 5)
32
round(3)
3.0
round(3.49)
3.0
round(3.49, 1)
3.5
round(-3.5)
-4.0
round(-3.4)
-3.0
int(-1.7)
-1.0
floor(-1.7)
-2.0
round(-1.7)
-2.0
- 进制转换函数在:
除了十进制标准,Python整型也支持八进制和十六进制整型。除此之外,Python还提供了两个内建函数来返回字符串表示的八进制和十六进制整型,它们分别是
oct()
和hex()
。它们都接受一个整型(任意进制的)对象,并返回一个对应值的字符串对象。 - ASCII转换函数:
Python也提供了 ASCII(美国标准信息交换码)码与其序列值之间的转换函数。每个字符对应一个唯一的整型(0〜255)。对所有使用ASCII表的计算机来说,这个数值是不变的。这保证了不同系统之间程序行为的一致性。函数
chr()
接受一个单字节整型值,返回一个字符串,其值为对应的字符。函数ord()
则相反,它接受一个字符,返回其对应的整型值。
不能混用十进制浮点型和普通浮点型,可以通过字符串或其他十进制数创建十进制浮点型,且必须导入decimal模块以便使用Decimal类。
from decimal import Decimal
dec = Decimal(.1)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: Cannot convert float to Decimal. First convert the float to a string
dec = Decimal('.1')
dec
Decimal('0.1')
print dec
0.1
dec + 1.0
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'Decimal' and 'float'
dec + Decimal('1.0')
Decimal('1.1')
print dec + Decimal('1.0')
1.1
数字类型相关模块
模块 | 介绍 |
---|---|
decimal | 十进制浮点运算类Decimal |
array | 高效数值数组(字符、整型、浮点型等) |
math/cmath | 标准C库数学运算函数,常规数学运算在math模块,复数运算在cmath模块 |
operator | 数字操作符的函数实现,比如operator.sub(m, n)等价于m - n |
random | 多种伪随机数生成器 |
核心模块:random
当你的程序需要随机数功能时,random模块就能派上用场。该模块包含多个伪随机数发生器,它们均以当前的时间戳为随机数种子。这样只要载入这个模块就能随时开始工作。下面列出了该模块中最常用的函数。
函数 | 描述 |
---|---|
randint() | 两个整型参数,返回二者之间的随机整型 |
randrange() | 它接受和range()函数一样的参数,随机返回range([start,]stop[,step])结果的一项 |
uniform() | 几乎和randint()一样, 不过它返回的是二者之间的一个浮点型(不包括范围上限) |
choice() | 随机返回给定序列的一个元素 |
-
random()方法返回随机生成的一个实数,它在[0,1)范围内。
-
random()是不能直接访问的,需要导入random模块,然后通过random静态对象调用该方法。
-
randint()使用方法:
import random random.randint(0,9) 4
函数返回数字 N ,N 为 a 到 b 之间的数字(a <= N <= b),包含 a 和 b。
对高级的数字科学计算应用来说,你会对著名的第三方包Numeric(NumPy)和SciPy感兴趣。关于这两个包的详细请访问下面的网址。
http://numeric.scipy.org/
http://scipy.org/