六、Python —— 函数

server/2024/12/2 10:14:25/

文章目录

  • 一、函数基础
    • 1.1、编写函数
    • 1.2、调用函数
    • 1.3、形参和实参
      • 1.3.1、形参的初始化方式
      • 1.3.2、带默认值的形参
    • 1.4、变量的作用域
    • 1.5、嵌套定义函数
    • 1.6、pass 语句
  • 二、参数传递
    • 2.1、值传递
    • 2.2、引用传递
  • 三、return 语句
  • 四、lambda 表达式
  • 五、函数递归


一、函数基础

 Python 中一个典型的函数定义包括以下部分:

  • 关键字 def
  • 函数名称
  • 由 0 个或多个形参组成的列表
  • 函数体

1.1、编写函数

 一个求阶的函数:

python">def fact(n):res = 1for i in range(1, n + 1):res *= ireturn res

1.2、调用函数

函数的调用完成两项工作:

  1. 用实参初始化函数对应的形参
  2. 将控制权转移给被调用的函数
python">print("我们要计算5的阶乘,答案是:")
print(fact(5))  # 输出 120
print("计算结束啦!")

1.3、形参和实参

实参 指调用函数时传入的变量或常量,形参 指定义函数时参数列表里的变量,形参列表可以为空。

1.3.1、形参的初始化方式

 调用函数时会 用实参去初始化形参,初始化的 顺序 有两种:

  • 第一种是 用位置实参 来初始化形参。顾名思义,实参会按位置关系来初始化形参,第一个实参初始化第一个形参,第二个实参初始化第二个形参,依此类推。形参和实参的个数必须匹配。例如:
python">def f(a, b, c, d):print("a =", a, end=", ")print("b =", b, end=", ")print("c =", c, end=", ")print("d =", d)f(1, True, "Python", 4.2)  # 输出 a = 1, b = True, c = Python, d = 4.2
f(1, True, "Python", 4.2, 3)  # 会报错,因为实参个数多于形参
f(1, True, "Python")  # 会报错,因为实参个数少于形参
  • 第二种是 用关键字实参 来初始化形参。此时实参不再按位置关系来初始化形参,而是按变量名初始化。例如:
python">def f(a, b, c, d):print("a =", a, end=", ")print("b =", b, end=", ")print("c =", c, end=", ")print("d =", d)f(b=1, c=True, a="Python", d=4.2)  # 输出 a = Python, b = 1, c = True, d = 4.2
  • 两种方式也可以 混合使用,但是 位置实参一定要放到关键字实参 之前。也就是说,位置实参只能初始化前若干个实参。例如:
python">def f(a, b, c, d):print("a =", a, end=", ")print("b =", b, end=", ")print("c =", c, end=", ")print("d =", d)f(1, 2, d="Python", c=4.2)  # 输出 a = 1, b = 2, c = 4.2, d = Python
f(1, b=3, "Python", d=4.2)  # 会报错,因为位置实参位于关键字实参后面了。

1.3.2、带默认值的形参

 形参也可以 设置默认值,但所有带默认值的形参必须是 最后几个。当某些形参没有被初始化时,这些形参会使用默认值。例如:

python">def f(a, b, c=3, d="Python"):print("a =", a, end=", ")print("b =", b, end=", ")print("c =", c, end=", ")print("d =", d)f(1, 2)  # c和d没有被初始化,采用默认值。输出 a = 1, b = 2, c = 3, d = Python
f(1, b=2, d="AcWing")  # c没有被初始化,采用默认值。输出 a = 1, b = 2, c = 3, d = AcWing

可以看到,位置实参和关键字实参中间是可以省略实参的,这种情况就取默认值

1.4、变量的作用域

函数内 定义的变量为 局部变量,只能在函数内部使用。

 当需要修改用 全局变量 时,需要用 global 关键字在函数内声明全局变量。例如:

python">x = 1def f():global x  # 在函数内声明全局变量x = 666y = 777print(x, y)f()  # 输出 666 777
print(x)  # 会发现全局变量x也被修改了
print(y)  # 会报错,因为y是局部变量,函数外无法使用

1.5、嵌套定义函数

 函数内部也可以定义函数。函数内部定义的函数,作用域为外层函数。例如:

python">def f():def g(x):  # 定义函数g()x += 1print(x)g(5)  # 调用函数g()f()  # 输出6

1.6、pass 语句

 当函数定义完但还不想实现时,可以用 pass 占位符,来避免出现语法错误。例如:

python">def f():pass

二、参数传递

2.1、值传递

intfloatboolstr 等采用 值传递值传递 指的是 实参 传递给 形参 的是 数值,而不是 变量空间
 将 实参的 初始值 拷贝给 形参。此时,对形参的改动 不会影响 实参的初始值。例如:

python">def f(y):y = 5print(y)x = 10
f(x)
print(x)  # 会发现x的值没变

2.2、引用传递

列表 采用的就是 引用传递引用传递 指的是 实参 将自己的 变量空间 传递给了 形参
 将 实参的 引用 传给 形参,此时 对形参的修改 会影响 实参的初始值。例如:

python">def f(b):for i in range(len(b)):b[i] += 1a = [0, 1, 2, 3, 4]
f(a)
print(a)  # 会发现列表a中的每个数加了1

三、return 语句

return 语句终止当前正在执行的函数并将控制权返回到调用该函数的地方,并返回结果。例如:

python">def f(x):if x == 1:return  # 不写返回值时,会返回 Noneif x == 2:return 3  # 返回一个变量if x == 3:return 4, 5  # 返回多个变量a = f(1)
b = f(2)
c, d = f(3)
e = f(4)  # 没写return时,也会返回None
print(a, b, c, d, e)  # 输出 None 3 4 5 None

