此书是自己好久之前买的,当时总觉得Python语言中有各种trick, 总是要自己猝不及防的掉入到陷阱之中, 看了一些资料后发现了这本书,感觉很是不错,不过可惜自己平时总是杂事太多,总是找不到整块的时间把这本书看完。现在正好赶上自己放寒假,这也是到了新单位后的第一个假期,BOSS说工作学习要靠自己自觉,不过不管怎么说我总是属于不太自觉的那个类型的,于是开启了小差,这也顺路把这本压箱底的书翻了出来,以下记录一些自己觉得自己平时没有注意到的小问题,有选择的记录到下面,也算是读书的小笔记,供自己日后翻查所用。

建议25:  避免finally中可能发生的陷阱

#!/usr/bin/env python
#encoding:UTF-8 def FinallyTest():
print 'I am starting------'
while True:
try:
print "I am running"
raise IndexError("r")
except NameError, e:
print 'NameError happened%s', e
break
finally:
print 'finally executed'
break FinallyTest()

try 块中发生异常的时候,如果在except语句中找不到对应的异常,异常将会被临时保存起来,在finally语句结束时再去执行刚才保存的内容,即保存的异常,如果此时finally中有break或者return 则会覆盖掉保存的内容,起到屏蔽异常的作用。

所以,在finally之中尽量不要使用break语句或return语句,以防止在程序出现问题时导致调试困难。

建议 37:

对字典排序, 利用    {}.iteritems   ,   key=itemgetter

对个操作个人感觉比较受用,因为以前曾经编写过NSGA-II 的Python程序, 其中有很大一部分需要用到对字典的排序,当时实现的十分蹩脚,看到这个应用感觉一亮。

1. 对字典排序

from operator import itemgetter

phonebook = {"Linda":'7750', "Bob":'9345', 'Carol':'5834'}

sorted_pb = sorted(phonebook.iteritems(), key=itemgetter(1))

print sorted_pb

输出:

[('Carol', '5834'), ('Linda', '7750'), ('Bob', '9345')]

2. 多维list排序

在sorted中 key 和 cmp 都是接收函数的参数, 但是cmp中的函数需要对两两传入的元素进行大小判断, 而key函数只需要返回一个用来判断两两元素大小的一个判断元素即可。

from operator import itemgetter

gameresult = [['Bob', 95.00, 'A'], ['Alan', 86.00, 'C'], ['Mandy', 82.50, 'A'], ['Rob', 86, 'E']]

sorted_gameresult=sorted(gameresult, key=itemgetter(2, 1) )

print sorted_gameresult

输出:

[['Mandy', 82.5, 'A'], ['Bob', 95.0, 'A'], ['Alan', 86.0, 'C'], ['Rob', 86, 'E']]

字典中混合 List 排序, 该种排序我认为是比较常见的一种,同时也是非常不好处理的一种:

from operator import itemgetter

mydict = {'Li':['M', 7], 'Zhang':['E', 2], 'Wang':['P', 3], 'Du':['C', 2], 'Ma':['C', 9], 'Zhe':['H', 7]}

sorted_mydict=sorted(mydict.iteritems(), key=lambda (k, v): itemgetter(1)(v) )

print sorted_mydict

输出:

[('Zhang', ['E', 2]), ('Du', ['C', 2]), ('Wang', ['P', 3]), ('Li', ['M', 7]), ('Zhe', ['H', 7]), ('Ma', ['C', 9])]

建议39:

使用Counter进行计数统计

from collections import defaultdict
some_data=[1,2,1,2,1,2,2,2,3,1,1,3,1,2,2,1,1,4]
count_frq=defaultdict(int)
for item in some_data:
count_frq[item]+=1
print count_frq

输出:

defaultdict(<type 'int'>, {1: 8, 2: 7, 3: 2, 4: 1})

pythonic 方法:

使用  Counter

from collections import Counter
some_data=[1,2,1,2,1,2,2,2,3,1,1,3,1,2,2,1,1,4]
count_frq=Counter(some_data)
print count_frq

输出:

Counter({1: 8, 2: 7, 3: 2, 4: 1})

Counter 类是属于字典的一个子类型。

Counter初始化:

Counter('success')

Counter(s=3, c=2, u=1)

Counter({'s'=3, 'c'=2, 'u'=1})

list(Counter({'s': 3, 'c': 2, 'e': 1, 'u': 1}).elements())

['e', 's', 's', 's', 'u', 'c', 'c']

>>> Counter({'s': 3, 'c': 2, 'e': 1, 'u': 1}).values()
[1, 3, 1, 2]

>>> w
Counter({'s': 3, 'c': 2, 'e': 1, 'u': 1})
>>> w.update({'s':7})

>>> Counter({'s': 3, 'c': 2, 'e': 1, 'u': 1}).most_common(4)
[('s', 3), ('c', 2), ('e', 1), ('u', 1)]

