当前位置: 首页 > 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概述 指纹识别&…...

第二章 法的内容与形式

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

外包干了四年,感觉废了..

先说一下自己的情况,大专生,18年通过校招进入湖南某软件公司,干了接近4年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…...

Git如何推送当前代码到远程仓库

第一种方法 (建立在已经配置好用户变量和ssh基础上) 在本地创建git仓库 git init 绑定远程仓库,origin是给远程仓库起的别名,也可以起其他名字,但是如果用origin,git push时可以不指出名字,如果…...

第五章 工厂模式

文章目录 一、简单工厂模式1、传统方式实现披萨订购( 可以忽略)披萨父类 Pizza子类胡椒披萨 PepperPizza子类印度披萨 GreekPizza订购披萨 OrderPizza订购披萨的 客户端 PizzaStore运行结果传统的方式的优缺点,新增子类需要修改的地方牵扯太多传统方式的究极耦合 2、…...

Spring MVC 参数解析(13)

目录 简介 调用流程 1. 首先,还是需要进行到前端控制器的doDispatch方法,这是我们的调用Spring MVC的核心入口方法 2. 在doDispatch方法内部,我们调用到了HandlerAdapter.handle(*****) 方法 3. 最终,我们会来到 RequestMappi…...

探索 Qt WebEngineWidgets:从底层原理到高级应用与技巧

探索 Qt WebEngineWidgets:从底层原理到高级应用与技巧 (Exploring Qt WebEngineWidgets: From Fundamentals to Advanced Applications and Techniques 一、Qt WebEngineWidgets 模块简介及原理 (Introduction and Principles of Qt WebEngineWidgets Module)1. Qt…...

leetcode160. 相交链表

给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。 图示两个链表在节点 c1 开始相交: 题目数据 保证 整个链式结构中不存在环。 注意,函数返回结果后&…...

核心业务7:放款实现

核心业务7:放款实现 1.放款实现流程 -------------------未完成生成借款人还款计划和投资人回款计划-------------- 2.数据库表 3.前端流程 4.汇付宝流程 5.尚融宝后端流程 -------------------未完成生成借款人还款计划和投资人回款计划-------------- -------------…...

STM32F4系列芯片RTC模块介绍

RTC是“实时时钟”的缩写,它是一种芯片,在计算机等电子产品中广泛应用。RTC提供了实时时钟计时功能和存储时间的能力,即时钟模块,常用于控制和记录时间的应用场合。 RTC的工作原理 RTC主要由时钟电路、电源管理电路、晶振电路、…...

MySQL 在线人数 场景分析

一般在直播或者游戏中经常会统计用户在线人数,主要分为求每个时刻的在线人数和求某个时刻的在线人数两种。 【场景】:某个时刻的在线人数、每个时刻的在线人数 【知识点】:窗口函数、时间函数、sum(tag) over (order by dt,tag desc rows b…...

使用mybatis和dynamic-datasource-spring-boot-starter动态切换数据源操作数据库

记录:415 场景:使用mybatis和dynamic-datasource-spring-boot-starter动态切换数据源操作数据库。 版本:JDK 1.8,Spring Boot 2.6.3,dynamic-datasource-spring-boot-starter-3.3.2,mybatis-3.5.9。 源码:https://github.com/b…...