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

news2024/11/16 13:03:51

目录

    • 专栏列表
    • 前言
    • 函数定义
      • 参数
      • 返回值
    • 示例
    • 函数类型
      • 普通函数
      • 空函数
      • 匿名函数(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_function

print(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 * 2

print(double(5))  # 输出: 20

函数参数

位置参数

必须按顺序传递。

def add(a, b):
    return a + b

print(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():
    pass

print(my_function.__name__)  # 输出: my_function

__doc__

函数的文档字符串。

def my_function():
    """这是一个示例函数"""
    pass

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

func.__dict__

函数的属性字典。

def my_function():
    pass

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

func.__defaults__

函数的默认参数值。

def my_function(a, b=10):
    pass

print(my_function.__defaults__)  # 输出: (10,)

func.__annotations__

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

def my_function(a: int, b: str) -> bool:
    pass

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

函数的作用域

全局作用域

在函数外部定义的变量。

x = 10

def my_function():
    print(x)

my_function()  # 输出: 10

局部作用域

在函数内部定义的变量。

def my_function():
    y = 20
    print(y)

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

闭包

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

def outer_function(x):
    def inner_function():
        return x * 2
    return inner_function

double = outer_function(10)
print(double())  # 输出: 20

总结

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

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

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

相关文章

如何为 5G 小型基站部署选择振荡器

5G 网络频谱频率更高、覆盖范围更短&#xff0c;因此比前几代网络密度更高。超高速 5G 回程 (mmWave) 在很大程度上依赖于小型基站&#xff0c;不仅是为了覆盖范围&#xff0c;也是为了速度。除此之外&#xff0c;O-RAN 联盟等举措为 RAN 生态系统提供了更多选择&#xff0c;但…

html+css 实现多选按钮动画(input checkbox按钮)

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享htmlcss 绚丽效果&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 文…

Vue3(二):computed、watch、生命周期、hooks

一、computed计算属性 <template><div class"person"> <!-- <input type"text" v-model"{{ firstName }}"> <input type"text" v-model"{{ lastName }}"> --><h1>一个人的信息</h1…

爬虫-通过几个例子来说明并发以及多线程

并发 什么是并发&#xff1f;并发&#xff0c;在操作系统中&#xff0c;是指一个时间段中有几个程序都处于已启动运行到运行完毕之间&#xff0c;且这几个程序都是在同一个处理机上运行&#xff0c;但任一个时刻点上只有一个程序在处理机上运行。 嗯&#xff0c;字认识&#…

vulntarget-b

实际部署之后centos7 的ip有所变动分别是 :192.168.127.130以及10.0.20.30 Centos7 老规矩还是先用fscan扫一下服务和端口&#xff0c;找漏洞打 直接爆出来一个SSH弱口令…&#xff0c;上来就不用打了&#xff0c;什么意思&#xff1f;&#xff1f;&#xff1f; 直接xshell…

快递员送包裹与一致性哈希的关系

一致性哈希&#xff08;Consistent Hashing&#xff09;是一种用于分布式系统中数据分布和负载均衡的哈希技术。它通过减少数据迁移、支持动态扩展和高容错等特点&#xff0c;在分布式缓存、存储、负载均衡等系统中有广泛应用。以下是对一致性哈希的详细介绍&#xff1a; 一致…

跨境电商平台评论管理:如何避免评论被删及提高留评率

在跨境电商领域&#xff0c;评论对于产品的销售和品牌形象至关重要。然而&#xff0c;卖家常常面临评论被删除的问题&#xff0c;这不仅影响了产品的曝光和销售&#xff0c;还可能对店铺声誉造成损害。本文将探讨亚马逊、Ozon、速卖通、Lazada等跨境电商平台评论被删除的原因&a…

财务分析,奥威BI行计算助力财务解放报表工作

【财务分析&#xff0c;奥威BI行计算助力财务解放报表工作】 在企业的财务管理体系中&#xff0c;财务报表的编制与分析是至关重要的一环。然而&#xff0c;传统的手工编制报表方式不仅耗时耗力&#xff0c;还难以应对日益复杂多变的财务数据需求。奥威BI&#xff08;Business…

2024最火的知识付费系统小程序+PC+H5三端数据互通支持采集资源开源版

内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 三、学习资料下载 一、详细介绍 系统含带 裂变模式 可以助力好友来获取资源共享 分站功能 独立后台 会员功能 卡密功能 二级分销功能等 自行研究看 后期有更新新版会在持续发布 目前版本是3.5 是我花三天时间修复的 …

数据开发/数仓工程师上手指南(三)数仓构建流程

前言 此系列的上篇文章通过拆解电商业务数仓系统&#xff0c;通过数仓分层概念对整个业务进行拆解分层&#xff0c;那么本章节将沿着上一篇的数仓概念分层切割电商业务&#xff0c;去具体构建电商业务的数据仓库&#xff0c;我们将按照行业认可标准的流程去构建较为完整的数据…

【C++的剃刀】我不允许你还不会AVL树

​ 学习编程就得循环渐进&#xff0c;扎实基础&#xff0c;勿在浮沙筑高台 循环渐进Forward-CSDN博客 Hello,这里是kiki&#xff0c;今天继续更新C部分&#xff0c;我们继续来扩充我们的知识面&#xff0c;我希望能努力把抽象繁多的知识讲的生动又通俗易懂&#xff0c;今天要…

springboot电影院线上购票系统-计算机毕业设计源码68220

目录 摘要 1 绪论 1.1 选题背景与意义 1.2国内外研究现状 1.3论文结构与章节安排 2系统分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 法律可行性分析 2.2 系统流程分析 2.2.1 添加信息流程 2.2.2 修改信息流程 2.2.3 删除信息流程 2.3 系统功能分析 2.…

暑期审稿慢,第三轮审稿人拒绝复审,怎么办?

我是娜姐 迪娜学姐 &#xff0c;一个SCI医学期刊编辑&#xff0c;探索用AI工具提效论文写作和发表。 暑期到了&#xff0c;国内的审稿人又慢了。近期不少学员问我&#xff1a;“娜姐&#xff0c;审稿一直没动静&#xff0c;可以催吗&#xff1f;真是着急啊 &#xff01;” …

如何在 VitePress 中自定义logo,打造精美首页 #home-hero-image

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storm…

C语言 | Leetcode C语言题解之第282题给表达式添加运算符

题目&#xff1a; 题解&#xff1a; #define MAX_COUNT 10000 // 解的个数足够大 #define NUM_COUNT 100 // 操作数的个数足够大 long long num[NUM_COUNT] {0};long long calc(char *a) { // 计算表达式a的值// 将数字和符号&#xff0c;入栈memset(num, 0, sizeof(num));in…

差分法求解 Burgers 方程(附完整MATLAB 及 Python代码)

Burgers 方程的数值解及误差分析 引言 Burgers 方程是一个非线性偏微分方程&#xff0c;在流体力学、非线性声学和交通流理论中有广泛应用。本文将通过数值方法求解带粘性的 Burgers 方程&#xff0c;并分析其误差。 方程模型 Burgers 方程的形式为&#xff1a; u t u u …

在react中如何计算本地存储体积

1.定义useLocalStorageSize钩子函数 // 计算localStorage大小 function useLocalStorageSize() {const [size, setSize] useState(0);useEffect(() > {const calculateSize () > {let totalSize 0;for (let key in localStorage) {//过滤掉继承自原型链的属性if (loc…

Profinet转EtherNet/IP协议转化网关(功能与配置)

怎么样把Profinet和EtherNet/IP两个协议连接起来?有很多朋友想要了解这个问题&#xff0c;那么作者在这里统一说明一下。其实有一个不错的设备产品可以很轻易地解决这个问题&#xff0c;名为JM-PN-EIP。接下来作者就从该设备的功能及配置详细说明一下。 一&#xff0c;设备主…

力扣高频SQL 50题(基础版)第二十二题

文章目录 力扣高频SQL 50题&#xff08;基础版&#xff09;第二十二题1084 销售分析题目说明思路分析实现过程准备数据实现方式结果截图 力扣高频SQL 50题&#xff08;基础版&#xff09;第二十二题 1084 销售分析 题目说明 表&#xff1a; Product --------------------- …

Scraperr能从网页中抓取数据

什么是 Scraperr &#xff1f; Scraperr 是一个自托管的 Web 应用程序&#xff0c;允许用户通过 XPath 指定元素从网页中抓取数据。用户可以提交要抓取的 URL 和相应元素&#xff0c;结果将显示在表格中。用户可以下载作业结果的 Excel 表&#xff0c;以及重新运行该作业的选项…