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

原创
2014/11/30 23:47
阅读数 210

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 中决定,在预定义缓存字符串表之外的字符串,如果不再有任何引用指向它,那这个字符串将不会被缓存。也就是说, 被缓存的字符串将不会象以前那样永生不灭,对象回收器一样可以回收不再被使用的字符串。


展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部