1、函数
1.1 作用:
封装代码,高效的代码重用
1.2 函数的使用
函数的定义(先):
def 函数名(参数):
代码1
代码2
....
调用函数(后):
函数名(参数)
注意:
1、不同需求,参数可有可无。
2、在python中,函数必须先定义,后使用。
3、调用函数的时候,解释器回到定义函数的地方去执行下方缩进的代码。
4、然后回到调用函数的地方,继续向下执行。
5、定义函数的时候,函数体内部缩进的代码并没有执行。
1.3 函数的参数的作用
调用函数的时候指定具体数字,那么在定义函数的时候就需要接收用户指定的数字,函数调用的时候指定的数字和定义函数时候接收的数字即是函数的参数。
def add_num(a,b):
result=a+b;
print(result)
add_num(10,20)
其中,a,b为形参,10,20为实参。
形参为定义函数时,实参为调用函数时。
1.4 函数的返回值的作用
需要返回结果给用户需要使用函数返回值。
def sum(a,b)
return a+b
print(sum(10,20)) #30
return作用:负责函数返回值,退出当前函数,return下方代码不执行。
1.5 函数说明文档
help(函数名) #help函数作用:查看函数的说明文档
定义函数的说明文档:
def 函数名(参数):
"""说明文档的位置"""
代码
示例:
def sum(a,b):
"""求和"""
return a+b
help(sum)
print(sum.__doc__)
输出:
Help on function sum in module __main__:
sum(a, b)
求和
求和
1.6 函数嵌套调用
指的是一个函数里面又调用了另一个函数。
输入:
def fun1():
print("正在调用fun1()...")
def fun2():
print("正在调用fun2()...")
fun2()
输出:
正在调用fun1()...
正在调用fun2()...
1.7 pass语句
在Python中表示一个空的语句块。
def someFunction():
pass
1.8 _init_()
函数
带有两个下划线开头的函数是声明该属性为私有,不能在类地外部被使用或直接访问。
init函数(方法)支持带参数的类的初始化 ,也可为声明该类的属性 。
init函数(方法)的第一个参数必须是 self(self为习惯用法,也可以用别的名字),后续参数则可 以自由指定,和定义函数没有任何区别。
2、函数变量和返回值
2.1 局部变量
定义在函数体内部,只在函数体内部生效,在函数体外部访问立即报错。
在函数体内部临时保存数据,函数调用完成后,则销毁局部变量。
2.2 全局变量
在函数体内、外都能生效。
a = 10 #全局变量
def testA():
print(a) #访问全局变量
testA() #10
2.3 修改全局变量的值 global
a = 10 #全局变量
def testA():
a = 20 #这个a是局部变量
print(a)
testA() #20
print(a) #10
修改全局变量:
a = 10
def testA():
print(a)
def testB():
global a #global关键字声明a是全局变量
a = 20
print(a)
testA() #10
testB() #20
print(a) #20
2.4 多函数程序执行流程
多函数共用全局变量,随着函数执行过程而变化。
2.5 返回值作为参数传递
def a():
return 10
def b(num):
print(num)
b(a()) #10
2.6 一个函数有多个返回值
def return_num():
return 1,2 #后面也可以直接写元组-列表-字典,返回多个值
print(return_num()) #(1,2)元组 默认返回元组
3、函数参数
3.1 位置参数
调用函数时根据函数定义的参数位置来传递参数。
注意:传递和定义参数的顺序及个数必须一致。
示例:
def user(name,age,gender):
print(f"您的名字是{age},年龄是{name},性别是{gender}")
user("Tom",20,"男") #您的名字是20,年龄是Tom,性别是男
3.2 关键字参数
函数调用,通过"键=值"形式加以指定,清除了参数的顺序需求。函数调用时,如果有位置参数时,位置参数必须在关键字参数的前面。但是关键字参数之间不存在先后顺序。
示例:
def user(name,age,gender):
print(f"您的名字是{name},年龄是{age},性别是{gender}")
user("tom",gender="男",age=20)
#您的名字是tom,年龄是20,性别是男
3.3 缺省参数
默认参数,用于定义函数,为参数提供默认值,调用函数时可不传递该默认参数值,所有位置参数必须出现在默认参数前,包括函数定义和调用
。
示例:
def user(name,age,gender="男"):
print(f"您的名字是{name},年龄是{age},性别是{gender}")
user("tom",20)
#您的名字是tom,年龄是20,性别是男
3.4 不定长参数
也叫可变参数,用于不确定调用的时候会传递多少个参数(不传参也行),用包裹(packing)位置参数,或者包裹关键字参数,来进行参数传递。
包裹位置
传递:返回一个元组
。
示例:
def user(*args):
print(args)
user("Tom",18) #('Tom', 18)
传进的所有参数都被args变量接收,它会根据参数的位置合并成一个元组(tuple),args是元组类型,这就是包裹位置传递。
包裹关键字
传递:返回一个字典
。
示例:
def user(**kwargs):
print(kwargs)
user(name="Tom",age=18,id=1998) #{'name': 'Tom', 'age': 18, 'id': 1998}
4、函数闭包拆包和交换变量值
4.1 拆包(元组、字典)
拆包-元组:
def return_num():
return 100,200
num1,num2 = return_num()
print(num1) #100
print(num2) #200
拆包-字典:
dict1 = {"name":"Tom","age":18}
a,b = dict1
print(a) #name
print(b) #age
print(dict1[a]) #Tom
print(dict1[b]) #18
4.2交换变量值-借助第三变量存储数据
简写式:
a,b = 1,2
a,b = b,a
print(a) #2
print(b) #1
4.3 闭包
def fun1(x):
def fun2(y):
return x*y
return fun2
print(fun1(8)(5)) #40
def fun1():
x = 5
def fun2():
x *= x
return x
return fun2()
#报错
#fun2()里x未定义
def fun1():
x = 5
def fun2():
nonlocal x #不能用global因为x不是全局变量
x *= x
return x
return fun2()
print(fun1()) #输出:25
欢迎指正错误!