• 编写高质量代码 改善Python程序的91个建议 (读后 小记)


    此书是自己好久之前买的,当时总觉得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)]

  • 相关阅读:
    给力牛人
    设计模式
    微软真的要放弃Windows品牌吗?
    SQL2005 Express 自动安装之命令行
    SQL where之 in 在变量
    数据库求闭包,求最小函数依赖集,求候选码,判断模式分解是否为无损连接,3NF,BCNF
    别浪费了你的大内存[转]
    QQ空间免费养5级花和拥有人参果
    asp.net2 统一搜索引擎关键字编码[转]
    把网速提高4倍的方法和动画教程
  • 原文地址:https://www.cnblogs.com/devilmaycry812839668/p/8304290.html
Copyright © 2020-2023  润新知