04-Python的函数1
# 函数
## 函数定义:
- 函数可以看出是语句的集合,通过函数调用来执行其包含语句。
- Python利用函数提高代码的重用率,减少了代码冗余。
- 基本格式:
def 函数名(参数表):
函数语句
return 返回值
* 参数和返回值都不一定是必须有的,Python运行函数没有参数和返回值。
* 函数代码块以 def 关键词开头,后接函数标识符名称、圆括号()、冒号。
* 函数内容以冒号起始,并且缩进。
* 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
* 函数语句必须要有缩进。
# 文档注释 def Fun1(a,b): """ 函数功能:计算两个数的和。 参数a: 参数b: 返回值为两个数的和 """ pass return a+b # 查看文档的两种方式:help()、fun.__doc__ help(Fun1) # print(Fun1.__doc__) ##################################################### # 结果 Help on function Fun1 in module __main__: Fun1(a, b) 函数功能:计算两个数的和。 参数a: 参数b:
* return [表达式] 结束函数,
* 选择性地返回一个值给调用方,可以返回多个值。
* 不带表达式的return相当于返回 None。
# 有返回值 def Fun1(): a = "这是返回值" return a # 无返回值None def Fun2(): pass # 多个返回值 def Fun3(): a, b = 1, 2 return a,b print(Fun1()) print(Fun2()) print(Fun3()) ######################## # 结果 这是返回值 None (1, 2)
- 创建函数
# 创建函数 # 注意:函数没有被调用是不会被执行的 # 1.创建有参数和返回值的函数 def MyFirstFun(a): print("这是函数") print("这是函数的参数%s"%a) return a # 2.创建没有参数和返回值的函数 def MSecdonFun(): pass
## 函数的简单调用
def MyFirstFun(a): print("这是函数") print("这是函数的参数%s"%a) return a def Fun2(): print("我被调用了") # 1.直接使用函数名,可以返回函数名变量的内存地址 print(MyFirstFun) print("1",'--'*20) # 2.函数名后面跟括号 Fun2() print('2','--'*20) MyFirstFun(5) print('3','--'*20) # 3.通过变量名调用 x = MyFirstFun x(66)
# 结果 <function MyFirstFun at 0x0000026BB15D7D90> 1 ---------------------------------------- 我被调用了 2 ---------------------------------------- 这是函数 这是函数的参数5 3 ---------------------------------------- 这是函数 这是函数的参数66
## 函数的参数
- 定义:
- 形参(形式参数):定义函数的时候,参数表中各个参数称为形式参数(只是一个占位符)。
- 实参(实际参数):在调用函数时,参数表中提供的参数称为实际参数。
- 注意:实参传递个形参就是将对象的引用赋值个形参。
- 分类:
- 位置参数
- 定义时直接定义变量名,调用时直接把变量或者值放入指定的位置
- 定义: def 函数名 (参数1,参数2,参数3,···):
- 调用 : 函数名(v1, v2,v3,···)
- 注意:调用时赋值要参数按位置赋值
# 单个位置参数的函数 def Fun1(v1): print(v1) f1 = Fun1("abc") # 运行函数Fun1 # 多个位置参数的函数 def Fun2(v1, v2, v3): print(v1, v2) return v3 f2 = Fun2(1, 2, "edf") # 运行函数Fun2 print(f2) # 返回函数Fun2的值 # 结果 abc 1 2 edf
- 默认参数
- 形参带有默认值,调用时候,如果没有相对应形参赋值,则使用默认值。
- 定义:def 函数名(p1=v1, p2=v2,···):
- 调用:func_name()
- 注意:
* 默认参数可以简化函数的调用。但是设置默认参数是需要位置参数在前,默认参数在后。
- 例如 :def Fun1(v1, v2=5, v3): 这样系统还会报错。
* 当函数有多个参数时,把变化大的参数放在前面,变化小的放在后面,变化小的参数就可以作为默认参数。
* 默认参数必须指向不变的对象。
* 使用关键字参数,可以不考虑参数位置。
# 1.默认参数只有默认参数 def Fun1(v1=3, v2=3, v3=6): s = v1 + v2 * v3 return s v1 = Fun1() # 不需要传递参数 # 2.位置参数和默认参数配合使用 def Fun2(v1, v2=3, v3=6): s = v1 + v2 * v3 return s v2 = Fun2(10) # 把位置参数的值传递进去 # 3.位置参数和默认参数配合使用 def Fun3(v1, v2=3, v3=6): s = v1 + v2 * v3 return s v3 = Fun3(10, v2=0) # 修改默认参数 print(v1, v2, v3) # 结果 21 28 10
# 注意: # 默认参数必须指向不变的对象 def Fun1(l1 = []): l1.append("end") return l1 Fun1() print(Fun1()) # 参数l1也是一个变量,指向对象[] # 每次调用函数,l1就被改变一次 # 结果 ['end', 'end']
- 可变参数
- 允许传入0个或任意个参数,内部组装成元组。
- 定义:def func(*args):
- 调用:func(p1, p2, p3, ....)
def Fun1(*args): for i in args: print(i) Fun1() # 允许传递0个参数 l = [1, 2, 3] t = ("a", "b", "c") Fun1(l, t, 888) # 允许传递多个参数,不包括包含关键字的参数 # 结果 [1, 2, 3] ('a', 'b', 'c') 888
- 关键字参数
- 允许传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为字典。
- 定义:def func(**kargs):
- 调用:func(p1, p2, p3, ....)
def Fun1(**kargs): for i in kargs.items(): print(i) return kargs Fun1() # 允许传递0个参数 v = Fun1(name = "China", age = 5500, num = 56) # 允许传递多个参数,不包括包含关键字的参数 print(v) # 内部组成字典 # 结果 ('name', 'China') ('age', 5500) ('num', 56) {'name': 'China', 'age': 5500, 'num': 56}
- 命名关键字参数:
- 用来限制关键字参数的名字
- 定义;def 函数名(v1, v2, *, v3, v4)
- 在 * 后面的参数都必须以关键字形式传入,否则报错
# 第一种形式 def Fun1(name, age, *args, job, num=2 ): print(name, age, args, job, num) # *后面的以关键字形式传进去,num是默认参数了,不需要在传进去(可修改) v1 = Fun1("xiaoming", 18, "None1", job="worker") # 第二种形式 def Fun2(name, age, *, job, n ): print(name, age, job, n) v2 = Fun2("sss", 22, job="worker",n=555) # 结果 xiaoming 18 ('None1',) worker 2 sss 22 worker 555
- 参数组合调用顺序:必须参数、默认参数、可变参数、关键字参数、命名关键字参数
def Fun1(name, age,*agrs, hoby="没有", **kwargs): print("我是{0},我今年{1}岁".format(name,age)) if hoby == "没有": print("没有爱好") else: print("我的爱好是{0}".format(hoby)) for k,v in kwargs.items(): print(k, "---", v) print("--" * 15) name = "xiaoming" age = 18 #调用不同格式 Fun1(name, age) # 位置参数 Fun1(name, age, hoby="swiming") # 修改默认参数,*agrs和**kwagrs没有接受参数 Fun1(name, age, "args1", "args2", hoby1="a", hoby2="b", hoby3="c") # 分别传入可变参数*agrs和关键字参数**kwargs # "args1"和"args2"传给*args, boby1、hoby2、boby3传给**kwagrs Fun1(name, age, "args1", "args2", hoby1=[1, 2, 3]) Fun1(name, age, "args1", "args2", hoby=("ssss","sss","ss"))
# 结果 我是xiaoming,我今年18岁 没有爱好 ------------------------------ 我是xiaoming,我今年18岁 我的爱好是swiming ------------------------------ 我是xiaoming,我今年18岁 没有爱好 hoby1 --- a hoby2 --- b hoby3 --- c ------------------------------ 我是xiaoming,我今年18岁 没有爱好 hoby1 --- [1, 2, 3] ------------------------------ 我是xiaoming,我今年18岁 我的爱好是('ssss', 'sss', 'ss') ------------------------------