函数
- 在模块中但是类之外定义的函数——>函数
- 在别的函数中定义的函数——>嵌套函数
- 在类中定义的函数——>方法
函数定义
格式如下:
def 函数名(形参列表):
函数体
return 返回值
函数调用
使用位置参数调用函数
- 在调用函数时传递的实参与定义函数时的形参顺序一致
def add(p1,p2):
return p1+p2
p = add(3.7,5)
print(p)
使用关键字参数调用函数
- 采用“关键字 = 实参”的形式调用函数
def subtraction(p1,p2):
return p1-p2
ans1 = subtraction(3.9,5)
ans2 = subtraction(p2=3.9,p1=5)
print('ans1 = {} \n ans2 = {}'.format(ans1,ans2))
参数默认值
- 即在定义函数时直接指定形式参数的默认值。这样,当没有传入参数时,则直接使用定义函数时设置的默认值。
- 注:指定有默认值的形式参数必须在所有没默认值参数的最后,否则会产生语法错误。
这样就有语法错误
这样就没有语法错误
可变参数
- python中的函数可以定义接收不确定数量的参数,这种参数被称为可变参数
- 可变参数分为两种,即在参数前加 * 或 **
基于元组的可变参数(*可变参数)
- 可变参数在函数中被组装成一个元组
def sum(*numbers):
total = 0
for number in numbers:
total += number
else:
print('成功求和')
return total
print(sum(100.6,20,30))
print(sum(30,80))
基于字典的可变参数(**可变参数)
- 可变参数在函数中被组装成一个字典
def show_info(**info):
print('===show info===')
for key,value in info.items():
print('{} —— {}'.format(key,value))
show_info(name = 'jam',age = 20,sex = True)
show_info(sutdent_name = 'sam',sutdent_no = '1000')
这些参数一个等号代表传入一个键值对,等号前面是键,等号后面是值
变量的作用域
- 全局变量:在模块中创建的变量,作用域是整个模块
- 局部变量:在某一范围内创建,比如函数中,默认情况下作用域是整个函数
global关键字可以把变量提升为全局变量
x = 30
def value():
global x
x = 10
print('函数中x = {}'.format(x))
value()
print('全局模块中x = {}'.format(x))
函数类型
- 与其他数据类型一样,python中任意一个函数都有数据类型,类型为function,被称为函数类型
x = 30
def value():
global x
x = 10
print('函数中x = {}'.format(x))
value()
print('全局模块中x = {}'.format(x))
print(type(value))
通过输出可以看到value类型为function
理解数据类型
- 函数类型的数据与其他类型的数据是一样的
因此:
一个函数可以作为另一个函数返回值使用
一个函数也可以作为另一个函数的参数使用
# 定义加法函数
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(type(f1))
print(type(f2))
print('10 + 6 = {}'.format(f1(10,6)))
print('10 - 6 = {}'.format(f2(10,6)))
过滤函数filter()
- filter() 函数用于对容器中的元素进行过滤处理
- filter()函数语法如下:
filter( function , iterable )
- 参数function是一个提供过滤条件的函数,返回布尔值
- 参数iterable是容器类型的数据
在调用filter()函数时,iterable容器会被遍历,它的元素会被逐一传入function()函数中。function()函数若返回True,则元素被保留;否则被过滤。最后遍历完成,已保留的元素被放到一个新的容器数据中
def fun1(x):
return x>50
data = (31,56,732,89.54,33,61,67.89)
filtered = filter(fun1,data)
l = list(filtered)
print(type(filtered))
print(filtered)
print(l)
print(tuple(l))
print(set(l))
注:filter()函数的返回值并不是一个列表或者其他容器数据类型,所以需要通过list()或tuple()或set()进行转换
映射函数map()
- map()函数用于对容器中的元素进行映射(或变换)
- map()函数语法如下:
map( function , iterable )
- 参数function是一个提供变换规则的函数,返回变换之后的元素
- 参数iterable是容器类型的数据
map()函数过程同上文filter()函数
def fun1(x):
return x**2
data = (31,56,732,89.54,33,61,67.89)
mapped = map(fun1,data)
l = list(mapped)
print(type(mapped))
print(mapped)
print(l)
print(tuple(l))
print(set(l))
同理:需要通过list()或tuple()或set()进行转换
lambda关键字
- 在python中使用lambda关键字定义匿名函数,lambda关键字定义的函数也被称为lambda()函数。语法如下:
lambda 参数列表 : lambda函数体
注:lambda函数体部分不能包含多条语句,只有一条语句,语句会计算一个结果并返回
举例比如上文的def calc(opr):
函数还可以这么写
def calc(opr):
if opr == '+':
return lambda a,b: a + b # 替代add()函数
else:
return lambda a,b: a - b # 替代sun()函数
适用于函数体逻辑只有一行的情况,能减少代码量