一、函数的定义和调用
1.定义函数
自定义函数的语法格式如下所示在 Python 中,你可以定义一个自己想要功能的函数,
基于上述格式,下面对函数定义的规则进行说明:
(1).函数代码块以 def 开头,后面跟的是函数名和(参数列表)。
(2).函数名的命名规则跟变量的命名规则是一样的,即只能是字母、数字和下划线的任何组合,且不能以数字开头,并且不能跟关键字重名。
(3).函数的参数必须放在圆括号中。
(4).函数的第1行语句可以选择性地写文档字符串来存放函数说明,函数说明一般用一对三个单引号或三个双引号都行,它和 注释# 一个道理,都不是真正运行的程序。
(5).函数内容以冒号起始,并且缩进。
(6).return 表达式结束函数,选择性地返回一个值给调用方。不带表达式的 return 相当于返回 None.
接下来,我们定义一个能够完成打印信息的函数,例:
def greet(name): # 定义一个name形参,被用于接受值
"""这是一个打招呼的函数"""
print("初次见面。")
return "你好,{}!".format(name)
# 用str.format字符串格式化,{}用于存放最终生成greet变量插入的值
print(greet("世界"))
print(greet)函数调用之完,打印“初次见面”。然后,返回一个字符串格式化的name 传到下面要调用的print函数。
调用结果。
二、函数的参数
理解函数的参数作用前,补充两个概念:形参和实参
(1).形参(形式参数)
形参是在函数定义时使用的变量,用于接收传递给函数的值。
形参只在函数内部有效,它们是局部变量。
形参在函数被调用之前不占用内存中的具体存储位置。
(2).实参(实际参数)
实参是在函数调用时传递给函数的值。
实参可以是常量、变量、表达式或任何可以计算为值的东西,实参的值在函数调用时被传递给对应的形参。
1.函数参数的传递
现在结合上面的例子,学习“函数参数的传递”,比如:计算两个数的和,并打印计算结果
def add():
c = 2 + 3
print(c)
add()
这里由于固定计算两个的数值,无论调用多少次add( ),结果都是5,使得该函数很局限。
因此,为了能让定义的函数更加通用,可以任意计算两个数字的和,就在定义函数的时候添加两个参数,让这两个参数来接收传递给函数的值。
# 定义两个接收传递的参数 a和b
def add(a, b):
c = a + b
print(c)
# 调用带有参数的函数
add(3, 4)
现着我们可以计算任意两个数字的和,其他运算法则与此类似。此外,要注意定义传递几个参数,就调用几个参数。
2.默认参数
定义函数时,可以给函数的参数设置默认值,这个参数被称为默认参数,当调用函数时,由于默认参数在定义时已经被赋值,所以可直接调用,而其它参数(如:不是被定义的函数参数)是必须传入值的。如果默认参数没有传入值,则直接使用默认的值。如果默认参数传入了值,则使用传入的新值替代原来的默认值。
举个栗子:
def animal_info(name, characteristic="troublemaker"):
# 定义带有两个参数的animal_info函数
print("Name: ", name)
print("Characteristic: ", characteristic)
'''以上代码中,name参数没有默认值,characteristic参数
有默认值troublemaker'''
python = 'snake' # 这是没设置默认值的参数/变量
animal_info(name="cat")
# 调用animal_info函数,只给name参数传入值,而characteristic参数则会用默认值“troublemaker”
animal_info(name="turtle", characteristic="drawing!")
# 调用animal_info函数,给name参数和characteristic参数都传入新的值
还要注意的是:带有默认值的参数要一定要位于参数列表的末尾,否则会报错!
3.不定长参数
通常我们确定的参数个事不确定或比较多,此时可以在函数中使用不定长参数(可理解为不确定长度的参数)。语句格式如下:
在上述语句格式中,函数名后面共有3个参数。其中,formal_args 为形参(也就是前面所用的参数,如a,b),*args 和**kwargs 为不定长参数。当调用函数的时候,函数传入的参数个数会优先匹配formal_args参数的个数。如果传入的参数个数和 formal_args 参数的个数相同,不定长参数会返回空的元组或字典。如果传入参数的个数比formal_args 参数的个数多,可以分为如下两种情况:
(1)如果传入的参数没有指定名称,那么 *args 会以元组的形式存放这些多余的参数。
(2)如果传入的参数指定了名称,如 m=1,那么**kwargs 会以字典的形式存放这些被命名的参数,如 { m :1}
举个栗子:
def num(a, b, *args) # *args是不定长参数
print(a)
print(b)
print(*args)
num(1,2,3) # 调用1,2,3
在输出结果中,(3,)表示 *args 接收到了一个包含单个元素3 的元组。如果调用 num(1,2,3,4),则*args 将是一个包含两个元素的元组:(3,4)。
如果在参数列表末尾加上**kwargs参数:
def num(a, b, *args, **kwargs):
# *args、**kwargs是不定长参数
print(a)
print(b)
print(args)
print(kwargs)
num(1, 2, 3, 4, 5, 6)
# 调用1、2、3、4、5、6
可以看到此时,调用函数num传入了多个数字,从左到右依次匹配完a,b,其余全配不定长参数*args,不定长参数**kwargs 没收到任何数据,所以为‘空字典’
def num(a, b, *args, **kwargs):
# *args、**kwargs是不定长参数
print(a)
print(b)
print(args)
print(kwargs)
num(1, 2, 3, 4, x=5, y=6)
# 调用1、2、3、4、5、6
现在给 **kwargs参数 调用’5’和’6’
可以发现,如果我们的参数有以键值对的形式传入,那么就会被 **kwargs参数 接收。
三、函数的返回值
在Python中,函数的返回值用return 语句来执行。它的作用是结束当前函数的执行,并将结果返回给调用者。如果一个函数没有 return 语句,或者 return 语句没有指定返回值(即 return 后面没有值),那么函数将返回默认值 None。例:
def add(a, b):
c = a + b
if c < 0:
return # a+b小于0 就返回空值None
return c # a+b>0 就正常返回和的结果
print(add(1, -2))
因为1+(-2) < 0 , 返回结果如下:
四、函数的分类
根据有没有参数和返回值,函数大概可以分为以下四种类型:
(1)函数无参数、无返回值(没钱白给型)
通过一个打印函数示例:(想啥来啥,写个快乐!)
def display_menu():
print("-----Order_System-----")
print("Fried rice with egg")
print("Curry rice")
print("Fish ball soup")
print("Mushroom soup")
print("Fried eggplant")
print("soda")
print("pudding")
display_menu()
无参数、无返回值的函数,既不能接收也没有返回值。
调用展示菜单。
(2)函数无参数、有返回值(没钱白嫖型)
此类函数类型,一般用于采集数据、调查概率之类的情况会比较常用。
def get_price():
return float(input("你的预算: ")) # 假定你输入的数作为返回值
total_price = get_price()
print("总共消费:", total_price)
可以看到get_price( )里面没参数
打印结果......(p^ o ^p)
(3)函数有参数、无返回值。
这个类型比较少用吧,通常作为定义了模块,传入了参数,是希望有返回值的。
def person(a, b):
piece = a + "、" + b
print("用餐人员:{}".format(piece))
person("小明", "小红")
这里只算有定义和调用,没有明显的return,就不叫有返回值,或者就写个return后面不接任何东西,也会返回None。
调用结果。
(4)函数有参数、有返回值。
一般有参数、有返回值的函数,是我们会经常用到的。
举例:
while True:
def friend(num):
num *= 1.5 # 一般讲究菜数为人数的1.5倍
return num # 返回给下面变量piece的调用
num = int(input("请输入用餐人数:")) # 人数应当是整的
piece = friend(num)
print("一共点", int(piece), "道菜。") # 菜数也应当是整的
代码逻辑如下:
1.def friend(num):定义了一个名为 friend 的函数,它接受一个参数 num。
2.num *= 1.5 将传入的 num 参数乘以 1.5。这里使用的是乘法赋值运算符 *=,它等同于 num =num * 1.5。
3. return num 将乘以 1.5 之后的 num 返回。此时,num 代表的是菜品数。
4.num = int (input(”请输入用餐人数:”)) 这行代码请求用户输入用餐的人数,并将输入的字符串转换为整数类型,存储在变量 num 中。
5.piece = friend(num) 调用 friend 函数,并将输入的人数num 作为实参传递给函数。函数处理后返回的菜品数赋值给变量 piece。
6.print("一共点”,int(piece),"道菜。”)打印输出最终的菜品数。由于 friend 函数返回的是一个浮点数,这里通过 int(piece)将浮点数转换为整数,以确保输出的菜品数是整数值。
综上所述,输入的num作为实参传递给 friend 函数,函数处理后返回的 num(此时代表菜品数)再传递给变量 piece,最后打印出来。这个过程中,num 先是作为用餐人数的输入,然后通过函数处理得到菜品数,最后输出。
用了while True 循环,所以你可以输入很多次
P.S.
还有很多函数,后续用到再慢慢balabala....