Python基础篇---生成器和模块

news2024/11/26 18:21:47

生成器对象


 生成器对象其本质是自定义迭代器,就是需要我们自己写代码产生的迭代器。

生成器对象也是节省存储空间的 特性与迭代器对象一致。

def index():
    print('第一次输出')
    yield 1
    print('第二次输出')
    yield 2

1

2

3

4

5

6

7

8

9

10

当我们没有加括号调用之前,它就是一个普通的函数

        print(index)  # <function index at 0x1096c0ea0>

加括号调用并接收结果,不执行代码,而是变成生成器对象(迭代器)

        res = index()  # print(res)  # <generator object index at 0x11da33468>

        res有了iter()和next()方法

变成生成器对象之后调用__next__就会开始执行函数体代码

        调用一次next:

        print(res.__next__())  #第一次输出 1   yield有点像return的功能 停止在这里

        print(res.__next__())  #第二次输出 2  

        print(res.__next__())  # 报错

如果函数体代码中含有多个yield关键字  执行一次__next__返回后面的值并且让代码停留在yield位置,

再次执行__next__基于上次的位置继续往后执行到下一个yield关键字处,

如果没有了 再执行也会报错。

自定义range方法


range方法其实是一个可迭代对象。

需求:通过生成器模拟range方法。

def my_range():
    pass
for i in my_range(1,10):
    print(i)

先实现range2个参数的最简单情况。

def range(start, end):  # start为开始 end为结束
    while start < end:  # 设置一个循环 去迭代start+1
        yield start  # 每一次循环都返回start
        start += 1  # 迭代
for i in range(1, 10):
    print(i)

特殊情况,只有一个参数的情况。

def range(start, end=None):  # start为末尾值 end可以不传值 应该设置成默认参数
    if not end:  # 没有给end传值 end=None 代码层面做判断 将形参数据做替换处理
        end = start  
        start = 0
    while start < end:  # 设置一个循环 去迭代x+1
        yield start  # 每一次循环都返回x
        start += 1  # 迭代
for i in range(1, 10):
    print(i)

三个参数情况,传入了步长。

def range(start, end=None,step=1):  # 给函数添加第三个形参 并且设置成默认参数 默认值是1  step=1
    if not end:  # 没有给end传值 end=None 代码层面做判断 将形参数据做替换处理
        end = start
        start = 0
    while start < end:  # 设置一个循环 去迭代x+1
        yield start  # 每一次循环都返回x
        start += step  # 每次递增的时候只需要递增step的数值即可
for i in range(1, 10):
    print(i)

写代码一定不要想太多,先搭建主题功能,之后再考虑其他情况,思路一定要清晰!!!

yield关键字作用


1

2

3

4

5

yield的作用:

    在函数体代码中出现 可以将函数变成生成器

    在执行过程中 可以将后面的值返回出去 类似于return

    还可以暂停住代码的运行

    还可以接收外界的传值(了解)

def go_home(name):
    print(f'{name}在回家路上')
    while True:
        home= yield
        print(f'{name}到家了{home}')
res = go_home('jason')
# 想执行一次代码  如果想执行多次直至结束 可以直接用for循环
res.__next__()
res.__next__()
# 给yield传值
res.send('没有钥匙')  # 可以给yield传值 并且自动调用一次__next__方法
res.send('有钥匙')  # 可以给yield传值 并且自动调用一次__next__方法

生成器表达式


 生成器表达式也是为了节省存储空间,用来做代码优化,前期学习可以忽略。

# 生成器表达式
res = (i for i in 'jason')  
print(res)  # <generator object <genexpr> at 0x0000022C8D360D00>
print(res.__next__())  # j
print(res.__next__())  # a
print(res.__next__())  # s
"""生成器内部的代码只有在调用__next__迭代取值的时候才会执行"""

下面有一个生成器表达式的例题,诀窍在于生成器的调用。

