1.5怎样实现一个按优先级排序的队列?并且在这个队列上面每次pop操作总是返回优先级最高的那个元素
带有双下划线的方法,会在需要被调用的位置自动被调用
带有单下划线的变量是私有变量
下面利用类heapq模块实现一个简单的优先级队列:
import heapq
class PriorityQUeue:
def __init__(self):
self._queue = []
self._index = 0
def push(self,item,priority):
heapq.heappush(self._queue,(-priority,self._index,item))
self._index +=1
def pop(self):
return heapq.heappop(self._queue)[-1]
下面是它的使用方式:
class Item:
def __init__(self,name):
self.name = name
def __repr__(self):
return 'Item({!r})'.format(self.name)
>>>q = PriorityQueue()
>>>q.push(Item('foo'),1)
>>>q.push(Item('bar'),5)
>>>q.push(Item('spam'),4)
>>>q.push(Item('grok'),1)
>>>q.pop()
Item('bar')
>>> q.pop()
Item('spam')
>>> q.pop()
Item('foo')
>>> q.pop()
Item('grok')
仔细观察可以发现,第一个 pop() 操作返回优先级最高的元素。 另外注意到如果两个有
着相同优先级的元素( foo 和 grok ),pop操作按照它们被插入到队列的顺序返回的
__repr__()函数的作用
str()一般是将数值转成字符串。
repr()是将一个对象转成字符串显示,注意只是显示用,有些对象转成字符串没有直接的意思。如list,dict使用str()是无效的,但使用repr可以,这是为了看它们都有哪些值,为了显示之用。
Python中这个_repr_函数,对应repr(object)这个函数,返回一个可以用来表示对象的可打印字符串:
-
尝试生成这样一个字符串,将其传给 eval()可重新生成同样的对象 ;
-
否则,生成用尖括号包住的字符串,包含类型名和额外的信息(比如地址) ;
-
一个类(class)可以通过 __repr__() 成员来控制repr()函数作用在其实例上时的行为。
代码例子如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
>>>
class
D(
object
):
...
def
__str__(
self
):
...
return
"a __str__"
...
def
__repr__(
self
):
...
return
"a __repr__"
...
>>> dr
=
D()
>>>
print
dr
a __str__
>>> dr
a __repr__
>>>
"%s"
%
dr
'a __str__'
>>>
"%r"
%
dr
'a __repr__'
|