函数:是封装了某一功能的代码块,可以重复使用。
是Python已经提前定义好的函数,当遇到具体场景可以直接使用。
返回对象的长度或元素个数:
length = len([1,2,3,4,5])
print(length) # 输出:5
# 返回字符串中元素的个数:
name = len("Barbara")
print(name) # 输出:7
# 返回元组的长度:
fruit = len(("apple","banana","pear"))
print(fruit) # 输出:3
查询对象的数据类型
print(type(1)) # 整型
print(type("barbara")) # 字符串
# 输出:
def sayHi(): # sayHi是函数名
print("Hi") # 实现函数的功能
关键字def是用来高数Python,我们要定义新函数。
def 在英语里是define的缩写,本意是“定义”,它是定义函数的固定形式。
命名规则:
1. 函数名最好是动词,尽量体现函数的功能。
2. 用字母,下划线和数字组成,且不以数字开头。
3. 不与关键字重名,不出现下划线—以外的特殊符号。
调用函数:
def sayHi(): # 定义函数
print("Hi")
# 调用函数
sayHi()
# 程序通过函数名,来定位函数体中的代码
def sayWelcome(disount): # 形参
print("欢迎光临")
print(f"商品一律{discount}")
sayWelcome("7.8折") # 实参
形参:定义函数时,括号内指定的变量名
实参:调用函数时,括号内设置的数据
实参本质是“数据”,调用函数时,会把这个函数传递给形参
关键字实参:
调用函数时,直接在括号内指名道姓地对形参进行赋值。形参=实参的方式传递数据
def sayWelcome(store,discount):
print(f"欢迎光临{store}")
print(f"商品一律{discount}")
# 调用函数
sayWelcome(store="商品店",discount="7.8折")
# 使用形参=实参的方式传递
关键字实参的顺序无关紧要,只要给形参赋值相同的实参,结果都一样。
sayWelcome(store="商品店",discount="7.8折")
和 sayWelcome(discount="7.8折",store="商品店")
结果相同
位置实参
def sayWelcome(store,discount):
print(f"欢迎光临{store}")
print(f"商品一律{discount}")
# 调用函数
sayWelcome("水果铺","7.8折)
缺少实参:
实参和形参个数应该保持一致,缺少实参会程序报错。
位置实参的顺序:
位置实参的顺序很重要,如果指定错误,则结果会受影响:
def petMsg(name,pet):
print(f"{name}有一只{pet}")
petMsg("小明","猫") # 输出:小明有一只猫
petMsg("猫","小明") # 输出:猫有一只小明
默认值形参:
def getArea(R,pi=3.14): # 默认值形参
area = pi*R*R
print(area)
# 调用函数,设置实参为2
getArea(2)
参数的优先级:
调用函数时,如果给默认值形参提供了实参值,那么该形参将优先使用实参值。
def getArea(R,pi=3.14):
area = pi*R*R
print(area)
getArea(2,3.1415)
# 输出:12.56636
如上图,形参pi会优先使用接受的实参值3.1415,而不是默认值3.14
默认值形参的位置:
在定义函数时,先写非默认的形参,后写默认值形参
也就是所=说,默认值形参只能放在非默认值形参的后面,否则会程序报错。
例如:def getArea(pi=3.14,R)
getArea(2)
可以理解为:调用函数时,程序不知道数据2到底是修改pi的默认值,还是传递给R
def getArea(length):
area = length*length
print(area)
if getArea(13) > 160:
print("面积足够大") # 此时程序会报错
因为函数内数据被直接输出,没有传递到函数外,没办法用getArea(13)
和160比较大小。
def getArea(length):
area = length*length
return area
# 调用函数,再将结果赋值给变量result
result = getArea(13)
print(result) # 输出:169
关键字return,将函数内的数据返回到调用函数的位置
return后面是指定的返回值,返回值会返回到调用的地方
调用函数的代码getArea(13)
等同于一个变量,用于保存函数的返回值169
任意类型的返回值:
return的返回值没有类型限制,可以是一个变量名,一串字符串,甚至是一个表达式。
return length*length
返回多个值:
def getSize(length):
perimeter = 4*length
area = length**2
return perimeter,area # 用逗号隔开
print(getSize(6)) # 输出:(24,36)元组
当函数返回多个值时,返回值间用逗号隔开。此时的返回值,会以元组的形式返回。
return的位置:
return是函数结束的标志
函数内可以有多个return,但只要执行一次,整个函数就会结束运行。所以return的位置决定了函数能执行到哪一步。
def add(num):
total = 0
for i in num:
total = total+i
return total # 循环结束后再返回total
number = add([1,2,3])
print(number)
def add(num):
total = 0
for i in num:
total = total+i
return total # 第一次循环后直接返回total
number = add([1,2,3])
print(number)
局部变量:就是在函数内部定义的变量,只能在函数内使用,出了函数就不能使用了。
全局变量:就是在函数外定义的变量。可以在函数内使用,也可以在函数外使用。
同名变量:
pi = 3.14 # 全局变量
def getArea(radius):
pi = 3.1415 # 局部变量
area = pi*radius*radius
return area
print(getArea(2)) # 输出:12.566
print(pi) # 输出:3.14
第1和第3行都定义了变量pi,但是本质上他们不是同一个变量。
因为第3行的pi在函数内重新定义了,属于局部变量,不论如何赋值都不会影响到第一行的全局变量pi的值。
所以,建议对全局变量和局部变量使用不同的变量名
# 使用 lambda 创建匿名函数,并赋值给变量square
square = lambda x:x*x # x为形参
# 通过变量名square,传入参数9,调用该匿名函数,并输出
print(square(9))
关键字lambda
,用来创建匿名函数。
表达式x*x
,是函数的返回值,这个表达式的结果将返回到调用函数的地方。
所以匿名函数可以看做是return型的简便写法。
变量square,可以通过该变量调用匿名函数
多个形参
add = lambda x,y:x+y
print(add(3,4))
# 调用函数时,以位置实参的方式,依次传递数据。
数学例子:
假设sum()
等于前n个正整数的和,即:
sum(n)=1+2+3+4+(n-1)+n
直接计算会很麻烦,用递归的思想,将原始问题拆解为等价的子问题。
换句话说,我们要计算sum(n)
,不妨先去计算更简单的sum(n-1)
。
但是,由于n
变成了n-1
,范围变小,为了保证等价,可以用sum(n-1)
加上n
。
# 定义名为sum() 函数,传入参数n
def sum(n):
if n == 1:
return 1
return n+sum(n-1)
# 调用sum()函数,传入参数5,并输出
print(sum(5)) # 输出:15
终止条件
n == 1
是终止条件,是递归执行到满足某一条件后,就返回具体的结果,避免程序无限递归下去。
递归前进条件:
sum(n)
等于n
加上sum(n-1)
。所以,函数返回了n+sum(n-1)
。