Python 教程(六):函数式编程

目录

    • 专栏列表
    • 前言
    • 函数定义
      • 参数
      • 返回值
    • 示例
    • 函数类型
      • 普通函数
      • 空函数
      • 匿名函数(Lambda 函数)
      • 嵌套函数
      • 函数装饰器
      • 高阶函数
    • 函数参数
      • 位置参数
      • 默认参数
      • 可变位置参数
      • 可变关键字参数
    • 函数属性和方法
      • `__name__`
      • `__doc__`
      • `func.__dict__`
      • `func.__defaults__`
      • `func.__annotations__`
    • 函数的作用域
      • 全局作用域
      • 局部作用域
    • 闭包
    • 总结

在前四篇教程中,我们学习了 Python 的基本语法和数据结构以及代码中条件语句和循环结构。本篇教程,我们将深入探讨 Python 中的函数式编程。通过本教程,我们学习了函数的定义、参数、返回值、类型、属性和方法、作用域以及闭包等概念

专栏列表

  • Python教程(一):环境搭建及PyCharm安装
  • Python 教程(二):语法与数据结构
  • Python 教程(三):字符串特性大全
  • Python 教程(四):Python运算符合集
  • Python 教程(五):理解条件语句和循环结构
  • Python 教程(六):函数式编程

在这里插入图片描述

正文开始如果觉得文章对您有帮助,请帮我三连+订阅,谢谢💖💖💖


前言

Python 中的函数是编程中非常基础且强大的概念。函数允许你封装一段代码,使其可以在程序中多次调用,从而提高代码的可重用性和清晰度。

函数就如同数学中的函数,一个函数是做一件事情的工具,它有封装性、重用性等特性,如同y=sin(x) 这个sin就是数学中定义的函数,我们学习后不用知道内部实现,直接拿来用就行

