Python3 函数与函数式编程
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 #Author:sking 4 #Python3 函数与函数式编程 5 6 #三种编程方式:1.面向过程(类class) 2.面向对象(过程def) 3.函数式编程(函数def) 7 #函数的优点:1.代码重用,代码易读 2.保持代码的一致性 3.便与修改,易扩展 8 9 #定义函数 10 def func_01(): 11 """函数的注释,就要要说明此函数的作用等等""" 12 print('哈哈1') 13 return 0 #return是用来结束函数的,同时也可以返回值 14 #return 1,'haha',['haha'] 都可以 当返回多个值时,会将返回结果组成一个元祖进行返回 15 #return 也可以返回一个函数 return func_01 16 def func_03(): 17 print('haha3') 18 return func_01() 19 data03 = func_03() #0 20 print(data03) 21 #定义过程(实际就是没有返回值的函数) 22 def func_02(): 23 """过程的注释""" 24 print('haha2') 25 26 x = func_01() 27 y = func_02() 28 print(x, y) #0 None 29 30 #函数的参数 31 def func_04(a, b, c): #a,b,c 就是函数func_04的形参 32 print(a, b, c) 33 return 0 34 35 func_04(1, 2, 3) #1 2 3 位置参数调用 ‘1, 2, 3’就是函数func_04的实参,形参和实参是一一对应的 36 #或者可以不考虑a, b的位置,与形参的顺序无关,可以这样写 37 func_04(b=9, a=8, c=6) #8 9 6 关键字参数调用 38 39 #位置参数和关键字参数的混和调用,一定要记住一句话”关键字参数不能写在位置参数的前面“ 40 func_04(6, c=2, b=4) #6 4 2 ok 41 #func_04(6,8,y=2) #报错 因为位置参数b已经有8了 42 #func_04(5,c=9,7) #报错 因为位置参数c已经有7了,另外就是关键字参数在位置参数的前面了 43 44 #默认参数的特点:调用函数的时候,默认参数非必须传递 45 def func_05(a, b=2): #b的值默认是2 46 print(a, b) 47 func_05(4) #4 2 #不给b传递参数的时候,b就调用默认值 48 func_05(4, 5) #4 5 #给b传递参数的时候,b就调用传递的参数 49 func_05(8, b=9) #8 9 #给默认参数赋值也可以这样写 50 51 #可变参数 *args(可变位置参数) 52 #可变关键字参数 **args 53 # *是元组 **是字典 54 def test_01(*args): #args是形参名,可以任意命名,但是一般都写作args 55 print(args) #(1, 2, 3, 4, 5) 是一个元祖 56 test_01(1,2,3,4,5) 57 tt = [1,2,3,4,5] 58 test_01(tt) #结果是([1, 2, 3, 4, 5],) 它把[1,2,3,4,5]作为了一个参数 59 test_01(*tt) #结果是(1, 2, 3, 4, 5) ok 60 #也就是test_01(*[1,2,3,4,5]) 也就是test_01(*[列表]) 也可以通过这种方式传递列表 61 62 def test_02(**kwargs): 63 print(kwargs) #{'a': 1, 'b': 2, 'c': 3} 是一个字典 64 test_02(a=1,b=2,c=3) 65 #test_02('a':1, 'b':2) #不可以这样传入字典' 66 tta = {'a':1, 'b':2} 67 test_02(**tta) #{'a': 1, 'b': 2} 这样也可以 68 #也就是test_02(**{'a':1, 'b':2}) 也就是test_02(**{字典}) 也可以通过这种方式传递字典 69 70 def c(*kk, **kr): 71 return kk, kr 72 print(c(1, 2, a=1, b=2)) #结果((1, 2), {'a': 1, 'b': 2}) 73 74 def d(a, b, *kk, **kr): 75 return a, b, kk, kr 76 print(d(1, 2, 3, 4, c=1, d=2)) #结果(1, 2, (3, 4), {'c': 1, 'd': 2}) 77 # #因为其实renturn只能返回一个结果,它只是把多个结果放在了一个元祖中了 78 #这里在赋值的时候就不能再用a=*了,因为a已经在def d(a, b, *kk, **kr)里面定义过了 79 80 #取出关键字参数的值,也就是取出字典的值 81 def test_04(**kwargs): 82 print(kwargs) #{'name': 'lidong', 'age': 8} 83 print(kwargs['name']) #lidong 84 print(kwargs['age']) #lidong 85 test_04(name='lidong',age=8)