8函数
在程序中需要反复执行的代码,我们一般把它们封装为一个函数。
8.1定义函数
自定义函数的语法格式如下:
def 函数名(形式参数列表):
函数体
return 返回值
示例代码如下:
# -*- coding: utf-8 -*-
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))
8.2调用函数
一般有两种调用函数的方式。
8.2.1位置参数调用函数
# -*- coding: utf-8 -*-
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))
area = rect_area(1, 1)
print(area)
8.2.2关键字调用函数8.3
# -*- coding: utf-8 -*-
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))
area = rect_area(width = 1, height = 1)
print(area)
8.3 参数的默认值
Python中没有函数重载的概念,而是为函数的参数提供了默认值。
def make_coffee(name="卡布奇诺"):
return "制作一杯{0}咖啡。".format(name)
coffee1 = make_coffee("拿铁")
coffee2 = make_coffee()
print(coffee1) # 制作一杯拿铁咖啡
print(coffee2) # 制作一杯卡布奇诺咖啡
8.4可变参数
Python中的函数可以定义接受不确定数量的参数,这种参数被称为可变参数。可变参数有两种,即在参数前加*或**。
8.4.1 基于元组的可变参数(*可变参数)
*可变参数在函数中被组装成一个元组。
示例代码如下:
# -*- coding: utf-8 -*-
def sum(*numbers):
total = 0.0
for number in numbers:
total += number
return total
print(sum(100.0,10.0,30.0)) # 输出150.0
print(sum(30.0,80.0)) # 输出110.0
8.4.2 基于字典的可变参数(**可变参数)
**可变参数在函数中被组装成一个字典。
示例代码如下:
# -*- coding: utf-8 -*-
def show_info(**info):
print('-----show_info------')
for key, value in info.items():
print('{0} : {1}'.format(key, value))
show_info(name='Tony', age=18, sex=True)
show_info(student_name='Tony',student_no='1000')
8.5函数中变量的作用域
变量可以在模块中创建,作用域(变量的有效范围)是整个模块,被称为全局变量。变量也可以在函数中创建,在默认情况下作用域是整个函数,被称为局部变量。
# -*- coding: utf-8 -*-
x = 20
def print_value():
x = 10
print("函数中x = {0}".format(x))
print_value()
print("全局变量x = {0}".format(x))
我们可以将局部变量提升为全局变量:
# -*- coding: utf-8 -*-
x = 20
def print_value():
global x
print("函数中x = {0}".format(x))
print_value()
print("全局变量x = {0}".format(x))
8.6函数类型
Python中的任意一个函数都有数据类型,这种数据类型是function,被称为函数类型。
8.6.1 理解函数类型
函数类型的数据与其他类型的数据是一样的,任意类型的数据都可以作为函数返回值使用,还可以作为函数参数使用。因此,一个函数可以作为另一个函数返回值使用,也可以作为另一个函数参数使用。
# -*- coding: utf-8 -*-
# 定义加法函数
def add(a, b):
return a + b
# 定义减法函数
def sub(a,b):
return a - b
# 定义计算函数
def calc(opr):
if opr == '+':
return add
else:
return sub
f1 = calc('+') # f1实际上是add函数
f2 = calc('-') # f2实际上是sub函数
print("10 + 5 = {0}".format(f1(10,5)))
print("10 - 5 = {0}".format(f2(10,5)))
函数参数列表参数数目不同则不是同类型的函数。
8.6.2 过滤函数filter()
在Python中定义了一些用于数据处理的函数,如filter()和map()等。我们先介绍filter()函数。
filter()函数用于对容器中的的元素进行过滤处理。语法如下:
filter(function,iterable)
参数function是一个提供过滤条件的函数,返回布尔值。参数iterable是容器类型的数据。
在调用filter()函数时,iterable会被遍历,它的元素会被逐一传入function()函数中。function()函数若返回Ture,则元素被保留;若返回False,则元素被过滤。最后遍历完成,已保留的元素被放到一个新的容器数据中。
示例代码如下:
# -*- coding: utf-8 -*-
#提供过滤条件函数
def f1(x):
return x > 50 # 找出大于50的元素
data1 = [66,15,91,28,32,32,132,67,11,32]
filtered = filter(f1, data1)
data2 = list(filtered) # 转换为列表
print(data2)
注意:filter()函数的返回值并不是一个列表,如果需要返回列表类型的数据,则还需要通过list()函数进行转换。
8.6.3映射函数map()
map()函数用于对容器中的元素进行映射(或变换)。语法如下:
map(function,iterable)
参数function是一个提供变换规则的函数,返回变换之后的元素。参数iterable是容器类型的数据。在调用map()函数时,iterable会被遍历,它的元素被逐一传入function()函数中,在function()函数中对元素进行变换。
# -*- coding: utf-8 -*-
# 提供变换规则的函数
def f1(x):
return x * 2 # 变换规则乘以2
data1 = [21,512,33,53,52,61,56]
mapped = map(f1,data1)
data2 = list(mapped) # 转换为列表
print(data2)
8.7 lambda()函数
在Python中使用lambda关键字定义匿名函数。lambda关键字定义的函数也被称为lambda()函数,定义lambda()函数的语法如下:
lambda 参数列表:lambda体
注:lambda体部分不能是一个代码块,不能包含多条语句,只能有一条语句,语句会计算一个结果并返回给lambda()函数,但与有名称的函数不同的是,不需要使用return语句返回。
lambda()函数与有名称的函数一样,都是函数类型,所以可以修改上面的代码,示例如下:
# -*- coding: utf-8 -*-
# 提供变换规则的函数
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)))
8.8使用lambda()函数
# -*- coding: utf-8 -*-
data1 = [66,15,91,28,98,50,7,80,99]
filtered = filter(lambda x: (x > 50),data1)
data2 = list(filtered)
print(data2)
mapped = map (lambda x: (x * 2), data1)
data3 = list(mapped)
print(data3)