Python代码优化及技巧笔记(二)

概述

这里是记录一些本人在开发过程中遇到的一些细节及代码优化问题,希望与君共勉。


版权说明

著作权归作者所有。

商业转载请联系作者获得授权,非商业转载请注明出处。

作者:Coding-Naga

发表日期: 2016年3月17日

链接:http://blog.csdn.net/lemon_tree12138/article/details/50854673

来源:CSDN

更多内容:分类 >> Thinking In Python


目录

  • 版权说明
  • 目录
  • 奇技淫巧
    • Python代码获取命令行输出
    • 不要将表达式作为函数的默认参数
    • 指定异常代码块exception block的参数
    • 在遍历列表时更改列表
    • 更优雅地打印出JSON
    • __init__py的功能
  • Ref

奇技淫巧


1. Python代码获取命令行输出

这里可以通过subprocess模块中的Popen, PIPE来实现。

比如有这如下代码,就可以尝试捕获控制台输出的文本信息:

from subprocess import Popen, PIPE

label = "Hello, Shell."
print(label)

f = Popen(("python", "catch_output.py"), stdout=PIPE).stdout
print("Catch Output: {0}".format(f.readline()))

上面的代码中我们可以打印出自身的控制台输出,还有通过捕获输出获得的输出信息。如下:

Hello, Shell.
Catch Output: Hello, Shell.

2. 不要将表达式作为函数的默认参数

在Python有一个比较基础也是比较重要的特性,那就是在python的函数中,我们可以给参数指定一个默认的值。但是,这是有一个小小的陷阱。对于新手来说可能会经常引起困扰,比如我们像下面这样编写python代码:

def test_args(array=[]):
    array.append("Bob")
    return array

以上的代码中正常情况下,是没有什么问题的,因为的的确确可以打印出“[Bob]”。可是,问题是出现在我们重复的调用上。怎么说?就以上面的test_args()方法,我们进行三次重复调用。打印的结果却是:

[‘Bob‘]
[‘Bob‘, ‘Bob‘]
[‘Bob‘, ‘Bob‘, ‘Bob‘]

WTF!

这是怎么会回事呢?因为,可选参数默认值的设置在Python中只会被执行一次

怎么来理解?很简单,也就是我们的参数默认值只有在对此函数进行定义,并且在函数调用的时候不传递此参数的值的时候,才被认为需要对其进行默认值的赋值。

想要修改此函数也很简单,代码如下:

def test_args(array=None):
    if array is None:
        array = []
    array.append("Bob")
    return array

3. 指定异常代码块(exception block)的参数

在python2.x中,我们知道可以使用逗号来进行异常参数的指定。如下:

def fun():
    try:
        print("Hello, Exception")
    except Exception, e:
        print(e)
    pass

可是在python3.x中,这种写法却存在着语法上的错误。不过对于python2.x与python3.x来说,都可以使用as来进行指定。如下:

def fun():
    try:
        print("Hello, Exception")
    except Exception as e:
        print(e)
    pass

所以,对于可能存在版本差异的项目来说,最好还是使用as来指定参数更为妥当。


4. 在遍历列表时更改列表

正常情况下我们很难在遍历列表的过程中能列表进行修改,这一条不仅在Python中适用,在Java中也存在着同样的规则。比如,如下的写法就会抛出一些异常。

def test_list_modify():
    a = [0, 1, 2, 3, 4, 5, 6, 7, 8]
    odd = lambda x: bool(x % 2)
    for i in xrange(len(a)):
        if odd(a[i]):
            a.remove(i)
    print(a)

上面的代码一定会抛出异常,异常如下所示:

Traceback (most recent call last):
  File "E:/workspace/src/Python/Demo/SimpleDemo-python/test/test_demo.py", line 106, in <module>
    test_list_modify()
  File "E:/workspace/src/Python/Demo/SimpleDemo-python/test/test_demo.py", line 76, in test_list_modify
    if odd(a[i]):
IndexError: list index out of range

原因也很容易找到,上面的代码中,我们尝试去修改列表的长度,这样会导致循环的过程中,访问数组的下标会超出修改后的列表长度。从而抛出以上异常信息。

不过,我们可以利用Python语言自身优雅的编程范式。修改后的代码如下:

def test_list_modify():
    a = [0, 1, 2, 3, 4, 5, 6, 7, 8]
    odd = lambda x: bool(x % 2)
    a[:] = [n for n in a if not odd(n)]
    print(a)

5. 更优雅地打印出JSON

在Python中,json模块为我们提供了非常好的json对象的打印接口——json.dumps()

当然json.dumps()中传入的是json这个对象,而不是原始的json字符串。想要实现将原始json字符串优雅地打印出来,我们可以对其进行二次封装。

  1. 通过json.loads()将json字符串转化成json对象;
  2. 通过json.dumps()将json字符串优雅地打印出来.
import json

json_data = "{\"status\": \"OK\", \"count\": 2, \"results\": [{\"age\": 27, \"name\": \"Oz\", \"lactose_intolerant\": true},"             " {\"age\": 29, \"name\": \"Joe\", \"lactose_intolerant\": false}]}"

def parser():
    json_obj = json.loads(json_data)
    show(json_obj)
    pass

def show(json_obj):
    print(json.dumps(json_obj, indent=4))
    pass

if __name__ == ‘__main__‘:
    parser()
    pass

打印的结果如下:


6. __init__.py的功能

有时我们需要向一个自定义模块中导入很多其他模块的内容,这样会让代码显得有一些臃肿。不过,好在我们可以通过__init__.py这个文件来解决这个问题。做法是将导入模块的代码放在__init__.py这个文件中,再在目标文件中导入__init__.py这一个模块中的全部内容即可。

