Python 函数类型

news2024/11/8 3:20:24
  1. 普通函数
  2. 匿名函数(Lambda函数)
  3. 高阶函数
  4. 内置函数
  5. 递归函数
  6. 闭包函数
  7. 装饰器函数
  8. 方法
    8.1. 实例方法
    8.2. 类方法
    8.3. 静态方法

1. 普通函数

最基本的函数类型,通过 def 关键字定义。

def add(a, b):
    return a + b
    
print(add(3, 5))  	# 输出: 8

2. 匿名函数(Lambda函数)

使用 lambda 关键字定义的函数,与普通函数不同,Lambda 函数通常是一次性使用的,通常用于定义简单的、短小的函数。

add = lambda a, b: a + b

print(add(3, 5))  	# 输出: 8

无参数的 Lambda 函数

greet = lambda: "Hello, World!"
print(greet())  	# 输出: Hello, World!

Lambda 函数的局限性
只包含一个表达式: Lambda 函数只能包含一个表达式,不适合处理复杂的逻辑。
可读性: 由于 Lambda 函数没有名字,如果逻辑稍微复杂一些,会影响代码的可读性。
调试困难: 匿名函数在调试时不容易定位问题。

3. 高阶函数

高阶函数具备以下特征之一:

  1. 接受一个或多个函数作为参数。
  2. 返回一个函数。
    可以接受函数作为参数或返回值的函数。高阶函数广泛应用于各种场景,如数据处理、事件处理和回调等。
def apply_function(func, x, y):
    return func(x, y)
 
print(apply_function(add, 3, 5))  	# 输出: 8

4. 内置函数

Python 提供的一些内置函数,例如 len(), max(), min(), print() 等。

5. 递归函数

一个递归函数通常包含以下两部分:
基准情形: 处理简单的、直接可解决的情况,防止无限递归。
递归调用: 将问题分解为一个或多个子问题,并调用自身来解决这些子问题。
在函数内部调用自身的函数,通常用于解决递归问题。

def factorial(n):
    if n == 1:
        return 1
    else:
        return n * factorial(n - 1)
 
print(factorial(5))  	# 输出: 120

6. 闭包函数(函数内定义的函数)

闭包(Closure)是指一个函数内部定义的函数,这个内部函数可以引用外部函数的变量。闭包不仅可以捕获这些变量,还可以在外部函数返回后继续使用它们。闭包常用于需要封装一些状态或行为的场景中。
闭包由以下三个部分构成:
外部函数: 包含内嵌函数的函数。
内嵌函数: 定义在外部函数内部并且引用外部函数的变量。
自由变量: 内嵌函数引用的、定义在外部函数中的变量。
一个函数可以返回另一个函数,返回的函数可以访问到外部函数的变量。
通过闭包实现一个简单的计数器:

def make_counter():		# 外部函数
    count = 0			# 自由变量
    def counter():		# 内嵌函数
        nonlocal count
        count += 1
        return count
    return counter
 
# 创建计数器实例
counter1 = make_counter()
print(counter1())  	# 输出: 1
print(counter1())  	# 输出: 2
 
counter2 = make_counter()
print(counter2())  	# 输出: 1

counter 是一个闭包,它保存了 make_counter 中的 count 变量,并且通过 nonlocal 关键字可以修改这个变量。
内部工作机制
创建闭包: 当 make_counter 函数被调用时,count 变量和 counter 函数被创建。counter 函数形成一个闭包,捕获 count 变量的引用。
返回闭包: make_counter 函数执行完毕,但 counter 函数和 count 变量仍然存在,因为 counter 函数持有对 count 的引用。
修改和访问状态: 每次调用 counter1 时,都会访问和修改 count 变量,从而实现了一个持续的状态。

7. 装饰器函数

装饰器函数(Decorator functions)在 Python 中是一种强大的工具,用于修改或扩展函数或类的功能。它们允许在不改变原始函数或类代码的情况下,通过添加额外的功能来改变它们的行为。通常情况下,装饰器是一个函数,它接受一个函数作为输入,并返回一个新的函数作为输出。
用于修改或增强其他函数功能的函数。

# 假设我们有一个函数 add_numbers,它用于计算两个数字的和。
# 我们希望在调用这个函数之前,检查传入的参数是否都是数字。如果不是,我们希望提示用户参数无效。
# 可以使用装饰器来实现这个功能:
 
def validate_numbers(func):
    def wrapper(*args, **kwargs):
        # 检查所有参数是否都是数字
        if all(isinstance(arg, (int, float)) for arg in args):
            return func(*args, **kwargs)
        else:
            print("参数无效,必须是数字。")
    return wrapper
 
