当前位置: 首页 > news >正文

5个面向Python高级开发者的技巧

使用这些用于自定义类行为、编写并发代码、管理资源、存储和操作数据以及优化代码性能的高级技术来探索 Python 的深度。

本文探讨了 Python 中的五个高级主题,它们可以为解决问题和提高代码的可靠性和性能提供有价值的见解和技术。从允许您在定义类时自定义类行为的元类编程,到支持并发代码执行的异步编程,再到上下文管理器、集合类和类型提示,这些主题提供了一系列工具和方法来处理这些问题Python 中的复杂挑战。无论您是初学者还是经验丰富的程序员,这些高级主题都可以帮助您编写更强大、更有效的代码。

元类编程:

元类是在 Python 中自定义类行为的强大工具。它们允许您定义类的创建方式,并可用于实现单例或工厂模式等设计模式。

要创建元类,您需要定义一个继承自“type”内置的类。例如:

class MyMeta(type):          def __new__(cls, name, bases, namespace):          # Customize the class creation process here          return super().__new__(cls, name, bases, namespace)

元类的方法__new__在定义新类时调用,并允许您通过修改其名称、基类或命名空间来自定义类。

下面是一个如何使用元类来实现单例模式的示例:

class SingletonMeta(type):          _instances = {}          def __call__(cls, *args, **kwargs):          if cls not in cls._instances:          cls._instances[cls] = super().__call__(*args, **kwargs)          return cls._instances[cls]          class MySingleton(metaclass=SingletonMeta):          pass          s1 = MySingleton()          
s2 = MySingleton()          
assert s1 is s2

在此示例中,SingletonMeta元类重写__call__方法以在每次调用时返回类的相同实例。MySingleton这确保在任何给定时间只有一个类实例。

元类编程是在 Python 中实现高级面向对象模式的有用技术。但是,它可能难以理解和调试,应谨慎使用。

异步编程:

异步编程是一种使用异步/等待语法编写并发代码的方法。它允许您编写可以同时执行 I/O 绑定或高级 CPU 绑定操作的代码,而无需多线程。

在 Python 中编写异步代码,需要使用async关键字定义异步函数,使用await关键字调用异步函数并等待其结果。例如:

import asyncio          async def fetch_url(url):          # Perform an HTTP request to the given URL          response = await asyncio.sleep(1)          return response          async def main():          # Run the tasks concurrently          task1 = asyncio.create_task(fetch_url('http://example.com/1'))          task2 = asyncio.create_task(fetch_url('http://example.com/2'))          await asyncio.gather(task1, task2)          asyncio.run(main())

在此示例中,该fetch_url函数对给定 URL 执行 HTTP 请求,并且该main函数创建两个使用该函数并发运行的任务asyncio.gather。

异步编程对于提高执行 I/O 绑定操作(例如网络通信或从数据库读取)的程序的性能很有用。它对于以并发方式实现高级 CPU 绑定操作(例如数据处理或机器学习)也很有用。

以下是如何使用异步编程并发执行 HTTP 请求的示例:

import aiohttp          
import asyncio          async def fetch_url(session, url):          async with session.get(url) as response:          return await response.text()          async def main():          async with aiohttp.ClientSession() as session:          # Run the tasks concurrently          task1 = asyncio.create_task(fetch_url(session, 'http://example.com/1'))          task2 = asyncio.create_task(fetch_url(session, 'http://example.com/2'))          responses = await asyncio.gather(task1, task2)          print(responses)          asyncio.run(main())

在此示例中,该fetch_url函数使用该aiohttp库对给定 URL 执行 HTTP GET 请求,并且该main函数创建两个使用该asyncio.gather函数并发运行的任务。

异步编程可以成为提高 Python 程序性能和可扩展性的强大工具。但是,它可能难以理解和调试,特别是对于刚接触并发编程的程序员而言。

上下文管理器:

上下文管理器是一种使用“with”语句管理文件句柄或锁等资源的方法。它们有助于确保资源在不再需要时得到适当清理。

要创建上下文管理器,您需要定义一个带有__enter__方法和__exit__方法的对象。例如:

class MyContext:          
    def __init__(self, value):          
        self.value = value          
    def __enter__(self):          
        print(f'Entering context with value {self.value}')          
        return self          
    def __exit__(self, exc_type, exc_value, traceback):          
        print('Exiting context')          
         
with MyContext(42) as context:          
    print(f'Value inside context: {context.value}')

