改善python的91个建议_摘选改善Python程序的91个建议

ContractedBlock.gif

ExpandedBlockStart.gif

#初始化

Counter('success')

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

Counter({'s': 3, 'c': 2, 'u': 1, 'e': 1})#常用方法

list(Counter(some_data).elements()) #获取 key 值

Counter(some_data).most_common(2) #前 N 个出现频率最高的元素以及对应的次数

(Counter(some_data))['y'] #访问不存在的元素返回 0

c = Counter('success')

c.update('successfully') #更新统计值

c.subtract('successfully') #统计数相减,允许为0或为负

View Code

41、使用 argparse 处理命令行参数

ContractedBlock.gif

ExpandedBlockStart.gif

importargparse

parse=argparse.ArgumentParser()

parse.add_argument('-o', '--output')

parse.add_argument('-v', dest='verbose', action='store_true')

args= parser.parse_args()

View Code

42、使用pandas处理大型CSV文件 教程

ContractedBlock.gif

ExpandedBlockStart.gif

reader(csvfile[, dialect='excel'][, fmtparam]) #读取一个 csv 文件,返回一个 reader 对象

csv.writer(csvfile, dialect='excel', **fmtparams) #写入 csv 文件

csv.DictWriter(csvfile, fieldnames, restval='', extrasaction='raise', dialect='excel')

常用API

43、一般情况下使用 ElementTree 解析 XML 教程

ContractedBlock.gif

ExpandedBlockStart.gif

count =0for event, elem in ET.iterparse('test.xml'):if event == 'end':if elem.tag == 'userid':

count+= 1elem.clear()print(count)

View Code

45、使用 traceback 获取栈信息

当发生异常,开发人员往往需要看到现场信息,trackback 模块可以满足这个需求

ContractedBlock.gif

ExpandedBlockStart.gif

traceback.print_exc() #打印错误类型、值和具体的trace信息

traceback.print_exception(type, value, traceback[, limit[, file]]) #前三个参数的值可以从sys.exc_info()

raceback.print_exc([limit[, file]]) #同上,不需要传入那么多参数

traceback.format_exc([limit]) #同 print_exc(),返回的是字符串

traceback.extract_stack([file, [, limit]]) #从当前栈中提取 trace 信息

View Code

traceback 模块获取异常相关的数据是通过sys.exc_info()得到的,该函数返回异常类型type、异常value、调用和堆栈信息traceback组成的元组。

同时 inspect 模块也提供了获取 traceback 对象的接口。

50、利用模块实现单例模式

51、用 mixin 模式让程序更加灵活

模板方法模式就是在一个方法中定义一个算法的骨架,并将一些实现步骤延迟到子类中。模板方法可以使子类在不改变算法结构的情况下,重新定义算法中的某些步骤。看个例子:

ContractedBlock.gif

ExpandedBlockStart.gif

classPeople(object):defmake_tea(self):

teapot=self.get_teapot()

teapot.put_in_tea()

teapot.put_in_water()return teapot

View Code

显然get_teapot()方法并不需要预先定义,也就是说我们的基类不需要预先申明抽象方法,子类只需要继承 People 类并实现get_teapot(),这给调试代码带来了便利。但我们又想到如果一个子类 StreetPeople 描述的是正走在街上的人,那这个类将不会实现get_teapot(),一调用make_tea()就会产生找不到get_teapot()的 AttributeError,所以此时程序员应该立马想到,随着需求的增多,越来越多的 People 子类会选择不喝茶而喝咖啡,或者是抽雪茄之类的,按照以上的思路,我们的代码只会变得越发难以维护。

所以我们希望能够动态生成不同的实例:

ContractedBlock.gif

ExpandedBlockStart.gif

classUseSimpleTeapot(object):defget_teapot(self):returnSimpleTeapot()classUseKungfuTeapot(object):defget_teapot(self):returnKungfuTeapot()class OfficePeople(People, UseSimpleTeapot): pass

class HomePeople(People, UseSimpleTeapot): pass

class Boss(People, UseKungfuTeapot): pass

defsimple_tea_people():

people=People()

people.__base__ +=(UseSimpleTeapot,)returnpeopledefcoffee_people():

people=People()

people.__base__ +=(UseCoffeepot,)deftea_and_coffee_people():

people=People()

people.__base__ +=(UseSimpleTeapot, UserCoffeepot,)returnpeopledefboss():

people=People()

people.__base__ +=(KungfuTeapot, UseCoffeepot, )return people

View Code

以上代码的原理在于每个类都有一个__bases__属性,它是一个元组,用来存放所有的基类,作为动态语言,Python 中的基类可以在运行中可以动态改变。所以当我们向其中增加新的基类时,这个类就拥有了新的方法,这就是混入mixin。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值