Python进阶学习----一闭三器

2023-09-21 11:38:13

目录

​编辑

前言

一.三器

1. 迭代器(Iterator)

1.1 什么是可迭代对象

1.2什么是迭代器

1.3案例演示: 以下是一个简单的迭代器示例,遍历一个列表并打印每个元素:

1.4迭代器总结

2. 生成器(Generator)

3. 装饰器(Decorator)

二.一闭 

4. 闭包(Closure)

总结:


 

前言

Python是一种功能强大而灵活的编程语言,拥有许多强大的特性和工具,其中包括"一闭三器"——迭代器、生成器、装饰器和闭包

一.三器

1. 迭代器(Iterator)

1.1 什么是可迭代对象

只要是可以通过for...in…的形式进行遍历的,那么这个数据类型就是可以迭代的

1.2什么是迭代器

迭代是python中访问集合元素的一种非常强大的一种方式。迭代器是一个可以记住遍历位置的对象,迭代器对象从第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。因此不会像列表那样一次性全部生成,而是可以等到用的时候才生成,因此节省了大量的内存资源。迭代器有两个方法:iter()和next()方法

1.3案例演示: 以下是一个简单的迭代器示例,遍历一个列表并打印每个元素:

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
        item = self.data[self.index]
        self.index += 1
        return item

my_list = [1, 2, 3, 4, 5]
my_iter = MyIterator(my_list)

for item in my_iter:
    print(item)

1.4迭代器总结

  1. 凡是可作用于for循环的对象都是Iterable 类型;

  2. 凡是可作用于 next() 函数的对象都是Iterator 类型;

  3. 集合数据类型如list 、dict、str等是 Iterable但不是Iterator,不过可以通过 iter()函数获得一个Iterator对象

特点:

  • 允许按顺序访问集合中的元素。
  • 可以在不加载整个集合到内存中的情况下处理大型数据集。

优点:

  • 节省内存,特别适用于大型数据集。
  • 提供了一种通用的遍历机制,适用于各种不同类型的数据结构。

缺点:

  • 需要手动实现__iter__()__next__()方法,有些繁琐。
  • 一旦迭代器遍历完数据,就不能再次使用,需要重新创建。

2. 生成器(Generator)

介绍: 生成器是一种特殊类型的迭代器,它可以以更简洁的方式生成值。

案例演示: 以下是一个生成器示例,生成斐波那契数列:

def fibonacci():
    a, b = 0, 1
    while True:
        yield a
        a, b = b, a + b

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

特点:

  • 使用yield关键字简化了迭代器的创建。
  • 延迟生成值,节省内存。

优点:

  • 更简洁的语法。
  • 适用于处理大量数据或需要延迟生成的情况。

缺点:

  • 不支持双向遍历,只能单向前进。
  • 无法随机访问元素。

3. 装饰器(Decorator)

介绍: 装饰器是一种用于修改函数或方法行为的技术,允许在不修改原始函数代码的情况下添加额外的功能。

案例演示: 以下是一个装饰器示例,用于测量函数执行时间:

import time

