4、python中函数、匿名函数、递归函数

news2025/7/12 15:01:40

文章目录

  • 函数的创建和调用
  • 空函数
  • 变量的作用域
    • 全局变量
    • 局部变量
    • 函数内部修改全局变量
  • 函数参数传递
    • 参数检查
    • 常见的4类形参
      • 必选参数
      • 默认参数
      • 可变参数--*args接收的是一个元组
      • 关键字参数--**kwargs接收的是一个字典
  • 匿名函数
    • 练习题,将整型数组的0移动到末尾
  • 递归函数
    • 求n的阶乘
    • 求斐波那契数列

如果在编写程序时,需要某块代码多次,但是为了提高编写的效率以及代码的重用,所以将具有独立功能的代码块组织为一个小模块,这就是函数。

函数的创建和调用

  • 形参就是定义函数时的参数
  • 实参就是调用函数时的参数
#如何定义一个函数
#定义函数,如果不调用函数,那么函数的内容不会执行
def get_max(num1,num2):
    result = num1 if num1>num2 else num2
    return result
# 调用函数
max_num=get_max(89,20)
print(max_num)

空函数

如果要定义一个函数,但是还没想好怎么些函数的代码,就可以先放一个pass语句,让代码运行起来。

  • pass只是一个占位符,不做任何操作
def login(username: str, password: str):
    pass

变量的作用域

  • 可变数值类型:列表、字典、集合
  • 不可变数据类型:数值型、字符串、元组

全局变量

全局变量是全局生效的变量【函数外部定义的变量,在任何地方都能访问到】

def login():
    print(name)

name = "root"  #全局变量
login()

在这里插入图片描述

局部变量

局部变量只能局部生效的变量 【函数内部定义的变量,只能在函数内部访问】

def login():
    name = "root"  #局部变量
    print(name)
login()

不同的函数,可以定义相同名字的局部变量,而且各个函数里的局部变量互不影响

def savemoney(money):
    allmoney = 100
    print("存钱前:", allmoney)
    allmoney += money
    print("存钱后:", allmoney)

def viewmoney():
    allmoney = 500
    print("查询金额:", allmoney)

savemoney(50)
viewmoney()

在这里插入图片描述

函数内部修改全局变量

  • 如果要在函数内修改全局变量,不能直接修改,需要先使用global关键字声明修改的变量是全局变量
  • 如果全局变量是可变数据类型,那么在函数内部对该变量修改就不用global关键字声明
  • 如果全局变量是不可变数据类型,那么在函数内部对该变量修改就需要global关键字声明
def fun():
    global money
    money += 1
    print(money)
    li.append('user2')
    print(li)

money = 100  # 全局变量,不可变数据类型
li=['user1'] #全局变量,可变数据类型
fun()

在这里插入图片描述

函数参数传递

参数检查

isinstance(var,int) 判断变量var是否为int

#在定义函数时,写上函数的类型说明
def get_max(num1: int, num2: int) -> int:  # 提示输入的实参应该为整型,且该函数的返回值也为整型
    """
    求两数的最大值 (函数的说明)
    :param num1:整数1
    :param num2: 整数2
    :return: 最大值
    """
    if isinstance(num1,int) and isinstance(num2,int):
        return num1 if num1 > num2 else num2
    else:
        return 0

result=get_max(30, 20)
print(result)
#print(help(get_max))

常见的4类形参

必选参数

必须要传递的参数

#num1和num2是必选参数,必须要传递
def get_max(num1: int, num2: int) -> int:
    return num1 if num1 > num2 else num2

result=get_max(40, 20)
print(result)

默认参数

默认参数,可传可不传的参数

def pow(x, y=2):
    return x ** y

result = pow(4)  # x=4,y=2 result=16
print(result)
result = pow(3, 3)  # x=3,y=3 result=27
print(result)

在这里插入图片描述

可变参数–*args接收的是一个元组

可变参数,参数的个数会变化,可以传0,1,2,3,4…n个参数
形参使用args,把传入的n个值都保存在元组中

