白骑士的Python教学进阶篇 2.4 高级数据结构

系列目录

上一篇:白骑士的Python教学进阶篇 2.3 文件操作​​​​​​​

        在Python中,掌握高级数据结构可以显著提升你的编程效率和代码可读性。高级数据结构包括列表推导式、生成器与迭代器以及装饰器。本文将详细介绍这些高级数据结构,帮助你在实际编程中更好地运用它们。

列表推导式

        列表推导式(List Comprehensions)是Python的一种简洁的语法,用于生成新的列表。通过列表推导式,可以用一行代码表达复杂的列表生成逻辑,增强代码的可读性和简洁性。

基本语法

        列表推导式的基本语法如下:

[expression for item in iterable if condition]

        'expression':生成新列表中元素的表达式。

        ’item‘:从 ‘iterable’ 中取出的元素。

        'iterable':一个可迭代对象,如列表、元组、字符串等。

        ’condition‘:一个可选的过滤条件,只有满足条件的元素才会包含在新列表中。

示例

        生成平方数列表:

squares = [x ** 2 for x in range(10)]
print(squares)

        输出:

[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

        过滤偶数并生成其平方:

even_squares = [x ** 2 for x in range(10) if x % 2 == 0]
print(even_squares)

        输出:

[0, 4, 16, 36, 64]

        使用嵌套循环生成二维坐标:

coordinates = [(x, y) for x in range(3) for y in range(3)]
print(coordinates)

        输出:

[(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]

生成器与迭代器

        生成器和迭代器是Python中用于高效处理大量数据的强大工具。它们可以在不占用大量内存的情况下生成序列数据。

迭代器

        迭代器是一种对象,它实现了迭代协议,包括 '__iter__()' 和 '__next__()' 方法。迭代器可以用于逐个访问集合的元素,而不需要一次性将所有元素加载到内存中。

示例

class MyIterator:
    def __init__(self, data):
        self.data = data
        self.index = 0

    def __iter__(self):
        return self

    def __next__(self):
        if self.index >= len(self.data):
            raise StopIteration

        result = self.data[self.index]
        self.index += 1
        return result

my_iter = MyIterator([1, 2, 3])
for item in my_iter:
    print(item)

        输出:

1
2
3

生成器

        生成器是使用 'yield' 关键字的函数。每次调用生成器的 '__next__()' 方法时,生成器函数会运行到 'yield' 语句并返回结果,然后暂停,下一次调用时从暂停处继续执行。

示例

        简单生成器:

def simple_generator():
    yield 1
    yield 2
    yield 3

gen = simple_generator()

for value in gen:
    print(value)

        输出:

1
2
3

        无限斐波那契序列生成器:

def fibonacci():
    a, b = 0, 1

    while True:
        yield a
        a, b = b, a + b

fib = fibonacci()

for _ in range(10):
    print(next(fib))

        输出:

0
1
1
2
3
5
8
13
21
34

        生成器表达式是生成器的简写形式,类似于列表推导式,但使用小括号而不是方括号。

gen_exp = (x ** 2 for x in range(10))

for value in gen_exp:
    print(value)

装饰器

        装饰器是一种高级函数,它允许你在不修改函数代码的前提下,增强或修改函数的行为。装饰器通常用于日志记录、权限检查、缓存等场景。

基本语法

        装饰器是一个返回函数的高阶函数,通常使用 '@decorator_name' 语法糖来应用装饰器。

示例

        基本装饰器:

def my_decorator(func):
    def wrapper():
        print("Something is happening before the function is called.")
        func()
        print("Something is happening after the function is called.")
    return wrapper

@my_decorator
def say_hello():
    print("Hello!")


say_hello()

        输出:

Something is happening before the function is called.
Hello!
Something is happening after the function is called.

        带参数的装饰器:

def repeat(num_times):
    def decorator_repeat(func):
        def wrapper(*args, **kwargs):
            for _ in range(num_times):
                result = func(*args, **kwargs)
            return result
        return wrapper
    return decorator_repeat

@repeat(num_times=3)
def greet(name):
    print(f"Hello, {name}!")


greet("Alice")

        输出:

Hello, Alice!
Hello, Alice!
Hello, Alice!

        类装饰器:

class CountCalls:
    def __init__(self, func):
        self.func = func
        self.num_calls = 0

    def __call__(self, *args, **kwargs):
        self.num_calls += 1
        print(f"Call {self.num_calls} of {self.func.__name__}")
        return self.func(*args, **kwargs)

@CountCalls
def say_hello():
    print("Hello!")


say_hello()
say_hello()

        输出:
 

Call 1 of say_hello
Hello!
Call 2 of say_hello
Hello!

结论

        高级数据结构如列表推导式、生成器与迭代器以及装饰器,是Python提供的强大工具,使开发者可以编写简洁、高效、可维护的代码。通过掌握这些高级特性,可以在实际项目中更灵活地处理复杂的数据操作,提高代码的执行效率,并且能够在不改变原有代码逻辑的情况下,轻松地扩展和增强功能。这些特性不仅提升了编程技能,也为解决实际问题提供了更多的解决方案。希望在实践中多多应用这些高级数据结构,享受Python编程的乐趣。

下一篇:白骑士的Python教学高级篇 3.1 多线程与多进程​​​​​​​

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/773578.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ssm校园志愿服务信息系统-计算机毕业设计源码97697

摘 要 随着社会的进步和信息技术的发展,越来越多的学校开始重视志愿服务工作,通过组织各种志愿服务活动,让学生更好地了解社会、服务社会。然而,在实际操作中,志愿服务的组织和管理面临着诸多问题,如志愿者…

实战演练:Fail2Ban部署全攻略,确保您的服务器免受CVE-2024-6387侵害!

Fail2Ban是一个开源的入侵防护软件,它可以扫描日志文件,识别恶意行为(如多次失败的登录尝试),并自动采取措施(如更新防火墙规则)来阻止攻击者。最近,CVE-2024-6387漏洞的爆出使我们更…

一分钟学习数据安全—自主管理身份SSI分布式加密密钥管理

在这篇之前,我们已经对SSI有了一个全局的了解。这个系列的文章可以作为一个学习笔记来参考,真正要实践其中的一些方案、协议,还需要参考专业的书籍和官方文档。作为一个SSI系列学习笔记的最后一篇,我们做一个简单的延伸&#xff0…

无服务器【Serverless】架构的深度剖析:组件介绍、优缺点与适用场景

🐇明明跟你说过:个人主页 🏅个人专栏:《未来已来:云原生之旅》🏅 🔖行路有良友,便是天堂🔖 目录 一、引言 1、云计算的发展趋势 2、无服务器计算简介 二、无服务…

DPDK概述

文章目录 1. DPDK概述1.1 DPDK 内存管理Mbuf单帧结构:1.2 DPDK内核驱动 igb_uio驱动1.3 DPDK源码下载方式1.4 pktgen源码下载方式1.5 DPDK相关名词解释 1. DPDK概述 Intel DPDK全称Intel Data Plane Development Kit,是Intel提供的数据平面开发工具集,为…

AI语音工具——Fish Speech:使用简单,可训练专属语音模型!

今天给大家介绍一款超好用的AI语音工具——Fish Speech,使用简单,还可以训练自己的语音模型! 工具介绍 Fish Speech是由 Fish Audio 开发的免费开源文本转语音模型。经过十五万小时的数据训练,Fish Speech能够熟练掌握中文、日语…

binutils ifunc 流程图

上图是x86 binutils 的流程图。 函数说明_bfd_x86_elf_link_hash_table_createInit local STT_GNU_IFUNC symbol hash.elf_x86_64_check_relocsAdd support for handling STT_GNU_IFUNC symbols_bfd_elf_x86_get_local_sym_hashFind and/or create a hash entry for local sym…

SSL/CA 证书及其相关证书文件解析

在当今数字化的时代,网络安全变得至关重要。SSL(Secure Socket Layer)证书和CA(Certificate Authority)证书作为保护网络通信安全的重要工具,发挥着关键作用。 一、SSL证书 SSL证书是数字证书的一种&…

前端八股文 说一下盒模型

网页中任何一个元素都可以视为一个盒子,由里到外,盒模型包括外边界(margin)、边框(border)、内边界(padding)和内容(content)。 盒模型基本分为3种&#xff1…

【遥感语义分割】UNetFormer

原文:UNetFormer: An UNet-like Transformer for Efficient Semantic Segmentation of Remotely Sensed Urban Scene Imagery Libo Wang1, 2, Rui Li1, Ce Zhang3, 4, Shenghui Fang1*, Chenxi Duan5, Xiaoliang Meng1, 2 and Peter M. Atkinson3, 6, 7 1) 中国…

【机器学习】分类算法-KNN算法实践

一、前言 前面的一篇文章介绍了KNN算法的基本思想,接下来我们就根据B站UP主【abilityjh】老师的节奏,做一个关于KNN算法运用于“约会网站配对”的算法实现。当然,这个实践的代码是一样的,但是理解的话,我是用自己的话来…

考到PMP证书后 如何获得PDU?

目前仅续证一次,也是在威班PMP考试后免费积攒的。其实获取PMP的渠道很多,网上也有很多售卖的,积攒起来也挺容易,不过在续证的时候千万不要找不明渠道来源的人去搞,不靠谱。续证期有三年的,三年时间积攒60PD…

第十二章 执行引擎

一、执行引擎概述 概述 执行引擎是 Java 虚拟机核心的组成部分之一。“虚拟机”是一个相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面上的,而虚拟机的执行引…

简单的git pull fail Can‘t update has no tracked branch解决记录

简单的git pull fail Can‘t update has no tracked branch解决记录 1. 问题描述 上午同事使用idea拉取代码的时候,发现拉取不了,提示用户权限问题,之后修改了git用户信息,发现还是拉取不了分支代码,然后删除了git r…

docker介绍与详细安装

1 docker 介绍 1.1 虚拟化 在计算机中,虚拟化(英语:Virtualization)是一种资源管理技术,是将计算机的各种实体资源,如服务器、网络、内存及存储等,予以抽象、转换后呈现出来,打破实…

Vue 详情实战涉及从项目初始化到功能实现、测试及部署的整个过程

本人详解 作者:王文峰,参加过 CSDN 2020年度博客之星,《Java王大师王天师》 公众号:JAVA开发王大师,专注于天道酬勤的 Java 开发问题中国国学、传统文化和代码爱好者的程序人生,期待你的关注和支持!本人外号:神秘小峯 山峯 转载说明:务必注明来源(注明:作者:王文峰…

全面解析找不到msvcp71.dll无法继续执行的原因及修复方法

在使用Windows操作系统时,可能会遇到“msvcp71.dll文件丢失”的问题,从而导致部分应用程序无法正常运行。msvcp71.dll属于Microsoft Visual C 2008 Redistributable package的一部分,其包含了运行基于该编译器开发的软件所需的运行时库函数。…

react v18 less使用(craco)

方案一、弹出配置(不推荐) 安装依赖:yarn add less less-loader 首先 执行 yarn eject 弹出配置项文件(注意:弹出配置不可逆!) 在 config 文件夹中 找到 webpack.config.js,在如图…

苹果手机耗电太快怎么办?6个有效解决方法大揭秘

现代智能手机功能越来越强大,但随之而来的电量消耗问题也让许多用户头疼不已。尤其是苹果手机,虽然以其流畅的用户体验和强大的功能著称,但电池续航问题仍然是很多用户的共同困扰。 那么,苹果手机耗电太快怎么办呢?别…

震惊!张宇25版高数18讲发布,656页惹争议!

这个张宇老师在微博已经解释过了! 我觉得张宇老师本意是好的,在考研数学教学创新这方面,他真的有自己的思考。 他为什么要这么做? 其实作为一个考研高数老师,他完全可以像其他老师一样,什么都不做&#x…