@validate_numbers
def add_numbers(a, b):
    return a + b
 
# 测试函数
print(add_numbers(10, 20))  	# 输出: 30
print(add_numbers(10, '20'))  	# 输出: 参数无效,必须是数字。

装饰器函数可以用于很多场景,比如缓存、日志记录、权限验证等,它们使得代码更加模块化和易于维护。

8. 方法

方法是属于对象的函数,也就是定义在类内部的函数。方法在调用时会隐式地接收一个对象实例作为第一个参数(通常是 self)。方法可以访问对象的属性和其他方法,并对对象的状态进行修改。
在类中定义的函数。包括实例方法、类方法和静态方法。

8.1. 实例方法

需要一个类的实例来调用的方法。

class MyClass:
    def instance_method(self):
        return "This is an instance method"
 
obj = MyClass()
print(obj.instance_method())  	# 输出: This is an instance method

8.2. 类方法

使用 @classmethod 装饰器定义的方法,第一个参数是类本身。

class MyClass:
    @classmethod
    def class_method(cls):
        return "This is a class method"

print(MyClass.class_method())  	# 输出: This is a class method

8.3. 静态方法

使用 @staticmethod 装饰器定义的方法,不依赖于类或实例。

class MyClass:
    @staticmethod
    def static_method():
        return "This is a static method"
 
print(MyClass.static_method())  # 输出: This is a static method

参考:
https://blog.csdn.net/Lzcsfg/article/details/140720452

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

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

相关文章

AJ-Report:一款开源且非常强大的数据可视化大屏和报表工具

嗨,大家好,我是小华同学,关注我们获得“最新、最全、最优质”开源项目和工作学习方法 AJ-Report是一个基于Java的开源报表工具,它集成了ECharts、Ant Design Vue等前端技术,致力于为企业提供一站式的数据可视化解决方案…

【深度学习】InstantIR:图片高清化修复

InstantIR——借助即时生成参考的盲图像修复新方法 作者:Jen-Yuan Huang 等 近年来,随着深度学习和计算机视觉技术的飞速发展,图像修复技术取得了令人瞩目的进步。然而,对于未知或复杂退化的图像进行修复,仍然是一个充满挑战的任务。针对这一难题,研究者们提出了 Insta…

MySQL utf8mb3 和 utf8mb4引发的问题

问题描述 Cause: java.sql.SQLException: Incorrect string value: \xF4\x8F\xBB\xBF-b... for column sddd_aaa_ark at row 1 sddd_aaa_ark 存储中文字符时,出现上述问题 原因分析 sddd_aaa_ark在数据库中结构是 utf8字符的最大字节数是3 byte,但是某些…

日语学习的难易程度

日语学习的难易程度是一个相对主观的问题,它受到多种因素的影响,包括个人的语言学习能力、学习方法、学习时间、学习资源的可获得性以及个人对日语文化的兴趣和投入程度等。以下是对日语学习难易程度的一些分析: 优点与易学之处 文字系统&am…

Win10 连接到 Ubuntu 黑屏无法连接 使用Rustdesk显示 No Displays 没有显示器

Win10 连接到 Ubuntu 黑屏无法连接 使用Rustdesk显示 No Displays 没有显示器 解决办法安装虚拟显示器 安装xorg虚拟显示器 $ sudo apt install xserver-xorg-video-dummy # 提示错误依赖使用下面这个试试 $ sudo apt-get install xserver-xorg-video-dummy --fix-missing配…

Ubuntu安装Python并配置pip阿里镜像教程 - 幽络源

背景 因为要部署yolov8项目到ubuntu系统,但是yolov8要求python版本必须大于3.10,因此ubuntu20.04自带的python3.8不可用,需自行安装python,本教程使用python源码编译式安装python3.12.3,原因是apt下载python无法指定目…

uniapp组件实现省市区三级联动选择

1.导入插件 先将uni-data-picker组件导入我们的HBuilder项目中&#xff0c;在DCloud插件市场搜索uni-data-picker 点击下载插件并导入到我们的项目中 2.组件调用 curLocation &#xff1a;获取到的当前位置&#xff08;省市区&#xff09; <uni-data-picker v-slot:defa…

力扣:94--中序遍历二叉树

