如果在开发程序时,需要某块代码多次,但是为了提高编写的效率以及代码的重用,所以把具有独立功能的代码块组织为一个小模块,这就是函数.
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)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出。