代码改变世界

代码这样写更优雅(1)

2017-06-22 13:35  很大很老实  阅读(327)  评论(0编辑  收藏  举报

这个文章是转载的,通过优雅的代码,可以提现python的优美和我们的能力,后续不定期的更新:

1)变量交换:

a,b=b,a

2)循环遍历:

一般人都写:for i in range(6):,实际上,这么写算不错了,但是,更优美的写法:

for i in xrange(6):
    (print i)

这个所谓更优美,就是在python2中,在3中,都是range了

 

3)带有索引位置的集合遍历:

colors = ['red', 'green', 'blue', 'yellow']
for i, color in enumerate(colors):
    print (i, '--->', color)

 

如果要统计文件的行数,可以这样写:

count = len(open(filepath, 'r').readlines())
  • 1
  • 1

这种方法简单,但是可能比较慢,当文件比较大时甚至不能工作。

可以利用enumerate():

count = -1 
for index, line in enumerate(open(filepath,'r')): 
    count += 1

4) 打开和关闭文件:

with open('data.txt') as f:
    data = f.read()
5)字符串链接:
names = ['raymond', 'rachel', 'matthew', 'roger',
         'betty', 'melissa', 'judith', 'charlie']
print (', '.join(names))

join 是一种更加高效的字符串连接方式,使用 + 操作时,每执行一次+操作就会导致在内存中生成一个新的字符串对象,遍历8次有8个字符串生成,造成无谓的内存浪费。而用 join 方法整个过程只会产生一个字符串对象。

6)列表推导式:

result=
[i*2 for i in xrange(10)]

等价于:
result = []
for i in range(10):
    s = i*2
    result.append(s)


7)善用装饰器

装饰器可以把与业务逻辑无关的代码抽离出来,让代码保持干净清爽,而且装饰器还能被多个地方重复利用。比如一个爬虫网页的函数,如果该 URL 曾经被爬过就直接从缓存中获取,否则爬下来之后加入到缓存,防止后续重复爬取。

一般写法:
def web_lookup(url, saved={}):
    if url in saved:
        return saved[url]
    page = urllib.urlopen(url).read()
    saved[url] = page
    return page

用了装饰器:

import urllib #py2
#import urllib.request as urllib # py3

def cache(func):
    saved = {}

    def wrapper(url):
        if url in saved:
            return saved[url]
        else:
            page = func(url)
            saved[url] = page
            return page

    return wrapper


@cache
def web_lookup(url):
    return urllib.urlopen(url).read()

用装饰器写代码表面上感觉代码量更多,但是它把缓存相关的逻辑抽离出来了,可以给更多的函数调用,这样总的代码量就会少很多,而且业务方法看起来简洁了。

 

.