四、lambda 表达式

lambda 关键字可以创建 匿名函数,目的是为了简化代码。lambda 函数的语法格式如下。其中,arguments 指的是 参数expression 指的是 函数的返回值 (不用写 return)

python">lambda arguments: expression

 有些函数可能会 用函数作为参数 (因为函数和变量实际上是一样的),这种情况的 第一种处理方法 就是,先将函数定义出来,然后将函数传进去。例如:

python">def foo(a, b, g):g()return a + bdef f():print("I'm called!")s = foo(3, 4, f)

 上面第一种处理方法意味着需要占用一个函数名。如果不想占用一个函数名,则可以使用 匿名函数 (lambda),例如:

python">def foo(a, b, g):g()return a + bs = foo(3, 4, lambda: print("I'm called!"))

 匿名函数也可以 传入参数,例如:

python">def foo(a, b, g):g(1, 2)return a + bs = foo(3, 4, lambda x, y: print("I'm called %d %d!" % (x, y)))
print("s = ", s)
"""output
I'm called 1 2!
s =  7"""

 常与 sort() 函数配合使用,sort() 默认 先根据第一个元素进行比较,再根据第二个元素进行比较,如果希望先根据第二个元素进行比较,且不用 lambda,则需要这样写:

python">pairs = [[1, "one"], [2, "two"], [3, "three"], [4, "four"]]def compare(pair):return pair[1]pairs.sort(key=compare)  # 每个元素使用第二个变量比较大小
print(pairs)  # 输出:[[4, 'four'], [1, 'one'], [3, 'three'], [2, 'two']]

 我们可以用 lambda 替换 compare 函数:

python">pairs = [[1, "one"], [2, "two"], [3, "three"], [4, "four"]]pairs.sort(key=lambda pair: pair[1])  # 每个元素使用第二个变量比较大小
print(pairs)  # 输出:[[4, 'four'], [1, 'one'], [3, 'three'], [2, 'two']]

注意,lambda 不能写 return,直接将返回值写在里面就自动视为 return


五、函数递归

 在一个函数内部,也可以调用函数自身。这种写法被称为 递归
 写递归函数可以从 集合 的角度来思考。理解递归函数的执行顺序可以用 的形式来思考。
 例如,求解斐波那契数列第 𝑛 项可以采用如下写法:

python">def fib(n):if n <= 2:return 1return fib(n - 1) + fib(n - 2)print(fib(6))  # 输出 8

http://www.ppmy.cn/server/146682.html

相关文章

Linux下如何安装JDK

在Linux系统上安装JDK&#xff08;Java Development Kit&#xff09;&#xff0c;通常包括下面步骤&#xff1a; 下载JDK安装包解压安装包配置环境变量等 在介绍安装之前&#xff0c;先厘清一些常用问题。 Linux 下Java 安装到哪个目录比较好&#xff1f; 在Linux系统下&am…

Burp入门(3)-爬虫功能介绍

声明&#xff1a;学习视频来自b站up主 泷羽sec&#xff0c;如涉及侵权马上删除文章 感谢泷羽sec 团队的教学 视频地址&#xff1a;burp功能介绍&#xff08;1&#xff09;_哔哩哔哩_bilibili 本文介绍burp的主动爬虫和被动爬虫功能。 一、主动爬虫 工作原理&#xff1a; 主动…

List集合的进一步学习:性能优化

|| 持续分享系列教程&#xff0c;关注一下不迷路 || || B站视频教程&#xff1a;墨轩大楼 || || 知识星球&#xff1a;墨轩编程自习室 || 在Java集合框架中&#xff0c;选择合适的集合类型和使用正确的操作…

聊聊Flink:这次把Flink的触发器(Trigger)、移除器(Evictor)讲透

一、触发器(Trigger) Trigger 决定了一个窗口&#xff08;由 window assigner 定义&#xff09;何时可以被 window function 处理。 每个 WindowAssigner 都有一个默认的 Trigger。 如果默认 trigger 无法满足你的需要&#xff0c;你可以在 trigger(…) 调用中指定自定义的 tr…

基于卷积网络结构的火灾检测系统实现

1.摘要 本文实现了实现了一个完整的火灾检测工作流&#xff0c;从数据预处理、模型训练到最终的推理和报警功能。首先基于卷积神经网络&#xff08;CNN&#xff09;模型&#xff0c;设计实现了一个可分离卷积&#xff08;SeparableConv2D&#xff09;和残差连接的卷积神经网络模…

【Git】Git 完全指南:从入门到精通

Git 完全指南&#xff1a;从入门到精通 Git 是现代软件开发中最重要的版本控制工具之一&#xff0c;它帮助开发者高效地管理项目&#xff0c;支持分布式协作和版本控制。无论是个人项目还是团队开发&#xff0c;Git 都能提供强大的功能来跟踪、管理代码变更&#xff0c;并保障…

封闭解(Closed-Form Solution)与复杂数值优化(Complex Numerical Optimization)的比较:中英双语

中文版 什么是封闭解&#xff1f; 在数学和统计学中&#xff0c;封闭解&#xff08;Closed-Form Solution&#xff09; 是指通过有限次基本运算&#xff08;如加减乘除、开方、对数、指数运算等&#xff09;即可明确表达的解。这意味着&#xff0c;当我们遇到一个数学问题或模…

[免费]SpringBoot+Vue景区订票(购票)系统【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的SpringBootVue大景区订票(购票)系统&#xff0c;分享下哈。 项目视频演示 【免费】SpringBootVue景区订票(购票)系统 Java毕业设计_哔哩哔哩_bilibili 项目介绍 现代经济快节奏发展以及不断完善升级的信息…