简介
- 它是代码的一种组织形式
- 一个函数一般完成一项特定的功能
定义
def func():
"""
def 是定义函数的关键字,后要跟一个空格
func 为函数名,可自定义,起名最好遵循约定俗的成命名规则,如小驼峰
func 后面的括号和冒号都不能省,括号内可以有参数,也可以没有
"""
print("我是一个函数。") # 需要注意缩进
print("我可以完成一定的功能。")
print("调用才能执行。")
return None # 只写 return 或不写,默认均返回 None
print("我不属于 func 函数。")
参数
说明
- 负责给函数传递一些必要的数据或者信息
- 形参(形式参数):在函数定义的时候用到的参数,也许有个默认值,也许有个具体值,也许只是占个位
- 实参(实际参数):在调用函数的时候输入的数据
- 个人觉得,Python 中更适合谈“可变参数”与“不可变参数”
例1
def hello(name): # 形参
print("Hello, {}!".format(name))
name = "YorkFish" # 实参
hello(name)
>>>
Hello, YorkFish!
例2
def hello(name): # 形参
print("Hello, {}!".format(name))
return "See you next time~"
name = "YorkFish" # 实参
rst = hello(name)
print("函数返回的是:", rst)
>>>
Hello, YorkFish!
函数返回的是: See you next time~
分类
- 普通参数
- 定义时,直接定义变量名
- 调用时,直接把变量或者值放入指定位置
- 默认参数
- 形参带有默认值
- 调用时,若没有给相应的形参赋值,则使用默认值
- 关键字参数
- 对调用时而言
- 可以不考虑参数位置
- 不容易混淆
- 收集参数
- 相当于预留一些位置给以后可能会用的参数,可以看成是一个特定的数据结构
args
是约定俗成,虽然可以写成别的,但推荐写成args
- 参数名
args
前的星号不能省略 - 收集参数可以和其他参数共存
普通参数
# 定义
def func_name(param1, param2, ...):
func_body
# 调用
func_name(value1, value2, ...) # 按位置依次传递数据
默认参数
# 定义
def func_name(param1=val1, param2=val2, ...):
func_body
# 调用1
func_name()
# 调用2
value1 = 100
value2 = 200
func_name(value1, value2)
关键字参数
# 定义
def func(param1=val1, param2=val2, ...):
func_body
# 调用1
func(para1=value1, param2=value2, ...)
# 调用2
func(param2=value2, param1=value1, ...)
收集参数
# 定义
def introduce(*args): # 按照 tuple 使用方式访问 args 得到传入的参数
print(type(args))
for item in args:
print(item)
# 调用
introduce() # 不传参,args 为空元组
introduce("YorkFish", 18, "reading", "running", "music")
>>>
<class 'tuple'>
YorkFish
18
reading
running
music
关键字收集参数
- 把关键字参数按字典格式存入收集参数
kwargs
为约定俗成- 调用时,把多余的关键字参数放入
kwargs
- 访问
kwargs
需要按字典格式访问
# 定义
def introduce(**kwargs):
print(type(kwargs)) # 在函数体内使用 kwargs 不用带星号
for k, v in kwargs.items():
print(k, v)
# 调用
introduce() # 不传参,kwargs 为空字典
introduce(name="YorkFish", age=18, hobby1="reading", hobby2="running", hobby3="music")
>>>
<class 'dict'>
name YorkFish
age 18
hobby1 reading
hobby2 running
hobby3 music
关键字参数,收集参数,关键字收集参数
- 收集参数,关键字参数,普通参数可以混合使用
- 使用规则:普通参数和关键字参数优先
# 定义
def stu(name, age, *args, hobby="None", **kwargs):
print("My name is {0}, and I am {1} years old.".format(name, age))
if hobby == "None":
print("I don't have a hobby.")
else:
print("I like {}".format(hobby))
for i in args:
print(i)
for k, v in kwargs.items():
print(k, v)
name = "YorkFish"
age = 18
# 调用
# stu(name, age)
# stu(name, age, hobby="reading")
stu(name, age, "Howard", "Raj", hobby="comic", hobby2="kites")
>>>
My name is YorkFish, and I am 18 years old.
I like comic
Howard
Raj
hobby2 kites
解包
list/dict
解包后,可以传给收集参数- 列表、元组使用
*
即可解包 - 字典需要用
**
解包
def test(*args):
for i in args:
print(i)
print(type(i))
a = [123, "YorkFish"]
test(*a)
>>>
123
<class 'int'>
YorkFish
<class 'str'>
返回值
说明
- 函数的执行结果
- 使用
return
关键字 - 如果没有写
return
语句,默认返回一个None
- 函数一旦执行
return
语句,则无条件返回需返回的值,然后退出函数 - 推荐最后以
return
结束的写法
举例
def test1():
print("有返回值!")
return 1
def test2():
print("没有返回值?")
rst1 = test1()
print(rst1)
rst2 = test2()
print(rst2)
>>>
有返回值!
1
没有返回值?
None
函数文档
说明
- 作用:对当前函数提供使用相关的参考信息
- 写法:在函数内部开始的第一行使用三引号字符串定义符
- 文档查看
- 使用
help()
,形如help(func)
- 使用
__doc__
,形如introduce.__doc__
- 使用
例1
def introduce(name, age, *args):
'''介绍人物
name:
age:
return: None
'''
print("name: {}, age: {}".format(name, age))
for i in args:
print(i)
help(introduce) # 查看 introduce 的说明文档
>>>
Help on function introduce in module __main__:
introduce(name, age, *args)
介绍人物
name:
age:
return: None
例2
def introduce(name, age, *args):
'''介绍人物
name:
age:
return: None
'''
print("name: {}, age: {}".format(name, age))
for i in args:
print(i)
print(introduce.__doc__)
>>>
介绍人物
name:
age:
return: None