在__init__.py中有如下代码:

import os
import time
import datetime as date

测试文件中的调用代码如下:

from __init__ import *

print(time.ctime())
print(date.date.day)
print(os.system("python test_init.py"))

当然,你也可以选择一个一个地导入,如下:

from __init__ import sys
from __init__ import getopt

from __init__ import pack
from __init__ import pehelp
from __init__ import PEParser
from __init__ import Signature

Ref

http://codingpy.com/article/top-10-mistakes-that-python-programmers-make/

http://www.vaikan.com/improving-your-python-productivity/


时间: 2024-11-03 07:33:56

Python代码优化及技巧笔记(二)的相关文章

Python代码优化及技巧笔记(一)

前言 这里是记录一些本人在开发过程中遇到的一些细节问题,与君共勉. 版权说明 著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处.作者:Coding-Naga链接:http://blog.csdn.net/lemon_tree12138/article/details/50736887 来源:CSDN 1.Python实现全排列 方案一: a = [1, 2, 3, 4, 5, 6, 7, 8, 9] result = list(itertools.permutations(a,

python 3.5 django 笔记(二)Tmeplates与models

回顾上节课的三条经典命令 django-admin startproject 项目名称 #建立项目 python manage.py startapp blog #建立项目内站点 python manage.py runserver #启动服务 #runserver后面可以带端口号,表示运行是的端口 Tmeplates: (图片转载至幕课) 在昨天的myblog\blog下简历templates文件夹 结构树 myblog | |-----blog |    | |    |-----templ

2. 蛤蟆Python脚本学习笔记二基本命令畅玩

2. 蛤蟆Python脚本学习笔记二基本命令畅玩 本篇名言:"成功源于发现细节,没有细节就没有机遇,留心细节意味着创造机遇.一件司空见惯的小事或许就可能是打开机遇宝库的钥匙!" 下班回家,咱先来看下一些常用的基本命令. 欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/48092873 1.  数字和表达式 看下图1一就能说明很多问题: 加法,整除,浮点除,取模,幂乘方等.是不是很直接也很粗暴. 关于上限,蛤蟆不太清楚

听力笔记(四级长对话技巧(二)——校园生活类)

对于四级考生而言,与日常生活最亲近的是什么?校园生活! 这一长对话类型是四.六级听力借鉴老托福(TPO)的结果.所以,如果真题练完还觉不够的同学,可以搜索TPO的对话,进行平时的练习.     校园生活类常见词汇(摘录): library:图书馆       reading assignment:阅读任务 volume:卷 do research:做实验  teaching assistant:助教       revise:修改,修订 presentation:演讲   fail the ex

python之数据类型(学习笔记二)

python之数据类型(学习笔记二) 在Python中,能够直接处理的数据类型有以下几种: (1)整数 Python可以处理任意大小的整数,当然包括负整数,在程序中的表示方法和数学上的写法一模一样,例 如: 1 , 100 , ‐8080 , 0 ,等等. 计算机由于使用二进制,所以,有时候用十六进制表示整数比较方便,十六进制用 0x 前缀和0-9,a-f表示,例 如: 0xff00 , 0xa5b4c3d2 ,等等. (2)浮点数 浮点数也就是小数,之所以称为浮点数,是因为按照科学记数法表示时

Python学习笔记&lt;二&gt;:列表、元组、字典

1 列表和元组 可以将列表和元组当成普通的"数组",它能保存任意数量任意类型的Python 对象.和数组一样,通过从0 开始的数字索引访问元素,但是列表和元组可以存储不同类型的对象. 列表和元组有几处重要的区别.列表元素用中括号( [ ])包裹,元素的个数及元素的值可以改变.元组元素用小括号(( ))包裹,不可以更改(尽管他们的内容可以).元组可以看成是只读的列表.通过切片运算( [ ] 和 [ : ] )可以得到子集,这一点与字符串的使用方法一样. 举例如下: >>>

python代码优化技巧

转自:http://www.douban.com/group/topic/31478102/ 这个资料库还有些不错的好文章: http://www.ibm.com/developerworks/cn/ 来看这篇<Python 代码性能优化技巧>http://www.ibm.com/developerworks/cn/linux/l-cn-python-optim/index.html 原文标题是代码性能优化,关键是性能优化,如果纯是代码优化则跟代码重构无异. 代码性能优化的本质:保证代码正确行

python源码剖析笔记1——Python对象初见

python源码剖析笔记1--Python对象初见 工作整两年了,用python最多,然而对于python内部机制不一定都清楚,每天沉醉于增删改查的简单逻辑编写,实在耗神.很多东西不用就忘记了,比如C语言,正好,python源码用C写的,分析python源码的同时又能温故C语言基础,实在是件很好的事情.另外,还有陈儒大神的<python源码剖析>做指引,分析也不至于没头没脑.期望在一个月的业余时间,能有所小成,以此为记. 1 python中的对象 python中,一切东西都是对象,在c语言实现

webpy使用笔记(二) session/sessionid的使用

webpy使用笔记(二) session的使用 webpy使用系列之session的使用,虽然工作中使用的是django,但是自己并不喜欢那种大而全的东西~什么都给你准备好了,自己好像一个机器人一样赶着重复的基本工作,从在学校时候就养成了追究原理的习惯,从而有了这篇session的使用和说明. PS:其实有些总结的东西挺好的,想分享给大家看,而不是枯燥的代码,这东西说实话对其他人用处不大,但都被移除首页了~~ webpy中的session 下面为官方的例子,用session来存储页面访问的次数,