前言
函数是变成语言中最常见的语法,函数的本质就是功能的封装。使用函数可以大大提高编程效率与程序的可读性。函数是能够实现特定功能的计算机代码而已,他是一种特定的代码组结构。
函数的作用
- 1.提升代码的重复利用率,避免重复开发相同代码
- 2.提高程序开发效率
- 3.便于程序维护
1. 函数的定义
- 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 ()。
- 任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数。
- 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
- 函数内容以冒号起始,并且缩进。
- return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。
基本
def 函数名称( ):
# 函数体
带有参数
def 函数名称(参数[,参数2,参数3]):
# 代码块
带有返回值
def 函数名称():
# 代码块
return values
def funName(args):
print(args)
return args
函数名的命名规则:和变量基本一样
- 1.推荐使用英文或者拼音,禁止使用中文
- 2.可以使用数字,但是不能用数字开头
- 3.不可以使用特殊字符,除了_
- 4.函数名严格区分大小写
- 5.函数名必须要有意义。
- 6.不能和系统已经存在的保留关键字冲突!
- 7.禁止使用和系统提供函数相同的函数名
2. 函数的调用
注意函数定义之后不会自动执行,必须在调用函数后函数才会执行,并且函数必须定义在前,只有前边定义了函数后面才能调用
# 函数定义
def funName(args):
print(args)
return args
# 函数调用:注意函数必须定义在前,只有前边定义了函数后面才能调用
funName("xujingliang")
3. 函数参数
3.1 必备参数
必备参数须以正确的顺序传入函数。调用时的数量必须和声明时的一样。
def getAll(a,b,c,d):
return a+b+c+d
print(getAll(1,2,3,4))
3.2 关键字参数
关键字参数和函数调用关系紧密,函数调用使用关键字参数来确定传入的参数值。使用关键字参数允许函数调用时参数的顺序与声明时不一致,因为 Python 解释器能够用参数名匹配参数值。
def getUserInfo(name,age):
print(name,age)
getUserInfo("xujingliang",20)
getUserInfo(age=20,name="sunyanan")
3.3 默认参数
调用函数时,默认参数的值如果没有传入,则被认为是默认值。下例会打印默认的age,如果age没有被传入:
def getPassword(username,password="12345"):
print(username,password)
getPassword("xujingliang")
getPassword("sunyanan","54321")
3.4 不定长参数
不定长参数:你可能需要一个函数能处理比当初声明时更多的参数。这些参数叫做不定长参数,和上述2种参数不同,声明时不会命名。基本语法如下:
def printUsers(user,*users):
print(user)
print(users)
printUsers("xujingliang")
printUsers("xujingliang","xunyanan","wuyou","wutong")
def getAllSum(arg,*args):
res = arg
if len(args)>0:
for i in args:
res += i
return res
print("return语句返回结果",getAllSum(10,20,30,40))
4. 匿名函数
使用 lambda 来创建匿名函数。
- python 使用 lambda 来创建匿名函数。
- 所谓匿名,意即不再使用 def 语句这样标准的形式定义一个函数。
- lambda 只是一个表达式,函数体比 def 简单很多。
- lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。
- lambda 函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数。
- 虽然lambda函数看起来只能写一行,却不等同于C或C++的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率。
语法: lambda [arg1 [,arg2,.....argn]]:expression
userinfo = lambda username,password:print(username+":"+password)
userinfo("xujingliang","123456789")
5. return语句
5.1 return语句的基本使用
return语句[表达式]退出函数,选择性地向调用方返回一个表达式。不带参数值的return语句返回None。之前的例子都没有示范如何返回数值,下例便告诉你怎么做:
def getResult(arg,*args):
res = arg
if len(args)>0:
for i in args:
res += i
return res
print("return语句返回结果",getResult(10,20,30,40))
上述代码示例中,计算所有传入参数的值,并返回所有值的总和结果。
当函数没有返回值时,函数返回值的类型None
def say(name):
print("My name is "+name)
result = say("hello")
print(type(result))
# 输出结果<class type="NoneType">
5.2 None无返回值
同时,当没有返回值时,我们可以return None;
def say(name):
print("my name is "+name)
return None
None详解
None作为一个特殊的字面量,用于表示:空、无意义,其有非常多的应用场景。
1. 用在函数返回值上
2. 用在if判断上,在if判断中None等同于False,一般用在函数中主动返回None,配合if做相关处理
3. 用于声明无内容的变量,暂时不需要变量有具体值,可以用None来代替 。nane = None
5.3 return多返回值
当函数需要返回多个返回值时,我们可以在return语句后面通古果逗号分隔多个返回值,同时需要多个变量来接收函数的返回值
例如下面代码中我们想函数中传入一个整数列表,通过比较返回传入列表的最大值和最小值
listA = [84,24,45,90,103,88,24]
def getMaxAndMinValue(listA):
max = listA[0]
min = listA[0]
for el in listA:
if el > max :
max = el
if el < min :
min = el
return max,min
max,min = getMaxAndMinValue(listA)
print(f"max:{max},min:{min}")
6. 变量作用域
一个程序的所有的变量并不是在哪个位置都可以访问的。访问权限决定于这个变量是在哪里赋值的。变量的作用域决定了在哪一部分程序你可以访问哪个特定的变量名称。两种最基本的变量作用域如下:
- 全局变量
- 局部变量
定义在函数内部的变量拥有一个局部作用域,定义在函数外的拥有全局作用域。局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问。调用函数时,所有在函数内声明的变量名称都将被加入到作用域中。如下实例:
total = 10
def getSum(a,b):
total = a+b
print("这里的total为局部变量",total)
return total
getSum(10,10)
print("这里的total为全局变量与函数内的total互不影响",total)
可以通过global关键字来在函数内部创建全局变量
def createGlobalVar(globalArgs):
global globalArg
globalArg = globalArgs
createGlobalVar(200)
print(globalArg)
如果全局变量和局部变量重名,可以使用全局函数globals()在函数内部访问重名的全局变量
def accessGlobalVar():
total = 10086
print(total)
print(globals()['total'])
accessGlobalVar()
7. 函数说明文档
用于描述函数及相关信息的说明注释,可以帮助我们更好的理解函数功能。同时在一些编辑器中当鼠标移动到函数时会弹出函数的相关说明,方便我们调用函数。
函数说明文档定义在函数体内,函数体开始的位置。
:param 用于解释参数
:return 用于解释返回值
def getMaxElement(salary):
"""
函数说明
getMaxElement函数可以刷双层循环遍历输出元素内容
:param salary: 传入列表参数
:return: 返回None值
"""
for item in range(0,len(salary)):
for el in range(0,len(salary)):
print("item:%s,el:%s" % (item,el))
return None
salarys = [5888.88,6000.00,7500.00,10000.00]
getMaxElement(salarys)
8. 函数的嵌套调用和递归调用
# 将 10不断除以2,直至商为0,输出这个过程中每次得到的商的值。
def recursion(n):
v = n//2 # 地板除,保留整数
print(v) # 每次求商,输出商的值
if v==0:
''' 当商为0时,停止,返回Done'''
return 'Done'
v = recursion(v) # 递归调用,函数内自己调用自己
recursion(10) # 函数调用
9. 函数作为参数传递
之前的学习中我们可以将字符串、整数当作参数传入到函数内,其实将函数自身作为一个参数有也可以传入函数内
def test_fun(compute):
result = compute(1,2)
return result
def compute(a,b):
return a+b
test_fun(compute)
函数作为参数传递是一种逻辑的传递,而非数据的传递。