python之函数(更新:匿名函数与递归函数)

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

1.函数的创建

#语法
def 函数名(参数1,参数2,参数3,...):
    '''注释'''
    函数体
    return 返回的值

所谓“返回值”,就是程序中函数完成一件事情后,最后给调用者的结果.
没有返回值,默认返回None

定义函数要注意以下几点:

1.函数名的命名规则要符合python中的命名要求。一般用小写字母和单下划线、数字等组合匈牙利命名法(sUserName),  驼峰式大小写(userName), 帕斯卡命名法(UserName)
2.def是定义函数的关键词,这个简写来自英文单词define
3.函数名后面是圆括号,括号里面,可以有参数列表,也可以没有参数
4.函数体(语句块),相对于def缩进,按照python习惯,缩进四个空格

2.变量作用域
1).局部变量
局部变量就是在函数内部定义的变量,不同的函数,可以定义相同的名字的局部变量,但是各用个的不会产生影响,局部变量的作用,为了临时保存数据需要在函数中定义变量来进行存储。
在这里插入图片描述
2).全局变量
如果一个变量,既能在一个函数中使用,也能在其他的函数中使用,这样的变量就是全局变量。
在函数外边定义的变量叫做全局变量;
全局变量能够在所有的函数中进行访问;
如果在函数中修改全局变量,那么就需要使用global进行声明,否则出错;
如果全局变量的名字和局部变量的名字相同,那么使用的是局部变量的。
在这里插入图片描述

global的本质是声明可以修改全局变量的指向, 即变量可以指向新的数据。
1). 不可变类型的全局变量: 指向的数据不能修改, 不使用global时无法修改全局变量。
2). 可变类型的全局变量: 指向的数据可以修改, 不使用global时可以修改全局变量。

在这里插入图片描述
3.形参与实参

在这里插入图片描述
定义时小括号中的参数,用来接收参数用的,称为 “形参”
调用时小括号中的参数,用来传递给函数用的,称为 “实参”

4.参数的类型
1).默认参数
默认参数就是定义函数时,形参给定一个值。如果在函数调用时实参重新赋值,则实参的值会代替指定默认参数的值。
在这里插入图片描述
2).可变参数
可变参数就是传入的参数个数是可变的,可以是 1 个、2 个到任意个,还可以是 0 个。
nums用来接收多个变量/参数, 接收近来的nums是一个元组。
在这里插入图片描述
以上代码时求多个数的平方和,我们可以看到当
num可以接收任意个参数,并求其平方和。

3).关键字参数
关键字参数允许传入 0 个或任意个含参数名的参数;
这些关键字参数在函数内部自动组装为一个 dict;
关键字参数用**kwargs。

def recordStudentInfo(name, sid, **kwargs):
    """
    录入学生信息, 必填的内容姓名和学号, 其他的可以自己输入
    """
    print("""
    
    姓名: %s
    学号: %s
    
    """%(name, sid))
    for key, value in kwargs.items():
        print("\t %s: \t%s" %(key, value))
 recordStudentInfo("sendoh", '001', score=100, courses=['python', 'c', 'Linux'])    

运行结果:
在这里插入图片描述
3.匿名函数
匿名函数指一类无须定义标识符的函数或子程序。Python用lambda语法定义匿名函数,只需用表达式无需申明(省略def声明函数的标准步骤)。
lambda函数语法:

lambda[arg1,arg2,....argn] : expression

在这里插入图片描述
lambda函数能接受任何数量的参数,但只能返回一个表达式的值。
1)应用一:函数作为参数传递


def test(a,b,func):
    result = func(a,b)
    return result
num = test(11,22,lambda x,y:x+y)
print(num)

2)应用二:作为内置函数的参数,多用于排序。

infors = [{"name":"wang","age":10},{"name":"xiaoming","age":20},{"name":"banzhang","age":10}]

infors.sort(key=lambda x:x['age']) #根据age对字典排序

print(infors)

# 排序结果  
[{'name': 'wang', 'age': 10}, {'name': 'banzhang', 'age': 10}, {'name': 'xiaoming', 'age': 20}]

4.递归函数
一个函数可以在内部调用自己本身,这个函数就是递归函数。
例如:计算阶乘factorial:n!=123*…*n
我们如果把求阶乘写成普通的函数,可以看到:
fact(n) = n! = 1 * 2 * 3 * … * (n-1) * n = (n-1)! * n
所以,fact(n)可以表示为 n * fact(n-1),只有n=1时需要重新赋值。
则写成递归函数为:

def fact(n):
if n==1:
  return 1
return n * fact(n - 1)

需要注意的是:
使用递归函数需要注意防止栈溢出。在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值