您的位置:首页 > 编程语言 > Python开发

Python核心编程 课后习题-第四章

2014-11-30 00:00 351 查看
摘要: Python核心编程第四章课后习题 e

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

答:身份、类型、值
1)身份:每一个对象都有惟一的身份标识自己。任何对象的身份都可以通过内建函数 id( ) 得到。这个值可以被认为是该对象的内存地址。
2)类型:对象的类型决定了该对象可以保存什么类型的值,可以进行什么操作,以及遵循什么规则。可以通过内建函数 type( ) 查看Python对象的类型。[ 因为在Python 中类型也是对象,所以type( )返回大是对象而不是简单大字符串 ]
3)值:对象表示的数据项。


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

对象创建成功之后,其值不可以更新,这些对象称为不可变对象 ; 而另一类对象创建后,其值允许改变,称为可变对象。

可变类型:列表、字典
不可变类型:数字、字符串、元组

摘自:http://fightlife2012.blog.163.com/blog/static/203582288201292324613791/
如: i = 0;
i = i + 1;
实际其引用的对象已经被改变,利用内置函数id()可以明确获悉其引用对象的id值改变
即可以理解为 i = 0时 0为创建了一个整形对象, 当 i = i + 1后,i + 1又新创建了一个整形对象,新创建的对象被关联到原来的变量名,原来引用的整形对象被丢弃,由于原来对象的引用计数将会归0,垃圾回收器在适当时机进行回收。




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

答:顺序访问类型:字符串、列表、元组。映射访问的类型:字典。

序列类型是指容器内的元素按从 0 开始的索引顺序访问。一次可以访问一个元素或多个元

素, 也就是大家所了解的切片(slice)。字符串, 列表和元组都归到这一类。

映射类型类似序列的索引属性,不过它的索引并不使用顺序的数字偏移量取值, 它的元素

无序存放, 通过一个唯一的 key 来访问, 这就是映射类型, 它容纳的是哈希键-值对的集合。


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

答:用法:type(object)

type() 接受一个对象做为参数,并返回它的类型。它的返回值是一个类型对象。

>>> type(type(42))
<type 'type'>


所有类型对象的类型都是 type,它也是所有 Python 类型的根和所有 Python 标准类

的默认元类(metaclass)。

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

答:

内建函数 str() 和 repr() 或反引号运算符(``) 可以方便的以字符串的方式获取对象的

内容、类型、数值属性等信息。

str()函数得到的字符串可读性好, 输出对人机友好。其返回值通常无法用于eval求值

而 repr()函数得到的字符串通常可以用eval来重新获得该对象

repr( ) <==> (` `)

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

答:

对于type(a) == type(b),比较操作符 == 是对两边对象的值进行比较的,也就是说,比较的是对象的数值而不是对象本身。

对于 type(a) is type(b),等价于id(type(a)) == id(type(b)),其两边都指向一个共享的数据对象等式才成立。

这样做是为了优化代码性能。我们用对象身份的比较来替代对象值的比较。如果对象是不同的,那意味着原来的变量一定是不同类型的。(因为每一个类型只有一个类型对象),我们就没有必要去

检查(值)了。 一次这样的调用可能无关紧要,不过当很多类似的代码遍布在应用程序中的时候,就有影响了。

isinstance( )函数,由名字可以知道,是否是某个类型的实例,用于判断对象的类型:

举个例子:

#!/usr/bin/env python

def displayNumType(num):
print num, 'is',
if isinstance(num, (int, long, float, complex)):
print 'a number os type:', type(num).__name__
else:
print 'not a number at all!!!'

dispalyNumType(-66)
dispalyNumType(99999999999999999999999999L)
dispalyNumType(98.6)
dispalyNumType(-5.2+1.9j)
dispalyNumType('xxx')


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

答:



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

答:1)相同点:列表和元组的存储模型都是容器,访问模型都是顺序访问

2)不同点:两者的更新模型不同,列表的更新模型是可更改的,即可变的(mutable),而元组的更新模型是不可更改的,即不可变的(immutable)

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

a = 10

b = 10

c = 100

d = 100

e = 10.0

f = 10.0

请问下面各表达式的输出是什么?

(a) a is b

(b) c is d

(c) e is f

答: (a) True

(b) True

(v) False

为什么会这样:

整数对象和字符串对象是不可变对象,所以 Python 会很高效的缓存它们。这会造成我们认为 Python 应该创建新对象时,它却没有创建新对象的假象。

我们通过查看对象的身份来看看发生了什么





Python 仅缓存简单整数,因为它认为在 Python 应用程序中这些小整数会经常被用到。Python 2.3 中决定,在预定义缓存字符串表之外的字符串,如果不再有任何引用指向它,那这个字符串将不会被缓存。也就是说, 被缓存的字符串将不会象以前那样永生不灭,对象回收器一样可以回收不再被使用的字符串。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: