zoukankan      html  css  js  c++  java
  • 代码这样写更优雅(1)

    这个文章是转载的,通过优雅的代码,可以提现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()

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

    .

     
  • 相关阅读:
    【测试平台学习1】 vue使用与启动
    【Devops】 发布一个Python项目(Flask服务后端)到K8S环境
    Spring5源码分析(024)——IoC篇之bean加载:parentBeanFactory和依赖处理
    Spring5源码分析(023)——IoC篇之bean加载:从缓存中获取单例 bean
    Java基础(018):Class.forName和ClassLoader的区别
    Spring5源码分析(022)——IoC篇之bean加载:FactoryBean的用法
    Spring5源码分析(021)——IoC篇之bean加载
    Java基础(017):反射初探
    Java基础(015):泛型
    Java基础(001):关于 short i = 1; i += 1;
  • 原文地址:https://www.cnblogs.com/aomi/p/7064480.html
Copyright © 2011-2022 走看看