Python 函数
在一个完整的项目中,某些功能会反复地使用。将功能封装成函数 ,当要使用某功能时,直接调用函数即可。
一、基础函数
函数的本质:函数就是对功能的封装
函数的优点
简化代码结构,减少了用户写代码的工作量以及重复性
如果想修改某些功能或者调试某个bug,只需要修改对应的函数即可
定义函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| def 函数名(参数列表): 语句 return 表达式
''' 解释: def:函数代码块以def关键字开始 函数名:遵循标识符规则 ():是参数列表的开始~结束 参数列表:任何传入函数的参数和变量必须放在圆括号之间,用逗号分隔。函数从函数调用者那里获取的信息 冒号:函数内容(封装的功能)以冒号开始,并且缩进 语句:函数封装的功能 return:一般用于结束函数的,并返回信息给函数的调用者 表达式:即为要返回给函数调用者的信息, 注意:最后的return表达式,可以不写,那return默认返回的就是None '''
|
函数的调用
1 2 3 4 5 6 7 8 9 10 11 12 13
| ''' 格式:函数名(参数列表) 函数名:是在使用这个函数功能时的参数 参数列表:函数的调用者给函数传递的信息,可以没有参数,但是小括号不能省略! 函数调用的本质:实参给形参赋值的过程 '''
def a_Mprint(): print("lemon is very cool") print("lemon is very handsome")
a_Mprint()
|
函数的参数
1 2 3 4 5
| def get_print(name, age): return name, age r = get_print("at", 18) print(r, type(r))
|
函数的返回值
1 2 3 4 5 6 7
| def get_num(num1, num2): return num1 + num2 print("lemon is very cool")
res = get_num(2, 3) print(res)
|
传递参数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| 例如: def func1(num): num = num + 10 print(id(num), num)
temp = 20 func1(temp) print(id(temp), temp)
例如: def func2(list1): list1[0] = 100 print(id(list1), list1)
list2 = [1, 2, 3, 4, 5] func2(list2) print(id(list2), list2)
|
关键字参数
1 2 3 4 5 6
|
def get_print(name, age): print(name, age)
get_print(age = 18, name = "lemon")
|
默认参数
1 2 3 4 5 6 7 8 9 10 11 12
| def a_Mprint(name = "lemon", age = 18): print(name, age)
a_Mprint()
def a_Mprint(name, age = 18): print(name, age)
a_Mprint("lemon")
|
不定长参数–>也叫多值参数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
|
def u_good(name, *args): print(name) print(args, type(args)) for i in args: print(i)
u_good("lemon", "good", "gool", "handsome")
def u_nice(name, **kwargs): print(name) print(kwargs, type(kwargs)) return kwargs
res = u_nice("lemon", age=18, height=1.75, weight="112") print(res["age"])
def i_jbk(*fet): sum = 0 for i in fet: sum += i return sum
a_Num = i_jbk(1,2,3,4,5) print(a_Num)
|
匿名函数
1 2 3 4 5 6 7 8 9 10 11 12
|
u_sum = lambda num1, num2: num1 * num2 net = u_sum(2, 5) print(net)
|
二、装饰器及偏函数
1、装饰器
概念:是一个闭包,比一个函数当作参数返回一个替代般的函数,本质上就是一个返回函数的函数
作用:装饰器就是给函数增加一些功能的
闭包案例
1 2 3 4 5 6 7 8 9 10
| def test1(a, b): def test2(x): print(a * b + x)
return test2
line1 = test1(2, 3) line2 = test1(2, 5) line1(4) line2(10)
|
简单的装饰器
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| def func1(): print("lemon is very handsome")
def outer(func): def inner(): print("**********************") func() return inner
f = outer(func1)
f()
|
复杂一点的装饰器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| def outer(func): def inner(age): if age < 0: age = 0 func(age) return inner
@outer def say(age): print("lemon is %d years old" % (age))
say(-10)
|
通用装饰器(常用)
1 2 3 4 5 6 7 8 9 10 11 12 13
| def outer(func): def inner(*args, **kwargs): print("&&&&&&&&&&&&&&&") func(*args, **kwargs) return inner
@outer def say(name, age): print("my name is %s, I am %d years old" % (name, age))
say("lemon", 18)
|
2、偏函数
把一个参数固定住,形成一个新的函数
1 2 3 4 5 6 7 8 9 10 11 12
| import functools ints1 = functools.partial(int, base = 2) print(ints1("1010"))
def ints2(str, base = 10): return int(str, base)
res = ints2("1010") print(res)
|
三、高阶函数
1、filter
功能: 用于过滤序列的,意思就是把传入的函数依次作用于序列的每个元素,根据返回的是True还是False来决定是否保留该元素
filter()
原型: filter(fn, lsd)
参数fn: 是函数
参数lsd: 是序列或列表
1 2 3 4 5 6 7 8 9 10 11
| list1 = [1, 2, 3, 4, 5, 6, 7]
def lem(num): if num % 2 == 0: return True return False
t = filter(lem, list1) print(list(t))
|
2、map 与 reduce
Google 文章 map reduce,python内置了map()和reduce()函数。
map()
功能: 将传入的函数依次作用在序列中的每一个元素,并把结果作为新的Iterator返回
原型: map(fn, lsd)
参数fn: 是函数
参数lsd: 是序列或列表
1 2 3 4 5 6 7 8 9 10 11 12 13
| def chr2int(chr): return {"0":0, "1":1, "2":2, "3":3, "4":4, "5":5, "6":6, "7":7, "8":8, "9":9}[chr]
list1 = ["2", "1", "6", "5"] res = map(chr2int, list1) print(res) print(list(res))
n = map(str, [1, 2, 3, 4]) print(list(n))
|
reduce()
功能: 一个函数作用在序列上,这个函数必须接受两个参数,reduce把结果继续和序列的下一个元素累计运算,知道序列为空为止。
- 比如:reduce(f, [a, b, c, d ])
- 相当于: a+b=ab ab+c=abc abc+d=abcd
原型: reduce(fn, lsd)
参数fn: 是函数
参数lsd: 是序列或列表
1 2 3 4 5 6 7 8 9 10 11 12
| from functools import reduce list2 = [1, 2, 3, 4, 5]
def mySum(x, y): return x + y
r = reduce(mySum, list2) print(f"r = {r}")
|
map-reduce联合使用,将字符串转成对应字面量数字;不用int()
1 2 3 4 5 6 7 8 9
| def str2int(str): def fc(x, y): return x * 10 + y def fs(chr): return {"0": 0, "1": 1, "2": 2, "3": 3, "4": 4, "5": 5, "6": 6, "7": 7, "8": 8, "9": 9}[chr] return reduce(fc, map(fs, list(str)))
a = str2int("1230") print(a, type(a))
|