# 可变参数,参数的个数会变化,可以传0,1,2,3,4...n个参数
#args是元组,把传入的n个值都保存在一个元组中
#args==arguments
def my_sum(*args):
    print(f"args为{args}")
    print(f"各个元素和为:{sum(args)}")

my_sum(1,2,3,4)
my_sum(1,2,4,76,9,65)
my_sum()

在这里插入图片描述

关键字参数–**kwargs接收的是一个字典

可以传递key和value
形参使用**kwargs,把传入的参数存放在字典中

def enroll(name,age=18,**kwargs):
    print(f"""
         入学信息登记
    1.姓名:{name}
    2.年龄:{age}
    3.其他信息:{kwargs}   
    """)

enroll('lee',country='china',english='cet-6',sports=['篮球','羽毛球'])

在这里插入图片描述

如果一个函数形式为 fun(*args,**kwargs),则表示该函数能接收任意的参数

匿名函数

匿名函数是指一类无需定义标识符的函数或子程序。python中使用lambda语法定义匿名函数。

# 一般函数的写法:
# def get_max(num1,num2):
#    return num1 if num1>num2 else num2
#匿名函数的写法
get_max = lambda num1, num2: num1 if num1 > num2 else num2
print(get_max(29, 2))

#def pow(x,y=2):
#    return x**y
get_pow=lambda x,y=2: x**y
print(get_pow(2))
print(get_pow(3,3))

在这里插入图片描述

练习题,将整型数组的0移动到末尾

给定一个整型数组,将数组中的所有0移动到末尾,非0项保持不变;
在原始数组上进行移动操作,勿创建新的数组;
输入:数组的记录;0702
输出:调整后数组的内容;7200

在匿名函数中自定义数组的排序规则,思路为:
0 7 0 2 -数组,before sorted
1 0 1 0 -排序规则( 1 if number==0 else 0)
0 0 1 1
7 2 0 0 -after sorted

nums=[0,7,0,2]
result=sorted(nums,key=lambda num:1 if num==0 else 0)   
print(result)  #[7, 2, 0, 0]

#由于题目要求是在原数组上修改
nums.sort(key=lambda num:1 if num==0 else 0)
print(nums)

在这里插入图片描述sorted()函数的参数key是函数类型,用来支持自定义的排序方式。
传递给key参数的是一个函数,它指定可迭代对象中的每一个元素来按照该函数进行排序。
带入上述实例:
匿名函数定义了规则: 1 if num==0 else 0
key参数接收到的是匿名函数,然后使用该匿名函数对数组中的每个元素进行排序

类似的思路也能实现将数组中偶数往前排,奇数往后排:

"""
自己定义数组排序规则:
0 7 0 2 -数组,before sorted
1 0 1 0 -排序规则( 1 if number%2==0 else 0)
0 0 1 1
7 2 0 0  -after sorted
"""
#实现将数组中偶数排在前面,奇数排在后面,
nums=[0,7,0,2]
result=sorted(nums,reverse=True,key=lambda num:1 if num%2==0 else 0)
print(result)

#由于题目要求是在原数组上修改
nums.sort(reverse=True,key=lambda num:1 if num%2==0 else 0)
print(nums)

在这里插入图片描述

递归函数

函数可以在内部调用其他函数。
如果一个函数在内部调用自己本身,那么这个函数就是递归函数

求n的阶乘

n!=n*(n-1)!=n*(n-1)(n-2)!=n(n-1)(n-2)(n-3)!=…

# 求数值的阶乘
# res = 1
# n = 3
# for i in range(1, n + 1):
#     res = res * i
# print(res)
def fac(n):
    if n == 1:
        return 1
    else:
        return n * fac(n - 1)
print(fac(3))
print(fac(5))

求斐波那契数列

def fib(n):
    if n == 1 or n == 2:
        return 1
    else:
        return fib(n - 1) + fib(n - 2)
# 1 1 2 3 5 8
print(fib(6))

