1.函数的概念
-
概念
写了一段代码实现了某个小功能;然后把这些代码集中到一块,起一个名字,下一次就可以根据这个名字再次使用这个代码,这就是函数。
-
作用
方便代码的重复使用。
分解任务,简化程序逻辑
使代码更加模块化
-
函数分类
内建函数
三方函数
自定义函数
2.函数的基本使用
-
简单定义
def 函数名():
函数体
-
函数调用
函数名()
#函数的定义
def test():
print(2**2)
print(2**3)
print(2**4)
#函数的调用
test()#输出4 8 16
3.函数的参数
3.1 单个参数
-
场景
需要动态的调整函数体中某一个处理信息时,则可以以参数的形式接收到相关数据。
-
定义
def 函数名(参数名称):
函数体:函数体中,可以直接以变量的方式使用该参数
-
函数的调用
函数名(参数值)
-
形参和实参的概念
上述函数定义中,参数名称 即为形参 ,在调用函数的时候,传递的真实数据,即为实参。
#单个参数的函数的定义
def test(num):
print(num**2)
#函数的调用
test(3)#输出 9
test(4)#输出 16
3.2 多个参数
-
场景
需要动态的调整函数体中多个处理信息使,则可以用逗号做分割,接收多个参数。
-
定义
def 函数名(参数名称1,参数名称2,…):
函数体:函数体中,可以直接以变量的方式使用该参数
-
函数的调用
函数名(参数1,参数2,…)
函数名(参数名称1=参数1,参数名称2=参数2,…) 可以指明形参名称,称为 “关键字参数” 。不需要严格按照顺序
#多个参数的函数的定义
def test(num1,num2):
print(num1+num2)
#函数的调用
test(3,4)#输出 7
test(8,16)#输出 24
test(num2 = 18,num1 = 54)#输出 72
3.3 不定长参数
-
场景
如果函数体中,需要处理的数据,不确定长度,则可以使用不定长参数的方式接收数据。
-
定义
-
方式一
def 函数名(*args):
*args:接收的参数组成一个元组
函数体:函数体中,可以直接以元组变量的方式使用该参数
函数使用:函数名(参数1,参数2,参数3,…)
-
方式二
def 函数名(**args):
****args:**接收的参数组成一个字典
**函数体:**函数体中,可以直接以元组变量的方式使用该参数
函数使用:函数名(参数名称1=参数1,参数名称2 = 参数2,参数名称3 = 参数3,…)
-
-
参数拆包
装包:把传递的参数,包装成一个集合,称之为“装包”
拆包:把集合参数,再次分解成单独的个体,称之为“拆包”
#不定长参数的函数的定义 *args 元组
def mySum(*t):
print(t,type(t))
result = 0
for v in t:
result += v
print(result)
#函数的调用
mySum(3,4,5,6,7)#输出 (3, 4, 5, 6, 7) <class 'tuple'> 25
mySum(3,8,5,12,7)#输出 (3, 8, 5, 12, 7) <class 'tuple'> 35
#不定长参数的函数的定义 **args 字典
def mySum(**kwargs):
print(kwargs,type(kwargs))
#函数的调用
mySum(name ="sz",age = 12)#输出 {'name': 'sz', 'age': 12} <class 'dict'>
#参数的拆包和装包 *args
def mySum(a,b,c,d):
print(a+b+c+d)
def test(*args):
print(args)
#拆包操作
mySum(args)#报错,b,c,d三个没有赋值成功
mySum(args[0],args[1],args[2],args[3])#这样太繁琐
mySum(*args)#这样直接把已经装包的参数,再次拆包后赋值。
test(1,2,3,4)#输出 (1, 2, 3, 4) 10 10
#参数的拆包和装包 **args
def mySum(a,b):
print(a)
print(b)
def test(**args):
print(args)
#拆包操作
mySum(**args)
test(a=1,b=2)#输出 {'a': 1, 'b': 2} 1,2
test(a=1,c=2)#输出 报错 因为字典拆包是拆成 a=1,c=2 这样mySum函数中的参数没有c
3.4 缺省参数
-
场景
当我们使用一个函数的时候,如果大多数情况下,使用的某个数据是一个固定值,则可以使用默认值,这种参数,称为“缺省参数”
-
定义
def 函数名(变量名1=默认值,变量名2=默认值,…):
函数体:函数体中,即使外界没有传递指定变量,也可以使用,只不过值是给定的默认值
-
函数的调用
函数名(变量1,变量2,…) 此次如果是缺省参数,则可以不填写
#缺省参数,当没有参数时,会使用默认值
def hit(somebody = "豆豆"):
print("我想打",somebody)
hit("zhangsan")#输出我想打 zhangsan
hit()#输出我想打 豆豆
3.5 参数注意
-
值传递和引用传递
值传递:是指传递过来的,是一个数据的副本,修改副本,对原件没有任何影响
引用传递:是指传递过来的,是一个变量的地址,通过地址,可以操作用一份原件。
-
在python当中,只有引用传递(地址传递),但是如果数据类型是可变的数据类型,则可以改变原件,如果数据类型是不可变类型,则不可以改变原件。
def change(num): print(id(num))#140706432668744 b = 10 print(id(b))#140706432668744 change(b) #此时b和num同时指向一个地址值,c c++ java三个语言是对于num创建一个新地址存放10 def change(num): print(id(num))#140706434962504 num = 666 print(id(num))#2095039032144 b = 10 print(id(b))#140706434962504 change(b) #此时因为num发生了改变,所以创建了一个新地址来存放num的改变,b没有发生改变
4.函数的返回值
-
场景
当我们通过某个函数,处理好数据之后,想要拿到处理的结果
-
语法
def 函数名(参数等):
函数体
return 数据
-
注意事项
- return后续代码不会被执行
- 只能返回一次
- 如果想要返回多个数据,可先把多个数据包装成一个集合,整体返回。如列表,元组,字典等等。
-