文档章节

python的一些使用技巧

旺酱在路上
 旺酱在路上
发布于 2016/10/20 00:52
字数 993
阅读 95
收藏 0

python的一些使用技巧

前言

我太喜欢python这门语言了,以至于我总会忍不住跟身边的人安利这门语言。

本篇博客并不是python的入门教程,而是给那些学习了python但还可以进阶的人看的。有些技巧如果使用得当,可以极大的简化你的代码。

AutoVivification

autovivification是Perl语言的一个特性,它会在你每次引用一个值未定义的属性时为你自动创建数组或者字典。 这个特性允许你在不需要预先声明变量的存在和完整的结构前, 就可以直接来引用它和它任意的子元素。

AutoVivification的一种实现方法如下:

class AutoVivification(dict):
    """Implementation of perl's autovivification feature."""
    def __getitem__(self, item):
        try:
            return dict.__getitem__(self, item)
        except KeyError:
            value = self[item] = type(self)()
            return value

我们可以这样子来使用AutoVivification:

weather = AutoVivification()
weather['china']['guangdong']['shenzhen'] = 'sunny'
weather['china']['hubei']['wuhan'] = 'windy'
weather['USA']['California']['Los Angeles'] = 'sunny'
print weather

结果输出:{'china': {'hubei': {'wuhan': 'windy'}, 'guangdong': {'shenzhen': 'sunny'}}, 'USA': {'California': {'Los Angeles': 'sunny'}}}

创建层级结构复杂的字典类型就是这么随心所欲,而且拥有dict的所有特性.

autovivification还有另一种实现方法,直接改写dict的__missing__方法

class AutoVivification(dict):
    """Implementation of perl's autovivification feature."""
    def __missing__(self, key):
        value = self[key] = type(self)()
        return value

修饰器

装饰器Python面向切面编程的实现。装饰器可以为已经存在的对象添加额外的功能,可以将大量函数中的共同功能抽离出来复用.

比如说我们有一个需求,需要统计每一个函数的运行时间.如果我们要复用这部分"计算时间消耗"的代码,用修饰器可以这样子实现.

import time
import functools

