本章主题
Python对象
内建类型
标准类型运算符 值的比较
对象身份比较
布尔类型
标准类型内建函数 标准类型总览
各种类型
不支持的类型

学习笔记

所有的 Python 对像都拥有三个特性:身份,类型和值。三个特性在对象创建的时候就被赋值,除了值之外,其它两个特性都是只读的.  身份--使用内建函数 id()查看;  类型--内建函数 type(); 值--对象表示的数据项

Python内建类型

      标准、

type、Null

      内部类型---代码、帧、跟踪记录、切片、省略、Xrange

              代码对象:调用内建函数 compile(),可以被 exec 命令或 eval()内建函数来执行;

              帧对象:表示 Python 的执行栈帧;

              跟踪记录 对象:当异常发生时,一个包含针对异常的栈跟踪信息的跟踪记录对象被创建

              当使用 Python 扩展的切片语法时,就会创建切片对象;

              省略对象用于扩展切片语法中,起记号作用;唯一的名字 Ellipsis, 它的布尔值始终为 True

              Xrange对象用于需要节省内存使用或 range()无法完成的超大数据集场合。

 

类就是类型,实例是对应类型的对象

布尔值介绍

所有标准对象均可用于布尔测试,同类型的对象之间可以比较大小。每个对象天生具有布 尔 True 或 False 值。空对象、值为零的任何数字或者 Null 对象 None 的布尔值都是 False。下列对象的布尔值是 False。

None
False (布尔类型)
所有的值为零的数

0 (整型)
(浮点型)
0L (长整型)
0.0+0.0j (复数) "" (空字符串) [] (空列表)

() (空元组)
{} (空字典)
值不是上面列出来的任何值的对象的布尔值都是 True,例如 non-empty、non-zero 等等。

用户创建的类实例如果定义了 nonzero(__nonzero__())或 length(__len__())且值为 0,那 么它们的布尔值就是 False。

 

标准类型运算符

所有的内建类型均支持比较运算,比较运算返 回布尔值 True 或 False

Python 仅缓存简单整数

布尔逻辑运算符 and, or 和 not 都是 Python 关键字。not优先级比较高

Python 提供了一些内建函数用于这些基本对象类型: cmp(), repr(), str(), type(),反引号运算符(``)。python3 已经舍弃了cmp()函数的使用,所以使用时会报错,在python3中我们可以使用operator模块中的函数实现该功能。

import operator
operator.lt(a,b)
 False

访问模型中共有三种访问方式:直接存取,顺序,和映射。

 

不支持的类型

Python 没有 char 或 byte 类型来保存单一字符或 8 比特整数。你可以使用长度为 1 的字 符串表示字符或 8 比特整数。

Python 的整数实现等同于 C 语言的长整数。

Python 的浮点类型实际上是 C 语言的双精度浮 点类型。Python 还有一种十进制浮点数类型 Decimal, 不过你必须导入 decimal 模块才可以使用它。浮点数总是不精确的。Decimals 则拥有任意的精度。在处理金钱这类确定的值时, Decimal 类型就很有用。 在处理重量,长度或其它度量单位的场合, float 足够用了。

 

 

4.10 练习

4–1. Python 对象。与所有 Python 对象有关的三个属性是什么?请简单的描述一下。

身份、类型、值。

4–2. 类型。不可更改(immutable)指的是什么?Python 的哪些类型是可更改的 (mutable),哪些不是?

如果对象支持更新操作,那么它的值就可以改变,否则它的值也是只读的。对象的值是否 可以更改被称为对象的可改变性(mutability)

数字 Scalar 不可更改 直接访问 

字符串 Scalar 不可更改 顺序访问 

列表 Container 可更改 顺序访问 

元组 Container 不可更改 顺序访问 

字典 Container 可更改 映射访问

不可更改指的是一旦修改,原有的变量会回收,重新分配ID,然后赋新值;而可更改,赋新值后,id并不发生改变。

4–3.  类型。哪些 Python 类型是按照顺序访问的,它们和映射类型的不同是什么?

