热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Python编程中的高级技巧与应用

在Python编程中,掌握高级技巧对于提升代码效率和可读性至关重要。本文重点探讨了生成器和迭代器的应用,这两种工具不仅能够优化内存使用,还能简化复杂数据处理流程。生成器通过按需生成数据,避免了大量数据加载对内存的占用,而迭代器则提供了一种优雅的方式来遍历集合对象。此外,文章还深入解析了这些高级特性的实际应用场景,帮助读者更好地理解和运用这些技术。

python的一些高级用法


生成器和迭代器

在讲生成器之前需要先了解一下一个高级的用法,也是我在面试过程中被问到的一个问题,当时没搞明白面试官要考察我什么,就没答出来,有点尴尬。
问题是:怎么用一行程序生成一个1-10数字的平方的一个列表。
答:用列表生成式,[x * x for x in range(1, 11)]。

通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。

所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator。

>>> L = [x * x for x in range(10)]
>>> L
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> g = (x * x for x in range(10))
>>> g
>>>> next(g)
0
>>> next(g)
1
>>> next(g)
4
>>> next(g)
9
>>> next(g)
16
>>> next(g)
25
>>> next(g)
36
>>> next(g)
49
>>> next(g)
64
>>> next(g)
81
>>> next(g)
Traceback (most recent call last):File "", line 1, in <module>
StopIteration

当然&#xff0c;上面这种不断调用next(g)实在是太变态了&#xff0c;正确的方法是使用for循环&#xff0c;因为generator也是可迭代对象&#xff1a;

>>> g &#61; (x * x for x in range(10))
>>> for n in g:
... print(n)
...
0
1
4
9
16
25
36
49
64
81

迭代器&#xff1a;

凡是可作用于for循环的对象都是Iterable类型&#xff1b;

凡是可作用于next()函数的对象都是Iterator类型&#xff0c;它们表示一个惰性计算的序列&#xff1b;

继承和多态

下面这是父类的定义&#xff1a;