在此示例中,该类MyContext定义了一个__enter__在输入“with”语句时调用的方法,以及一个__exit__在退出“with”语句时调用的方法。

以下是如何使用上下文管理器管理文件句柄的示例:

with open('myfile.txt', 'w') as f:          
    f.write('Hello, world!')

在此示例中,内置open函数返回管理文件句柄的上下文管理器。当退出“with”语句时,文件自动关闭。

上下文管理器是一种方便可靠的 Python 资源管理方式。它们确保资源得到适当清理,并有助于防止资源泄漏和其他问题。

集合类:

Python 有许多内置的集合类,例如 deque、Counter 和 OrderedDict,它们提供了用于存储和操作数据的专门功能。在某些情况下,这些类比传统的列表和字典更有效、更易于使用。

以下是如何使用该类deque实现简单队列的示例:

from collections import deque          
         
q = deque()          
q.append('a')          
q.append('b')          
q.append('c')          
print(q.popleft())  # Output: 'a'          
print(q.popleft())  # Output: 'b'          
print(q.popleft())  # Output: 'c'

在此示例中,该类deque实现了一个双端队列,允许您从任一端添加和删除元素。它比使用列表作为队列更有效,因为它支持两种操作的 O(1) 时间复杂度。

下面是一个示例,说明如何使用该类Counter来计算序列中元素的出现次数:

from collections import Counter          
         
c = Counter([1, 2, 2, 3, 3, 3])          
print(c)  # Output: Counter({3: 3, 2: 2, 1: 1})          
print(c[1])  # Output: 1          
print(c[4])  # Output: 0

在此示例中,该类Counter计算输入序列中每个元素的出现次数,并将它们存储在类似字典的对象中。它提供了一种对数据执行基本统计操作的便捷方式。

下面是一个示例,说明如何使用该类OrderedDict来保留字典中元素的插入顺序:

from collections import OrderedDict          
         
d = OrderedDict()          
d['a'] = 1          
d['b'] = 2          
d['c'] = 3          
for k, v in d.items():          
    print(k, v)  # Output: a 1, b 2, c 3

在此示例中,该类OrderedDict保留了字典中元素的插入顺序。如果您需要保持元素的原始顺序,或者如果您想要以可预测的顺序迭代元素,这将很有用。

集合类可以成为在 Python 中存储和操作数据的有用工具。它们提供了专门的功能,在某些情况下比传统数据结构更有效、更易于使用。

类型提示:

类型提示是 Python 3 的一项功能,它允许您使用预期的类型来注释变量和函数。这可用于静态类型检查、文档和优化。

要使用类型提示,您需要使用typing模块来定义预期的变量和函数类型。例如:

from typing import List, Dict          
         
def greet(name: str) -> str:          
    return f'Hello, {name}!'          
         
def count_words(s: str) -> Dict[str, int]:          
    words = s.split()          
    return {word: words.count(word) for word in set(words)}          
         
def add_numbers(numbers: List[int]) -> int:          
    return sum(numbers)

在此示例中,greet函数使用其参数的预期类型(字符串)及其返回值(也是字符串)进行注释。该count_words函数使用其参数的预期类型(字符串)及其返回值(将字符串映射到整数的字典)进行注释。该add_numbers函数使用其参数的预期类型(整数列表)及其返回值(整数)进行注释。

类型提示可用于使用诸如mypy. 它还可以用于文档目的,向您的代码用户提供有关变量和函数的预期类型的信息。最后,它可以通过优化编译器来生成更快的代码。

类型提示是提高 Python 程序的可靠性和性能的有用工具。它可以帮助及早发现错误并优化代码以提高性能。但是,它不能替代测试,应与其他工具和实践结合使用。

总之,本文概述了 Python 中的五个高级主题:元类编程、异步编程、上下文管理器、集合类和类型提示。这些主题中的每一个都可以为解决 Python 中的问题提供有价值的见解和技术,并可用于提高代码的可靠性和性能。

元类编程允许您在定义类时自定义类的行为,并且可用于实现高级的面向对象模式,例如单例模式或工厂模式。异步编程允许您使用 async/await 语法编写并发代码,并且对于提高执行 I/O 绑定或高级 CPU 绑定操作的程序的性能很有用。上下文管理器允许您使用“with”语句管理文件句柄或锁等资源,并确保在不再需要时正确清理资源。deque、Counter 和 OrderedDict 等集合类提供了用于存储和操作数据的专门功能,并且在某些情况下比传统数据结构更高效、更易于使用。

