小白学习Python的第十二天之装饰器生成器与模块

【AI黑话日日新】什么是AI Infra? 是支撑AI模型开发、训练、推理、部署与规模化运营的,是连接底层算力与上层AI应用的“数字基建”。没有高效的AI Infra,大模型训练、推理与落地都无法高效实现。 阅读详情

一. 有参装饰器

有参装饰器的功能 - 在给函数添加功能的时候可以通过参数控制具体的操作(操作不固定)
2.怎么写有参装饰器

"""
def 函数名0(装饰器的参数列表):
    def 函数名1(func):
        def 函数名2(*args, **kwargs):
            result = func(*args, **kwargs)
            新功能
            return result
        return 函数名2
    return 函数名1


def 函数名(装饰器的参数列表):
    无参装饰器
    return 无参装饰器的函数名


有参装饰器的用法:
@函数名0(装饰器实参列表)
"""
# 写一个装饰器可以在函数结束后打印指定的任意提示信息
def add_message(msg):
    def test1(func):
        def new_func(*args, **kwargs):
            result = func(*args, **kwargs)
            print(msg)
            return result
        return new_func
    return test1


@add_message('结束')
def func1(x, y):
    print(x+y)


func1(10, 20)
# 练习:写一个装饰器,在原函数返回值的基础上减去指定的值
# @sub(10)   @sub(30)


def sub(num):
    def test2(func):
        def new_func(*args, **kwargs):
            result = func(*args, **kwargs)
            if type(result) in (int, float, bool, complex):
                return result-num
            return result
        return new_func
    return test2


@sub(20)
def func2(x, y):
    return x*y


print(func2(10, 20))

二. 迭代器

1.什么是迭代器(iter)

"""
迭代器是容器型数据类型(序列),
特点:a.不能同时查看所有元素(打印看不到里面的元素)
     b.不能统计个数
     c.获取元素的时候只能一个一个的取(每次取最上层的那个),每次获取元素该元素就会从迭代器中消失(取一个就少一个)

"""

2.创建迭代器对象

"""
迭代器创建有两种方式
1)通过iter将其他序列转换成迭代器
2)创建生成器
"""
iter1 = iter([10, 20, 30, 40])
print(iter1)   # <list_iterator object at 0x000001BC01F4B198>
# print(len(iter1))   # TypeError: object of type 'list_iterator' has no len()

3.获取元素
不管通过什么样的方式获取到了迭代器中的元素,对应的元素都会从迭代器中消失

"""
1)取单个元素
next(迭代器) - 获取迭代器最上面的一个数据(如果迭代器为空,就会报StopIteration错误)

2)遍历
for 遍历 in 迭代器:
    pass
"""
print(next(iter1))   # 10
print(next(iter1))   # 20
next(iter1)          # 30
print(next(iter1))   # 40
# print(next(iter1))   # StopIteration

iter2 = iter('hello')
for i in iter2:
    print(i)

iter3 = iter('python!')
list1 = list(iter3)
print(next(iter3))   # StopIteration

iter4 = iter('python123')
next(iter4)
for i in iter4:
    print('i', i)

三. 生成器

1.什么是生成器(generator)

"""
生成器的本质就是迭代器(迭代器的特点和获取元素的方式生成器都适用)
"""

2.怎么创建生成器

"""
调用一个带有yield关键字的函数就可以创建一个生成器对象
(如果被调用的函数里面有yield,不会执行函数体也不会获取函数返回值)
"""
def func1():
    print('=====')
    print('+++++')
    yield
    return 100


re = func1()
print(re)   # <generator object func1 at 0x0000020B004BBBF8>

3.怎么确定生成器中产生的数据

"""
产生数据的个数:看执行完生成器对应的函数的函数体会遇到几次yield
产生的数据的值:看每次遇到的yield后面的数据是什么,没有数据就是None
"""
def func2():
    yield 100
    yield 'abc'
    for i in range(3):
        yield i


gen1 = func2()
# print(gen1)

# print(len(gen1))   # TypeError: object of type 'generator' has no len()
# print(len(list(gen1)))   # 5
print(list(gen1))   # [100, 'abc', 0, 1, 2]

4.生成器产生数据的原理

"""
调用函数创建生成器对象的时候不会执行函数体,获取生成器中的元素的时候才会执行。
第一次获取元素会从函数体开始的位置开始执行,执行到第一次yield就停下来,并且将yield后面的数据作为这次获取到的元素。
后面每次获取元素的时候都是从上次结束的位置接着往后执行,执行到下一次yield又会停下来。如果从当前位置开始执行到函数结束没有遇到yield,如果是next就会报StopIteration错误
"""
def func4():
    print('======1======')
    yield 100
    print('======2======')
    yield 200
    print('======3======')
    yield 300