python中的注释,写备注,方便阅读,机器会直接忽略

  • #: 单行注释
  • ''': 多行注释

函数定义

在 Python 中,使用 def 关键字来定义函数, 依次写出函数名、括号、括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用return语句返回。

def function_name(parameters):"""函数的文档字符串,描述函数的功能"""# 函数体return value

参数

  • 位置参数:必须按顺序传递的参数。
  • 默认参数:有默认值的参数,调用时可以省略。
  • 可变参数:允许传递任意数量的位置参数。
  • 关键字参数:允许传递任意数量的关键字参数。

返回值

函数可以通过 return 语句返回一个值,如果没有 return 语句,默认返回 None

示例

def greet(name, message="Hello"): # message 是有默认值的"""打印问候语"""return f"{message}, {name}!"print(greet("Alice"))  # 输出: Hello, Alice!
print(greet("Bob", "Good morning"))  # 输出: Good morning, Bob!

函数类型

普通函数

普通的函数定义如上所示。

空函数

如果想定义一个什么事也不做的空函数,可以用pass语句:

def nop():pass

匿名函数(Lambda 函数)

使用 lambda 关键字定义的小型函数。

add = lambda x, y: x + y
print(add(5, 3))  # 输出: 8

嵌套函数

在一个函数内部定义的函数。

def outer_function(text):def inner_function():return text.upper()return inner_functionprint(outer_function("hello")())  # 输出: HELLO

函数装饰器

在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator)。借助 Python 的@语法,把 decorator置于函数的定义处

示例:

我们接下来要做一件事,调用 hello 函数的同时,记录日志,一般做法:我们定义 log 和 hello 函数,然后依次调用它们

常规用法:

def log():print('日记记录。。。')def hello(world):print('hello' + world)def exec():log()hello('world')exec()

装饰器改造


def log(fn): # 接受装饰的函数def wrapper(world): # 接受参数,函数名自定义print('日记记录。。。')return fn(world) # 调用log装饰的fn函数return wrapper@log   # == log(hello)
def hello(world):print('hello' + world)hello('world!!')

在这里插入图片描述

高阶函数

可以接受其他函数作为参数或者返回一个函数的函数。

def make_twice(func):def wrapper(x):return func(func(x))return wrapper@make_twice
def double(x):return x * 2print(double(5))  # 输出: 20

函数参数

位置参数

必须按顺序传递。

def add(a, b):return a + bprint(add(3, 4))  # 输出: 7

默认参数

可以提供默认值。

def greet(name, message="Hello"):return f"{message}, {name}!"print(greet("Alice"))  # 输出: Hello, Alice!
print(greet("Bob", "Good morning"))  # 输出: Good morning, Bob!

可变位置参数

使用 * 收集任意数量的位置参数。

def add(*args):return sum(args)print(add(1, 2, 3, 4))  # 输出: 10

可变关键字参数

使用 ** 收集任意数量的关键字参数。

def print_kwargs(**kwargs):for key, value in kwargs.items():print(f"{key}: {value}")print_kwargs(name="Alice", age=25)  # 输出: name: Alice, age: 25

函数属性和方法

__name__

函数的名称。

def my_function():passprint(my_function.__name__)  # 输出: my_function

__doc__

函数的文档字符串。

def my_function():"""这是一个示例函数"""passprint(my_function.__doc__)  # 输出: 这是一个示例函数

func.__dict__

函数的属性字典。

def my_function():passmy_function.attr = "value"
print(my_function.__dict__)  # 输出: {'attr': 'value'}

func.__defaults__

函数的默认参数值。

def my_function(a, b=10):passprint(my_function.__defaults__)  # 输出: (10,)

func.__annotations__

函数的参数和返回值注解。

def my_function(a: int, b: str) -> bool:passprint(my_function.__annotations__)  # 输出: {'a': <class 'int'>, 'b': <class 'str'>, 'return': <class 'bool'>}

函数的作用域

全局作用域

在函数外部定义的变量。

x = 10def my_function():print(x)my_function()  # 输出: 10

局部作用域

在函数内部定义的变量。

def my_function():y = 20print(y)my_function()  # 输出: 20
print(y)  # NameError: name 'y' is not defined

闭包

闭包是指一个函数记住并访问其外部作用域中的变量。

def outer_function(x):def inner_function():return x * 2return inner_functiondouble = outer_function(10)
print(double())  # 输出: 20

总结

函数是 Python 编程中的核心概念之一。通过本教程,我们学习了函数的定义、参数、返回值、类型、属性和方法、作用域以及闭包等概念。掌握这些知识点将帮助你编写更清晰、更高效的代码。如果你有任何问题或需要进一步的帮助,请随时联系我们。

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

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

相关文章

算法工程师第二十二天(491.递增子序列 46.全排列 47.全排列 II )

参考文献 代码随想录 一、非递减子序列 给你一个整数数组 nums &#xff0c;找出并返回所有该数组中不同的递增子序列&#xff0c;递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。 数组中可能含有重复元素&#xff0c;如出现两个整数相等&#xff0c;也可以视作…

解析大数据分析行业的现状与前景:全球视角下的中国力量

目录 写在开头1、全球大数据分析趋势&#xff1a;引领潮流的先行者2、中国大数据分析现状&#xff1a;后起之秀的强劲崛起3、岗位分类与技能需求&#xff1a;大数据从业者的职业版图3.1. 数据科学家 (Data Scientist)3.2. 数据产品和项目管理岗位3.3. 数据工程师 (Data Enginee…

黑马头条Day11- 实时计算热点文章、KafkaStream

一、今日内容 1. 定时计算与实时计算 2. 今日内容 KafkaStream 什么是流式计算KafkaStream概述KafkaStream入门案例SpringBoot集成KafkaStream 实时计算 用户行为发送消息KafkaStream聚合处理消息更新文章行为数量替换热点文章数据 二、实时流式计算 1. 概念 一般流式计…

4、Python+MySQL+Flask的文件管理系统【附源码,运行简单】

4、PythonMySQLFlask的文件管理系统【附源码&#xff0c;运行简单】 总览 1、《文件管理系统》1.1 方案设计说明书设计目标工具列表 2、详细设计2.1 登录2.2 注册2.3 个人中心界面2.4 文件上传界面2.5 其他功能贴图 3、下载 总览 自己做的项目&#xff0c;禁止转载&#xff0c…

AI学习指南机器学习篇-标签传播算法的参数与调优

AI学习指南机器学习篇-标签传播算法的参数与调优 标签传播算法是一种常用的无监督学习算法&#xff0c;用于发现数据中的聚类结构。在应用标签传播算法时&#xff0c;合理地选择和调整参数可以对算法的效果产生重要影响。本文将介绍标签传播算法中的参数&#xff0c;并解释如何…

UART 通信协议

文章目录 一 简介二 电平标准三 引脚定义四 数据格式五 波特率 一 简介 ​ UART (Universal Asynchronous Receiver/Transmitter)&#xff0c;通用异步收发器&#xff0c;是一种串行、异步、全双工通信协议。 串行&#xff1a;利用一条传输线&#xff0c;将数据一位一位地传送…

【七】Hadoop3.3.4基于ubuntu24的分布式集群安装

文章目录 1. 下载和准备工作1.1 安装包下载1.2 前提条件 2. 安装过程STEP 1: 解压并配置Hadoop选择环境变量添加位置的原则检查环境变量是否生效 STEP 2: 配置Hadoop2.1. 修改core-site.xml2.2. 修改hdfs-site.xml2.3. 修改mapred-site.xml2.4. 修改yarn-site.xml2.5. 修改hado…

C++中的define与const的区别

C中的define与const的区别 对比维度defineconst类型和安全检查字符替换&#xff0c;没有类型安全检查有数据类型&#xff0c;进行类型检查编译器处理预处理阶段展开&#xff0c;不参与类型检查和优化编译阶段处理&#xff0c;保留类型检查和优化特性存储方式直接替换&#xff…

引用的项目“xxxx/tsconfig.node.json”可能不会禁用发出。

vue3 报错&#xff1a; 引用的项目“xxxx/tsconfig.node.json”可能不会禁用发出。 解决&#xff1a; 进入对应的 json 文件&#xff1a; 修改&#xff1a; "noEmit": false 当 noEmit 设置为 false 时&#xff0c;TypeScript 编译器将根据项目配置生成相应的输出文…

基于Java的微博传播分析系统的设计与实现

1 项目介绍 1.1 摘要 本文致力于展示一项创新的微博传播分析系统设计与应用研究&#xff0c;该系统基于Java技术&#xff0c;巧妙利用大数据环境下的社交媒体——微博的庞大用户群及高度活跃特性&#xff0c;旨在深度探索信息传播的内在逻辑与社会影响机制。研究开篇明确定了…

OpenCV 灰度直方图

一 直方图的定义&#xff0c;意义和特征 1 定义 在统计学中&#xff0c;直方图是一种对数据分布情况的图形表示&#xff0c;是一种二维统计图表&#xff0c;他的两个坐标分别是统计样本&#xff08;图像、视频帧&#xff09;和样本的某种属性&#xff08;亮度&#xff0c;像素…

bugku-web-cookies

进来以后看到一个巨长的字符串, 源码同样,发现url后面是base64编码解码得keys.txt 还有一个line参数&#xff0c;修改并没有发生任何变化。我想不到要改keys.txt成index.php&#xff08;base64加密格式&#xff1a;aW5kZXgucGhw&#xff09; line1时&#xff1a; line2时&…

AcWing 802. 区间和

var说明add存储了插入操作&#xff0c;在指定 x x x下标所在位置 a [ x ] c a[x]c a[x]cquery是求 [ L , R ] [L,R] [L,R]区间和用到的数组,最后才用到alls 是存储离散化之后的值 , 对于会访问到的每个下标&#xff0c;统统丢到 a l l s 里面 &#xff0c;会把 x 和 [ L , R …

基于深度学习的复杂策略学习

基于深度学习的复杂策略学习&#xff08;Complex Strategy Learning&#xff09;是通过深度学习技术&#xff0c;特别是强化学习和模仿学习&#xff0c;来开发和优化解决复杂任务的策略。这类技术广泛应用于自动驾驶、游戏AI、机器人控制和金融交易等领域。以下是对这一领域的系…

【Golang 面试 - 基础题】每日 5 题(七)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/UWz06 &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 Golang 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏…

数据结构----算法复杂度

1.数据结构前言 数据是杂乱无章的&#xff0c;我们要借助结构将数据管理起来 1.1 数据结构 数据结构(Data Structure)是计算机存储、组织数据的⽅式&#xff0c;指相互之间存在⼀种或多种特定关系的数 据元素的集合。没有⼀种单⼀的数据结构对所有⽤途都有⽤&#xff0c;所…

设计模式补

适配器模式&#xff08;Adapter Pattern&#xff09; 适配器类继承A目标接口,把B非适配器类当适配器类的参数,用适配器类使用A目标接口的方法 是一种结构型设计模式&#xff0c;它的主要目的是使原本接口不兼容的类可以一起工作。适配器模式通过创建一个适配器类来包装现有类…

查看路由表 netstat -r

“Kernel IP routing table” 是Linux系统中用于展示和配置IP路由的表。它告诉操作系统如何将数据包从一个网络接口发送到另一个网络或主机。下面是对您给出的路由表条目的解释&#xff1a; Destination&#xff1a;目的地地址&#xff0c;可以是具体的IP地址&#xff0c;也可…

C#:通用方法总结—第8集

大家好&#xff0c;今天继续讲解我们的通用方法系列。 下面是今天分享的通用方法&#xff1a; &#xff08;1&#xff09;这个通用方法为Ug删除参数构建器方法&#xff1a; public static int RemoveParameters(int id)//删除参数构建器 { UFSession.GetUFSession().Undo.Se…

Android 一个简单线程更新UI

new Thread(new Runnable() {Overridepublic void run() {//执行的业务runOnUiThread(new Runnable() {Overridepublic void run() {//更新UI//Loading("信息处理中");}});} }).start();