前言
函数是变成语言中最常见的语法,函数的本质就是功能的封装。使用函数可以大大提高编程效率与程序的可读性。函数是能够实现特定功能的计算机代码而已,他是一种特定的代码组结构。
函数的作用
- 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语句
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))
上述代码示例中,计算所有传入参数的值,并返回所有值的总和结果。
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()