专栏名称: Python开发者
人生苦短,我用 Python。伯乐在线旗下账号「Python开发者」分享 Python 相关的技术文章、工具资源、精选课程、热点资讯等。
目录
相关文章推荐
Python初级入门到精通  ·  Python-finally语句与应用 ·  14 小时前  
Python爱好者社区  ·  90W,确实可以封神了! ·  2 天前  
Python开发者  ·  刚刚,OpenAI正式发布o3-pro!奥特 ... ·  2 天前  
Python大全  ·  用Python实现智能乒乓球游戏! ·  2 天前  
Python大全  ·  用Python实现智能乒乓球游戏! ·  2 天前  
51好读  ›  专栏  ›  Python开发者

让你的 Python 代码优雅又地道

Python开发者  · 公众号  · Python  · 2017-09-15 17:48

正文

请到「今天看啥」查看全文


) :

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 ,







请到「今天看啥」查看全文


推荐文章
Python初级入门到精通  ·  Python-finally语句与应用
14 小时前
Python爱好者社区  ·  90W,确实可以封神了!
2 天前
Python大全  ·  用Python实现智能乒乓球游戏!
2 天前
Python大全  ·  用Python实现智能乒乓球游戏!
2 天前
广东基础研究  ·  省杰青项目|高通量微流控芯片
7 年前
何凯文考研英语  ·  新的栏目,新的开始!
7 年前