Python学习
Kun Li
自古山高水远路,无一不为风尘苦。
展开
-
python中的配置config模块
现在的一般项目基本都采用了config配置式写法,因此在此处记录几种config写法。2.gflags,之前在做创意项目时用的基本都是这个。1.yaml文件的写法。原创 2023-12-04 16:36:18 · 372 阅读 · 0 评论 -
pyqt5-signal和slot
信号(signal)和槽(slot)是qt的核心机制。在创建事件循环之后,通过建立信号和槽的连接就可以实现对象之间的通信。当信号发射时,连接的槽函数就会自动执行,在pyqt5中,信号和槽通过QObject.signal.connect()连接。所有从QOject类或其子类如QWidget派生的类都能够包含信号和槽。当对象改变其状态时,信号就由该对象发射出去。槽用于接收信号,但它们是普通的对象成员函数,多个信号可以与单个槽进行连接,单个信号也可以与多个槽进行连接。总之,信号和槽构建了一种强大的空间编程机制。示原创 2022-12-04 18:54:48 · 493 阅读 · 0 评论 -
pyqt5-布局管理入门
1.绝对布局开始按钮左上角距离主窗口左侧为426px,上侧为1px,这里的1px时是相对于布局而言,但是geometry是绝对布局,控件宽度是100px,高度是100px。Horizontal spacer:表示开始按钮应该与栅格布局管理器尽可能离得远一些。Verrical spacer:表示两个布局管理器不要批次挨着。Horizontak line:表示开始按钮与左边的两个布局管理器根本不是同一类别,用一条线把它们区分开来。::原创 2022-12-04 15:48:00 · 1716 阅读 · 0 评论 -
pyqt5
我一直觉得对算法人员来说,移动端,桌面,服务器端都有有点应用服务的能力。1.designer.exe pyuic5前者是设计界面的,后者是将界面ui转换为py的。2.界面与逻辑分离 由ui编译而来的.py文件成为界面文件,调用界面文件称为逻辑文件。原创 2022-12-04 14:31:42 · 134 阅读 · 0 评论 -
流畅的python
第一章:python数据模型1.1 如何使用特殊方法模拟数值类型,字符串表示形式,算术运算符,自定义的布尔值1.2 特殊方法一览1.3 为什么len不是普通方法第二章:序列构成的数组2.1 内置序列类型概览2.2 列表推导和生成器表达式列表推导和可读性,列表推导同filter和map的比较,笛卡尔积,生成器表达式2.3 元组不仅仅是不可变的列表元组和记录,元组拆包,具名元组,作为不可变列表的元组2.4 切片为什么切片和区间会忽略最后一个元素,对对象进行切片,多原创 2022-02-27 15:30:12 · 3429 阅读 · 0 评论 -
python中的callable
一个可callable的对象是指可以被调用执行的对象并且可以传入参数,只要可以在一个对象的后面使用小括号来执行代码,那么这个对象就是可执行对象。一般可执行对象有四种1.函数2.类3.类里面的函数4.实现了__call__方法的实例对象。...原创 2020-11-15 15:20:21 · 426 阅读 · 0 评论 -
python数据结构 --序列构成的数组
1.容器序列:list、tuple、collections.deque;扁平序列:str、bytes、bytearray、memoryview、array.array;容器序列存放的是它们所包含的任意类型的对象的引用,而扁平序列里存放的是值而不是引用。2.list和列表推导 [x for x in range(2,11)]3.元组->不可变的列表,元组拆包,具名元组(collections.namedtuple)lax_coordinates = (33.9425,-118.40)l.原创 2020-10-27 18:58:53 · 261 阅读 · 0 评论 -
Python数据模型
python数据模型是python中对象的属性。数据模型其实是对python框架的描述,它规范了这门语言自身构建模块的接口,这些模块包括但不限于序列、迭代器、函数、类和上下文管理器。import collectionsCard = collections.namedtuple('Card',['rank','suit'])class FrenchDeck: ranks = [str(n) for n in range(2,11)] + list('JQKA') suits = '原创 2020-10-27 16:01:20 · 1001 阅读 · 0 评论 -
Python 可迭代对象与迭代器的对比
可迭代对象:使用 iter 内置函数可以获取迭代器的对象,如果对象实现了能返回迭代器的 __iter__ 方法,那么对象就是可迭代的,实现了 __getitem__ 方法,而且其参数是从零开始的索引,这种对象也可以迭代。迭代器:迭代器是这样的对象:实现了无参数的 __next__ 方法,返回序列中的下一个元素,如果没有元素了,那么抛出的 StopIteration 异常。Python 中的迭代...原创 2019-04-22 10:38:08 · 553 阅读 · 0 评论 -
Python 比较运算符
Python 中正向和反向使用的都是同一系列方法。例如,对 == 而言,正向和反向调用都是 __eq__ 方法,只是把参数对调了,而 >,<,>=,<=,正向的 __gt__ 方法调用的是反向的 __lt__ 方法,并把参数对调。对 == 和 != 来说,如果反向调用失败,Python 会比较对象的ID,而不是抛出 TypeError。如下: def __e...原创 2019-04-20 13:21:56 · 1869 阅读 · 0 评论 -
Python 重载乘法运算符
Python 中的乘法运算符就是计算标量积(scalar product),也叫元素级乘法 (elementwise multipication)如下: def __mul__(self, scalar): if isinstance(scalar, numbers.Real): return Vector(n * scalar for n ...原创 2019-04-20 12:42:18 · 3908 阅读 · 0 评论 -
Python 重载向量加法运算符 +
例子: def __add__(self, other): try: pairs = itertools.zip_longest(self, other, fillvalue=0.0) return Vector(a + b for a, b in pairs) except TypeError: ...原创 2019-04-20 11:59:58 · 2094 阅读 · 0 评论 -
Python x 和 +x 何时不相等?
每个人都觉得 x==+x,而且在 Python 中,几乎所有的情况下都是这样。但是,在 Python 的标准库中找到两例 x!=+x 的情况。第一例和 decimal.Decimal 类有关。如果 x 是 Decimal 实例,在算术运算的上下文中创建,然后在不同的上下文中计算 +x,那么 x!=+x,例如,x所在的上下文使用某个精度,而计算+x时,精度变了。import decimal...原创 2019-04-20 10:56:38 · 738 阅读 · 0 评论 -
Python 处理多重继承
继承有很多应用,而多重继承增加了可选方法和复杂度。1. 把接口继承和实现继承区分开。使用多重继承时,一定要明确一开始为什么创建子类。可能原因有:1.继承接口,创建子类型,实现是什么的关系。2.继承实现,通过重用避免代码重复。这两条经常同时出现,但是一定要明确意图。通过继承重用代码是实现细节,通常可以换用组合和委托模式,而接口继承则是框架的支柱。2.使用抽象基类显式表示接口在 Pyt...原创 2019-04-20 09:34:44 · 336 阅读 · 0 评论 -
Python 多重继承和方法解析顺序
任何实现多重继承的语言都要处理潜在的命名冲突,这种冲突由不相关的祖先类实现同名方法引起的,这种冲突称为‘菱形问题’。如下例子:class A: def ping(self): print('ping:', self)class B(A): def pong(self): print('pong:', self)class C(A...原创 2019-04-19 23:04:49 · 831 阅读 · 0 评论 -
Python 中的鸭子类型(duck typing),协议和接口
得益于 Python 数据模型,自定义类型的行为可以像内置类型那样自然。实现如此自然的行为,靠的不是继承,而是鸭子类型:我们只需按照预定行为实现对象所需的方法即可。“不要检查它是不是鸭子,它的叫声像不像鸭子,它走路姿势像不像鸭子等等,具体检查什么取决于你想使用语言的哪些特性”。鸭子类型:对象的类型无关紧要,只要实现了特定的协议即可。即忽略对象真正的类型,转而关注对象有没有实现所需的方法,签名和...原创 2019-04-19 14:11:29 · 1046 阅读 · 1 评论 -
Python 定义一个完整的 vector 类
第一版:# BEGIN VECTOR_V1from array import arrayimport reprlibimport mathclass Vector: typecode = 'd' def __init__(self, components): self._components = array(self.typecode, co...原创 2019-04-19 12:27:44 · 7254 阅读 · 0 评论 -
Python reduce,sum,any,all 归约函数
归约函数:把有序或有限的可迭代对象变成一个聚合结果。关键思想是把一系列值归约成单个值。reduce( ) 函数的第一个参数就是接受两个参数的函数,第二个参数是一个可迭代的对象。加入有个接受两个参数的 fn 函数和一个 lst 列表。调用 reduce(fn,lst) 时,fn 会应用到第一对元素上,即 fn(lst[0],lst[1]),生成第一个结果 r1。然后,fn 会应用到 r1 和下...原创 2019-04-19 12:16:55 · 606 阅读 · 0 评论 -
Python @classmethod 和 @staticmethod 装饰器
classmethod:定义操作类,而不是操作实例的方法。classmethod 改变了调用方法的方式,因此类方法的第一个参数是类本身,而不是实例,classmethod 最常见的用途是定义备选构造方法。staticmethod 装饰器也会改变方法的调用方式,但是第一个参数不是特殊的值。其实静态方法就是普通方法,只是在类的定义体里,而不是在模块层定义。class Demo: @c...原创 2019-04-19 09:53:47 · 324 阅读 · 0 评论 -
Python 的私有属性和‘受保护的’属性
Python 不能像 java 那样使用 private 修饰符创建私有属性,但是 Python 有个简单的机制,能避免子类意外覆盖‘私有’属性。举个例子,有个人编写了一个名为 dog 的类,这个类的内部用到了 mood 实例属性,但是没有将其开放,现在,你创建了 dog 类的子类:beagle,如果你有创建了名为 mood 的实例属性,那么在继承的方法中就会把 dog 类的 mood 属性覆...原创 2019-04-19 09:22:47 · 3947 阅读 · 1 评论 -
Python 自定义类实现更Python的语言风格
如何实现在很多 Python 类型中常见的特殊方法,以一个简单的欧几里得向量类型为例:"""A 2-dimensional vector class >>> v1 = Vector2d(3, 4) >>> print(v1.x, v1.y) 3.0 4.0 >>> x, y = v1 >&...原创 2019-04-18 22:29:00 · 240 阅读 · 0 评论 -
Python 函数的参数作为引用时,不使用可变类型参数作为参数的默认值
可选参数有默认值,这是 Python 函数定义的一个很棒的特性,这样 API 在进化的同时能保证向后兼容,但是我们应当避免使用可变的对象作为参数的默认值。""">>> bus1 = HauntedBus(['Alice', 'Bill'])>>> bus1.passengers['Alice', 'Bill']>>> bus1.p...原创 2019-04-18 17:02:29 · 2093 阅读 · 0 评论 -
Python 为任意对象做深复制和浅复制
默认做浅复制,复制列表(或多数内置的可变集合)最简单的方式是使用内置的类型构造方法。然后,构造方法做的是浅复制(即复制了最外层容器,副本中的元素是原容器中元素的引用)。多个浅复制的应用是共享一个原容器的引用的,因此,出现可变元素时,改动会相互影响。l2 = list(l1) 这种是浅复制,l2 和 l1 值相同,但是标识是不同,指的是不同的对象。深复制,即副本之间不共享内部对象的引用。copy...原创 2019-04-18 16:32:27 · 652 阅读 · 0 评论 -
Python 元组的相对不可变性
元组与多数的 Python 集合(列表,字典,集等)一样,保持的是对象的引用,如果引用的元素是可变的,即便元组本身不可变,元素依然可变。也就是说,元组的不可变性其实是指 tuple 数据结构的物理内容(即保存的引用)不可变,与引用的对象无关。元组中的值会随着引用的可变对象的变化而变,元组中不可变的是元素的标识。一开始,t1 和 t2 相等,但是修改 t1 中的一个可变元素之后,二者就不相...原创 2019-04-18 15:22:14 · 1025 阅读 · 0 评论 -
Python 参数化装饰器
在解析源码中的装饰器时,Python 会把被装饰的函数作为第一个参数传给装饰器函数,那怎么让装饰器接受其他参数呢?答案是建立一个装饰器工厂函数,返回一个装饰器,然后再把它应用到要装饰的函数上。举例:# BEGIN REGISTRATIONregistry = [] # <1>def register(func): # <2> print(...原创 2019-04-18 12:51:12 · 797 阅读 · 0 评论 -
使用 functools.lru_cache 做备忘
functools.lru_cache 是非常实用的装饰器,它实现了备忘功能。这是一项优化技术,它把耗时的函数结果保存起来,避免传入相同的参数时重复计算。缓存不会无限制增长,一段时间不用的缓存会被扔掉。生成第 n 个斐波那契数,递归非常耗时,看一个用装饰器写的例子:# clockdeco.pyimport timedef clock(func): def clocked...原创 2019-04-18 11:44:05 · 381 阅读 · 0 评论 -
Python 中的闭包
闭包是指延伸了作用域的函数,其中包含函数定义体中引用、但是不在定义体中定义的非全局变量。函数是不是匿名没有关系,关键是它能访问定义体之外定义的非全局变量。举个例子:计算移动平均值的类def make_averager(): series = [] def averager(new_value): series.append(new_value) ...原创 2019-04-18 11:16:21 · 191 阅读 · 0 评论 -
Python 中的装饰器
装饰器是可调用的对象,其参数是另一个函数(被装饰的函数)。装饰器可能会处理被装饰的函数,然后把它返回,或者将其替换成另一个函数或可调用对象。严格的说,装饰器只是语法糖。装饰器可以像常规的可调用对象那样调用,其参数是另一个函数。装饰的两大特性:1.能把被装饰的函数替换成其他函数。2.装饰器在加载模块时立即执行。# BEGIN REGISTRATIONregistry = [] #...原创 2019-04-17 11:11:04 · 141 阅读 · 0 评论 -
Python 使用一等函数实现设计模式 - 重构策略模式
""" >>> from promotions import * >>> joe = Customer('John Doe', 0) >>> ann = Customer('Ann Smith', 1100) >>> cart = [LineItem('banana', 4, .5), ...原创 2019-04-17 10:53:25 · 288 阅读 · 0 评论 -
使用 reduce 函数计算阶乘
第一种:使用 reduce 函数和一个匿名函数计算阶乘from functools import reducedef fact(n): return reduce(lambda a.b:a*b,range(1,n+1)) 第二种: 使用 reduce 和 operator.mul 函数计算阶乘from functools import reducefrom opera...原创 2019-04-16 10:15:59 · 2963 阅读 · 0 评论 -
Python: 用户定义的可调用类型
不仅 Python 函数是真正的对象,任何 Python 对象都可以表现的像函数。为此,只需内部实现实例方法 __call__下面这个例子:调用 BingoCage 实例,从打乱的列表中取出一个元素。BingoCage 这个类的实例使用任何可迭代对象构建,而且会在内部存储一个随机顺序排列的列表。# BEGIN BINGOimport randomclass BingoCage:...原创 2019-04-16 09:09:19 · 429 阅读 · 0 评论 -
输出 windows 下 Python 的默认编码
import sys, localeexpressions = """ # 若文件没有指定 encoding 参数,默认值由 locale.getpreferredencoding() 提供 locale.getpreferredencoding() type(my_file) my_file.encoding ...原创 2019-04-15 20:17:48 · 1929 阅读 · 0 评论 -
collections.Counter 的用法
利用 Counter 来计算单词中各个字母出现的次数感觉是个特别好用的小函数。collections.Counter这个类型会给键准备一个整数计时器。每次更新一个键时候都会增加这个计数器。...原创 2019-04-15 11:46:49 · 1039 阅读 · 0 评论 -
用 setdefault 处理找不到的键
下面是从索引中获取单词出现的频率信息,并把他们写进对应的列表里。import sysimport reWORD_RE = re.compile(r'\w+')index = {}with open(sys.argv[1], encoding='utf-8') as fp: for line_no, line in enumerate(fp, 1): f...原创 2019-04-15 11:03:27 · 424 阅读 · 0 评论 -
用 bisect.insort 插入新元素
排序很耗时,因此在得到一个有序序列之后,我们最好能保持它的有序insort(seq,item)把变量 item 插入到序列 seq 中,并能保持 seq 的升序顺序。import bisectimport randomSIZE = 7random.seed(1729)my_list = []for i in range(SIZE): new_item = rand...原创 2019-04-14 10:59:16 · 2498 阅读 · 0 评论 -
在有序序列中用 bisect 查找某个元素的插入位置
bisect(haystack,needle) 在 haystack 中搜索 needle 的位置,该位置满足的条件是,把 needle 插入这个位置之后,haystack 还能保持升序。也就是在说这个函数返回的位置前面的值,都小于或等于 needle 的值。其中 haystack 必须是一个有序的序列。你可以先用 bisect(haystack,needle)查找位置 index,再用 hays...原创 2019-04-14 10:43:47 · 463 阅读 · 0 评论 -
列表表达式同filter和map的比较
filter和map合起来能做的事情,列表推导也可以做,如下:import timeitTIMES = 10000SETUP = """symbols = '$¢£¥€¤'def non_ascii(c): return c > 127"""def clock(label, cmd): res = timeit.repeat(cmd, setup=SE...原创 2019-04-13 23:27:16 · 309 阅读 · 0 评论 -
使用 python 读取图像数据,提高数据预处理速度
import cv2import timeimport glob'''首先需要从处理内容的文件列表开始使用 for 循环逐个处理每个数据,然后在每个循环迭代上运行预处理'''# loop through all jpg file in the current folder# resize each one to size 600*600start_time = time.ti...原创 2019-02-17 14:14:16 · 6275 阅读 · 0 评论 -
python中turtle绘制七段数码管
效果如下,思路是先绘制一条线,在绘制七条线,传入数字,如果数字绘制需要七段中某一位置有笔画,就绘制,无则不绘。# coding=utf-8import turtle, timedef drawGap(): # 绘制数码管间隔 turtle.penup() turtle.fd(5)def drawLine(draw): # 绘制单段数码管 draw...原创 2019-01-03 11:18:17 · 1772 阅读 · 0 评论 -
python中turtle绘制科赫雪花
效果图如下,采用递归实现。注意一点,角度设置是按所画曲线的方向为x轴来设定,所以是0,60,-120,60.# coding=utf-8# 科赫曲线 分形几何:整体和局部都有相似之处import turtledef koch(size, n): if n == 0: turtle.fd(size) else: for angle...原创 2019-01-03 10:59:40 · 4317 阅读 · 1 评论