总体而言,这些高级主题可以为解决 Python 问题提供有价值的工具和技术,并可以帮助您编写更可靠、更高效的代码。

 

相关文章:

5个面向Python高级开发者的技巧

使用这些用于自定义类行为、编写并发代码、管理资源、存储和操作数据以及优化代码性能的高级技术来探索 Python 的深度。 本文探讨了 Python 中的五个高级主题,它们可以为解决问题和提高代码的可靠性和性能提供有价值的见解和技术。从允许您在定义类时自定义类行为的…...

Nginx简介

Nginx是什么?可以做什么事情? Nginx是高性能的HTTP和反向代理的web服务器,处理高并发的能力十分强大,能经受高负载的考研,有报告表明能能支持高达50000个并发连接数。 特点 占有内存少:一万个长连接&…...

十五分钟带你学会 Electron

文章目录 什么是 Electron为什么要选择 Electron安装 Electron桌面CSDN实战Electron 基础配置Electron 进程主进程渲染进程主进程与渲染进程的区别主进程与渲染进程的通信 Electron 跨平台问题Electron 部署打包应用程序发布应用程序 Electron 跨端原理总结 什么是 Electron E…...

设计模式-结构型模式之桥接模式

2. 桥接模式 2.1. 模式动机 设想如果要绘制矩形、圆形、椭圆、正方形,我们至少需要4个形状类,但是如果绘制的图形需要具有不同的颜色,如红色、绿色、蓝色等,此时至少有如下两种设计方案: 第一种设计方案是为每一种形状…...

软件测试工程师为什么要写测试用例?

软件测试工程师为什么要写测试用例?相信从事软件测试行业的从业者来讲,测试用例并不陌生。因为测试用例不仅仅是一组简单的文档,它包含前提条件、输入、执行条件和预期结果等等重要内容,并且能够完成一定的测试目的和需求。下面本…...

【DAY40】VUE练习

DOS命令: DOS(Disk Operating System)是一种操作系统,它使用命令行界面(Command Prompt)进行交互。在 DOS 中,有一些常用的命令,可以用来定位目录、创建、删除、拷贝文件和目录&…...

实模式的寄存器

实模式的寄存器有8个通用寄存器,分别为AX、BX、CX、DX、SI、DI、BP和SP。通用的意思就是它们之中的大部分可以根据需要用于多种目的。 AX: accumulator,累加寄存器 BX: base,基址寄存器 CX: count,计数寄存器 SI: Source Index&am…...

【UE 控件蓝图】通过键盘选中要点击的按钮 通过Enter键点击

上一篇【UE 控件蓝图】菜单及功能实现博客已经完成了菜单的制作,但是我们只能通过鼠标来点击菜单选项,本篇博客实现的是能够通过键盘的上下键来选中按钮,然后按下“Enter”键来实现点击按钮的效果。 效果 可以看到并没有移动鼠标也可以通过…...

SSR在天猫优品大促会场的探索实践

BBC 发现其网站加载时间每增加一秒,用户便会流失 10%。为提高页面的秒开率,我们不断探索着优化策略,仅仅在浏览器领域下的优化已经满足不了我们的极致要求,开始往服务端方向不断探索。本文将讨论业务接入SSR的几个问题&#xff1a…...

WPF教程(一)---创建一个WPF程序基础知识

1.前言: 这篇主要讲WPF的开发基础,介绍了如何使用Visual Studio 2019创建一个WPF应用程序。 首先说一下学习WPF的基础知识: 1) 要会一门.NET所支持的编程语言--例如C#。 2) 会一点“标准通用标记语言”:WPF窗体程序使用的XAML语…...

【C++ 四】函数、指针

函数、指针 文章目录 函数、指针前言1 函数1.1 概述1.2 函数定义1.3 函数调用1.4 值传递1.5 函数常见样式1.6 函数声明1.7 函数分文件编写1.8 函数默认参数1.9 函数占位参数1.9 函数重载1.9.1 函数重载概述1.9.2 函数重载注意事项 2 指针2.1 指针基本概念2.2 指针变量定义和使用…...

虚拟人与娱乐传媒融合,推动综艺新模式

经过多年的更新迭代和市场的推动,虚拟人技术正在逐渐迈向成熟:3D虚拟形象的制作变得越来越精致且真实,并且出现了越来越多功能丰富使用便捷的动捕设备。因此,包括综艺影视在内的诸多领域,开始尝试将虚拟人技术融入行业…...