# 普通的求和函数
def add(n, i):
    return n + i
# 生成器对象 返回 0 1 2 3
def test():
    for i in range(4):
        yield i
# 将test函数变成生成器对象
g = test()
# 简单的for循环
for n in [1, 10]:
    g = (add(n, i) for i in g)
    """
    第一次for循环
        g = (add(n, i) for i in g)
    第二次for循环
        g = (add(10, i) for i in (add(10, i) for i in g))
    """
res = list(g)  # list底层就是for循环 相当于对g做了迭代取值操作
print(res)

#A. res=[10,11,12,13]
#B. res=[11,12,13,14]
#C. res=[20,21,22,23]
#D. res=[21,22,23,24]
"""正确答案是C  诀窍就是抓n是多少即可"""

模块


 简介

模块就是一系列功能的结合体,可以直接使用,极大地提升开发效率。

模块的三种来源

1

2

3

4

5

6

内置的模块

    无需下载 解释器自带  直接导入使用即可

自定义模块

    自己写的代码 封装成模块 自己用或者发布到网上供别人使用

第三方模块

    别人写的发布到网上的 可以下载使用的模块(很多牛逼的模块都是第三方)

模块的四种表现形式

1

2

3

4

使用python代码编写的py文件        # 掌握

多个py文件组成的文件夹(包)     # 掌握

已被编译为共享库或DLL的c或C++扩展(了解)

使用C编写并链接到python解释器的内置模块(了解)

模块的两种导入方式


要想使用模块,必须先把模块导入,而导入的方法有两种。

方式1---import...句式

import md  # 导入md模块
print(md.name)  #调用md模块中的名称
md.read1()   # 调用md模块里的函数

import句式的特点

1

2

可以通过import后面的模块名点的方式 使用模块中所有的名字

并且不会与当前名称空间中的名字冲突(指名道姓)  

 模块导入的原理

1

2

3

4

5

6

7

8

执行当前文件 产生一个当前文件的名称空间

执行import句式 导入模块文件(即执行模块文件代码产生模块文件的名称空间)

在当前文件的名称空间中产生一个模块的名字 指向模块的名称空间

通过该名字就可以使用到模块名称空间中的所有数据

ps:相同的模块反复被导入只会执行一次

         import md   有效

         import md   无效(写了跟没写一样)

         import md   无效(写了跟没写一样)

方式2---from...import...句式

from md import name  # 导入模块中的名称name  其他的没有导入进来
print(name)  # jasonNB
name = 'kevin'
print(name)  # kevin

from...import...句式特点

1

2

3

4

重复导入也只会导入一次

使用模块名称空间中的名字不需要加模块名前缀,直接使用即可

但是from...import的句式会产生名字冲突的问题,在使用的时候 一定要避免名字冲突

使用from...import的句式 只能使用import后面出现的名字,没有出现的用不了

from...import...的原理

1

2

3

执行当前文件产生一个名称空间

执行导入语句 运行模块文件产生名称空间存放运行过程中的所有名字

将import后面的名字直接拿到当前执行文件中

 

模块导入补充

1.可以给模块起别名(使用频率很高)

使用场景:模块名或者变量名很复杂,可以起别名简写
import md as m
print(m.name)
from md import name as n
print(n)

2.连续导入多个模块或者变量名

import time, sys, md
from md import name, read1, read2
# 连续导入多个模块,这多个模块最好有相似的功能部分,如果没有建议分开导入,如果是同一个模块下的多个变量名无所谓!!!

3.通用导入

from md import *
#   *表示md里面所有的名字   from...import的句式也可以导入所有的名字
#   如果模块文件中使用了__all__限制可以使用的名字  
#   那么*号就会失效 依据__all__后面列举的名字

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

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

相关文章

学习JavaScript,有哪些好的博客或者网站推荐?