gen2 = func4()
print(next(gen2))
for i in range(3):
    print('````````')

print(next(gen2))
print(next(gen2))
# print(next(gen2))   # StopIteration

gen3 = func4()
gen4 = func4()

print(next(gen3))   # 100
print(next(gen3))   # 200
print(next(gen4))   # 100


def func5():
    for i in range(5):
        yield i*2


# 重新调用函数则会重新开始
print(next(func5()))   # 0
print(next(func5()))   # 0
# 练习:写一个产生学号的生成器,能够产生指定学科001~999的学生学号
# python学生:python001~python999
# java学生:java001~java999


def student_id(str:str):
    for i in range(1, 1000):
        yield f'{str}{i:0>3}'
        # yield str+str(i).zfill(3)


py = student_id('python')
for i in range(1, 1000):
    print(next(py))

ja = student_id('java')
for i in range(1, 1000):
    print(next(ja))
# 练习:写一偶数个生成器,能够产生所有的正的偶数


def even():
    num = 2
    while True:
        yield num
        num += 2


even1 = even()
print(next(even1))
print(next(even1))

4.生成式 - 生成器的推导式

"""
将列表推导式[]变成(),创建的就是生成器的推导式即生成式
"""

四. 模块的使用

test模块

print('==========test开始==========')
A = 100


def func1():
    print('test1中的函数')


for X in range(10):
    pass
print('==========test结束==========')

test1模块

def sum1():
    print(sum(range(100)))


def main():
    sum1()


if __name__ == '__main__':
    main()

1.什么是模块

"""
python中一个py文件就是一个模块。
可以在一个模块中去使用另外一个模块的内容(全局变量),但需要提前导入模块
"""

2.导入模块

"""
1)import 模块名 - 导入能够使用指定模块中所有的全局变量;
               以'模块名.变量'形式去使用

2)from 模块名 import 变量名1,变量名2,...
a.导入模块,能使用模块中指定的全局变量;
b.直接使用对应的变量,不需要在前面加'模块名.'

3)import 模块名 as 新模块名
导入模块的时候对模块进行重命名,重命名后需要通过新模块名来使用被导入的模块

4)from 模块名 import 变量 as 新变量名,...
导入模块的时候对指定变量进行重命名

5)from 模块名 import *
导入模块中所有的全局变量
"""
# 导入方式一:import 模块名
import test
print(test.A)

test.func1()
print(test.X)
# 导入方式二:from 模块名 import 变量
from test import A, func1
print(A)
func1()
# 导入方式三:模块重命名
import test as ts
ts.func1()
print(ts.A)
print(ts.X)
# 本模块中的变量名与导入模块的变量名都可以使用
# 导入方式四:对变量重命名
from test import func1 as ts_func1


def func1():
    print('本模块中的func1')


func1()   # 本模块中的func1
ts_func1()   # test1中的函数

3.导入模块的原理

"""
不管是通过import还是from-import,在导入模块的时候,系统会自动将被导入的模块中所有的代码都执行一遍

注意:import导入模块的时候,自带查重功能(如果被导入的模块已经被导入过,不会重复导入)
"""
import test
import test
# *import 自带检测重复导入的功能*

4.阻止导入

"""
定义模块的时候,可以通过if __name__ == '__main__' 这个if语句来阻止模块
中的指定代码被其他模块在导入的执行。(在这个if语句中的代码不会被其他模块执行,
不在这个if语句中的代码就会被其他模块执行)

原理:
每个py文件中默认都有一个变量 __name__ 用来保存当前模块的模块名,
当直接执行某个py文件的时候这个文件中的__name__会自动变成"__main__"
"""
Unity 面试篇|(四)Unity性能优化篇 【全面总结 | 持续更新】 Unity中,CPU准备好需要绘制的元素,对底层图形程序接口进行调用的过程,每次引擎准备数据并通知GPU的过程称为一次Draw Call。DrawCall越高对显卡的消耗就越大。降低DrawCall的方法:动态合批静态合批降低shader的等级特性场景优化策略——遮挡技术。rectMask2D替代Mask。 阅读详情

相关推荐

STM32duino LSM6DSO驱动库:低功耗IMU工程化实践

惯性测量单元(IMU)是智能终端与工业设备实现运动感知的核心传感器,其性能关键在于数据精度、实时响应与系统功耗的协同优化。LSM6DSO作为集成加速度计与陀螺仪的六轴MEMS器件,依托片上有限状态机(FSM)和机器学习核心(MLC),支持自由落体检测、计步器、6D方向识别等硬件自治功能,显著降低主控CPU负载。在STM32平台下,通过深度耦合HAL/LL库、显式引脚管理、DMA加速SPI传输及EXTI中断协同,可实现亚毫秒级事件响应与微安级待机功耗。本文聚焦STM32duino生态中LSM6DSO驱动的工程