树 – 二叉树 完全二叉树&#xff1a; 完全二叉树可以用数组完美匹配位置&#xff08;先序存储&#xff1a;根左右&#xff09;&#xff0c; 推论一 &#xff1a; 位置为k的节点&#xff0c;左孩子&#xff1a;2*k 1 &#xff0c;右孩子 &#xff1a; 2 * &#xff08;k 1&…

「C/C++」C/C++STL篇 之 数组赋值给std::vector多种方法

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「C/C」C/C程序设计&#x1f4da;全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasoli…

关于 Qt+Osg中使用背景图HUD受到后绘制几何图形顶点颜色影响 的解决方法

若该文为原创文章&#xff0c;转载请注明出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/143607816 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、Op…

使用python向钉钉群聊发送消息

使用python向钉钉群聊发送消息 一、在钉钉群中新建机器人二、使用代码发送消息 一、在钉钉群中新建机器人 在群设置中添加机器人 选择自定义 勾选对应的安全设置 完成后会展示webhook&#xff0c;将地址复制出来&#xff0c;并记录&#xff0c;后面会用到 二、使用代码发送消…

第100+31步 ChatGPT学习:概率校准 Quantile Calibration

基于Python 3.9版本演示 一、写在前面 最近看了一篇在Lancet子刊《eClinicalMedicine》上发表的机器学习分类的文章&#xff1a;《Development of a novel dementia risk prediction model in the general population: A large, longitudinal, population-based machine-learn…

这款神器,运维绝杀 !!!

项目简介 CrowdSec 是一款开源的、基于社区协作的网络安全防护工具&#xff0c;它通过分析和共享IP信誉数据来对抗恶意行为。该软件不仅支持IPv6&#xff0c;而且相较于传统的Python实现&#xff0c;其采用Go语言编写&#xff0c;运行速度提升了60倍。CrowdSec 利用Grok模式解析…

Unreal5从入门到精通之如何在指定的显示器上运行UE程序

前言 我们有一个设备,是一个带双显示器的机柜,主显示器是一个小竖屏,可以触屏操作,大显示器是一个普通的横屏显示器。我们用这个机柜的原因就是可以摆脱鼠标和键盘,直接使用触屏操作,又可以在大屏观看,非常适合用于教学。 然后我们为这款机柜做了很多个VR项目,包括Uni…

R7:糖尿病预测模型优化探索

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 一、实验目的&#xff1a; 探索本案例是否还有进一步优化的空间 二、实验环境&#xff1a; 语言环境&#xff1a;python 3.8编译器&#xff1a;Jupyter notebo…

Django 框架:全方位技术分析

Django 框架:全方位技术分析 介绍 Django 是一个高级 Python Web 框架,鼓励快速开发和遵循设计的最佳实践。由经验丰富的开发人员打造,开源并可扩展,Django 旨在让构建 Web 应用更快、更轻松。 历史背景 Django 始于 2003 年,最初是 Lawrence Journal-World 报社的一个内…

如何用 ChatPaper.ai 打造完美的 AI 课堂笔记系统

作为学生&#xff0c;我们都遇到过这样的困扰&#xff1a;上课时记笔记太投入就听不进讲解&#xff0c;专注听讲又担心错过重要知识点。有了AI助手&#xff0c;这个问题就可以优雅地解决了。今天跟大家分享如何用ChatPaper.ai构建个人的智能课堂笔记系统。 为什么需要AI辅助记笔…

《手写Spring渐进式源码实践》实践笔记(第十六章 三级缓存解决循环依赖)

文章目录 第十六章 通过三级缓存解决循环依赖背景技术背景Spring循环依赖循环依赖类型三级缓存解决循环依赖 业务背景 目标设计一级缓存实现方案设计思路代码实现测试结果 三级缓存实现方案 实现代码结构类图实现步骤 测试事先准备属性配置文件测试用例测试结果&#xff1a; 总…

Java8新特性/java

1.lambda表达式 区别于js的箭头函数&#xff0c;python、cpp的lambda表达式&#xff0c;java8的lambda是一个匿名函数&#xff0c;java8运行把函数作为参数传递进方法中。 语法格式 (parameters) -> expression 或 (parameters...) ->{ statements; }实战 替代匿名内部类…

ubuntu双屏只显示一个屏幕另一个黑屏

简洁的结论&#xff1a; 系统环境 ubuntu22.04 nvidia-535解决方案 删除/etc/X11/xorg.conf 文件 记录一下折腾大半天的问题。 ubuntu系统是22.04,之前使用的时候更新驱动导致桌面崩溃&#xff0c;重新安装桌面安装不上&#xff0c;请IT帮忙&#xff0c;IT一番操作过后也表示…