对非容器类型可以直接访问。所有的数值类型都归到这一类。

序列类型是指容器内的元素按从 0 开始的索引顺序访问。一次可以访问一个元素或多个元 素, 也就是大家所了解的切片(slice)。 字符串, 列表和元组都归到这一类

映射类型类似序列的索引属性,不过它的索引并不使用顺序的数字偏移量取值, 它的元素 无序存放, 通过一个唯一的 key 来访问, 这就是映射类型, 它容纳的是哈希键-值对的集合。

直接访问 数字
顺序访问 字符串、列表、元组
映射访问 字典

4–4.  type()。内建函数 type()做什么?type()返回的对象是什么?

内建函数 type()可以查看python对象的类型。type()返回的对象是class类型

4–5. str() 和 repr()。内建函数 str()与 repr()之间的不同是什么?哪一个等价于反引号(``)运算符?。

print 语句调用 str()函数显示对象,而交互式解释器则调用 repr()函数来显示对象.repr() 输出对 Python 比较友好, 而 str()的输出对人比较友好.

repr()=反引号(``)运算符.

str()函数得到的字符串可读性好, 而 repr()函数得到的字符 串通常可以用来重新获得该对象, 通常情况下 obj == eval(repr(obj)) 这个等式是成立的。

4–6. 对象相等。您认为 type(a) == type(b)和 type(a) is type(b)之间的不同是什么?为什么会选择后者?函数 isinstance()与这有什么关系?

type(a) == type(b)-----------判断同类型对象是否相等;
type(a) is type(b) 等于id(a) == id(b)---对象值的比较;

判断对象类型时也使用 isinstance(),  if isinstance(num, int) 等价于 if type(num) is IntType

4–7. 内建函数 dir()。在第二章的几个练习中,我们用内建函数 dir()做了几个实验,它接受一个对象,然后给出相应的属性。请对 types 模块做相同的实验。记下您熟悉的类型, 包括您对这些类型的认识,然后记下你还不熟悉的类型。在学习 Python 的过程中,你要逐步将 “不熟悉”的类型变得“熟悉”起来。

执行 dir(sys) , 就可以看到 sys模块的所有属性

dir(type)
['__abstractmethods__', '__base__', '__bases__', '__basicsize__', '__call__', '__class__', '__delattr__', '__dict__', '__dictoffset__', '__dir__', '__doc__', '__eq__', '__flags__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__instancecheck__', '__itemsize__', '__le__', '__lt__', '__module__', '__mro__', '__name__', '__ne__', '__new__', '__prepare__', '__qualname__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasscheck__', '__subclasses__', '__subclasshook__', '__text_signature__', '__weakrefoffset__', 'mro']
 

dir(1)
['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__', '__delattr__', '__dir__', '__divmod__', '__doc__', '__eq__', '__float__', '__floor__', '__floordiv__', '__format__', '__ge__', '__getattribute__', '__getnewargs__', '__gt__', '__hash__', '__index__', '__init__', '__init_subclass__', '__int__', '__invert__', '__le__', '__lshift__', '__lt__', '__mod__', '__mul__', '__ne__', '__neg__', '__new__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__round__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__', 'bit_length', 'conjugate', 'denominator', 'from_bytes', 'imag', 'numerator', 'real', 'to_bytes']
dir(str)
['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isascii', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']
 

4–8. 列表和元组。列表和元组的相同点是什么?不同点是什么?

元组可以看成是 只读的列表。列表可更改顺序访问,元组不可更改。

4–9. 练习,给定以下赋值:

a = 10
b = 10
c = 100
d = 100
e = 10.0
f = 10.0 请问下面各表达式的输出是什么?为什么?

1. (a)  a is b
2. (b)  c is d
3. (c)  e is f
4. true
5. true
6. false
  1. 整数对象和 字符串对象是不可变对象,所以Python会很高效的缓存它们.a 和 b 指向了相同的整数对象,但是 e 和 f 并没有指向相同的浮点数对象.