weixin_36304957的博客 552

python装饰器

Python中的装饰器及@用法详解 转载请注明出处:http://blog.youkuaiyun.com/tyhj_sf/article/details/77417455 这篇文章主要介绍了Python中的装饰器用法,以实例形式详细的分析了Python中的装饰器的使用技巧及相关注意事项。 一、例子 1.1 先看下面一个简单的例子程序 def funA(arg): prin...

weixin_33759269的博客 856

机器学习预测土壤养分:从电导率、pH到随机森林与神经网络的农业实践

在智慧农业与精准农业领域,机器学习已成为处理复杂农业数据、挖掘潜在规律的关键技术。其核心原理在于通过算法从多维数据中自动学习特征与目标变量之间的映射关系,尤其擅长捕捉非线性关联。这项技术的核心价值在于能够将传统上依赖昂贵、耗时实验室分析的问题(如土壤养分检测),转化为基于易获取传感器数据(如电导率、pH值)的快速、低成本预测任务,为农业生产的实时决策与资源优化提供了全新可能。其典型应用场景包括作物生长监测、产量预测以及精准施肥管理等。本文聚焦于利用随机森林和神经网络等回归算法,构建通过土壤物理参数预测氮磷钾

weixin_33693070的博客 667

python第十二天

# 1.有参装饰器的功能 - 在给函数添加功能的时候可以通过参数控制具体的操作(操作不固定) # 2.怎么写有参装饰器 """ 示例: def 函数名0(装饰器的参数列表): def 函数名1(func): def 函数名2(*args, **kwargs): result = func(*args, **kwargs) 新功能 return result return 函数名2

Tdyang111的博客 146

Ubuntu20.04下Pycharm的快速安装与配置指南

本文提供了一份详细的Ubuntu 20.04系统下PyCharm社区版的安装与配置指南。文章重点介绍了通过手动下载.tar.gz压缩包进行安装的灵活方法,并涵盖了系统准备、依赖安装、首次运行、创建快捷方式以及解释器配置等关键步骤,帮助Python开发者快速搭建高效、可控的本地开发环境。

weixin_28831341的博客 379

阿里开源最强数字人工具 EchoMimicV2,本地部署(一)

EchoMimicV2是阿里推出的半身人体AI数字人项目,基于参考图片、音频剪辑和手部姿势序列生成高质量动画视频,确保音频内容与半身动作的一致性。现在本地部署,安装体验一下。

缘分天空的专栏 4615

第十二天 迭代器生成器

1. 什么是迭代器(iter) 1)迭代器是容器型数据类型 2)怎么创建迭代器:a.将其他序列转换成迭代器 b.创建生成器 3)特点:打印的时候不能查看元素;无法获取元素个数; 获取元素的时候必须将元素从迭代器中取出,取出后元素会从迭代器中消失,并且无法再添加。 # 创建迭代器 i1 = iter('abc') print(i1) # <str_iterator object at 0x10653ebe0> # print(len(i1)) # 报错! i

weixin_63123211的博客 108

RK3566开发板实战:YT8512C百兆网卡调试全记录(附DTS配置避坑指南)

本文详细记录了RK3566开发板上YT8512C百兆以太网卡的调试全过程,包括硬件信号检测、DTS配置优化及常见错误排查。特别针对DTS配置中的关键参数和避坑指南进行了深入解析,为开发者提供实用的调试技巧和经验分享。

weixin_29189381的博客 273

Python第十五天 datetime模块 time模块 thread模块 threading模块 Queue队列模块 multiprocessing模块 paramiko模块 fab...

Python第十五天 datetime模块 time模块 thread模块 threading模块 Queue队列模块 multiprocessing模块 paramiko模块 fabric模块 目录 Pycharm使用技巧(转载) Python第一天 安装 shell 文件 Python第二天 变量 运算符与表达式 input()与r...

dingshen2767的博客 355

实战落地!Python抓取股票历史数据:开盘/收盘/成交量全维度爬取(附数据清洗+可视化)

股票历史数据抓取的核心是“数据准确性+完整性”,网页爬取适合小批量、个性化需求,API调用适合批量、标准化需求。多市场数据抓取:适配港股(00700.HK)、美股(AAPL)的抓取逻辑;高频数据抓取:抓取分钟级、小时级行情数据,用于短线量化策略;财务数据扩展:抓取市盈率、市净率、净利润等财务指标,结合价格数据做基本面分析;量化策略回测:将清洗后的数据接入Backtrader、VNPY等量化框架,验证策略有效性。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1740