在这里插入图片描述

汉诺塔游戏
如果有n个盘子,那么总共需要移动2^n-1次

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

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

相关文章

软件测试 -- 进阶 4 软件测试策略

巧而好度,必攻;勇而好问,必胜;智而好谋,必成。-- 《孔子家语》 翻译:灵巧而有擅长揣摩的人,必定坚定;勇敢而有擅长请教的人,必定取胜;富有智慧而有擅长谋…

Linux系统配置及服务管理-07-文件系统及RAID

文件系统详解 EXT4文件系统 EXT4是第四代扩展文件系统(Fourth extended filesystem) 类型:索引(index ) 文件系统 系统限制: Ext3: 文件系统最大16TBExt4: 文件系统最大16TBXFS : 文件系统最大100TB. 名词 inod…

进程间通信之匿名管道和命名管道

目录 管道是什么 匿名管道 命名管道 命名管道创建方式 管道的特点: 管道是什么 概念:管道是计算机通信领域设计者,设计出的一种单向通信的方式,linux原生提供管道通信 管道都是单向传输内容的 管道中传输的都是"资源&…

SSM_整合篇

一、整合步骤 1.1 数据表的介绍 team表&#xff1a; player表&#xff1a; 1.2 创建maven项目 1.3 pom.xml引入jar依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"…

ps打开图片的三种方式 同步部分基本操作方式

观看本文 需要您的电脑已安装PS工具 如果没有 可以观看我的文章 PS软件下载安装以基本配置 然后打开PS 就会变成一个这样的界面 然后点击右上角的 PS 进入工作区 然后我们就会进入 一个这样的工作区 然后我们在左上角点击文件 选择 打开 然后 在文件框中 找到自己想处理的图…

OJ练习第23题——Z字形变换

OJ练习第23题——Z字形变换题目要求示例Java代码如下&#xff1a;思路分析力扣链接&#xff1a;Z字形变换题目要求 将一个给定字符串 s 根据给定的行数 numRows &#xff0c;以从上往下、从左到右进行 Z 字形排列。请你实现这个将字符串进行指定行数变换的函数&#xff1a;str…

canvas学习

canvas 是一块画布&#xff0c;可以设置宽高 &#xff0c;默认 300 * 150 使用方式 1. 声明书写 canvas标签 2. 拿到canvas的dom 3. 调用方法 getContext (注意 此方法在prototype上) 方法集合&#xff1a; 填充&#xff1a; 1. fillStyle&#xff0c; 设置填充颜色 &…

详解非负矩阵分解(NMF)及其在脑科学中的应用

非负矩阵分解及其在脑科学中的应用 基本原理确定最优因子数量代码实现非负矩阵分解与主成分分析的区别非负矩阵分解在脑科学中的应用应用一:神经发育模式:T2w/T1w比值映射的非负矩阵分解(NMF)应用二:微观结构的协方差模式基本原理 NMF的基本思想可以简单描述为:对于任意给…

Python用PyMC3实现贝叶斯线性回归模型

在本文中&#xff0c;我们将在贝叶斯框架中引入回归建模&#xff0c;并使用PyMC3 MCMC库进行推理。 最近我们被客户要求撰写关于叶斯线性回归模型的研究报告&#xff0c;包括一些图形和统计输出。我们将首先回顾经典频率论的多重线性回归方法。然后讨论贝叶斯如何考虑线性回归。…

8、MyBatis核心配置文件之typeAliases(mybatis-config.xml)

MyBatis核心配置文件之typeAliases&#xff08;mybatis-config.xml&#xff09; 1、&#xff01;&#xff01;&#xff01;&#xff01;注意 2、 设置类型别名&#xff08;比如有的全类名&#xff08;resultType&#xff09;太长了不好使用&#xff09; typeAlias :设置某个类…

Python版本的温湿度+Nokia5110 display(SPI)

