Python中的返回值问题!!!

如下例子:
print sorted(4,3,2,1) 返回一个列表,并打印
print revered(1,2,3,4) 返回一个列表对象,并打印列表对象名字的字符串
我不是很理解这里,一个对象不就代表指向内存空间的那块代码吗?那既然是引用的地址空间打印出来的不就是代码的返回值吗!!
返回列表和返回列表对象的区别实在是有点不理解.. 请高手解决

首先,代码有误,你想调用的应该是
sorted([4,3,2,1])
reversed([4,3,2,1])

然后,你所说的reversed的返回值类型也不正确。
sorted返回的是list,reversed返回的是iterator。
list你应该很熟悉了。iterator和list是完全不同的东西。简单的说iterator只是提供一个接口,每次迭代可以产生一个值,到没有值为止。iterator在很多语言里面都有实现。在python里面主要用在for循环和list comprehension。

iterator和list/tuple/dict/set等容器的关系:
1.python内置的容器类几乎都实现了iterator接口。
显式获取某个容器的iterator可以调用iter函数:
l = [1,2,3,4]
i = iter(l)
//现在i就是一个list iterator。可以用来遍历l这个list.
i.next() # 1
i.next() # 2
//每一个iterator都必须实现next方法。并且在没有元素时抛出StopIteration异常。

在for语句和list comprehension中,都是隐式调用了这个函数。所以可以直接
for obj in some_container:
pass

2.某些容器可以通过iterator进行初始化,比如list
l = [1,2,3,4]
i = iter(l)
l2 = list(i)

最后,没有列表和列表对象这种说法。这两者一般都是指列表对象(instance of the type list)。如果你是想说列表类(the list type)本身,可以这样得到:
type([])
或者
[].__class__追问

不好意思,写错了
不用跟我说 这两个方法的区别和作用,跟我说说这两个个方法在内存中的指针关系,就行了..我想知道的就这个 还有迭代器 是干嘛的不是很清楚

追答

>>跟我说说这两个个方法在内存中的指针关系
这个问题与指针没有关系。Python里面也没有指针概念。
迭代器与指针也没有什么关系。

>>还有迭代器 是干嘛的不是很清楚
关于迭代器,百度一下,你就知道。高级一点的C++的教材里面应该也会讲。
我只能说迭代器是拥有统一接口的,可用来逐一产生数据的object. 一般用于循环。
举个python的例子,比如我有一个list, 我可以设计一个迭代器是正序遍历所有元素,也可以设计一个迭代器是逆序遍历所有元素,也可以设计一个剔除所有负数的迭代器,也可以设计每隔一个元素提取一个元素的迭代起,也可以设计一个迭代器是按从小到大的顺序逐一返回所有元素等等。这些迭代器都不是list,尽管他们可以返回list的某些/全部元素。

要真想懂这个,必须你自己设计并实现2-3个迭代器才能真正理解。这个概念与具体的程序语言关系不大。C++/C/Java/Python都可以实现迭代器。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-12-03
我举个例子说明一下吧

a = sorted( ( 1 ,2 ,3 ,4 ) )
b = reversed( ( 1 ,2 ,3 ,4 ) )
print( type( a ) ,a )
print( type( b ) ,b )

打印的结果是
<class 'list'> [1, 2, 3, 4]
<class 'reversed'> <reversed object at 0x00DB7130>

第一个sorted我输入的参数是tuple,返回的是一个list类型的对象,所有已经数据都进行计算好,所以print输出时调用的是list的__str__接口.

第二个reversed我输入的同样是一个tuple,但是返回的数据却并不是list,而是一个reversed类型的对象,而这个对象没有实现__str__接口,因此print调用的是基类object的__repr__接口,打印的是对象的信息,而是对象的信息.

你提的问题有点模糊,不应该是"列表和列表对象",应该是"列表和迭代器"吧.
打印reversed对象的属性
__class__
__delattr__
__doc__
__eq__
__format__
__ge__
__getattribute__
__gt__
__hash__
__init__
__iter__
__le__
__length_hint__
__lt__
__ne__
__new__
__next__
__reduce__
__reduce_ex__
__repr__
__setattr__
__sizeof__
__str__
__subclasshook__

会发现reversed并不支持索引,而是支持__iter__和__next__,这个就是一个迭代器,迭代器的优点就是不必计算所有的数据,节省内存和运算时间,因为reversed的语义是将原来的序列反转,所以要求输入的参数的序列是已知的.
而sorted的输入参数和输出列表的顺序没有直接的关联,因此需要转换成list,计算全部的数据后才能返回,不能返回迭代器.

这个就是两个函数的差别.

再举个例子,如果在sorted和reversed中的参数输入迭代器的话会发生什么呢

a = sorted( i for i in range( 4 ) )
b = reversed( i for i in range( 4 ) )

[0, 1, 2, 3]
Traceback (most recent call last):
File "1.py", line 87, in <module>
b = reversed( i for i in range( 4 ) )
TypeError: argument to reversed() must be a sequence

可以看到sorted是可以正常返回的,但reversed就不行,因为reversed不能计算迭代器的数据顺序.追问

不用跟我说 这两个方法的区别和作用,跟我说说这两个个方法在内存中的指针关系,就行了..我想知道的就这个 还有迭代器 是干嘛的不是很清楚

相似回答