详解Python模块化编程-自定义函数
详解Python模块化编程-自定义函数
xiaozhan_Python
一个有温度的 Python 订阅号!
以下文章来源于pythonic生物人 ,作者pythonic生物人
分享数据科学干货(涉及Python/R/统计等)
0、楔子
1、自定义函数格式
2、编写函数说明文档
3、函数参数
函数形参和实参区别
位置实参
关键字实参
默认实参
让实参可选
传递任意数量的实参
结合使用位置实参和任意数量实参
使用任意数量的关键字实参
4、函数返回值
将函数存储在模块中并导入新程序中
正文开始啦
0、楔子
函数可以理解为多条语句整合而成的 代码块 ,指定 特定的名称 , 用于实现具体的功能。函数可以实现代码更好的 复用 ,是 结构化编程 的核心。例如,已知圆的半径r求圆的面积,可以通过如下代码解决。
import
math
r =
3
S = math.pi*r*r
print(S)
28.274333882308138
但是,当需要求多个圆的面积时,反复写上面代码就显得很繁琐,这时可以定义一个求圆面积的函数s_circle,每次只需传入不同圆的半径,即可计算不同圆面积。
def
s_circle
(r)
:
S = math.pi*r*r
return
S
print(s_circle(
3
))
print(s_circle(
333
))
28.274333882308138
348368.06776391855
1、 自定义函数格式
格式如下:
def
fun_name
(args)
:
fun_body
return
xx
fun_name,自定义的函数名;
args,传入函数的参数;
fun_body,函数体,即函数想实现的功能;
return
xx,
return
结束函数,函数返回值 xx,不指定则返回
None
。
举个栗子,定义一个计算圆面积的函数:
def
s_circle
(r)
:
#自定义函数s_circle,传入的参数r。
S = math.pi*r*r
#函数体
return
S
#返回圆的面积S
print(s_circle(
3
))
#函数名()调用函数,括号内为传入
28.274333882308138
当函数体只有一行时,可以置于def语句同一行。
def
for_multi
(x,y)
:
print(x*y)
#函数定义
for_multi(
10
,
12
)
#调用函数
120
2、编写函数说明文档
说明文档置于函数开头处,作为函数的一部分存储起来,通过函数名.__doc__可查看说明文档。
def
s_circle
(r)
:
"compute the circular area with radius"
#函数说明文档内容
S = math.pi*r*r
return
S
s_circle.__doc__
#函数__doc__属性存储函数说明文档
’compute the circular area with radius’
3、函数参数
形参和实参区别
形参:定义函数时,函数名称后面括号里的内容为形参; 实参:调用函数时,括号里的内容为实参。
def
hello2sb
(sb)
:
#括号内为传入的参数,此处sb为形参。
print(
"Hello %s!"
%sb.title())
hello2sb(
"jack"
)
#此处jack为调用hello2sb的实参,是调用函数时传递给函数的信息。
Hello Jack!
位置实参
调用函数时按照形参的顺序关联实参。
def
des_sb
(name,provice)
:
"""describe sb"""
print(
"%s comes from %s."
%(name.title(),provice.title()))
#title函数返回标题化字符,单词的开头为大写,其余为小写
des_sb(
"cao"
,
"anhui"
)
Cao comes from Anhui.
关键字实参
形参=实参传递参数,无需考虑实参顺序。
def
des_sb
(name,provice)
:
"""describe sb"""
print(
"%s comes from %s."
%(name.title(),provice.title()))
#无需考虑输入实参顺序,以下两种输出一样
des_sb(name =
"cao"
,provice =
"anhui"
)
des_sb(provice =
"anhui"
,name =
"cao"
)
#颠倒实参顺序
Cao comes from Anhui.
Cao comes from Anhui.
默认实参
定义函数时,给形参一个默认值,调用函数时若提供了实参则使用提供值,否则使用默认值。
def
des_sb
(name,provice,dynasty=
"Three Kingdoms Era"
)
:
#定义时形参dynasty指定默认值
"""describe sb"""
print(
"%s comes from %s of %s."
%(name.title(),provice.title(),dynasty))
des_sb(name =
"cao"
,provice =
"anhui"
)
#形参此处未指定实参,调用默认值
des_sb(name =
"cao"
,provice =
"anhui"
,dynasty =
"Qin"
)
#dynasty指定实参,使用实参
Cao comes from Anhui of Three Kingdoms Era.
Cao comes from Anhui of Qin.
**注意:**以上三种参数传递方式可以混用,自己最容易理解的调用方式即可。
让实参可选
指定形参默认值为空字符串,放到所有形参最后,则该形参可空(可以提供实参也可以不用)。
def
return_fullname
(firstname,lastname,middlename=
""
)
:
"""Show fullname"""
if
middlename:
fullname =
" "
.join((middlename.title()+
""
+lastname,firstname.title()))
else
:
fullname =
" "
.join((lastname.title(),firstname.title()))
return
fullname
#返回fullname
#调用函数
fullname = return_fullname(firstname =
"cao"
,lastname =
"cao"
)
#middlename形参为空
fullname1 = return_fullname(firstname =
"cao"
,middlename =
"meng"
,lastname =
"de"
)
print(fullname)
print(fullname1)
Cao Cao
Mengde Cao
传递任意数量的实参
定义函数时使用:*形参名称。
def
known_tangera
(*heros)
:
#星号(*)使得Python将所有实参存入heros元组中
"""show known heros in tang"""
print(heros)
known_tangera(
"yuanba li"
,
"shiming li"
)
known_tangera(
"yuanba li"
,
"shiming li"
,
"cheng nuo"
)
(’yuba li’, ’shiming li’)
(’yuba li’, ’shiming li’, ’cheng nuo’)
结合使用位置实参和任意数量实参
在函数定义中将接纳任意数量实参的形参(*形参名)放在最后.。
def
make_pizza
(size, *toppings)
:
"""概述要制作的比萨"""
print(
"
Making a "
+ str(size) +
"-inch pizza with the following toppings:"
)
for
topping
in
toppings:
#toppings元组存储任意数量的实参
print(
"- "
+ topping)
make_pizza(
16
,
’pepperoni’
)
make_pizza(
12
,
’mushrooms’
,
’green peppers’
,
’extra cheese’
)
Making a 16-inch pizza with the following toppings:
- pepperoni
Making a 12-inch pizza with the following toppings:
- mushrooms -
- green peppers
- extra cheese
使用任意数量的关键字实参
定义函数时使用:**形参名称。
def
build_profile
(first, last, **user_info)
:
#形参**user_info 中的两个星号让Python创建一个名为user_info 的空字典,
#并将收到的所有名称—值对都封装到这个字典中。
"""创建一个字典, 其中包含我们知道的有关用户的一切"""
profile = {}
profile[
’first_name’
] = first
profile[
’last_name’
] = last
for
key, value
in
user_info.items():
profile[key] = value
return
profile
#传递
user_profile = build_profile(
’albert’
,
’einstein’
,
location=
’princeton’
,
field=
’physics’
)
print(user_profile)
{’first_name’: ’albert’, ’last_name’: ’einstein’, ’location’: ’princeton’, ’field’: ’physics’}
4、函数返回值
在函数中, 可使用return 语句将值返回到调用函数的代码行。
将函数存储在模块中并导入新程序中
将函数存储在被称为模块的独立文件(模块可以理解为以.py结尾的文件)中,再将模块导入到主程序中。import 语句允许在当前运行的程序文件中使用模块中的代码。导入模块的方法有多种, 下面对每种都作简要的介绍
导入整个模块
下面创建pizza模块,pizza.py:
def
make_pizza
(size, *toppings)
:
"""概述要制作的比萨"""
print(
"
Making a "
+ str(size) +
"-inch pizza with the following toppings:"
)
for
topping
in
toppings:
print(
"- "
+ topping)
在pizza.py所在的目录中创建另一个名为making_pizzas.py的模块:
import
pizza
#导入pizza模块
#让Python打开文件pizza.py,并将其中的所有函数都复制到这个程序中。
#本程序可以使用pizza.py中定义的所有函数。
pizza.make_pizza(
16
,
’pepperoni’
)
#调用pizza模块中make_pizza函数
pizza.make_pizza(
12
,
’mushrooms’
,
’green peppers’
,
’extra cheese’
)
Making a 16-inch pizza with the following toppings:
- pepperoni
Making a 12-inch pizza with the following toppings:
- mushrooms
- green peppers
- extra cheese
导入模块特定的函数
#从module_name模块中导入任意数量函数,函数之间逗号分割。
from module_name import function_0, function_1, function_2
making_pizzas.py
from
pizza
import
make_pizza
#只导入pizza模块中的make_pizza函数
make_pizza(
16
,
’pepperoni’
)
#调用pizza模块中make_pizza函数
make_pizza(
12
,
’mushrooms’
,
’green peppers’
,
’extra cheese’
)
导入模块中的所有函数
使用星号(* ) 运算符可让Python导入模块中的所有函数。
from
pizza
import
*
#导入pizza模块所有函数
make_pizza(
16
,
’pepperoni’
)
make_pizza(
12
,
’mushrooms’
,
’green peppers’
,
’extra cheese’
)
使用as 给函数指定别名
from
pizza
import
make_pizza
as
mp
#函数别名mp
mp(
16
,
’pepperoni’
)
mp(
12
,
’mushrooms’
,
’green peppers’
,
’extra cheese’
)
使用as 给模块指定别名
import
pizza
as
p
#模块别名p
p.make_pizza(
16
,
’pepperoni’
)
p.make_pizza(
12
,
’mushrooms’
,
’green peppers’
,
’extra cheese’
参考:Python编程: 从入门到实践Python基础教程(第3版)
END
各位伙伴们好,詹帅本帅搭建了一个个人博客和小程序,汇集各种干货和资源,也方便大家阅读,感兴趣的小伙伴请移步小程序体验一下哦!(欢迎提建议)
推荐阅读
牛逼!Python常用数据类型的基本操作(长文系列第①篇)
牛逼!Python的判断、循环和各种表达式(长文系列第②篇)
牛逼!Python函数和文件操作(长文系列第③篇)
牛逼!Python错误、异常和模块(长文系列第④篇)
推荐阅读
牛逼!Python常用数据类型的基本操作(长文系列第①篇)
牛逼!Python的判断、循环和各种表达式(长文系列第②篇)
牛逼!Python函数和文件操作(长文系列第③篇)
牛逼!Python错误、异常和模块(长文系列第④篇)
-
2023年血糖新标准公布,不是3.9-6.1,快来看看你的血糖正常吗? 2023-02-07
-
2023年各省最新电价一览!8省中午执行谷段电价! 2023-01-03
-
GB 55009-2021《燃气工程项目规范》(含条文说明),2022年1月1日起实施 2021-11-07
-
PPT导出高分辨率图片的四种方法 2022-09-22
-
2023年最新!国家电网27家省级电力公司负责人大盘点 2023-03-14
-
全国消防救援总队主官及简历(2023.2) 2023-02-10
-
盘点 l 中国石油大庆油田现任领导班子 2023-02-28
-
我们的前辈!历届全国工程勘察设计大师完整名单! 2022-11-18
-
关于某送变电公司“4·22”人身死亡事故的快报 2022-04-26