前提需要把micropython的固件安装到系统中 安装micropython到esp8266中 本实验需要&#xff1a; 1. ESP8266&#xff08;我的是Wemos D1) 2. DHT11 3. Nokia5110 LCD 连线&#xff1a; DHT11 out --> D2(GPIO-016) (-接入GND&#xff0c;接入3.3vcc) Nokia 5110 LCD We…

GO语言最常用的语法

一 ,变量&#xff1a;变量赋值只能在函数内使用&#xff0c;故第三种方式只能在函数内使用&#xff0c;可使用var()同时定义多个变量变量定义 使用var关键字 var a bool var a bool true 不指定类型直接初始化让编译器选择 var a "abc" 使用 “ : "…

Python入门、环境搭建、变量、数据类型

目录 前景 官方下载 基本数据类型 动态语言的体现 静态语言的体现 弱语言的体现 强语言的体现 注释 整数 浮点型 浮点型计算方案 字符串 布尔 引用数据类型 列表 [ ] 列表方法 集合Set{} 基本方法 特殊需求方法 应用场景 字典{} 常见操作 元组 操作符 练习…

基于ANSYS 2019R1全解一款双吸泵的双向流固耦合方法

作者&#xff1a;李雷 一、导读 对于旋转机械来说&#xff0c;传统设计从理论计算到手工木模图&#xff0c;再到模型泵的加工制造&#xff0c;最后进行相关性能试验。当性能试验与预期效果差距较大的时候还需要修改水力模型。这种传统的设计不仅设计周期长&#xff0c;而且成…

Vue3+nodejs全栈项目(资金管理系统)——后端篇(二)用户模块

文章目录用户模块的增删改查新增创建user_info表初始化路由模块路由模块处理函数(添加&#xff09;测试查询路由模块处理函数(查询)测试编辑&#xff08;根据id&#xff09;路由模块处理函数&#xff08;编辑/更新&#xff09;测试删除(根据id&#xff09;路由模块处理函数测试…

黑马JVM学习笔记-内存结构

什么是JVM? 定义&#xff1a; Java Virtual Machine - java 程序的运行环境(Java二进制字节码的运行环境) 好处&#xff1a;3 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收功能数组下标越界检查(下标越界抛出异常比数组新元素覆盖其他部分造成的危害小)…

1. SAP Business Application Studio 里创建一个基于 CAP 模型的最简单的 OData 服务

本教程已经花费了 24 个文章的篇幅,介绍了使用 SAP ABAP SEGW 这个开发工具,开发基于 SAP ABAP 技术栈的 OData 服务的详细步骤。 正如本教程目录 中提到的那样,SAP OData 开发技术包含传统的 ABAP,RAP(Restful ABAP Programming) 和 CAP(Cloud Application Programming) …

前端程序员接私活,直呼赚麻了

总有一些前端程序员会想找私活&#xff0c;但是又不清楚具体的办法&#xff0c;或者是做了但没完全做&#xff0c;吃力又不讨好还赚不到钱。今天就给大家介绍一些可行性高的方法&#xff0c;让你快速找到合适的前端兼职。 干货满满&#xff0c;希望大家点赞收藏下&#xff0c;别…

Java 异常中 e.getMessage() 和 e.toString() e.printStackTrace()的区别常见的几种异常

Java 异常中 e.getMessage() 和 e.toString() e.printStackTrace()的区别 一、概述 在java异常体系中&#xff0c;要打印异常信息&#xff0c;可以通过&#xff1a;e.getMessage() 、 e.toString() e.printStackTrace() 等方法打印出 一些 异常信息。已知的是这些方法都可以打…

WinBUGS对多元随机波动率模型:贝叶斯估计与模型比较

在本文中&#xff0c;我们通过一个名为WinBUGS的免费贝叶斯软件&#xff0c;可以很容易地完成基于似然的多变量随机波动率&#xff08;SV&#xff09;模型的估计和比较。 最近我们被客户要求撰写关于随机波动率的研究报告&#xff0c;包括一些图形和统计输出。通过拟合每周汇率…