Linux_红帽8学习笔记分享_5

Linux_红帽8学习笔记分享_5 文章目录 Linux_红帽8学习笔记分享_51. UMASK反掩码1.1如何查看反掩码umask1.2 UMASK反掩码的作用1.2.1对于目录来说1.2.2对于文件来说 1.3如何修改UMASK反掩码1.4普通用户反掩码的测试 2.whereis的使用3. SUID权限弥补(主要针对文件,所有者执行位变…...

网络编程及项目思路

计算机和计算机之间通过网络进行数据传输 常见的软件架构: C/S:客户端/服务器 画面可以做的非常精美,用户体验好需要开发客户端,也需要开发服务端用户需要下载和更新的时候太麻烦 B/S:浏览器/服务器 不需要开发客户端,只需要…...

GD(兆易创新)系列FLASH进行FPGA和ZYNQ配置固化相操作

写在前面 本文主要针对使用GD(兆易创新)系列的FLASH做启动配置片时,遇到的相关问题进行简单整理复盘,避免后人踩坑。 本人操作固化芯片型号为:ZYNQ7045、690T(复旦微替代型号V7 690T)。 7系列…...

通过一个小例子来看一下C语言指针 p、*p、p、*p、*p分别代表什么

前言 在C语言中,指针是非常重要的概念。指针是一个变量,其值为另一个变量的地址。使用指针可以直接访问内存中的数据,这使得C语言非常灵活和强大。在学习C语言时相比大家都已经知道了&和*的区别了,但是你知道*&p和&*…...

【内摹访谈】谈谈AI爆发前夜的B端设计

本文来自摹客产品设计团队(MPD)的设计专栏“内摹访谈”。专栏介绍:专栏名称来源于西方美学理论「内摹仿说」,意指审美活动与摹仿活动紧密相连,审美不只针对表象动作,其核心在于由物及我,从表观带…...

Redis—AOF持久化

一、AOF定义 保存写操作命令到日志的持久化方式,就是 Redis 里的 AOF(Append Only File) 持久化功能 定义:以日志的形式记录每个操作,记录写指令不记录读指令,只许追加⽂件不允许修改,AOF保存的是appendonly.aof⽂件…...

OpenCV实例(五)指纹识别

OpenCV实例(五)指纹识别 1.指纹识别概述1.1概述1.2原理 2.指纹识别算法2.1特征提取2.2MCC匹配方法2.3尺度不变特征变换(SIFT) 3.显示指纹的关键点4.基于SIFT的指纹识别 作者:Xiou 1.指纹识别概述 1.1概述 指纹识别&…...

第二章 法的内容与形式

目录 第一节 法的内容与形式的概念 一、法的内容与形式的含义 二、法的内容和形式的关系 第二节 法律权利与法律义务 一、权利和义务的概念 二、权利和义务的分类 三、权利与义务的联系 第三节 法的成文形式与不成文形式 一、历史上各种法的表现形式 二、成文法与不成文…...

大数据学习栈记——Neo4j的安装与使用

本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

C++初阶-list的底层

目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

Zustand 状态管理库:极简而强大的解决方案

Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试

作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)

目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...

排序算法总结(C++)

目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指:同样大小的样本 **(同样大小的数据)**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...

Kafka主题运维全指南:从基础配置到故障处理

#作者:张桐瑞 文章目录 主题日常管理1. 修改主题分区。2. 修改主题级别参数。3. 变更副本数。4. 修改主题限速。5.主题分区迁移。6. 常见主题错误处理常见错误1:主题删除失败。常见错误2:__consumer_offsets占用太多的磁盘。 主题日常管理 …...

小木的算法日记-多叉树的递归/层序遍历

🌲 从二叉树到森林:一文彻底搞懂多叉树遍历的艺术 🚀 引言 你好,未来的算法大神! 在数据结构的世界里,“树”无疑是最核心、最迷人的概念之一。我们中的大多数人都是从 二叉树 开始入门的,它…...

ubuntu22.04 安装docker 和docker-compose

首先你要确保没有docker环境或者使用命令删掉docker sudo apt-get remove docker docker-engine docker.io containerd runc安装docker 更新软件环境 sudo apt update sudo apt upgrade下载docker依赖和GPG 密钥 # 依赖 apt-get install ca-certificates curl gnupg lsb-rel…...