Cadence画PCB的傻瓜式教程

1.原理图1)建立元件库2)建立原理图3)在原理图中画好电路图4)利用MENTOR-GRAPHICS-IPC-7351-LP-VIEWER查看元件的封装信息,用pad designer画焊盘,用pcb editor画元件的封装(对照LP_VIEWER),(也可以使用package wizard)5)在原理图中为元件添加封装信息(键入)6)Drc检查7)生成网表2.Pcb1)设置...

tianpu2320959696的博客 1万+

第十二天 生成器再进阶

小知识点:   print(函数名.__name__)就可以打印函数的以字符串的名字的功能。   print(函数名.__doc__)打印函数文档的功能。   使用装饰器会改变函数__name__的输入。但是如果想使用原本函数的名字和文档的话,就可以使用以下模块: from functools import wraps: def wrapper(func):   @wraps(func...

weixin_34248258的博客 93

Ubuntu零基础教学-史上最详Ubuntu20.04安装教程,超级详细,强烈建议收藏!

官网地址:https://www.vmware.com/ 1、VMware Workstation Pro 15.5.1在Windows 10的安装不再介绍了,一路下一步即可。 2、下面详细介绍在VMware 虚拟机里安装Ubuntu 20.04 LTS的步骤

**My Coding Family** 2万+

Python第十一天 异常处理 glob模块和shlex模块 打开外部程序和subprocess模块 subprocess类 Pipe管道 operator模块 sorted函...

Python第十一天 异常处理 glob模块和shlex模块 打开外部程序和subprocess模块 subprocess类 Pipe管道 operator模块 sorted函数 os模块 hashlib模块 platform模块 csv模块 目录 Pycharm使用技巧(转载) Python第一天 安装 shell 文件 ...

dingshen2767的博客 270

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Python第十四天 序列化 pickle模块 cPickle模块 JSON模块 API的两种格式

Python第十四天 序列化 pickle模块 cPickle模块 JSON模块 API的两种格式 目录 Pycharm使用技巧(转载) Python第一天 安装 shell 文件 Python第二天 变量 运算符与表达式 input()与raw_input()区别 字符编码 python转义符 字符串格式化 Python第三天 序列 5种数据...

dingshen2767的博客 200

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Python第八天 模块 包 全局变量和内置变量__name__ Python path

Python第八天 模块 包 全局变量和内置变量__name__ Python path 目录 Pycharm使用技巧(转载) Python第一天 安装 shell 文件 Python第二天 变量 运算符与表达式 input()与raw_input()区别 字符编码 python转义符 字符串格式化 Python第三天 序列 5种数据类...

dingshen2767的博客 291

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

python复习题(基础知识 ) 都写一遍胜过复习一次

目录第一天第二天第三天count 计数index 角标索引 第一天 1.环境配置:Python,Pycharm,Pycharm配置Python 2.学习软件:Typora,文档python.md 1.1、下载安装python-3.8.2-amd64.exe 官网地址:https://www.python.org/downloads/windows/ 1.2、 下载地址: PyCharmhttps://www.jetbrains.com/pycharm/download/#section=windows

zzsaixuexi的博客 428

Python第五天 文件访问 for循环访问文件 while循环访问文件 字符串的startswith函数和split函数 linecache模块...

Python第五天 文件访问 for循环访问文件 while循环访问文件 字符串的startswith函数和split函数 linecache模块 目录 Pycharm使用技巧(转载) Python第一天 安装 shell 文件 Python第二天 变量 运算符与表达式 input()与raw_input()区别 字符编码 python...

dingshen2767的博客 240

Python第十天 print >> f,和fd.write()的区别 stdout的buffer 标准输入 标准输出 从控制台重定向到文件 标准错误 重定向 输出流和输入流 捕...

Python第十天 print >> f,和fd.write()的区别 stdout的buffer 标准输入 标准输出 从控制台重定向到文件 标准错误 重定向 输出流和输入流 捕获sys.exit()调用optparse argparse 目录 Pycharm使用技巧(转载) Python第一天 安装 shell 文件 P...

dingshen2767的博客 282

Python第六天 类型转换

Python第六天 类型转换 目录 Pycharm使用技巧(转载) Python第一天 安装 shell 文件 Python第二天 变量 运算符与表达式 input()与raw_input()区别 字符编码 python转义符 字符串格式化 Python第三天 序列 5种数据类型 数值 字符串 列表 元组 字典 Python第四天 ...

dingshen2767的博客 133
上一篇: day11作业
下一篇: day12 作业
bbbbbya
博客等级 码龄9年 18粉丝 35原创
评论 8
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值