Day18.函数的注意事项

Python培训教程:Day16-20Python语言进阶 Python培训教程:Python语言进阶 数据结构和算法 算法:解决问题的方法和步骤 评价算法的好坏:渐近时间复杂度和渐近空间复杂度。 渐近时间复杂度的大O标记: 常量时间复杂度 - 布隆过滤器 / 哈希存储 对数时间复杂度 - 折半查找(二分查找) 线性时间复杂度 - 顺序查找 / 桶排序 对数线性时间复杂度 - 高级排序算法(归并排序、快速排序) 平方时间复杂度 - 简单排序算法(选择排序... 阅读详情

函数的注意事项



前言

其实我们在学习编程的过程中,函数的使用应该是最为常见的,而且我们常常调用的不就是封装好的函数嘛,但是这不重要,重要的是我们能灵活运用这些函数就好,重复造轮子这种事情实在是没必要,而且你的轮子还一般比别人差,那何必呢,直接用不想吗?


  1. 将函数视为“一等公民”
  • 函数可以赋值给变量
  • 函数可以作为函数的参数
  • 函数可以作为函数的返回值
  1. 高阶函数的用法(filter、map以及它们的替代品)
items1 = list(map(lambda x: x ** 2, filter(lambda x: x % 2, range(1, 10))))
items2 = [x ** 2 for x in range(1, 10) if x % 2]

items1, items2
  1. 位置参数、可变参数、关键字参数、命名关键字参数

  2. 参数的元信息(代码可读性问题)

  3. 匿名函数和内联函数的用法(lambda函数)

  4. 闭包和作用域问题

  • Python搜索变量的LEGB顺序(Local >>> Embedded >>> Global >>> Built-in)

  • global和nonlocal关键字的作用

    global:声明或定义全局变量(要么直接使用现有的全局作用域的变量,要么定义一个变量放到全局作用域)。

    nonlocal:声明使用嵌套作用域的变量(嵌套作用域必须存在该变量,否则报错)。

  1. 装饰器函数(使用装饰器和取消装饰器)

例子:输出函数执行时间的装饰器。

def record_time(func):
    """自定义装饰函数的装饰器"""

    @wraps(func)
    def wrapper(*args, **kwargs):
        start = time()
        result = func(*args, **kwargs)
        print(f'{func.__name__}: {time() - start}秒')
        return result

    return wrapper

如果装饰器不希望跟print函数耦合,可以编写可以参数化的装饰器。

from functools import wraps
from time import time


def record(output):
    """可以参数化的装饰器"""

    def decorate(func):

        @wraps(func)
        def wrapper(*args, **kwargs):
            start = time()
            result = func(*args, **kwargs)
            output(func.__name__, time() - start)
            return result

        return wrapper

    return decorate


from functools import wraps
from time import time
  

class Record():
    """通过定义类的方式定义装饰器"""

    def __init__(self, output):
        self.output = output

    def __call__(self, func):

        @wraps(func)
        def wrapper(*args, **kwargs):
            start = time()
            result = func(*args, **kwargs)
            self.output(func.__name__, time() - start)
            return result

        return wrapper

说明:由于对带装饰功能的函数添加了@wraps装饰器,可以通过func.__wrapped__方式获得被装饰之前的函数或类来取消装饰器的作用。

例子:用装饰器来实现单例模式。

from functools import wraps
  

def singleton(cls):
    """装饰类的装饰器"""
    instances = {}

    @wraps(cls)
    def wrapper(*args, **kwargs):
        if cls not in instances:
            instances[cls] = cls(*args, **kwargs)
        return instances[cls]

    return wrapper


@singleton
class President:
    """总统(单例类)"""
    pass

注: 上面的代码中用到了闭包(closure),不知道你是否已经意识到了。还没有一个小问题就是,上面的代码并没有实现线程安全的单例,如果要实现线程安全的单例应该怎么做呢?

线程安全的单例装饰器。

from functools import wraps
from threading import RLock


def singleton(cls):
    """线程安全的单例装饰器"""
    instances = {}
    locker = RLock()

    @wraps(cls)
    def wrapper(*args, **kwargs):
        if cls not in instances:
            with locker:
                if cls not in instances:
                    instances[cls] = cls(*args, **kwargs)
        return instances[cls]

    return wrapper

提示:上面的代码用到了with上下文语法来进行锁操作,因为锁对象本身就是上下文管理器对象(支持__enter__和__exit__魔术方法)。在wrapper函数中,我们先做了一次不带锁的检查,然后再做带锁的检查,这样做比直接加锁检查性能要更好,如果对象已经创建就没有必须再去加锁而是直接返回该对象就可以了。


总结

今天主要是学了点函数的使用注意事项,以及一些常见“骚操作”(易错操作)。重点就是函数的各种参数,生成式以及相对较难的装饰器。

遛了溜了,脑壳疼。Loading(18/100)。。。

Python100Days学习笔记---Day16-20Python语言进阶 生成式(推导式)的用法 prices = { 'AAPL': 191.88, 'GOOG': 1186.96, 'IBM': 149.24, 'ORCL': 48.44, 'ACN': 166.89, 'FB': 208.09, 'SYMC': 21.29 } # 用股票价格大于100元的股票构造一个新的字典 prices2 = {key: ... 阅读详情

相关推荐

代码随想录算法训练营Day6 | Leetcode 454四数相加II、383赎金信、15三数之和、18四数之和

Leetcode454四数相加II、383赎金信、15三数之和、18四数之和解题思路与技巧、代码

叽里呱啦大王的博客 984

day16 - Python语言进阶

Python语言进阶 数据结构和算法 算法:解决问题的方法和步骤 评价算法的好坏:渐近时间复杂度和渐近空间复杂度。 渐近时间复杂度的大O标记: - 常量时间复杂度 - 布隆过滤器 / 哈希存储 - 对数时间复杂度 - 折半查找(二分查找) - 线性时间复杂度 - 顺序查找 / 桶排序 - 对数线性时间复杂度 - 高级排序算法(归...

didoo2014的博客 391

C++ Day04 this指针,友元函数,重载

关键字:friend可以声明1,全局函数2,成员函数3,类注意友元打破c++的封装性。一般用于运算符重载作用是对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型。关键字operator语法返回值类型 operator+运算符形参列表函数体如:>>void operator>>(形参列表思路1、分析运算符的运算对象的个数2、分析运算符左边的运算对象是 自定对象 还是其他左边:是其他 只能全局函数实现 (必须使用友元)左边:自定义对象。

aisheisadas的博客 1670

51 Python - 装饰器 参数化装饰器——装饰器更通用

05参数化装饰器——装饰器更通用 参数化装饰器如何理解,简单理解就是让装饰器可以通用。场景举例,现在有个需求要改某一段文字,既要加<P>标签,又要加<B>,还有加<Div>。是不是意味着需要定义多个装饰器, 答案不需要,可以通过参数化形式共用一个装饰器,传入不同参数就可以了。 001装饰器未使用参数 不用参数化装饰器需要定义...

weixin_30408309的博客 221

Trae CN 使用入门指南

【代码】Trae CN 使用入门指南。

weixin_42551921的博客 8767

计算机考研408复试题汇总

TCP连接是全双工的,两端都可以先挥手 其中一端完成数据发送任务后,发送一个FIN包来终止,另一端针对这个FIN包回复确认包, 直到另一端也发送请求终止数据包FIN,另一端作出确认应答,并且还要发送一个ACK=1表示确认号有效,如果没有收到这个就可以进行重传.

ca1m4n的博客 1万+

【编程之路】Python 编程实例解析

有一个通过网络获取数据的函数(可能会因为网络原因出现异常),写一个装饰器让这个函数在出现指定异常时可以重试指定的次数,并在每次重试之前随机延迟一段时间,最长延迟时间可以通过参数进行控制。

Data · Model · Agent · Repeat 2808

基于Ultralytic实现多路摄像头目标检测

基于Ultralytic实现多路摄像头目标检测前面的文章分享了单路摄像头画面的YOLO目标检测,这篇文章主要分享一下多路摄像头画面的实时YOLO目标检测。测试环境在Windows系统下进行。

qq_57674776的博客 941

day18and19

Day18 线程(object类)中常用的方法 public final void notify() 唤醒当前锁对象的线程 唤醒一个 public final void notifyAll() 唤醒所以使用这个锁对象的线程 唤醒所以 public final void wait() 无线等待 >等待被唤醒 public final void wait(long timeout)>定时等待 线程的方法 public final void join() 当前线程执行完毕才执行其他线程

yuanjin666的博客 221

【Unity】YooAsset与HybridCLR:高效资源管理与代码热更的黄金组合

本文深入探讨了Unity开发中YooAsset与HybridCLR的组合应用,为需要长期运营的项目提供了完整的资源与代码热更新解决方案。YooAsset作为高效的资源管理框架,简化了AssetBundle的打包、加载与热更流程;而HybridCLR则攻克了IL2CPP模式下C#代码无法热更的难题。两者结合,实现了从资源到逻辑的平滑在线更新,极大提升了开发迭代与线上维护的效率。

weixin_29006701的博客 280

QT使用openssl实现RSA加解密

使用openssl生成公私钥,随后用QT对相应的信息进行RSA加解密

weixin_42098322的博客 3867

【美利坚】Day 1 CPT申请步骤及信息获取指南(Day1 CPT)

通过以上步骤,可高效完成Day 1 CPT申请并合法维持工作身份。如需进一步帮助,建议联系学校DSO或专业中介获取个性化指导。:直接邮件或电话联系学校国际办公室,确认政策细节(例:Harrisburg University采用在线票务系统)。

Dontla的博客 1815

计算机视觉:AI生成内容(AIGC)对视觉领域的冲击

计算机视觉:AI生成内容(AIGC)对视觉领域的冲击​ 人工智能,计算机视觉,大模型,AI,在信息技术日新月异的当下,计算机视觉作为人工智能领域的关键分支,已经深度融入了我们生活与工作的各个层面。从安防监控系统里精准的人脸识别,助力维护公共安全;到工业生产线上高效的产品质量检测,保障产品品质;再到医疗影像分析中为疾病诊断提供有力支持,计算机视觉技术凭借其对视觉信息的强大处理与理解能力,不断推动着各行业的发展与变革。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 17万+

day18 结构体

1.展开时机:有参宏而言,在预处理阶段展开,而函数在调用时才展开2.内存使用:有参宏而言,占用的是所在函数的空间,而函数在调用时会单独开辟空间3.效率上:有参宏的效率比函数有的效率高4.有参宏是宏定义,只替换不计算不做正确性检查,而函数调用要符合函数的调用标准,形参会进行计算。

luochen330x的博客 921

【系统架构设计师】模拟预测试卷十 - 案例分析(完整结构)

本文为系统架构设计师考试模拟试题及参考答案,包含五个专题:质量属性(必答)、信息系统架构设计、嵌入式系统架构设计、云原生架构设计、面向服务架构设计(SOA)。试题一聚焦非功能需求与质量属性映射,如性能、可修改性、一致性等;其余选答题分别涉及分层架构设计(如嵌入式实时控制)、云原生会话管理、服务化治理(如契约设计、熔断策略)等核心架构场景,涵盖战术应用、权衡分析及解决方案设计。参考答案提供关键要点,例如离线借还的冲突解决、服务编排与共享服务的区分、嵌入式硬实时保护的必要性等,适用于备考实战演练。

数据知道的博客 251

labview高低拼接的理解

计算机的一个字节由8位组成,无符号的8位整形表示的范围为0~255,范围太小了,所以用双字节,即16位整形表示更大范围的数字0 ~65535。2.labview中的高低拼接实质是高8位字节左移8位与低8位字节相加,结果是双字节整形。

qwerqwerdhr的博客 835

C++学习day--18 空指针和函数指针、引用

C++学习day--18 空指针和函数指针、引用

我的博客 1038

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

【Python-Day 19】函数的回响:深入理解 `return` 语句与返回值

本文是Python学习系列第19篇,重点讲解函数中的return语句。return语句具有两个核心功能:终止函数执行和返回值。文章详细介绍了return的基本语法、返回值的作用以及如何返回单个或多个值。通过实例演示了没有返回值、返回单个值和返回多个值的不同情况。此外,还讲解了函数执行过程中的控制流变化,包括return后的代码不会执行、多个return语句的执行顺序等。最后,文章总结了return语句的关键要点,帮助读者全面理解这个函数返回值的重要机制。

吴师兄大模型的博客 1723

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

day_18 date、time

date

十点半的博客 301

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

day18 异常

day18 异常 异常的描述 1.异常:开发过程中发生了一些错误,或者是不正常的情况(可以在代码中进行处理,甚至可以避免)。 2.异常解决的方式: ​ 1. 异常声明或抛出 ​ 2. 异常捕获,解决异常 3. 代码终止 3.error:错误,表示代码中发生的比较严重的问题,一般都会去解决,只能去修改代码。比如:内存溢出。 4.体系: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直...

qq_43453694的博客 156

9.18 day second 注意事项

Java高级类的使用 在static方法内部只能访问类的static属性,不能访问类的非static属性。 class Person {     private int id;  //不是static属性     private static int total = 0;     public static int getTotalPerson() {  id++; //非

u010999382的专栏 339

【Day 7-N18】Python函数(2)——基于元组、字典的可变参数,函数中变量的作用域

本文总结了Python函数中可变参数和作用域的关键知识点:1. 可变参数机制:- args接收任意数量位置参数并打包为元组- **kwargs接收任意数量关键字参数并打包为字典2. 参数使用规则:必须按位置参数→args→默认参数→**kwargs的顺序定义3. 变量作用域:包含局部变量、全局变量和内置变量,使用global/nonlocal关键字可修改外作用域变量4. 最佳实践:建议遵循参数顺序规范、避免可变默认参数、最小化作用域范围,并规范使用文档字符串这些内容有助于编写更灵活安全的函数,为后续学习高阶

qq_31964455的博客 631

[LeetCode]day22 18.四数之和

给你一个由 n 个整数组成的数组 nums ,和一个目标值 target。输出:[[-2,-1,1,2],[-2,0,0,2],[-1,0,0,1]]输入:nums = [1,0,-1,0,-2,2], target = 0。输入:nums = [2,2,2,2,2], target = 8。你可以按 任意顺序 返回答案。a、b、c 和 d 互不相同。输出:[[2,2,2,2]]

qq_65173003的博客 927

javase复习day18API

abs方法的小bug:以int类型为例,取值范围: -2147483648~2147483647如果没有正数与之对应,那么传递负数结果有误-2147483648没有正数对应则结果还是 -2147483648可以使用JDK15后的新方法 absExact 如果结果有误则会报错。

m0_72625929的博客 1229

day18Java-Exception-异常注意事项

常用对象Exception-异常注意事项 A:子类重写父类方法时,子类的方法必须抛出相同的异常或父类异常的子类。(父亲坏了,儿子不能比父亲更坏) B:如果父类抛出了多个异常,子类重写父类时,只能抛出相同的异常或者是他的子集,子类不能抛出父类没有的异常 C:如果被重写的方法没有异常抛出,那么子类的方法绝对不可以抛出异常,如果子类方法内有异常发生,那么子类只能try,不能throws 代码演示A A:...

ginger_mr的博客 165

Day12 函数的进阶

总结

o9887568546的博客 86
上一篇: Day17.数据结构和算法
下一篇: Day20.Python的并发编程
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值