前言 特意制作了一个Js整体的学习路线以及相关知识点博客讲解以及各类网站学习的资源整合&#xff0c;希望对你有帮助哈~ 废话少说&#xff0c;我们直接进入正题&#xff0c;先放上路线导图&#xff1a; 部分重要知识点 基础性知识 声明变量 null 和 undefined 详解JavaS…

code warrior IDE win10 64位安装保姆级教程

以下安装步骤是在win10 64位系统运行程序默认安装在C盘第1步&#xff1a;第2步&#xff1a;将PE_Plugin.dll文件复制到com文件夹中&#xff0c;路径如下&#xff1a;C:\Program Files(x86)\Freescale\CodeWarrior for Microcontrollers V6.3\bin\plugins\com第3步&#xff1a;以…

Blender里的三种绑定 (三)骨骼

文章目录Blender里的三种绑定.骨骼.骨骼基础.骨骼的父子关系.挤出骨骼.细分骨骼.骨骼分层.骨骼分组.骨骼约束.骨骼被遮挡.对称骨骼.为模型绑定骨骼.刚体物体&#xff0c;只跟随骨骼的移动&#xff0c;不随骨骼移动发生形变&#xff0c;如机械.软体物体&#xff0c;跟随骨骼的移…

手写RPC框架第7版-框架容错性相关设计

源代码地址&#xff1a;https://github.com/lhj502819/IRpc/tree/v8 系列文章&#xff1a; 注册中心模块实现路由模块实现序列化模块实现过滤器模块实现自定义SPI机制增加框架的扩展性的设计与实现基于线程和队列提升框架并发处理能力框架容错性相关设计通过SpringBoot-Starte…

数据结构:关于空间复杂度的例题计算

1、计算冒泡排序的空间复杂度 答案&#xff1a;该程序空间复杂度为O(1)。 解析&#xff1a;该程序在栈空间所申请的临时变量空间只有三个&#xff0c;也就是看成常数个&#xff0c;所以是O(1)。如下图所示 2、动态开辟N个数的数组空间复杂度 答案&#xff1a;该程序空间复杂度…

【UE4 第一人称射击游戏】31-更好的UI界面

素材资料地址&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1epyD62jpOZg-o4NjWEjiyg密码&#xff1a;jlhr上一篇&#xff1a;【UE4 第一人称射击游戏】30-简单的任务提示功能本篇效果&#xff1a;步骤&#xff1a;在UE中新建一个“HUD_Export”文件夹&#xff0c;将所…

《码出高效:java开发手册》七 - 并发与多线程

前言 现代CPU运算速度以百亿计&#xff0c;家用计算机和操作系统也是数十进程&#xff0c;数百线程&#xff0c;程序相应也需要采用多线程和并发的技术 并发和并行&#xff1a;并发是指某个时间段&#xff0c;多任务处理&#xff1b;并行是指同时处理多任务的能力&#xff1b;…

接口测试项目实战与经典面试题解析,挑战 BAT 大厂必会!

近年来&#xff0c;接口测试技术体系已在各大互联网企业落地普及&#xff0c;各种新接口框架不断涌现&#xff0c;业界也形成了不少成熟方案和成功案例。当前 BAT 大厂在招聘测试人员时&#xff0c;接口测试技能和项目经验是必考重点&#xff0c;直接影响到职级评定和薪资水平&…

2023/1/10 Vue学习笔记6 - 路由基本使用

1 路由的简介-router 1、路由就是一组key-value的对应关系。 2、多个路由&#xff0c;需要经过路由器的管理。 SPA (single page web application&#xff09;应用 - 单页面web应用 {"key":"/class","value":"班级组件" }1.vue-rout…

kali中wpscan工具使用

一.wpscan工具简介 wpscan是一款专门针对wordpress的扫描工具&#xff0c;采用ruby语言编写&#xff0c;能够扫描worpress网站中包括主题漏洞、插件漏洞以及wordpress网站本身存在的漏洞。wpscan还可以扫描wordpress网站启用的插件和其他功能。 在Kali Linux系统中&#xff0…