编写高质量代码 改善Python程序的91个建议 (读后 小记)的更多相关文章

  1. 编写高质量代码--改善python程序的建议(六)

    原文发表在我的博客主页,转载请注明出处! 建议二十八:区别对待可变对象和不可变对象 python中一切皆对象,每一个对象都有一个唯一的标识符(id()).类型(type())以及值,对象根据其值能否修 ...

  2. 编写高质量代码--改善python程序的建议(八)

    原文发表在我的博客主页,转载请注明出处! 建议四十一:一般情况下使用ElementTree解析XML python中解析XML文件最广为人知的两个模块是xml.dom.minidom和xml.sax, ...

  3. 编写高质量代码--改善python程序的建议(七)

    原文发表在我的博客主页,转载请注明出处! 建议三十四:掌握字符串的基本用法 编程有两件事,一件是处理数值,另一件是处理字符串,在商业应用编程来说,处理字符串的代码超过八成,所以需要重点掌握. 首先有个 ...

  4. 编写高质量代码–改善python程序的建议(五)

    原文发表在我的博客主页,转载请注明出处! 建议二十三:遵循异常处理的几点基本原则 python中常用的异常处理语法是try.except.else.finally,它们可以有多种组合,语法形式如下: ...

  5. 编写高质量代码--改善python程序的建议(四)

    原文发表在我的博客主页,转载请注明出处! 建议十八:有节制的使用from...import语句 python提供了三种方式引入外部模块: import语句 from...import... __imp ...

  6. 编写高质量代码--改善python程序的建议(三)

    原文发表在我的博客主页,转载请注明出处! 建议十三:警惕eval()的安全漏洞 相信经常处理文本数据的同学对eval()一定是欲罢不能,他的使用非常简单: eval("1+1==2" ...

  7. 编写高质量代码–改善python程序的建议(二)

    原文发表在我的博客主页,转载请注明出处! 建议七:利用assert语句来发现问题断言(assert)在很多语言中都存在,它主要为调试程序服务,能够快速方便地检查程序的异常或者发现不恰当的输入等,可防止 ...

  8. 编写高质量代码--改善python程序的建议(一)

    原文发表在我的博客主页,转载请注明出处! 初衷 python是一个入门十分容易的编程语言,但是想要写好python却是一件不容易的事情,如果不是专业使用python的人,只是将python作为一个脚本 ...

  9. 编写高质量代码改善python程序91个建议学习01

    编写高质量代码改善python程序91个建议学习 第一章 建议1:理解pythonic的相关概念 狭隘的理解:它是高级动态的脚本编程语言,拥有很多强大的库,是解释从上往下执行的 特点: 美胜丑,显胜隐 ...

随机推荐

  1. 1.初步认识JVM -- JVM序列

    1.JVM概念 JVM是java Virtual Machine的简称.也称为Java虚拟机. 虚拟机:通过软件模拟具有完整硬件功能的运行在一个完全隔离环境的完整计算机系统.VMWare.Visual ...

  2. mysql索引之聚簇索引与非聚簇索引

    1 数据结构及算法基础 1.1 索引的本质 官方定义:索引(Index)是帮助MySQL高效获取数据的数据结构 本质:索引是数据结构 查询是数据库的最主要功能之一.我们都希望查询速度能尽可能快,因此数 ...

  3. 企业级服务元年:iClap高效解决手游更新迭代问题

    2006年至今,手游市场经历了不少变革,从WAP站到2009年智能手机时代来临,2012大量资本涌入国内手游行业,到2014年手游市场趋于成熟,细分市场成为追逐热门,在2015年优胜劣汰的资本寒冬浪潮 ...

  4. web上的复制

    你可能曾经尝试过复制网页上的一些文字,得到的却是令人沮丧的的结果.这篇文章介绍相关的内容. 不是真正的文字 这可能是最常见的问题,很多人尝试对一张带有文字的图片进行像文字那样的选择,复制当然不行了. ...

  5. mongodb-的副本集

    复制的重要性不再多说,其主要就是提供数据保护,数据高可用和灾难恢复. 复制是跨多个mongodb服务器分布和维护的方法.mongodb可以把数据从一个节点复制到其他节点并在修改时进行同步. mongo ...

  6. Python3.x:定时任务实现方式

    Python3.x:定时任务实现方式 Python3.x下实现定时任务的方式有很多种方式. 一.循环sleep: 最简单的方式,在循环里放入要执行的任务,然后sleep一段时间再执行.缺点是,不容易控 ...

  7. 20155201 2016-2017-2 《Java程序设计》第四周学习总结

    20155201 2016-2017-2 <Java程序设计>第四周学习总结 教材学习内容总结 - 第六章要点: 继承:面向对象中,子类继承父类,避免重复的行为定义.继承基本上就是避免多个 ...

  8. QT+VS中ui不能声明为指针?

    问题描述:QtCreator里的UI全是默认为指针类型,调用的时候[ui->]但是使用VS+Qt来,发来默认的是变量类型,使用的时候[ui.] 统一:为了统一我把后者声明改为前者 问题:在mai ...

  9. 为pyhon安装opencv扩展包出现distributed 1.21.8 requires msgpack, which is not installed.【转】

    本文转载自:https://blog.csdn.net/weixin_39513374/article/details/81051466 pip install msgpack-python pip ...

  10. shell 交互式选择(select)

    新建文件 sudo vi test.sh 写入如下内容: #!/bin/bash echo "What is your favourite OS?" select var in & ...