def time_calc(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        start = time.time()
        func(*args, **kwargs)
        end = time.time()
        print 'used-time:', end - start
    return wrapper

@time_calc
def foo_1(second):
    time.sleep(second)
    print 'foo_1 exit'

@time_calc
def foo_2(a, b=1):
    time.sleep(1)
    print 'foo_2 exit'

foo_1(1)
foo_2(1, b=2)

这样子,"计算时间消耗"的逻辑我们就不需要在多个函数中一一实现了,而是通过修饰器time_calc,加在其他函数的上面解决了. 如果上面的例子不够清楚,可以移步另一篇对python修饰器的入门使用讲解更详细的文章 Python装饰器与面向切面编程

一个函数允许加上多个修饰器,而且修饰器的执行顺序是自下向上运行.

比如我们又定义了一个do_nothing

def do_nothing(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        func(*args, **kwargs)
        print 'after func, do nothing...'
    return wrapper

然后修饰foo_1,可以看到输出是由下往上执行的.

@time_calc
@do_nothing
def foo_1(second):
    time.sleep(second)
    print 'foo_1 exit'

foo_1(1)

输出:
foo_1 exit
after func, do nothing...
used-time: 1.00242614746

此外,修饰器还可以带上自己的参数.我们只需要让修饰器的写法上稍微变一下。

def time_calc(machine='machine01'):
    def outer_wrapper(func):
        @functools.wraps(func)
        def wrapper(*args, **kwargs):
            start = time.time()
            func(*args, **kwargs)
            end = time.time()
            print machine, 'used-time:', end - start
        return wrapper
    return outer_wrapper

@time_calc(machine='machine2')
def foo_1(second):
    time.sleep(second)
    print 'foo_1 exit'

foo_1(1)

metaclass的使用

metaclass 是巧妙使用python的一个利器。Django的models.Model 就是使用了该利器来实现简单易用的ORM的。这里限于篇幅不展开介绍,有兴趣的可以移步我的另一篇博客

魔术方法

在Python中,所有以"__"双下划线包起来的方法,都统称为"魔术方法"。 有些魔术方法,巧妙使用它可以构造出非常优美的代码,比如将复杂的逻辑封装成简单的API。

关于魔术方法的介绍和举例,可以移步另一篇博客,那里有更多的介绍。

扩展

© 著作权归作者所有

旺酱在路上
粉丝 0
博文 5
码字总数 12042
作品 0
深圳
程序员
私信 提问
精选26个Python实用技巧,想秀技能先Get这份技术列表!

作者 | Peter Gleeson 译者 | 婉清 编辑 | Jane 出品 | AI科技大本营 【导读】Python 虽然是脚本语言,但是因为其易学,迅速成为科学家的工具,从而积累了大量的工具库、架构,人工智能涉及大...

AI科技大本营
2018/09/09
0
0
Supporting Python 3——不使用2to3转换支持Python 2和Python 3

不使用2to3转换支持Python 2和Python 3 虽然Python 3的官方文档努阴人们写同时支持Python 2和Python 3的代码,但是在一此情况这是合适的。尤其是你不能放弃支持Python 2.5及更早的版本时,因...

在湖闻樟
2015/10/28
807
0
团队拙作《Python机器学习实战》

之前看国内外的 Python 机器学习的书,鲜有将机器学习到底怎么做人脸识别、怎么做风险控制、怎么做 OCR 算法模型列出的,并且真正的一个 Python 应用,不止是从机器学习库中导入一下配置一下...

yijun2018
2018/04/20
0
0
值得玩味儿的14个Python编程小技巧

最近的工作中经常使用Python编写一些基本解决一些NLP的小问题,在自己的工作日记里面也记录了不少的python编程中常用的小"Trick",看到最近大家学习Python的劲头儿这么火辣,那就简单的贴出一...

流川枫AI
2018/09/23
0
0
Python 编码时应该注意的几件事情

在编程过程中,多了解语言周边的一些知识,以及一些技巧,可以让你加速成为一个优秀的程序员。 对于Python程序员,你需要注意一下本文所提到的这些事情。 你也可以看看Zen of Python(Pytho...

justjavac
2012/11/19
112
0

没有更多内容

加载失败,请刷新页面

加载更多

toast组件单元测试

先看是否存在 describe('Toast', () => { it('存在.', () => { expect(Toast).to.be.exist }) }); 看属性,我们要测 ToastVue 和 plugin.js describe('Toast', () =>......

ories
20分钟前
57
0
如何将整个MySQL数据库字符集和排序规则转换为UTF-8?

如何将整个MySQL数据库字符集转换为UTF-8并将排序规则转换为UTF-8? #1楼 在命令行外壳上 如果您是命令行外壳程序之一,则可以非常快速地执行此操作。 只需填写“ dbname”:D DB="dbname"(...

javail
今天
80
0
开源矿工系统内部的层

开源矿工系统内部的层 所谓“层”、“界”、“域”、“集合”,这些词其实是在试图表达物质系统的组成结构和运动景象中的规矩,这些不同人发明的词都是来源于对同一个规律的观察、发现、表达...

NTMiner
今天
88
0
如何将文件从一个git repo移到另一个(不是克隆),保留历史记录

我们的Git储存库是作为单个Monster SVN储存库的一部分开始的,其中每个项目都有自己的树,如下所示: project1/branches /tags /trunkproject2/branches /tags ...

技术盛宴
今天
65
0
数据结构之数组-c代码实现

在上一篇文章里讲了数组的具体内容,然后自己使用c语言对数组进行了实现。 其中定义了一个结构体,定义了长度、已使用长度和地址指针。 定义alloc函数来分配内存空间 之后便是插入元素的ins...

无心的梦呓
今天
65
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部