4、python中函数、匿名函数、递归函数
创始人
2024-04-13 08:35:01
0

文章目录

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

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

函数的创建和调用

  • 形参就是定义函数时的参数
  • 实参就是调用函数时的参数
#如何定义一个函数
#定义函数,如果不调用函数,那么函数的内容不会执行
def get_max(num1,num2):result = num1 if num1>num2 else num2return 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 = 100print("存钱前:", allmoney)allmoney += moneyprint("存钱后:", allmoney)def viewmoney():allmoney = 500print("查询金额:", allmoney)savemoney(50)
viewmoney()

在这里插入图片描述

函数内部修改全局变量

  • 如果要在函数内修改全局变量,不能直接修改,需要先使用global关键字声明修改的变量是全局变量
  • 如果全局变量是可变数据类型,那么在函数内部对该变量修改就不用global关键字声明
  • 如果全局变量是不可变数据类型,那么在函数内部对该变量修改就需要global关键字声明
def fun():global moneymoney += 1print(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 num2else:return 0result=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 num2result=get_max(40, 20)
print(result)

默认参数

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

def pow(x, y=2):return x ** yresult = 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 1else:return n * fac(n - 1)
print(fac(3))
print(fac(5))

求斐波那契数列

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

在这里插入图片描述

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

相关内容

热门资讯

银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
【NI Multisim 14...   目录 序言 一、工具栏 🍊1.“标准”工具栏 🍊 2.视图工具...
AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
Android|无法访问或保存... 这个问题可能是由于权限设置不正确导致的。您需要在应用程序清单文件中添加以下代码来请求适当的权限:此外...
月入8000+的steam搬砖... 大家好,我是阿阳 今天要给大家介绍的是 steam 游戏搬砖项目,目前...
​ToDesk 远程工具安装及... 目录 前言 ToDesk 优势 ToDesk 下载安装 ToDesk 功能展示 文件传输 设备链接 ...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
AWS管理控制台菜单和权限 要在AWS管理控制台中创建菜单和权限,您可以使用AWS Identity and Access Ma...