目录
函数的介绍
在程序中反复执行的某些代码我们可以使用函数来封装。函数具有函数名、参数和返回值。Python中的函数很灵活:可以在模块中但是类之外定义,作用域是当前模块,我们称之为函数;也可以在别的函数中定义,称之为嵌套函数,还可以在类中定义,称为方法。
定义函数
def rect_area(width,height):
area=width*height
return area
def print_area(width,height):
area=width*height
print("{0}*{1}长方形的面积:{2}".format(width,height,area))
定义函数采用如上代码的形式定义。形式参数是定义函数时的参数不是实际数据,会在调用函数时传递给它们实际数据,所以我们称定义函数时的参数为形式参数,简称形参;称调用函数时传递的实际数据为实际参数,简称实参。
调用函数
使用位置参数调用函数
在调用函数时传递的实参与定义函数时的形参顺序一致,这是调用函数的基本形式。
def rect_area(width,height):
area=width*height
return area
r_area=rect_area(320,480)
print("{0}*{1}长方形的面积:{2:.2f}".format(320,480,r_area))
使用关键字参数调用函数
在调用函数时可以采用“关键字=实参”的形式,其中,关键字的名称就是定义函数时形参的名称。
def rect_area(width,height):
area=width*height
return area
r_area=rect_area(width=320,height=480) # 关键字的名称就是定义函数时形参的名称
print("{0}*{1}长方形的面积:{2:.2f}".format(320,480,r_area))
r_area=rect_area(height=480,width=320) # 实参不再受形参的顺序限制
print("{0}*{1}长方形的面积:{2:.2f}".format(320,480,r_area))
参数的默认值
在调用函数时如果提供参数,那么按照提供的参数,如果没有那么使用默认值。
def make_coffee(name="卡布奇诺"): # 默认值
return "制作一杯{0}咖啡。".format(name)
coffee1=make_coffee("拿铁") # 提供参数
coffee2=make_coffee() #没有提供参数,使用默认值
print(coffee1) # 制作一杯拿铁咖啡
print(coffee2) # 制作一杯卡布奇诺咖啡
可变参数
Python中的函数可以定义接收不确定数量的参数,这种参数称为可变参数。可变参数有两种,即在参数前加*或**。
基于元组的可变参数(*可变参数)
*可变参数在函数中被组装成一个元组。
def sum(*numbers): # 可变参数,多个参数被组装成元组numbers
total=0.0
for number in numbers:
total+=number
return total
print(sum(100.0,20.0,30.0))
print(sum(30.0,80.0))
基于字典的可变参数(**可变参数)
**可变参数在函数中被组装成一个字典。
def show_info(**info): # 可变参数
for key,value in info.items():
print('{0}-{1}'.format(key,value))
show_info(name='Tony',age=18,sex=True) # 多个参数被组装成字典info
show_info(student_name='Tony',student_no='1000')
函数中变量的作用域
变量可以在模块中创建,作用域(变量的有效范围)是整个模块, 被称为全局变量。变量也可以在函数中创建,在默认情况下作用域是整 个函数,被称为局部变量。
x=20 # 在模块中定义x,作用域是整个模块
def print_value():
x=10 # 在模块中定义变量x,作用域是整个函数,它会屏蔽模块变量x
print("函数中x={0}".format(x))
print_value()
print("全局变量x={0}".format(x))
函数中x=10
全局变量x=20
在一般情况下尽量不在模块和函数中定义两个同名变量,对于在模块和函数中各定义的一个同名变量,如果在函数中将其声明为global,则会将函数中的这个同名变量提升为全局变量。
# show_info(student_name='Tony',student_no='1000')
x=20 # 在模块中定义x,作用域是整个模块
def print_value():
global x # 将x变量提升为全局变量
x=10 # 在模块中定义变量x,作用域是整个函数,它会屏蔽模块变量x
print("函数中x={0}".format(x))
print_value()
print("全局变量x={0}".format(x))
函数中x=10
全局变量x=10
函数类型
Python中的任意一个函数都有数据类型,这种数据类型是function, 被称为函数类型。
理解函数类型
函数类型的数据与其他类型的数据是一样的,任意类型的数据都可 以作为函数返回值使用,还可以作为函数参数使用。因此,一个函数可 以作为另一个函数返回值使用,也可以作为另一个函数参数使用。
def add(a,b): # 返回两个数字数据之和
return a+b
def sub(a,b): # 返回两个数字数据之差
return a-b
def calc(opr): # 返回function类型的数据,即另一个函数add()或sub()
if opr=='+':
return add
else:
return sub
f1=calc('+') # 调用calc()函数返回数据f1,f1实际上是add()函数
f2=calc('-')
print("10+5={0}".format(f1(10,5)))
print("10-5={0}".format(f2(10,5)))
以上代码中定义的三个函数虽然都是函数类型的,但在细节方面还是有区别的,这个区别主要是函数参数列表。有两个参数的函数和有一个参数的函数是不同的函数类型。
def add(a,b): # 返回两个数字数据之和
return a+b
def sub(a,b): # 返回两个数字数据之差
return a-b
def square(a):
return a*a
add()和sub()函数有两个数字参数,具有相同的函数类型,square()函数只有一个数字参数,所以square()与add()、sub()函数类型不同。
过滤函数filter()
在Python中定义了一些用于数据处理的函数,如filter()和map()等。我们先介绍filter()函数。 filter()函数用于对容器中的元素进行过滤处理。
filter()函数的语法如下:
filter(function,iterable)
参数function是一个提供过滤条件的函数,返回布尔值。 参数iterable是容器类型的数据。
在调用filter()函数时,iterable会被遍历,它的元素会被逐一传入function()函数中。function()函数若返回True,则元素被保留,若返回False,则元素被过滤。最后遍历完成,已保留的元素被放到一个新的容器数据中。
def f1(x):
return x>50
data1=[66,15,91,28,98,50,7,80,99]
filtered=filter(f1,data1)
data2=list(filtered) # 转换为列表
print(data2)
[66, 91, 98, 80, 99]
注意:filter()函数的返回值并不是一个列表,如果需要返回列表类型的数据,则还需要通过list()函数进行转换。
映射函数map()
map()函数用于对容器中的元素进行映射(或变换)。例如:我想将列表中的所有元素都乘以2,返回新的列表。
map()函数的语法如下:
map(function,iterable)
参数function是一个提供变换规则的函数,返回变换之后的元素。 参数iterable是容器类型的数据。
在调用map()函数时,iterable会被遍历,它的元素会被逐一传入function()函数中,在function()函数中对元素进行变换。
def f1(x):
return x*2
data1=[66,15,91,28,98,50,7,80,99]
mapped=map(f1,data1)
data2=list(mapped) # 转换为列表
print(data2)
[132, 30, 182, 56, 196, 100, 14, 160, 198]
lambda()函数
我们之前学习的函数都是有名称的函数,例如前面定义的rect_area()函数,rect_area就是其函数名。我们也可以定义匿名函数,匿名函数就是没有名称的函数。 在Python中使用lambda关键字定义匿名函数。lambda关键字定义的函数也被称为lambda()函数,定义lambda()函数的语法如下。 “参数列表”与函数的参数列表是一样的,但不需要用小括号括起来。
lambda 参数列表:lambda体
注意:lambda体部分不能是一个代码块,不能包含多条语句,只有一条语句,语句会计算一个结果并返回给lambda()函数,但与有名称的函数不同的是,不需要使用return语句返回。
lambda()函数与有名称的函数一样,都是函数类型,所以前面的add()和sub()函数可以被lambda()函数替代。修改前面的代码示例如下:
def calc(opr):
if opr=='+':
return lambda a,b:(a+b) # 替代add()函数
else:
return lambda a,b:(a-b) # 替代sub()函数
f1=calc('+')
f2=calc('-')
print("10+5={0}".format(f1(10,5)))
print("10-5={0}".format(f2(10,5)))