把一段实现某个功能的完整代码,用一个函数封装,后期可以通过调用函数名,实现依次编写,多次调用的目的
函数,可以等价于我们初高中学过的f(x),f是运算法则,也就是代码函数中对应的代码执行块,每有一个x对应经过f运算之后得到一个值,如f(x)对应的是让x乘3加2,每有一个x进入f中便会得到一个值。
高中对应的函数三要素是,定义域、运算法则、值域,而编程中的函数也有三要素,分别为参数、功能、返回值。它们对应于函数中的三要素。
即在python内部已经封装好的函数。
如求取序列的长度len(),对一个序列进行排序sorted()等。每一个内置函数都有固定传入的形参和默认值,这是python编译器已经写好的。(具体数据类型一些常用的内置函数可见之前的内容)
格式:
def 函数名(形式参数1, 形式参数2, ......)(形参可有可无)
具体实现某个功能的完整代码
return(返回值可有可无)
函数调用:函数名(实际参数1, 实际参数2)
def 关键字 define 定义
函数名 遵循标识符命名规则
形参 要求调用者提供数据,可以没有
return 返回值,可以没有(默认为None)
【例子】
# 黑塔厨是这样的
def ihei1():
print("黑塔女士聪明绝顶!!!")
return "黑塔女士全肯定BOT1号启动"
def ihei2():
print("黑塔女士沉鱼落雁!!!")
return "黑塔女士全肯定BOT2号启动"
def ihei3():
print("黑塔女士举世无双!!!")
return "黑塔女士全肯定BOT3号启动"
def ihei(m):
# 未找到型号机器人调用此函数(此函数无返回值)
print(f"未找到{m}号黑塔机器人,无法启动夸夸模式")
i = int(input("请问想要启动哪一号小黑塔夸夸机器人:"))
if i == 1:
print(ihei1()) # 调用1号夸夸机器人
elif i == 2:
print(ihei2()) # 调用2号夸夸机器人
elif i == 3:
print(ihei3()) # 调用3号夸夸机器人
else:
ihei(i) # 未找到机器人,调用第四个函数
可变数据类型:列表、集合、字典
可变类型传参时,函数体内部修改会改变原数据
不可变数据类型:数字、字符串、元组
不可变类型传参时,函数体内部修改不会影响原数据
def ihei(action1, action2):
action1 = "关闭黑塔女士全肯定BOT1号"
action2["黑塔女士全肯定BOT2号"] = "关闭"
act1 = "开启黑塔女士全肯定BOT1号" # 数据类型为字符串(不可变数据类型),进入函数之后数据不变
act2 = {"黑塔女士全肯定BOT2号": "开启"} # 数据类型为字典(可变数据类型),进入函数之后数据被修改
ihei(act1, act2)
print(act1)
print(act2)
注意,在python中def一个函数,要与前后的代码块均空出两行位置
传参的个数和顺序必须和形参一样
【例】同P.2.*例子
调用函数时,格式:
函数名(形参名 = 实参值) (传参的顺序可以与函数定义的时候的形参顺序不同)
def ihei(action1, action2):
action1 = "关闭黑塔女士全肯定BOT1号" # 关闭黑塔女士全肯定BOT1号(字符串)
action2["黑塔女士全肯定BOT2号"] = "关闭" # 关闭黑塔女士全肯定BOT2号(字典)
act1 = "开启黑塔女士全肯定BOT1号"
act2 = {"黑塔女士全肯定BOT2号": "开启"}
ihei(action2=act2, action1=act1) # 直接将定义的实参赋给函数的形参,但注意形参的变量名必须与定义的时候一样,此时传参可不按定义时顺序。
print(act1)
print(act2)
定义函数时,直接给形参赋值
调用时不传实参,按默认值处理
传递实参,使用传递的实参
def ihei(action2, action1="关闭黑塔女士全肯定BOT1号"):
action2["黑塔女士全肯定BOT2号"] = "关闭"
return action1
act2 = {"黑塔女士全肯定BOT2号": "开启"}
print(ihei(act2)) # 此时调用ihei函数,act2作为参数传入函数进行修改,而在函数内部action1变量默认初始值为"关闭黑塔女士全肯定BOT1号",此时action1作为返回值被打印。
print(act2)
上述函数注意:可以有多个参数,但默认参数一定要在非默认参数之后,且默认与非默认参数不能交替传递
用args
数据的类型时元组
def ihei(*args):
print(type(args)) # 不定长参数以元组的形式传入
print(args)
ihei({"黑塔女士全肯定BOT1号": "开启"}, {"黑塔女士全肯定BOT2号": "关闭"}, { "黑塔女士全肯定BOT3号": "损毁"})
运用args时,可以传递多个参数,且被传递的参数以元组类型存储
若args后面还有形参时,必须使用关键字传参:
def ihei(*args, c):
print(type(args)) # 不定长参数以元组的形式传入
print(args)
print(type(c)) # 传入c的参数是什么数据类型便是什么数据类型
print(c)
ihei({"黑塔女士全肯定BOT1号": "开启"}, {"黑塔女士全肯定BOT2号": "关闭"}, c={"黑塔女士全肯定BOT3号": "损毁"})
标志 **kwargs (**必须有,kwargs是程序员约定俗成的)
kwargs以字典存储,关键字为键,实参值为值
def ihei(**kwargs):
print(type(kwargs)) # 不定长参数以字典的形式传入
print(kwargs)
ihei(黑塔女士全肯定BOT1号="开启", 黑塔女士全肯定BOT2号="关闭", 黑塔女士全肯定BOT3号="损毁")
# 打印结果:
#
# {'黑塔女士全肯定BOT1号': '开启', '黑塔女士全肯定BOT2号': '关闭', '黑塔女士全肯定BOT3号': '损毁'}
函数没有return或return后面没有内容,返回值默认为None
# 以本节第一段代码为例
def ihei(action1, action2):
action1 = "关闭黑塔女士全肯定BOT1号"
action2["黑塔女士全肯定BOT2号"] = "关闭"
return
act1 = "开启黑塔女士全肯定BOT1号" # 数据类型为字符串(不可变数据类型),进入函数之后数据不变
act2 = {"黑塔女士全肯定BOT2号": "开启"} # 数据类型为字典(可变数据类型),进入函数之后数据被修改
print(ihei(act1, act2)) # 打印结果为None
print(act1)
print(act2)
函数也可返回多个数据
当返回值有多个时,需要有多个变量去接受对应的返回值,若变量与返回值不对应的时候(只能有一个),默认返回一个元组
# 同以本节第一段代码为例
def ihei(action1, action2):
action1 = "关闭黑塔女士全肯定BOT1号"
action2["黑塔女士全肯定BOT2号"] = "关闭"
return action1, action2
act1 = "开启黑塔女士全肯定BOT1号" # 数据类型为字符串(不可变数据类型),进入函数之后数据不变
act2 = {"黑塔女士全肯定BOT2号": "开启"} # 数据类型为字典(可变数据类型),进入函数之后数据被修改
print(ihei(act1, act2))
# 打印结果为:('关闭黑塔女士全肯定BOT1号', {'黑塔女士全肯定BOT2号': '关闭'})
# 结果以元组类型存储
# ————————————————————————————————————————————————————————————————————————————
# 或用(参数个数)个变量接取函数调用之后返回值的结果
a, b = ihei(act1, act2)
print(a)
print(b)
变量的作用域:(指变量起作用的范围),根据作用范围的大小,将变量分成了局部变量和全局变量
局部变量:函数定义处的参数(形参)和函数内部定义的变量
作用域:仅在当前函数体内部,等函数执行结束,局部变量的生命周期结束
全局变量:在函数定义的变量或函数内部使用关键字global修饰的变量
作用域:从定义位置开始到程序结束,全局变量的生命周期才结束(函数体内部也可以使用全局变量)
可用global关键字声明在函数内部的变量视为全局变量
【例】
def ihei(action1, action2):
action1 = "关闭黑塔女士全肯定BOT1号"
action2["黑塔女士全肯定BOT2号"] = "关闭" # action1和action2是局部变量
act1 = "开启黑塔女士全肯定BOT1号"
act2 = {"黑塔女士全肯定BOT2号": "开启"}
ihei(act1, act2) # act1和act2是全局变量
print(act1)
print(act2)
没有名字的函数,只能用一回(但是给匿名函数赋一个变量名),一般情况下函数体只有一句代码且返回值只有一个的时候,可以使用匿名函数来简化,关键字:lambda
格式:
lambda 参数列表:表达式
print((lambda a, b, c: a + b + c)("黑塔女士聪明绝顶!!!\n", "黑塔女士沉鱼落雁!!!\n", "黑塔女士举世无双!!!\n"))
# 可以用一个变量来对该匿名函数进行调用
ihei = lambda a, b, c: a + b + c
print(ihei("BOT1\n", "BOT2\n", "BOT3\n"))
***匿名函数因为也有参数,可以用上面自定义的几种传参方式进行参数的传递
更多内容请看——>python1_Gu_shiwww的博客-CSDN博客
下一篇跳转链接:python面向对象-CSDN博客