def timing_decorator(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print(f"{func.__name__} took {end_time - start_time} seconds to run.")
        return result
    return wrapper

@timing_decorator
def slow_function():
    time.sleep(2)

slow_function()

特点:

  • 可以轻松地扩展函数的功能,例如日志记录、性能分析等。
  • 可以重用装饰器,使代码更干净。

优点:

  • 提高了代码的可维护性和可读性。
  • 使功能扩展更容易。

缺点:

  • 可能会增加代码的复杂性,特别是当多个装饰器堆叠时。

二.一闭 

4. 闭包(Closure)

介绍: 闭包是一种函数,它可以访问其定义范围之外的变量,即使外部函数已经执行完毕。

案例演示: 以下是一个闭包示例,创建一个计数器函数:

def counter():
    count = 0
    def increment():
        nonlocal count
        count += 1
        return count
    return increment

counter1 = counter()
print(counter1())  # 输出1
print(counter1())  # 输出2

counter2 = counter()
print(counter2())  # 输出1

特点:

  • 允许函数保留状态,使得函数可以"记住"之前的状态。
  • 有助于隐藏数据,实现封装。

优点:

  • 提供了一种轻量级的状态管理机制。
  • 使函数更加灵活和可复用。

缺点:

  • 可能会导致不正确的行为,特别是当闭包不正确地使用时。
  • 可能会增加代码的复杂性,难以理解。

总结:

 一闭三器属于进阶语法,我们需要有强大的基础才能实际开发中运用,当我们运用得当,它能成为我们很实用的工具,为我们减轻很多代码,以及提示代码的质量

更多推荐

“探索前后端分离架构下的Vue.js应用开发“

目录引言1.前后端分离2.Vue的简介1.Vue.js是什么?2.库和框架的区别3.MVVM的介绍3.Vue的入门数据的双向绑定数据的单项绑定4.Vue的生命周期总结引言在当今互联网时代,前后端分离架构已经成为了Web应用开发的主流趋势。前后端分离架构的核心思想是将前端和后端的开发过程解耦,使得前端和后端可以独立开发、

[JAVEee]SpringBoot项目的创建

SpringBoot可以更好的开发Spring项目,本文章将使用idea社区版来演示创建项目的过程与注意事项.SpringBoot的优点SpringBoot中内置快速添加依赖的功能,能够便捷的集成各种框架,帮助开发.内置运行容器,无需配置Tomcat容器等其他web容器,可直接进行项目的部署与运行.更好的使用注解与配置

AI Studio星河社区生产力实践:基于文心一言快速搭建知识库问答

还在寻找基于文心一言搭建本地知识库问答的方案吗?AIStudio星河社区带你实战演练(支持私有化部署)!相信对于大语言模型(LLM)有所涉猎的朋友,对于“老网红”知识库问答不会陌生。自从大模型爆火后,开发者都希望尽快进行开发实战,企业都希望尽快在产品中集成LLM的能力,结合业务快速落地,那最直接的方式就是构建知识库问答

算法 杨辉三角求解 java打印杨辉三角 多路递归打印杨辉三角 递归优化杨辉三角 记忆法优化递归 帕斯卡三角形 算法(十二)

1.杨辉三角:是二项式系数在三角形中的一种几何排列,中国南宋数学家杨辉1261年所著的《详解九章算法》一书中出现。在欧洲,帕斯卡(1623----1662)在1654年发现这一规律,所以这个表又叫做帕斯卡三角形。帕斯卡的发现比杨辉要迟393年,比贾宪迟600年。--百度百科2.杨辉三角特点:1.每个数等于它上方两数之和

CATTI考试,拿证必看篇:CATTI备考,你不可不知的东西都在这里!

打工人,打工魂,打工都是人上人。在人才拥挤的就业市场里,我们如何能够脱颖而出,赢得一份好工作呢?于是很多人把目光投向了CATTI。CATTI是一项面向全社会的职业资格考试,全称为全国翻译专业资格(水平)考试。具有一定外语水平的人员,不分年龄、学历、资历和身份,均可报名参加相应语种二、三级的考试。本文将带大家快速了解这门

SkyWalking快速上手(一)——安装单机版SkyWalking、使用SkyWalking

文章目录什么是SkyWalking为什么选择SkyWalking安装步骤前置条件环境要求下载SkyWalking配置SkyWalkingSkywalking使用Agent配置Collector配置启动SkyWalking配置SkyWalking代理SkyWalking的监控功能分布式调用链追踪性能指标监控告警和报警总结

黑马JVM总结(六)

(1)常量池方法区的组成中都由一个叫做运行时常量池的部分,内部包含一个叫做StringTable的东西反编译二进制字节码:类的基本信息:常量池:方法定义:构造方法main方法:方法中有一些指令,通过指令#2去常量池中找这个静态指令常量池:#2它是要找java/lang/System类下的out变量,类型是java/io

负载均衡原理及应用

🌷🍁博主猫头虎(🐅🐾)带您GotoNewWorld✨🍁🦄博客首页——🐅🐾猫头虎的博客🎐🐳《面试题大全专栏》🦕文章图文并茂🦖生动形象🐅简单易学!欢迎大家来踩踩~🌺🌊《IDEA开发秘籍专栏》🐾学会IDEA常用操作,工作效率翻倍~💐🌊《100天精通Golang(基础入门篇)》🐅学会Gol

基于Java+SpringBoot+Vue的图书借还小程序的设计与实现(亮点:多角色、点赞评论、借书还书、在线支付)

图书借还管理小程序一、前言二、我的优势2.1自己的网站2.2自己的小程序(小蔡coding)2.3有保障的售后2.4福利三、开发环境与技术3.1MySQL数据库3.2Vue前端技术3.3SpringBoot框架3.4微信小程序四、功能设计4.1主要功能描述五、系统实现5.1小程序界实现5.1.1首页展示5.1.2点赞、

MYSQL_

文章目录①.索引的概述②.二叉树和红黑树③.Hash建立索引结构④.B树的数据结构⑤.MyISAM存储引擎索引实现⑥.InnoDB索引实现(聚集)⑦.联合索引的设定①.索引的概述①.索引是帮助MySQL高效获取数据的排好序的数据结构②.mysql数据库的实现原理通过b+树实现的,b+树的原理是先找到所有的数据,然后折半

【 安全】什么是CSRF攻击?如何避免?开发的时候怎么预防?

文章目录前言CSRF概念CSRF原理CSRF攻击防御防御方法session工作原理几种常见的攻击类型CSRF攻击实例CSRF攻击的对象当前防御CSRF的几种策略验证HTTPReferer字段在请求地址中添加token并验证在HTTP头中自定义属性并验证Chrome浏览器端启用SameSitecookieCSRF工具的防

热文推荐