- 函数可以看出是语句的集合,通过函数调用来执行其包含语句。
- 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‘) ------------------------------
原文:https://www.cnblogs.com/cmn-note/p/11194032.html