关于distinct——去除重复记录

distinct译为&#xff1a;不同的&#xff0c;有区别的&#xff1b;在SQL语句中表示去除重复记录的意思 举例&#xff1a;在员工表emp中查询所有的工作岗位。 分析&#xff1a;在员工表中的工作岗位字段下有重复的工作岗位&#xff0c;我们在查询的时候就希望将重复的工作岗位显…

数据库取证——MySQL基础知识

目录 一、数据库基础知识 &#xff08;一&#xff09;数据库&#xff08;DB&#xff09; &#xff08;二&#xff09;数据库管理系统&#xff08;DBMS&#xff09; &#xff08;三&#xff09;数据库系统&#xff08;DBS&#xff09; &#xff08;四&#xff09; 数据库的…

【Unity云消散】简单理论基础:实现边缘光

写在前面 既然想要实现云的消散效果&#xff0c;那么边缘光如何计算也是一个重点。 在Unity Shader入门精要的14章&#xff0c;介绍轮廓线渲染就介绍了——轮廓边检测&#xff0c;而边缘光也是需要先检测出轮廓边再进行的。 Unity3D Shader系列之边缘光RimLight 这篇博客给…

Go专家编程读书小记

文章目录协程进程和线程进程&#xff1a;进程间通信&#xff1a;线程&#xff1a;区别&#xff1a;协程GMP模型调度策略内存管理内存分配span&#xff1a;cache&#xff1a;central&#xff1a;heap&#xff1a;垃圾回收常见的垃圾回收算法&#xff1a;三色标记&#xff1a;垃圾…

【NI Multisim 14.0原理图设计基础——查找元器件】

目录 序言 一、查找元器件 &#x1f34d;1.浏览元器件 &#x1f34d;2.搜索元器件 &#x1f34d; 3.显示找到的元器件及其所属元器件库 &#x1f34d; 4.加载找到元器件的所属元器件库 序言 NI Multisim最突出的特点之一就是用户界面友好。它可以使电路设计者方便、快捷地…

大资金现金管理的利器:稳定币网格做市策略

数量技术宅团队在CSDN学院推出了量化投资系列课程 欢迎有兴趣系统学习量化投资的同学&#xff0c;点击下方链接报名&#xff1a; 量化投资速成营&#xff08;入门课程&#xff09; Python股票量化投资 Python期货量化投资 Python数字货币量化投资 C语言CTP期货交易系统开…

从一条记录说起—— InnoDB 记录结构

准备工作 到现在为止&#xff0c;MySQL对于我们来说还是一个黑盒&#xff0c;我们只负责使用客户端发送请求并等待服务器返回结果&#xff0c;表中的数据到底存到了哪里&#xff1f;以什么格式存放的&#xff1f;MySQL是以什么方式来访问的这些数据&#xff1f;这些问题我们统…

springboot构造树形结构数据并查询的方法

因为项目需要,页面上需要树形结构的数据进行展示(类似下图这样),因此需要后端返回相应格式的数据。 不说废话,直接开干!!! 我这里用的是springboot+mybatis-plus+mysql,示例的接口是查询一级权限以及二级权限、三级权限整个权限树… 下面是导入的maven依赖 <depe…

SSD核心设计

摘要本文介绍了此类设计选择的分类&#xff0c;并使用跟踪驱动的模拟器和从实际系统中提取的工作负载跟踪分析各种配置的可能性能。我们发现SSD性能和生命周期对工作负载非常敏感&#xff0c;并且通常较高的复杂系统问题出现在存储堆栈中甚至在分布式系统中&#xff0c;与设备固…

9. 回文数

文章目录题目描述方法一 转换为字符串方法二 转存入数组方法三 数学方法倒转数字方法四 对折参考文献题目描述 给你一个整数 x &#xff0c;如果 x 是一个回文整数&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 回文数是指正序&#xff08;从左向右&…