随笔分类 - python问题分析及解决
摘要:如何使用函数装饰器 问题举例 有时候我们想为多个函数统一添加某种功能,比如计时统计、记录日志,缓存运算结果等; 我们并不想在每个函数内一一添加完全相同的代码,有什么解决方案吗? 解决思路 定义装饰器函数,用它在原函数的基础上生成一个添加新功能的函数来代替原函数 代码 参考资料:python3实用编程
阅读全文
摘要:如何通过实例方法名字的字符串调用方法 问题举例 在某项目中我们的代码用了三个不同库中的图形类:Circle,Triangle,Rectangle 它们都有一个获取图形面积的接口,单接口名字可能不同,我们可以实现一个统一的获取 面积的函数,使用每种方法名进行尝试,调用相应类的接口。 解决思路 方法一:
阅读全文
摘要:如何在环状数据结构中管理内存 问题举例 在python中,垃圾回收器通过引用计数来回收垃圾对象, 在某些环状数据结构(树,图...),存在对象间的循环引用,比如树的父节点引用子节点, 子节点同时引用父节点。测试同时del掉引用父子节点,两个对象不能被立即回收。 分析 当一个对象引用计数为0,或者只剩
阅读全文
摘要:如何使用描述符对实例属性做类型检查 问题举例 在某些项目中,我们实现一些类,并希望能像静态类型语言那样对它们的 实例属性做类型检查: p = Persosn() p.name = 'tom' #必须是str p.age = 18 #必须是int 要求: (1)可对实例属性指定类型 (2)赋予不正确类
阅读全文
摘要:如何让类支持比较操作 问题举例 有时我们希望自定义类的实例间可以使用<, <=, >, >=, ==, !=符号进行比较,我们自定义比较的行为。 比如,有一个矩形,比较两个矩形的实例时,我们希望比较的是面积。 比如,有一个矩形和一个圆形,我们希望比较一个矩形实例和一个圆形实例, 我们希望它们比较的是
阅读全文
摘要:如何创建可管理的对象属性 问题举例 在面向对象编程中, 我们把方法看作对象的接口, 直接访问对象的属性可能是不安全的,或设计上不够灵活。 但是使用调用方法在形式上不如访问属性简洁。 circle.get_radius() circle.set_radius(5.0) #繁琐 circle.radiu
阅读全文
摘要:如何让对象支持上下文管理 问题举例 一个telnet客户端的类TelnetClient, 调用实例的connect(),login(),interact方法 启动客户端与服务器交互,交互完毕后需要调用cleanup()方法,关闭已连接的socket, 以及将操作历史记录写入文件并关闭。 能否让Tel
阅读全文
摘要:如何为创建大量实例节省内存 问题举例 在网络游戏中,定义玩家类Player(id, name, level...), 每个玩家在线将创建一个Player实例,当在线人数很多时,将产生大量实例, 如何降低这些实例的内存开销? 分析 通过类创建的对象一般有一个__dict__属性,它是一个字典, 在添加
阅读全文
摘要:如何派生内置不可变类型并修其改实例化行为 问题举例 自定义一种新类型的元组,对传入的可迭代对象,我们只保留 其中int类型且值大于0的元素,例如 IntTuple([1, -1, 'abc', 6, ['x', 'y'], 3]) => (1, 6, 3) 如何继承内置tuple实现IntTuple
阅读全文
摘要:如何在一个for语句中迭代多个可迭代对象 问题举例 (1)某班学生期末考试成绩,语文,数学,英语分别存储在3个列表中,同时迭代三个列表,计算每个学生的总分 (2)某年级有4个班,某次考试每班英语成绩分别存储在4个列表中,一次迭代每个列表,统计全学年成绩高于90分的人数 解决思路 (1)使用内置函数z
阅读全文
摘要:如何对迭代器做切片操作 问题举例 读取某个文件内容的100~300行内容,我们是否可以使用 类似列表切片的方式得到一个100~300行文件内容的生成器 分析 列表的切片操作其实是在重载方法__getItem__方法 可以通过file.readlines()后再做切片,内存会加载整个文件到内存,如果文
阅读全文
摘要:如何实现反向迭代 问题举例 实现一个连续浮点数发生器FloatRange,根据给定范围(start, end)和步进值(step) 产生一系列连续的浮点数,如FloatRange(3.0, 4.0, 0.2)可产生序列: 正向:3.0>3.2>3.4>3.6>3.8>4.0 反向:4.0>3.8>3
阅读全文
摘要:如何使用生成器函数实现可迭代对象 问题举例: 实现一个可迭代对象的类,它能迭代出给定范围内 的所有素数: pn = PrimeNumbers(1, 30) for x in pn: print(x) 输出结果: 2 3 5 7 11 13 17 19 23 29 解决思路 将该类的__iter__方
阅读全文
摘要:可迭代对象与迭代器对象 问题举例 某软件要求,从网络抓取各个城市的气温信息,并依次显示: 北京:15~22 上海:18~23 ...... 如果一次抓取所有城市气温信息再显示,显示第一个城市的气温时会由很长的延时, 并且浪费存储空间,我们期望以“用时访问”的策略,并且把所有城市的气温信息封装 到一个
阅读全文
摘要:如何实现用户的历史记录功能 使用collections中的deque 分析:如果程序退出,保存在内存中的历史记录将会被情况,应当保存在磁盘中 以方便下次访问程序时从新加载 使用pickle模块将历史记录存储到硬盘中 参考资料:python3实用编程技巧进阶
阅读全文
摘要:如何让字典有序 问题举例: 统计学生的成绩和名次,让其在字典中按排名顺序有序显示,具体格式如下 {'tom':(1, 99), 'lily':(2, 98), 'david':(3, 95)} 说明 python3.5中的dict是无序的,python3.6中的dict是有序的, 为了实现程序向后兼
阅读全文
摘要:如何快速找到多个字典中的公共键 问题举例 统计每轮都进球的球员: 第1轮{‘tom’:1, 'meixi':2} 第2轮{‘coco’:3, 'meixi':4, 'marton':2} 第3轮{'coco':2, 'meixi':1, 'david':1} for循环、列表解析和set交集 分析:
阅读全文
摘要:如何统计序列中元素的频度 问题举例 如何找出随机序列[1, 5, 6, 5, 3, 2, 1, 0, 6, 1, 6]中出现频度最高的3个元素? 如何统计某篇英文文章中词频最高的5个单词? 将序列转换成字典(元素:频度),根据字典的值进行排序 列表 分析:使用生成器解析比列表解析节省空间 当一个列表
阅读全文
摘要:如何根据字典中值的大小对字典项排序 问题举例 某班英语成绩以字典形式存储,如何根据成绩高低,计算学生成绩排名 { “tom”:80, "lily":88, "marton":99, } 分析:字典中的值无法用sorted函数进行排序,我们可以将字典各项转换成元组,使用sorted函数进行排序 元组元
阅读全文
摘要:如何为元组中的每个元素命名 简述 当对象数据格式固定时,用元组比列表更节省内存空间, 我们使用索引访问元组元素,但是这种访问方式会降低程序的可读性。 举个栗子 对于学生的信息,我们有固定的数据格式,我们可以用元组表示, 但是在我们使用它的时候并不知道stu1[1],stu[2]具体代表什么信息, 这
阅读全文

浙公网安备 33010602011771号