Python中的函数

目录

函数的介绍

定义函数

调用函数

使用位置参数调用函数

使用关键字参数调用函数

参数的默认值

可变参数

基于元组的可变参数(*可变参数)

基于字典的可变参数(**可变参数)

函数中变量的作用域

函数类型

理解函数类型

过滤函数filter()

映射函数map()

lambda()函数

函数的介绍

在程序中反复执行的某些代码我们可以使用函数来封装。函数具有函数名、参数和返回值。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)))

你可能感兴趣的:(Python从入门到精通,python)