作者主页:编程指南针
作者简介:Java领域优质创作者、CSDN博客专家
、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、腾讯课堂常驻讲师主要内容:Java项目、Python项目、前端项目、人工智能与大数据、简历模板、学习资料、面试题库、技术互助
收藏点赞不迷路 关注作者有好处
文末获取源码
三.函数实现模块化编程
在编程语言中,大都通过函数来实现对相关代码的封装,实现模块化编程,完成代码的可重用设置。Python有内置函数和自定义函数。
3.1 函数定义与调用
语法:
def functionname([parameterlist]):
['''comments''']
[functionbody]
* functionname: 函数名
* parameterlist: 参数列表
* comments: 说明
* functionbody : 函数体
示例:定义一个过滤危险字符的函数filterchar()
def filterchar(string):
'''功能说明:过滤指定的字符串,并将过滤后的结果输出
没有返回值
'''
import re #导入Python的re模块
pattern = r'(黑客)|(抓包)|(监听)|(Trojan)' #模式字符串
sub = re.sub(pattern,'@_@',string) #进行模式替换
print(sub)
调用的函数基本语法。
functionname([parametersvalue])
示例:
str = '我是一名热爱黑客的程序员,喜欢研究Trojan'
filterchar(str)
如果定义一个函数还不知道做什么用,可以使用pass来填充函数体,也可以使用’…'来表示省略代码。
def functionname():
pass
def functionname():
...
3.2 参数传递
参数的作用是传递数据给函数使用,在函数体内进行相应的数据处理。
形式参数:简称形参,是指定义函数时,括号里面的参数。就像电影剧本中的角色。
实际参数:简称实参,是指调用函数时,传递的实际参数值。就像出演电影角色的演员。
根据实参的类型不同,又分为值传递(类型为不可变类型)和引用传递(类型为可变类型)。二者的具体区别是,进行值传递时,改变形参的值,实参的值不变;引用传递时,改变形参的值,实参的值也发生改变。
示例:
#值传递和引用传递
def demo(obj):
print("原值:",obj)
obj += obj
#调用函数
print("---------值传递--------")
mot = "唯有在被追赶的时候,你才能真正的奔跑"
print("函数调用前:",mot)
demo(mot)
print("函数调用后:",mot)
print("---------引用传递--------")
list1 = ['邓肯','吉诺比利','帕克']
print("函数调用前:",list1)
demo(list1)
print("函数调用后:",list1)
在进行参数传递时,数量和数据类型要求和定义函数时的参数要求保持一致。也可以通过关键字参数来传递,这样就可以不必保持和定义时候的参数位置保持一致了。
比如:
functionname(height=20,width=30,height=50)
参数默认值:也可以为参数指定默认值,这样调用时可以不传参
#函数参数默认值
def abc(str='aaa'):
print(str)
abc()
可变参数:一种是*parameter ,一种是 **parameter
*parameter : 表示接受任意多个实参放在一个元组中。
示例:
#定义可变参数
def printplayer(*name): #定义输出我喜欢的NBA球员函数
print('\n 我喜欢的NBA球员有:')
for item in name:
print(item) #输出球员名称
printplayer('邓肯')
printplayer('邓肯','乔丹','大佛')
如果想使用一个已经存在的列表作为参数,可以在列表名称字前加*
param =['邓肯','乔丹','大佛']
printplayer(*param)
**parameter: 表示接受任多个显示赋值的多个参数,将其放入一个字典中。
#可变参数
def printsign(**sign):
print()
for key,value in sign.items():
print("["+key+"] 的绰号是:"+value)
printsign(邓肯='石佛',罗宾逊='海军上将')
如果想把一个己存在的字典作为可变参数传递,可以在参数名前加 **:
param ={'邓肯':'石佛','罗宾逊':'海军上将'}
printsign(**param)
3.3 返回值
函数执行完后可以返回相关的执行结果。
示例:
#函数返回值
def fun_checkout(name):
nickname=""
if name == '邓肯':
nickname = '石佛'
elif name == '吉诺比利':
nickname = '妖刀'
elif name == '罗宾随逊':
nickname = '海军上将'
else:
nickname = '查无此人'
return nickname
while FutureWarning:
name = input("请输入NBA求员的名称:")
nickname = fun_checkout(name)
print("球 员:",name,"绰号:",nickname)
3.4 变量的作用域
局部变量:指在函数内部定义的变量,只能在函数内部使用。
全局变量:如果一个变量在函数外定义,那么即可以在函数外使用,也可以在函数内使用;在函数体内定义的变量名前加global关键字,此变量也可以变为一个全局变量。
示例:
#局部变量
def fun_variable():
var_name = '指南针毕业设计出品'
print(var_name)
fun_variable()
print(var_name) #函数名使用局部变量时,抛出 NameError
示例:
#全局变量
var_name = '指南针毕业设计出品'
def fun_variable():
print(var_name)
fun_variable()
print(var_name)
示例:
#全局变量
def fun_variable():
global var_name
var_name = '指南针毕业设计出品'
print(var_name)
fun_variable()
print(var_name)
3.5 匿名函数
不给函数指定名字,一般是一次性的调用,临时性。
result = lambda[args[,args,..argn]]:expression
* result:用于调用lambda表达式
* [arg1[,arg2,...argn]]:可选参数,用于指定要传的参数列表,多个参数间用,号分隔
* expression:必须参数,用于指定一个实现具体功能的表达式.
示例:计算圆的半径
import math
def circlearea(r):
result = math.pi*r*r
return result
r = 10
print("半径为",r,"的圆的面积为:",circlearea(r))
如果用匿名函数实现如下:
import math
r = 10
result = lambda r:math.pi*r*r
print("半径为",r,"的圆的面积为:",result(r))