Python
文章平均质量分 79
be5yond
不想成为全栈的网络工程师不是好测试开发
展开
-
使用urlencode,在requests中get请求发送字典数据
1.背景某个项目中的一个查询接口,为了前端数据处理方便,get请求也传递了多层嵌套的参数。如下格式{ "page_num": 1, "page_size": 10, "filter": { "type": 2, "status": 1, "sort": { "product": 1, "time": -1 } }}2.问题使用requests内置原创 2022-04-24 10:40:07 · 2267 阅读 · 0 评论 -
Python 中调用父类中的方法,super() 函数介绍
1. 概述super() 返回父类的临时对象,然后可以调用父类的方法。常用于扩展父类的方法,通过使用super() 语句直接调用父类的方法,无需再子类中重新实现, 使用最少的代码来扩展父类的方法。一个例子:创建一个矩形类,包含长宽2个属性, 周长和面积2个函数。class Rectangle: def __init__(self, length, width): self.length = length self.width = width原创 2021-09-07 16:04:17 · 5184 阅读 · 0 评论 -
Python 中的魔术方法(九)自定义反射,__instancecheck__和 __subclasscheck__
可以通过定义魔术方法来控制使用内置函数isinstance()和issubclass()行为的反射方式。原创 2021-09-06 16:30:41 · 523 阅读 · 0 评论 -
Python 中的魔术方法(八)上下文管理器,__enter__和 __exit__
1.__enter__和 __exit__上下文管理器的行为由两个魔术方法决定:__enter__(self) - 定义上下文管理器在 with 语句创建的块的开头应该做什么。__enter__的返回值 绑定到 with 语句的目标,即 as 语句后面的名称。 __exit__(self, exc_type, exc_value, exc_tb) 此方法在执行流离开 with 上下文时调用。如果发生异常,则exc_type、exc_value和 分别exc_tb保存异常类型、值和回溯信息...原创 2021-09-06 16:15:49 · 1077 阅读 · 0 评论 -
Python 中的魔术方法(七)自定义容器行为, __setitem__ 和 __getitem__ 等
1. 协议Python 中创建自定义序列通常的方式是继承内置的数据类型,使用collections模块中的UserDict UserList等数据。如果要创建完全自定义的序列, 需要实现Python 中自定义容器类型其中一些协议。首先,有用于定义不可变容器的协议:要创建不可变容器,您只需要定义 __len__ 和 __getitem__对于可变容器, 需要实现__setitem__ 和__delitem__。如果容器对象需要支持迭代,还需要实现一个返回一个迭代器的 __iter__...原创 2021-09-06 15:43:51 · 354 阅读 · 1 评论 -
Python 中的魔术方法(六)属性访问控制, __getattr__ 和 __getattribute__
1.__getattr__ 和 __getattribute__区别__getattr__只在没有找到目标属性时调用。很适合作为属性缺失时的缺省回调函数。__getattribute__在查看对象的实际属性之前调用,需要注意避免无限递归。一个代码示例来展示两个方法的使用, 创建一个自定义字典, 可以使用 obj.attr 的语法来访问字典内的数据。 如 obj = {"a": "b"} ,obj.a 返回 b。 增加一个size属性,返回字典数据个数。In [1]: from ...原创 2021-09-06 15:22:04 · 502 阅读 · 0 评论 -
Python 中的魔术方法(五)类的展示方法, __str__ 和 __repr__
1.__str__ 和 __repr__Python的内置函数 repr() 能够把对象用字符串的形式表达出来,方便我们辨认。这就是“字符串表示形式”。根据 Python 文档中定义 __str__:通过 str(object) 以及内置函数 format() 和 print() 调用以生成一个对象的“非正式”或格式良好的字符串表示。返回值必须是字符串对象。 __repr__:是由 repr() 内置函数调用,用来输出一个对象的“官方”字符串表示。返回值必须是字符串对象,此方法通..原创 2021-09-06 11:50:41 · 291 阅读 · 0 评论 -
Python 中的魔术方法(四)数学运算方法, __add__(+), __or__(|)等方法
和比较运算符一样, 也可以通过魔术方法自定义 数字运算符的行为,1. 一元运算符方法 说明 运算符 __pos__(self) 实现取正的行为 +obj __neg__(self) 实现取负的行为 -obj __abs__(self) 实现内置 abs() 函数的行为 abs(obj) __invert__(self) 实现 ~ 运算符实现反转行为 ~(obj) __round__(self, n) 实现内置 ..原创 2021-09-03 15:57:50 · 771 阅读 · 0 评论 -
Python 中的魔术方法(三)自定义比较方法, __eq__(==), __lt__(<)等方法
相较于 a.is_equal(b), a.is_greater_than(b)这种语法的函数调用来进行对象的对比, 使用运算符的比较 a == b, a > b这样的语法更加直观。Python 种提供了一系列的魔术方法, 来实现对象的对比。方法 说明 运算符 __eq__(self, other) 定义相等运算符的行为 == __ne__(self, other) 定义不等式运算符的行为 != __lt__(self, other)...原创 2021-09-03 14:31:38 · 918 阅读 · 0 评论 -
Python 中的魔术方法(二)__call__, 重载 ()的功能, 使实例像函数一样工作
Python 中的一个特殊魔术方法 __call__ 允许类的实例表现得好像它们是函数一样。 你可以“调用”它们,并将实例化过程中的参数,作为函数的参数来使用。__call__(self, *args, **kwargs)允许将类的实例作为函数调用。ins()本质上就是 ins.__call__.请注意,__call__接受任意数量的参数;代码示例class Card: def __init__(self, suit, rank): self.suit = s...原创 2021-09-03 11:53:05 · 623 阅读 · 0 评论 -
Python 中的魔术方法(一)__new__和__init__, 构造和初始化的区别
1. 概念在Python中,所有以双下划线__包起来的方法,统称为Magic Method(魔术方法),它是一种的特殊方法。2. 构造和初始化最基本的魔术方法,大家经常用的__init__。这是我们初始化定义的对象行为的方式。但是当我实例化一个类 instance = MyClass() 时,__init__并不是第一个被叫到的。而是令一个方 法__new__,由它实际上创建了实例,然后将创建时的任何参数传递给初始化程序。在对象生命周期的另一端,是__del__方法。我们仔细看看这 3...原创 2021-09-03 11:27:38 · 373 阅读 · 0 评论 -
Python 更加优雅的读取资源方式 importlib.resources
1. 简介这个模块使得Python的导入系统提供了访问*包*内的*资源*的功能。如果能够导入一个包,那么就能够访问那个包里面的资源。资源可以以二进制或文本模式方式被打开或读取。Python项目使用项目内的资源文件,例如项目所需的数据文件。通常使用以下方法硬编码数据文件的路径 将数据文件放入包装中,并使用进行定位__file__ 使用setuptools.pkg_resources访问数据文件资源如 项目文件结构如下, 在test.py 中要使用data.txt 中的数据myproj.原创 2021-09-02 16:21:55 · 3559 阅读 · 0 评论 -
Python 并发编程(三)对比(multiprocessing, threading, concurrent.futures, asyncio)
1. 对比Python 3.2 引入了concurrent.futures。3.4版本引入了asyncio到标准库, python3.5以后使用async/await语法。库 Class/Method 并发类型 适用任务 multiprocessing Pool 并行 cpu 密集型 concurrent.futures ProcessPoolExecutor 并行 cpu 密集型 threading Thread 并原创 2021-09-01 16:59:37 · 5113 阅读 · 2 评论 -
Python 并发编程(一)基本概念(进程、线程、协程)
1. 并发与并行并发和并行是相似的术语,但它们并不是一回事并发是在 CPU 上同时运行多个任务的能力。任务可以在重叠的时间段内启动、运行和完成。在单个 CPU 的情况下,多个任务在上下文切换的帮助下运行,其中存储进程的状态,以便稍后调用和执行。并行性是在多个 CPU 内核上同时运行多个任务的能力。通俗点解释就是,区别就在于是否可以“同时”处理。比如正在用 pad 看电影,这时电话响了,暂停电影然后接电话,挂掉电话之后继续看电影,这就是并发。电影继续播着,一边看电影一边讲电话就是并行.原创 2021-09-01 14:41:51 · 177 阅读 · 0 评论 -
Python 深入理解dict---为什么 dict 查询元素比 list 快?
前言:查看https://wiki.python.org/moin/TimeComplexity中的数据可以看到在 list 中查找元素的复杂度为 O(n) , 在 dict 中查找元素的复杂度 为 O(1)本文来探讨以下其中的原理。1. hash字典建立在另一种技术之上:哈希表hash 函数是一种可以将任意长度的数据映射到固定长度值的函数,称为哈希。hash 函数有 3 大特点:速度快: 确定性: 同一数据hash计算后,永远产生唯一的确定值。 固定长度:无论输入多..原创 2021-08-31 19:21:09 · 1218 阅读 · 0 评论 -
Python中的内存管理---list的内存使用
前言使用 Python 的时候,我们知道 list 是一个长度可变对的数组, 可以通过 insert,append 和 extend 轻易的拓展其中的元素个数。 也可以使用运算符 如: [1] + [2] 生成新的数组[1, 2]extend()、"+"、"+="的区别"+"将两个 list 相加,会返回到一个新的 list 对象 append 在原 list 上进行修改,没有返回值从以下代码可以看到, 调用 b = b + [3, 4] 之后, 通过id(b) 查看 b 变成了一个新对..原创 2021-08-31 14:18:42 · 4195 阅读 · 0 评论 -
【算法题】给定两个有序区间列表,找到这两个列表的交集
示例:输入: arr1=[[1, 3], [5, 6], [7, 9]], arr2=[[2, 3], [5, 7]]返回:[2, 3], [5, 6], [7, 7]输入:arr1=[[1, 3], [5, 7], [9, 12]], arr2=[[5, 10]]返回:[5, 7], [9, 10]思路:2个区间的关系, 一共有四种可能,没有交集, 部分交集,被包含, 相等。因为要求的是两个有序区间列表的交集, 使用 2个指针分别遍历一个区间列表,然后将求当前...原创 2021-08-30 16:14:15 · 308 阅读 · 0 评论 -
Python 并发编程(二) GIL (全局解释器锁)
Python 全局解释器锁 GIL(GlobalInterpreterLock),简单来说是一个互斥锁,它同一时间只允许一个线程控制 Python 解释器。这意味着在任何时间点都只能有一个线程处于执行状态。由于即使在具有多个 CPU 内核的多线程架构中,GIL 也只允许一次执行一个线程,因此 GIL 被称为 Python 最“臭名昭著”的特性。1. 为什么需要GILPython 使用引用计数进行内存管理。这意味着在 Python 中创建的对象有一个引用计数变量,用于跟踪指向该对象的引用数量...原创 2021-08-23 16:22:56 · 281 阅读 · 0 评论 -
Python中的内存管理---引用计数与垃圾收集
1. CPython介绍Python 是一种解释型编程语言。你的 Python 代码实际上被编译成更多计算机可读的指令,称为字节码 (即我们经常在__pycache__文件夹中见到的 .pyc 文件)。当您运行代码时,这些指令由虚拟机解释。默认的 Python 实际上是CPython,是用 C 编写的,运行时由它解释 Python 字节码。除 CPython 之外还有其他实现常见python解释器 名称 CPython IronPython Jython PyP...原创 2021-08-23 15:28:11 · 186 阅读 · 0 评论 -
Python 如何写干净的代码 Clean-Code
1. 什么是Clean-CodeClean-Code 是一组规则和原则,有助于保持我们的代码可读、可维护和可扩展。我们花在阅读代码上的时间比实际编写代码的时间多得多,这就是为什么编写易于维护的代码很重要。1.1 Clean-Code的特点容易理解 更有效率 易于维护, 拓展, 调试 需要更少的文档2. 代码标准代码标准是编码规则、指南和最佳实践的集合。从以下几个方面介绍一下代码标准编程实践和原则 文件组织 代码格式(缩进、声明、语句) 命名约定 注释2.1 代码原则原创 2021-08-19 15:06:55 · 703 阅读 · 0 评论 -
Python 更好的文件路径处理模块 pathlib详解
1. 为什么需要pathlib在pathlib出现之前, Python 的标准库os.path支持操作文件路径, 使用字符串表示文件路径。In [1]: import os.pathIn [2]: os.path.abspath('test')Out[2]: 'C:\\Users\\Public\\Documents\\test'如以上代码, abspath函数的返回是一个字符串. 如果想要获取父目录, 需要使用字符串的split方法In [3]: path = os.path..原创 2021-08-17 15:47:48 · 2862 阅读 · 0 评论 -
Python中with语句详解, 2种方式创建自定义的上下文管理器
1. Python中的资源管理在编程中面临的一个常见问题是如何正确管理外部资源,例如文件、锁和网络连接。如果创建和打开资源后, 而不实现关闭, 就会出现内存泄漏.正确管理资源需要一个Setup阶段和一个Teardown, Teardown阶段需要执行一些清理操作,例如关闭文件、释放锁或关闭网络连接.file = open("hello.txt", "w")file.write("Hello, World!")file.close()如果调用 .write() 期间发生异常,.close原创 2021-08-16 14:50:55 · 715 阅读 · 0 评论 -
Python中生成随机数据random模块总结
1. 伪随机查看 python 标准库random的文档, 第一行是该模块为各种分布实现了伪随机数生成器random模块本质上是用数据的算法来实现的, 生成的数据看似随机, 但依然是可重现的。1.1seed, getstate, setstate通过指定初始化随机数, random.seed 可以使后续生成的随机数具有确定性.In [1]: import randomIn [2]: random.seed(100)In [3]: [random.random() ...原创 2021-08-13 17:21:16 · 2239 阅读 · 0 评论 -
Python 中的json模块dumps参数详解
1.什么是JSON维基百科中的定义: JSON(JavaScriptObjectNotation,JavaScript对象表示法)是一种由道格拉斯·克罗克福特构想和设计、轻量级的资料交换语言,该语言以易于让人阅读的文字为基础,用来传输由属性值或者序列性的值组成的数据对象。尽管JSON是JavaScript的一个子集,但JSON是独立于语言的文本格式,并且采用了类似于C语言家族的一些习惯。一个数据示例:{ "firstName": "Micheal", "lastName":..原创 2021-08-13 11:48:03 · 18111 阅读 · 6 评论 -
Python中的数据类dataclass详解
1. 为什么需要数据类1.1 ☹️内置数据类型的局限假设遇到一个场景, 需要保存一些运动员信息的数据对象. 可以使用基本的数据类型tuple和dict实现.如需要创建一个球员jordan, 信息包括球员姓名, 号码, 位置, 年龄.使用tupleIn [1]: jordan = ('Micheal Jordan', 23, 'PG', 29)In [2]: jordan[0]Out[2]: 'Micheal Jordan'劣势: 创建和取值基于位置, 需要记住坐标对应的....原创 2021-08-12 15:53:05 · 29730 阅读 · 8 评论 -
Python中的包和模块 module, package
1. 概述模块化编程是指将大型、繁杂的编程任务拆分为更小的、各自独立的、更易于管理的子任务或模块的过程。然后可以将各个模块拼凑在一起以创建更大的应用程序。应用程序中模块化代码有几个优点: 简单性:一个模块通常只关注问题的一小部分。这使得开发更容易,更不容易出错。 可维护性:模块化设计为任务强制划分了逻辑边界。如果模块之间以最小化相互依赖的方式编写,那么对单个模块的修改对程序其他部分产生影响的可能性就会降低。(甚至可以在不了解模块外的应用程序的情况下对模块进行更改。) 可重用原创 2021-08-09 16:27:18 · 345 阅读 · 0 评论 -
Python中的命名空间介绍 -- 以及nonlocal 和global 的使用
1. 命名空间Python程序运行时, 会根据需要创建命名空间. 按照命名空间的生命周期来划分, 可将命名空间分为4种内置 ( Built-in ) 全局 ( global ) 闭包 ( Enclosing ) 本地 ( local )1.1 内置命名空间内置空间中保存着Python内置的变量对象(如 print函数, list对象等), 内置命名空间由Python解释器创建和销毁, 只要python程序在运行, 内置空间的变量就是生效的. 如:任何时候都可以调用print函数和使用l.原创 2021-08-05 20:56:34 · 488 阅读 · 1 评论 -
Python中的*args和**kwargs理解
1.Python函数的参数Python函数的传参, 支持两种方式, 一种是基于位置传递(Positional Arguments), 一种是基于变量名称传递(Keyword Arguments).比如定义一个函数func 接受4个参数In [1]: def func(a, b, c, d): ...: print(a, b, c, d)可以基于位置传参, (1, 2, 3, 4)根据位置顺序分别赋值给参数a, b, c, d.In [2]: func(1, 2, 3, .原创 2021-08-03 20:53:36 · 1241 阅读 · 5 评论 -
Python 迭代器与生成器的区别
先说结论: ① 所有的生成器都是迭代器. ② 迭代器(iterator)用类实现, 生成器(generator)用函数实现Python 中任意的对象,只要它定义了可以返回一个迭代器的__iter__方法,或者定义了可以支持下标索引的__getitem__方法,那么它就是一个可迭代对象(如: tuple, list, dict)1.迭代器迭代器的实现是基于类, 要使得类的实例是一个生成器, 需要满足2个条件.定义一个__iter__方法, 内容要 return self...原创 2021-08-03 16:54:46 · 5442 阅读 · 1 评论 -
Python 中的深拷贝deepcopy与浅拷贝copy
Python中的赋值语句不会创建一个新对象,它们只是将一个新的变量名称指向原来的对象。In [1]: a = [1,2,3]In [2]: b = aIn [3]: bOut[3]: [1, 2, 3]In [4]: b is aOut[4]: True此时,如果原对象a发生变化, 便量b也同步收到影响。In [5]: a.append(4)In [6]: bOut[6]: [1, 2, 3, 4]制作拷贝如果想要生成一个新的对象, 可以使用构造函数In原创 2021-08-01 13:39:48 · 1059 阅读 · 0 评论 -
Python让代码更简洁的方法(三), 赋值表达式(海象运算符 :=)
前言:Python使用缩进来标识语句块, 来表明代码之间的逻辑层级关系, 有的时候一些简单的代码逻辑,确写了好几行, 看起来既不简洁也不优雅.其实Python提供了更贴近自然语言的语法, 从而写出更高可读性的代码. 本文介绍一下海象操作符.我们经常遇见这样的代码lst = [1, 2, 3, 4]if len(lst) > 3: n = len(lst) print(f"List is too long ({n} elements, expected <= .原创 2021-07-31 15:30:55 · 297 阅读 · 0 评论 -
Python让代码更简洁的方法(二), 列表表达式
前言:Python使用缩进来标识语句块, 来表明代码之间的逻辑层级关系, 有的时候一些简单的代码逻辑,确写了好几行, 看起来既不简洁也不优雅.其实Python提供了更贴近自然语言的语法, 从而写出更高可读性的代码....原创 2021-07-30 20:02:37 · 495 阅读 · 0 评论 -
Python 让代码更简洁的方法(一), 条件表达式(三元运算符)
前言:Python 之禅中有两句,Beautiful is better than ugly.Flat is better than nested.其实Python提供了更贴近自然语言的语法, 从而写出更高可读性的代码.1. 条件表达式(三元运算符)写代码时, if条件语句是使用最频繁的了, 但是当条件判断之后执行的代码相当简短的时候, Python代码会变得1.1 ☹️丑陋的写法if a > b: m = aelse: m = b1.2..原创 2021-07-30 14:41:53 · 7240 阅读 · 0 评论 -
Python 中的属性方法@property 介绍
1. 类属性和实例属性Python中类和实例都是对象, 可以在定义时或者通过 . 语法设置和读取属性内容.In [1]: class Demo: ...: cls_name = "Demo" ...: def __init__(self, name): ...: self.name = nameIn [2]: demo = Demo('demo')In [3]: demo.nameOut[3]: 'demo'In [4]: demo.c.原创 2021-07-29 11:25:57 · 274 阅读 · 0 评论 -
理解method(实例方法), staticmethod(静态方法)和classmethod(类方法)的区别
1.概述Python中定义在类中的函数称作方法, 可以通过装饰器@staticmethod 和@classmethod将其转换成静态方法, 和类方法.本文将通过实例帮大家理解其中的区别,以便明确他们的使用场景, 可以熟练使用来写出更易于维护的代码。让我们首先编写一个类,其中包含所有三种方法类型的简单示例:class Demo: def method(self, x): print("instance mathod", self, x) @class...原创 2021-07-28 17:37:34 · 810 阅读 · 0 评论 -
Python中的函数式编程 functools模块介绍 partial singledispatcher lru_cache
前言之前的文章中提到了 functools模块中的reduce 和 wraps,functools模块提供了处理函数的高阶函数, 再不重写原函数的情况下, 使用或者拓展原函数的功能. 本文介绍一下functools中的其他常用模块. 熟练运用可以使代码更加高性能, 易读易维护的代码.下面开始吧1. 偏函数 partial 和partialmethodpartial作为一个函数式编程中的高阶函数,其功能就是为某个已经存在的函数对象提供了一种简洁的绑定函数参数的方式。对于关键字参数,相当于提供默..原创 2021-07-27 17:00:33 · 312 阅读 · 0 评论 -
Python中的函数式编程 3个问题了解装饰器
前言:装饰器是python的一个重要特性, 通过对以下3个方面来进行介绍,1. 装饰器是什么2. 为什么需要装饰器3. 如何使用装饰器希望可以通过本文理解装饰器, 从而写出更加简洁,优雅, 更加pythonic的代码.什么是闭包?有关装饰器的文章中, 经常看到一句话, 装饰器的本质是个闭包. 那么什么是闭包呢, 维基百科中的定义: 闭包在实现上是一个结构体,它存储了一个函数(通常是其入口地址)和一个关联的环境(相当于一个符号查找表), 环境里是若干对符号和值的对应关系..原创 2021-07-26 20:47:13 · 292 阅读 · 4 评论 -
Python中的函数式编程 lambda filter map reduce 介绍
1. 函数是一等公民为了支持函数式编程,需要编程语言中的函数具有两种能力:将另一个函数作为参数 将另一个函数返回给它的调用者Python 在这两个方面都表现出色, 因为python中的一切都是对象, 函数也是一个对象,函数是一等公民.所谓一等公民(first class),指的是函数与字符串和数字等值具有相同的特征,可以赋值给其他变量,也可以作为参数传入另一个函数,或者作为函数的返回值。In [1]: def func(): ...: print('a func...原创 2021-07-23 21:16:52 · 201 阅读 · 0 评论 -
【技术分享】处理JSON 数据的神器: JMESPath (二) 进阶篇
前言:【技术分享】处理JSON 数据的神器: JMESPath (一) 入门篇文中介绍了, jmespath的基本使用方法, 如何使用 . 和[ ]抽取json文档中的目标数据, 管道符 | 的作用和多字段处理 [ ] { }本文继续介绍JMESPath 的高阶用法, 包括数据过滤 和使用内置函数进行数据转换1. 数据过滤对于列表数据, jmespath支持基于另一个表达式比较来过滤数据元素的方法. 语法为 [?expression] ,表...原创 2021-07-22 19:55:58 · 2587 阅读 · 1 评论 -
【技术分享】处理JSON 数据的神器: JMESPath (一) 入门篇
什么是JMESPathJMESPath 是查询 JSON 数据的查询语言. 可以快速解析复杂的JSON数据.通过定义jmespath, 可以将数据提取, 数据筛选, 数据格式转换 动作只需一步即可完成, 大大加快对于复杂的JSON数据的处理速度.为了展示它的强大之处, 看下面这个例子, 输入如下jmespath, 对目标数据的locations字段进行处理.① 找到locations字段下的数据, 过滤state == 'WA' 的数据, 提取name字段② 将结果数据传...原创 2021-07-22 14:24:36 · 6813 阅读 · 3 评论