python函数

四、函数定义

P.1函数定义

        把一段实现某个功能的完整代码,用一个函数封装,后期可以通过调用函数名,实现依次编写,多次调用的目的

        函数,可以等价于我们初高中学过的f(x),f是运算法则,也就是代码函数中对应的代码执行块,每有一个x对应经过f运算之后得到一个值,如f(x)对应的是让x乘3加2,每有一个x进入f中便会得到一个值。

        高中对应的函数三要素是,定义域、运算法则、值域,而编程中的函数也有三要素,分别为参数、功能、返回值。它们对应于函数中的三要素。

P.2函数分类

P.2.1内置函数

即在python内部已经封装好的函数。

如求取序列的长度len(),对一个序列进行排序sorted()等。每一个内置函数都有固定传入的形参和默认值,这是python编译器已经写好的。(具体数据类型一些常用的内置函数可见之前的内容)

P.2.2自定义函数

格式:

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)               # 未找到机器人,调用第四个函数

P.2.*可变/不可变类型传参区别:

可变数据类型:列表、集合、字典
可变类型传参时,函数体内部修改会改变原数据

不可变数据类型:数字、字符串、元组
不可变类型传参时,函数体内部修改不会影响原数据

def ihei(action1, action2):
    action1 = "关闭黑塔女士全肯定BOT1号"
    action2["黑塔女士全肯定BOT2号"] = "关闭"


act1 = "开启黑塔女士全肯定BOT1号"             # 数据类型为字符串(不可变数据类型),进入函数之后数据不变
act2 = {"黑塔女士全肯定BOT2号": "开启"}       # 数据类型为字典(可变数据类型),进入函数之后数据被修改
ihei(act1, act2)
print(act1)
print(act2)

P.3函数传参

注意,在python中def一个函数,要与前后的代码块均空出两行位置

P.3.1位置传参

传参的个数和顺序必须和形参一样

【例】同P.2.*例子

P.3.2关键字传参

调用函数时,格式:

函数名(形参名 = 实参值)                    (传参的顺序可以与函数定义的时候的形参顺序不同)

def ihei(action1, action2):
    action1 = "关闭黑塔女士全肯定BOT1号"        # 关闭黑塔女士全肯定BOT1号(字符串)
    action2["黑塔女士全肯定BOT2号"] = "关闭"    # 关闭黑塔女士全肯定BOT2号(字典)


act1 = "开启黑塔女士全肯定BOT1号"
act2 = {"黑塔女士全肯定BOT2号": "开启"}
ihei(action2=act2, action1=act1)               # 直接将定义的实参赋给函数的形参,但注意形参的变量名必须与定义的时候一样,此时传参可不按定义时顺序。
print(act1)
print(act2)

P.3.3默认传参

定义函数时,直接给形参赋值

        调用时不传实参,按默认值处理

        传递实参,使用传递的实参

def ihei(action2, action1="关闭黑塔女士全肯定BOT1号"):
    action2["黑塔女士全肯定BOT2号"] = "关闭"
    return action1


act2 = {"黑塔女士全肯定BOT2号": "开启"}       
print(ihei(act2))        # 此时调用ihei函数,act2作为参数传入函数进行修改,而在函数内部action1变量默认初始值为"关闭黑塔女士全肯定BOT1号",此时action1作为返回值被打印。
print(act2)

上述函数注意:可以有多个参数,但默认参数一定要在非默认参数之后,且默认与非默认参数不能交替传递

P.3.4不定长参数(可以传递多个参数)

用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号": "损毁"})

P.3.5关键字不定长参数

标志        **kwargs        (**必须有,kwargs是程序员约定俗成的)

kwargs以字典存储,关键字为键,实参值为值

def ihei(**kwargs):
    print(type(kwargs))           # 不定长参数以字典的形式传入
    print(kwargs)


ihei(黑塔女士全肯定BOT1号="开启", 黑塔女士全肯定BOT2号="关闭", 黑塔女士全肯定BOT3号="损毁")


# 打印结果:
# 
# {'黑塔女士全肯定BOT1号': '开启', '黑塔女士全肯定BOT2号': '关闭', '黑塔女士全肯定BOT3号': '损毁'}

P.3.6函数返回值

函数没有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)

P.3.7函数中的变量

变量的作用域:(指变量起作用的范围),根据作用范围的大小,将变量分成了局部变量和全局变量

局部变量:函数定义处的参数(形参)和函数内部定义的变量

        作用域:仅在当前函数体内部,等函数执行结束,局部变量的生命周期结束

全局变量:在函数定义的变量或函数内部使用关键字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)

P.4匿名函数

没有名字的函数,只能用一回(但是给匿名函数赋一个变量名),一般情况下函数体只有一句代码且返回值只有一个的时候,可以使用匿名函数来简化,关键字: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博客

你可能感兴趣的:(python函数)