python高级编程一(生成器与高级编程)

@TOC

生成器

生成器使用
          通过列表⽣成式,我们可以直接创建⼀个列表。但是,受到内存限制,列表容量肯定是有限的。⽽且,创建⼀个包

含100万个元素的列表,不仅占⽤很⼤的存储空间,如果我们仅仅需要访问前⾯⼏个元素,那后⾯绝⼤多数元素占
⽤的空间都⽩⽩浪费了。所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推
算出后续的元素呢?这样就不必创建完整的list,从⽽节省⼤量的空间。在Python中,这种⼀边循环⼀边计算的机
制,称为⽣成器:generator。
创建生成器,列表生成式,我们知道,只要将最外一层的中括号,改为小括号,⽣成器保存的是算法,每次调⽤ next(g) ,就计算出 g 的下⼀个元素的值,直到计算到最后⼀个元素,没有更多的元素时,抛出 StopIteration 的异常。当然,这种不断调⽤ next() 实在是太繁琐了,虽然是点一次出现一次,但正确的⽅法是使⽤ for 循环,因为⽣成器也是可迭代对象。所以,我们创建了⼀个⽣成器后,基本上永远不会调⽤next() ,⽽是通过 for 循环来迭代它,并且不需要关心StopIteration 异常。

list1 = [x for x in range(1,10)]
print(list1)
# 如何不让内存溢出 引入生成器(按照一个生成式来创建元素)
g = (x for x in range(1,10))
print(g)
print(next(g))

在这里插入图片描述

通过函数来创建生成器(yield)

通过斐波那契数列来实现
普通实现:

def test1(times):#初始化a,b=0,1n=0while n<times:print(b) #  yield b #yield用于创建一个生成器,工作返回后面变量值给生成器a,b=b,(a+b)n+=1return "done"print(test1(6))

生成器方式实现:

#引出生成器:对象,保存了产生元素的算法,同时会记录游标的位置
# 创建一个生成器: 1、通过列表生成式来创建
#                 2、通过函数来创建生成器(yield)
# 遍历生成器中元素内容:
#       1、通过next(g) ,当已经遍历到生成器的结尾抛异常 :StopIteration
#       2、通过for来遍历
#       3、object内置的__next__ :当已经遍历到生成器的结尾抛异常 :StopIteration
#       4、send 函数  ,但是生成器的第一个值必须使用send(None),后面的值就没有限制(不推荐使用)
def test2():#初始化a,b=0,1while True:temp = yield b #yield用于创建一个生成器,工作返回后面变量值给生成器,无返回值a,b=b,a+bprint(temp)
g4 =test2()
print(g4)
print(next(g4))
print(next(g4))
print(next(g4))print(g4.send(None))
print(g4.send(''))
print(g4.send(''))
print(g4.send(''))
print(g4.send(''))

⽣成器是这样⼀个函数,它记住上⼀次返回时在函数体中的位置。对⽣成器函数的第⼆次(或第 n 次)调⽤跳转⾄
该函数中间,⽽上次调⽤的所有局部变量都保持不变。⽣成器不仅“记住”了它数据状态;⽣成器还“记住”了它在流
控制构造(在命令式编程中,这种构造不只是数据值)中的位置。⽣成器的特点:

  1. 节约内存
  2. 迭代到下⼀次的调⽤时,所使⽤的参数都是第⼀次所保留下的,在整个所有函数调⽤的参数都是第⼀次所调⽤时保
    留的,⽽不是新创建的

迭代器

迭代是访问集合元素的⼀种⽅式。迭代器是⼀个可以记住遍历的位置的对象。迭代器对象从集合的第⼀个元素开始
访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
我们已经知道,可以直接作用于 for 循环的数据类型有以下几种:
一类是集合数据类型,如 list 、 tuple 、 dict 、 set 、 str 等;
一类是 generator ,包括生成器和带 yield 的generator function。
这些可以直接作用于 for 循环的对象统称为可迭代对象: Iterable 。
那我们怎么判断一组数据或是一组数据对象是不是 Iterable 对象尼?
可以使⽤ isinstance() 判断⼀个对象是否是 Iterable 对象

