函数同其他语言一样,是一段可以重复使用的代码片段,不过在Python中,函数的功能和c和c++等传统语言还是有很大的不同,它更加灵活对边,使用起来也方便很多。
函数的声明使用关键字def + 函数名(参数1,参数2,关键字参数1),返回使用return,如果不写return,默认会返回一个none,下面是一个函数的定义:
def func1(x, y, z=1.5):
if z > 1:
return z*(x+y)
else:
return z/(x+y)
这个函数有三个参数,其中z是有默认值的,这个同C和C++一样,但是我们在调用这个函数时,一方面可以和C++一样按照顺序传递参数的值,另一方面,我们可以使用关键字传递参数,这么做的好处就是不需要记住参数的具体顺序,我们只要指定了这个参数是哪一个就行,比如:
func1(x=5, y=6, z=7)
#可以不按照之前的顺序来
func1(y=6, z=7, x=5)
#得到的结果是一样的
函数中的临时定义的变量,只能作用于函数内部,当退出函数时,这个变量就会销毁。如果想使用全局变量,那么需要在变量前加关键字global,这只适合定义一些表示状态的变量,如果有大量的全局变量,那么就创建一个类来管理更加方便。
在之前我们知道有一种类型是元组,我们在函数返回值可以返回一个元组,这样就能达到返回多个值的功能,比如:
def get_max_min_value(a, b, c, d, e)
dmax = max(a, b, c, d, e)
dmin = min(a, b, c, d, e)
return (dmax, dmin)
除了返回元组,我们还可以返回一个字典,或者list都可以实现这个功能
在Python中,函数其实就是一个对象,那么在做其他操作的时候,可以将函数当做一个值传递过去:
import re #导入正则表达式模块
arr_strs = ['Hello', 'World!', 'Google', 'facebook', 'tencent qq##', 'Ali baba?']
def clean_strings(strings):
result = []
for value in strings:
value = value.strip()
value = re.sub('[!#?]', '', value)
value = value.title()
result.append(value)
return result
print(clean_strings(arr_strs)
#打印
['Hello', 'World', 'Google', 'Facebook', 'Tencent Qq', 'Ali Baba']
#单独定义一个处理不好字符的函数,然后放到函数列表中去,进行统一操作
def remove_punctuation(value):
return re.sub('[!#?]', '', value)
clean_ops = [str.strip, remove_punchuation, str.title] #将函数放到一个list中去
def clean_strings(strings, ops):
result = []
for value in strings:
for func in ops:
value = func(value)
result.append(value)
return result
print(clean_strings(arr_strs) #得到的结果和上面是一样的
#还可以将函数单做参数传递给其他函数
for v in map(remove_punctuation, arr_strs):
print(x)
#结果是指将不好的符号处理掉,没有将首字母大写
除了我们正常定义的函数之外,有时候图方便,经常会使用匿名函数(Lambda),也就是一句话的函数:
def short_func(x):
return x*2
#像这种简单的函数,可以使用匿名函数,一句话就能搞定
ret = lambda x: x*2
#其效果是一样的,有时候这么做会让代码更加简洁,下面是对一个字符串排序:
strs = ['foo', 'card', 'bar', 'aaaa', 'abab']
strs.sort(key=lambda x: len(set(list(x)))) #根据使用不同字符数量排序
print(strs)
#打印
['aaaa', 'foo', 'abab', 'bar', 'card']
匿名函数还有一个重要的用处,是可以把一个函数变成更多其他重复要用的函数,比如:
def add_n(x, y):
return x+y
#由于我们在使用中其中一个参数只用到了3,那么我们可以重新利用匿名函数定一个add_three的函数
add_three = lambda x: add_n(x, 3)
print(add_three(3))
#打印
6
#当然,Python的内建模块已经做了这个处理,在functools模块中:
from functools import partial
add_three = partial(add_n, 3)
print(add_three(3))
#得到结果是一样的