正文
)
:
print
colors
自定义排序顺序
colors
=
[
'red'
,
'green'
,
'blue'
,
'yellow'
]
def compare_length
(
c1
,
c2
)
:
if
len
(
c1
)
<
len
(
c2
)
:
return
-
1
if
len
(
c1
)
>
len
(
c2
)
:
return
1
return
0
print sorted
(
colors
,
cmp
=
compare_length
)
更好的方法
print sorted(colors, key=len)
第一种方法效率低而且写起来很不爽。另外,Python 3已经不支持比较函数了。
调用一个函数直到遇到标记值
blocks
=
[]
while
True
:
block
=
f
.
read
(
32
)
if
block
==
''
:
break
blocks
.
append
(
block
)
更好的方法
blocks
=
[]
for
block
in
iter
(
partial
(
f
.
read
,
32
),
''
)
:
blocks
.
append
(
block
)
iter接受两个参数。第一个是你反复调用的函数,第二个是标记值。
译注:这个例子里不太能看出来方法二的优势,甚至觉得partial让代码可读性更差了。方法二的优势在于iter的返回值是个迭代器,迭代器能用在各种地方,set,sorted,min,max,heapq,sum……
在循环内识别多个退出点
def find
(
seq
,
target
)
:
found
=
False
for
i
,
value
in
enumerate
(
seq
)
:
if
value
==
target
:
found
=
True
break
if
not
found
:
return
-
1
return
i
更好的方法
def find
(
seq
,
target
)
:
for
i
,
value
in
enumerate
(
seq
)
:
if
value
==
target
:
break
else
:
return
-
1
return
i
for执行完所有的循环后就会执行else。
译注:刚了解for-else语法时会困惑,什么情况下会执行到else里。有两种方法去理解else。传统的方法是把for看作if,当for后面的条件为False时执行else。其实条件为False时,就是for循环没被break出去,把所有循环都跑完的时候。所以另一种方法就是把else记成nobreak,当for没有被break,那么循环结束时会进入到else。
遍历字典的key
d
=
{
'matthew'
:
'blue'
,
'rachel'
:
'green'
,
'raymond'
:
'red'
}
for
k
in
d
:
print
k
for
k
in
d
.
keys
()
:
if
k
.
startswith
(
'r'
)
:
del
d
[
k
]
什么时候应该使用第二种而不是第一种方法?当你需要修改字典的时候。
如果你在迭代一个东西的时候修改它,那就是在冒天下之大不韪,接下来发生什么都活该。
d.keys()把字典里所有的key都复制到一个列表里。然后你就可以修改字典了。
注意:如果在Python 3里迭代一个字典你得显示地写:list(d.keys()),因为d.keys()返回的是一个“字典视图”(一个提供字典key的动态视图的迭代器)。详情请看文档。
遍历一个字典的key和value
# 并不快,每次必须要重新哈希并做一次查找
for
k
in
d
:
print
k
,
'--->'
,
d
[
k
]
# 产生一个很大的列表
for
k
,
v
in
d
.
items
()
:
print
k
,
'--->'
,
v
更好的方法
for
k
,
v
in
d
.
iteritems
()
:
print
k
,
'--->'
,
v
iteritems()更好是因为它返回了一个迭代器。
注意:Python 3已经没有iteritems()了,items()的行为和iteritems()很接近。详情请看文档。
用key-value对构建字典
names
=
[
'raymond'
,
'rachel'
,
'matthew'
]
colors
=
[
'red'
,
'green'
,
'blue'
]
d
=
dict
(
izip
(
names
,