from collections.abc import Iterable
# Iterable:可迭代对象,能够通过for循环来遍历
a=(1,)
b=[1,2]
c={}
def test1(args):if isinstance(args,Iterable):print("args是可迭代对象")else:print('args对象不是可迭代对象')
test1(a)
test1(b)
test1(c)
test1(10)

可以被next()函数调⽤并不断返回下⼀个值的对象称为迭代器

def test2(arg):if isinstance(arg, Iterator):print("args是迭代器")else:print('args对象不是迭代器')
test2(a)
test2(b)
test2(c)
test2(x for x in 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

智能指针之设计模式2

前面介绍了工厂模式控制了智能指针和资源对象的创建过程&#xff0c;现在介绍一下智能指针是如何利用代理模式来实现“类指针&#xff08;like-pointer&#xff09;”的功能&#xff0c;并控制资源对象的销毁过程的。 2、代理模式 代理模式是为其它对象提供一种代理以控制对这…

探索R语言:在线学习资源汇总

一、收集关于特定R主题的问题和答案&#xff08;Q&A&#xff09; 1. Stack overflow Empowering the world to develop technology through collective knowledge – Stack Overflowhttps://stackoverflow.co/ 二、Rstudio工具栏help Rstudio中有个Cheat sheet&#xf…

《C语言中以数组作为参数的探讨》

&#x1f680;个人主页&#xff1a;BabyZZの秘密日记 &#x1f4d6;收入专栏&#xff1a;C语言 &#x1f30d;文章目入 一、数组作为参数的传递机制二、数组参数的声明方式&#xff08;一&#xff09;省略数组大小&#xff08;二&#xff09;指定数组大小&#xff08;三&#x…

深入解析区块链技术:原理、应用与未来展望

1 区块链技术原理 1.1 基本概念 区块链本质上是一个分布式账本&#xff0c;它由一系列按照时间顺序排列的数据块组成&#xff0c;每个数据块包含了一定时间内的交易信息。这些数据块通过密码学技术相互链接&#xff0c;形成一个不可篡改的链条。其核心特点包括去中心化、不可篡…

selenium快速入门

一、操作浏览器 from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By# 设置选项 q1 Options() q1.add_argument("--no-sandbo…

面试如何应用大模型

在面试中,如果被问及如何应用大模型,尤其是面向政务、国有企业或大型传统企业的数字化转型场景,你可以从以下几个角度进行思考和回答: 1. 确定应用大模型的目标与痛点 首先,明确应用大模型的业务目标,并结合企业的实际需求分析可能面临的痛点。这些企业通常会关注如何提…

嵌入式常见概念的介绍

目录 一、MCU、MPU、ARM &#xff08;一&#xff09;MCU&#xff08;微控制器&#xff09; &#xff08;二&#xff09;MPU&#xff08;微处理器&#xff09; &#xff08;三&#xff09;ARM&#xff08;架构&#xff09; 二、DSP &#xff08;一&#xff09;数字信号处理…

深度强化学习(DRL)框架与多目标调度优化详解

深度强化学习&#xff08;DRL&#xff09;框架与多目标调度优化详解 &#xff08;截至2025年4月&#xff0c;结合最新研究进展&#xff09; 一、DRL主流框架及核心算法 通用DRL框架 Ray RLlib&#xff1a;支持分布式训练&#xff0c;集成PPO、A3C、DQN等算法&#xff0c;适用于…

centos 安装python3.9.9

这里写自定义目录标题 安装编译依赖 sudo yum -y groupinstall "Development Tools" sudo yum -y install openssl-devel bzip2-devel libffi-devel wget zlib-devel yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel …

【动态规划】深入动态规划:背包问题

文章目录 前言01背包例题一、01背包二、分割等和子集三、目标和四、最后一块石头的重量|| 完全背包例题一、完全背包二、 零钱兑换三、零钱兑换||四、完全平方数 前言 什么是背包问题&#xff0c;怎么解决算法中的背包问题呢&#xff1f; 背包问题 (Knapsack problem) 是⼀种组…

Vue 接口请求 Nginx配置实时压缩 速度起飞

生效之前 nginx配置如下 gzip on; gzip_min_length 1k; gzip_buffers 16 256k; gzip_http_version 1.1; gzip_comp_level 6; gzip_types application/json application/javascript text/javascript text/css text/plain; gzip_vary on; 生效之后 #user…

Mitosis:跨框架的UI组件解决方案

Mitosis 是一个开源工具&#xff0c;可以将 JSX 组件转换为 Angular、React、Qwik、Vue、Svelte、Solid 和 React Native 等框架的功能齐全的组件。 Stars 数13019Forks 数593 主要特点 跨框架兼容性&#xff1a;Mitosis 允许开发者编写一次组件&#xff0c;然后编译成多个主流…

齐次坐标系统:什么是齐次坐标?为什么要引入齐次坐标?

齐次坐标系统&#xff1a;计算机图形学的基础 在计算机图形学、计算机视觉、相机标定、三维建模等领域&#xff0c;齐次坐标是一个非常重要的数学工具。本文将介绍&#xff1a;齐次坐标的基本概念、数学原理、我们为什么要引入齐次坐标、及其在实际应用中的价值。 文章目录 齐…

JS的大数运算(注意:原生的只支持整数计算!!!)

JS的大数运算&#xff08;注意&#xff1a;原生的只支持整数计算&#xff01;&#xff01;&#xff01;&#xff09; 一、JS的大数运算&#xff08;注意&#xff1a;原生的只支持整数计算&#xff01;&#xff01;&#xff01;&#xff09;1. 数字精度限制2. 大数解决方案2.1. …

Android 之美国关税问题导致 GitHub 403 无法正常访问,责任在谁?

这几天各国关税问题导致世界动荡不安&#xff0c;如今GitHub又无法正常访问&#xff0c;是不是Google到时候也无法正常使用了。

JAVA中正则表达式的入门与使用

JAVA中正则表达式的入门与使用 一&#xff0c;基础概念 正则表达式&#xff08;Regex&#xff09; 用于匹配字符串中的特定模式&#xff0c;Java 中通过 java.util.regex 包实现&#xff0c;核心类为&#xff1a; Pattern&#xff1a;编译后的正则表达式对象。 Matcher&#…

Prompt_Engineering提示词工程(一)

一、Prompt&#xff08;提示词&#xff09; Prompt&#xff08;提示词&#xff09;是给AI模型交互文本片段&#xff0c;用于指导模型生成符合预期输出结果&#xff0c;提示词的目的是为模型提供一个上下文的任务&#xff0c;以便模型能够更准确地理解用户的意图&#xff0c;并…

【设计模式】面向对象开发学习OOPC

PLOOC-裸机思维 PLOOC-git OOPC精要——撩开“对象”的神秘面纱 C/C面向对象编程之封装-KK 面向过程&#xff0c;本质是“顺序&#xff0c;循环&#xff0c;分支”面向对象&#xff0c;本质是“继承&#xff0c;封装&#xff0c;多态”参考的书籍&#xff1a;《UMLOOPC嵌入式…

软考高级--案例分析

架构风格 重点 交互方式数据结构控制结构扩展方法 分类 管道-过滤器风格 数据流 数据仓储风格 星型结构以数据为中心&#xff0c;其他构件围绕数据进行交互 企业服务总线esb 定义 以一个服务总线充当中间件的角色&#xff0c;把各方服务对接起来&#xff0c;所有服务…

01_背包问题

package org.josh; import java.util.*; public class Main { public static void main(String[] args) { Scanner scanner new Scanner(System.in); int n scanner.nextInt(); // 物品数量 long w scanner.nextLong(); // 背包容量&#xff0c;使用long防止溢出 int[] v …