#初始化
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 处理命令行参数
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文件 教程
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 教程
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 模块可以满足这个需求
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 模式让程序更加灵活
模板方法模式就是在一个方法中定义一个算法的骨架,并将一些实现步骤延迟到子类中。模板方法可以使子类在不改变算法结构的情况下,重新定义算法中的某些步骤。看个例子:
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 子类会选择不喝茶而喝咖啡,或者是抽雪茄之类的,按照以上的思路,我们的代码只会变得越发难以维护。
所以我们希望能够动态生成不同的实例:
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。