class Animal(object):def run(self):print(&#39;Animal is running...&#39;)

下面是子类继承&#xff1a;

class Dog(Animal):def run(self):print(&#39;Dog is running...&#39;)def eat(self):print(&#39;Eating meat...&#39;)

当子类和父类都存在相同的run()方法时&#xff0c;我们说&#xff0c;子类的run()覆盖了父类的run()&#xff0c;在代码运行的时候&#xff0c;总是会调用子类的run()。这样&#xff0c;我们就获得了继承的另一个好处&#xff1a;多态。

多态也就是子类既有父类的数据类型也有子类的数据类型&#xff0c;但是父类没有子类的数据类型。&#xff08;这里的数据类型就是类名&#xff09;

要理解多态的好处&#xff0c;我们还需要再编写一个函数&#xff0c;这个函数接受一个Animal类型的变量&#xff1a;

def run_twice(animal):animal.run()animal.run()

>>> run_twice(Dog())
Dog is running...
Dog is running...

>>> run_twice(Animal())
Animal is running...
Animal is running...

你会发现&#xff0c;新增一个Animal的子类&#xff0c;不必对run_twice()做任何修改&#xff0c;实际上&#xff0c;任何依赖Animal作为参数的函数或者方法都可以不加修改地正常运行&#xff0c;原因就在于多态。

多态的好处就是&#xff0c;当我们需要传入Dog、Cat、Tortoise……时&#xff0c;我们只需要接收Animal类型就可以了&#xff0c;因为Dog、Cat、Tortoise……都是Animal类型&#xff0c;然后&#xff0c;按照Animal类型进行操作即可。由于Animal类型有run()方法&#xff0c;因此&#xff0c;传入的任意类型&#xff0c;只要是Animal类或者子类&#xff0c;就会自动调用实际类型的run()方法&#xff0c;这就是多态的意思&#xff1a;

对于一个变量&#xff0c;我们只需要知道它是Animal类型&#xff0c;无需确切地知道它的子类型&#xff0c;就可以放心地调用run()方法&#xff0c;而具体调用的run()方法是作用在Animal、Dog、Cat还是Tortoise对象上&#xff0c;由运行时该对象的确切类型决定&#xff0c;这就是多态真正的威力&#xff1a;调用方只管调用&#xff0c;不管细节&#xff0c;而当我们新增一种Animal的子类时&#xff0c;只要确保run()方法编写正确&#xff0c;不用管原来的代码是如何调用的。这就是著名的“开闭”原则&#xff1a;

对扩展开放&#xff1a;允许新增Animal子类&#xff1b;

对修改封闭&#xff1a;不需要修改依赖Animal类型的run_twice()等函数。

装饰器

这种在代码运行期间动态增加功能的方式&#xff0c;称之为“装饰器”&#xff08;Decorator&#xff09;。
装饰器的作用就是为已经存在的对象添加额外的功能。

具体用到的时候我有了更深的理解再补充

注册器

这个一般出现在比较大型的项目中。
这个注册器不是用户账号注册的模块&#xff0c;而是项目中注册模块的一个模块。举个例子&#xff0c;一个深度学习项目可能支持多种模型&#xff1b;具体使用哪种模型可能是用户在配置文件中指定的。最简单的实现方式&#xff0c;就是维护一个模型名称->模型类的字典。但每当你增加一个模型时&#xff0c;这个字典就需要手动维护&#xff0c;比较繁琐。本文介绍一种注册器的模块&#xff0c;你需要维护的是需要注册的模块的代码路径&#xff08;相对简介些&#xff09;。

其实说的简单点就是注册器就是一个自动维护的字典&#xff0c;将你定义的模块添加到项目中。

class Register:def __init__(self, registry_name):self._dict &#61; {}self._name &#61; registry_namedef __setitem__(self, key, value):if not callable(value):raise Exception(f"Value of a Registry must be a callable!\nValue: {value}")if key is None:key &#61; value.__name__if key in self._dict:logging.warning("Key %s already in registry %s." % (key, self._name))self._dict[key] &#61; valuedef register(self, target):"""Decorator to register a function or class."""def add(key, value):self[key] &#61; valuereturn valueif callable(target):# &#64;reg.registerreturn add(None, target)# &#64;reg.register(&#39;alias&#39;)return lambda x: add(target, x)def __getitem__(self, key):return self._dict[key]def __contains__(self, key):return key in self._dictdef keys(self):"""key"""return self._dict.keys()

主要看一下register函数&#xff0c;其实就是一个add模块。


推荐阅读
  • 使用 XlsxWriter 模块在 Python 中实现 Excel 单元格内多种格式文本的高效写入
    XlsxWriter 是一个强大的 Python 库,专门用于生成 `.xlsx` 格式的 Excel 文件。该模块不仅支持基本的数据写入,还提供了丰富的格式化选项,能够实现单元格内多种文本样式的高效处理。无论是字体、颜色、对齐方式还是边框,XlsxWriter 都能轻松应对,满足用户在 Excel 视图中的各种需求。 ... [详细]
  • 开发心得:利用 Redis 构建分布式系统的轻量级协调机制
    开发心得:利用 Redis 构建分布式系统的轻量级协调机制 ... [详细]
  • 在第七天的深度学习课程中,我们将重点探讨DGL框架的高级应用,特别是在官方文档指导下进行数据集的下载与预处理。通过详细的步骤说明和实用技巧,帮助读者高效地构建和优化图神经网络的数据管道。此外,我们还将介绍如何利用DGL提供的模块化工具,实现数据的快速加载和预处理,以提升模型训练的效率和准确性。 ... [详细]
  • 深入解析Java中HashCode的功能与应用
    本文深入探讨了Java中HashCode的功能与应用。在Java中,HashCode主要用于提高哈希表(如HashMap、HashSet)的性能,通过快速定位对象存储位置,减少碰撞概率。文章详细解析了HashCode的生成机制及其在集合框架中的作用,帮助开发者更好地理解和优化代码。此外,还介绍了如何自定义HashCode方法以满足特定需求,并讨论了常见的实现误区和最佳实践。 ... [详细]
  • 本文深入探讨了 Python Watchdog 库的使用方法和应用场景。通过详细的代码示例,展示了如何利用 Watchdog 监控文件系统的变化,包括文件的创建、修改和删除等操作。文章不仅介绍了 Watchdog 的基本功能,还探讨了其在实际项目中的高级应用,如日志监控和自动化任务触发。读者将能够全面了解 Watchdog 的工作原理及其在不同场景下的应用技巧。 ... [详细]
  • voc生成xml 代码
    目录 lxmlwindows安装 读取示例 可视化 生成示例 上面是代码,下面有调用示例 api调用代码,其实只有几行:这个生成代码也很简 ... [详细]
  • 深入解析十大经典排序算法:动画演示、原理分析与代码实现
    本文深入探讨了十种经典的排序算法,不仅通过动画直观展示了每种算法的运行过程,还详细解析了其背后的原理与机制,并提供了相应的代码实现,帮助读者全面理解和掌握这些算法的核心要点。 ... [详细]
  • 表面缺陷检测数据集综述及GitHub开源项目推荐
    本文综述了表面缺陷检测领域的数据集,并推荐了多个GitHub上的开源项目。通过对现有文献和数据集的系统整理,为研究人员提供了全面的资源参考,有助于推动该领域的发展和技术进步。 ... [详细]
  • 为了深入了解某些测试框架的工作原理,并在培训中构建一个简单的测试框架,我系统地研究了 should.js 的源代码。本文将分享我的学习过程和分析结果,帮助读者更好地掌握 should.js 的核心机制。 ... [详细]
  • 掌握DSP必备的56个核心问题,我已经将其收藏以备不时之需! ... [详细]
  • Go语言实现Redis客户端与服务器的交互机制深入解析
    在前文对Godis v1.0版本的基础功能进行了详细介绍后,本文将重点探讨如何实现客户端与服务器之间的交互机制。通过具体代码实现,使客户端与服务器能够顺利通信,赋予项目实际运行的能力。本文将详细解析Go语言在实现这一过程中的关键技术和实现细节,帮助读者深入了解Redis客户端与服务器的交互原理。 ... [详细]
  • 可转债数据智能抓取与分析平台优化
    本项目旨在优化可转债数据的智能抓取与分析平台。通过爬取集思录上的可转债信息(排除已发布赎回的债券),并结合安道全教授提出的三条安全线投资策略,新增了建仓线、加仓线和重仓线,以提供更精准的投资建议。 ... [详细]
  • 本文探讨了在Linux 2.6内核中实现进程隐藏的技术方法与实践。通过分析系统调用 `sys_getdents` 的工作原理,提出了一种有效的方法来隐藏指定的进程。该方法通过对内核模块进行修改,拦截并过滤掉目标进程的相关信息,从而在常用的进程查看命令(如 `ps` 和 `top`)中无法显示这些隐藏的进程。实验结果表明,该方法在实际应用中具有较高的隐蔽性和稳定性。 ... [详细]
  • 深入理解Spark框架:RDD核心概念与操作详解
    RDD是Spark框架的核心计算模型,全称为弹性分布式数据集(Resilient Distributed Dataset)。本文详细解析了RDD的基本概念、特性及其在Spark中的关键操作,包括创建、转换和行动操作等,帮助读者深入理解Spark的工作原理和优化策略。通过具体示例和代码片段,进一步阐述了如何高效利用RDD进行大数据处理。 ... [详细]
  • 2019年斯坦福大学CS224n课程笔记:深度学习在自然语言处理中的应用——Word2Vec与GloVe模型解析
    本文详细解析了2019年斯坦福大学CS224n课程中关于深度学习在自然语言处理(NLP)领域的应用,重点探讨了Word2Vec和GloVe两种词嵌入模型的原理与实现方法。通过具体案例分析,深入阐述了这两种模型在提升NLP任务性能方面的优势与应用场景。 ... [详细]
author-avatar
一枝草一滴露的执着
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有