#编程方法论:
- 面向对象
- 面向过程
没有返回值的函数。
一步一步来,可读性强。
- 函数式编程
函数式=编程语言定义的函数+数学意义的函数
代码简洁但可读性差
风格:不使用变量保存状态,不修改变量
面向过程和函数式编程的方式举例:
实现y = 2 * x + 1
#面向过程 def func(x): res = 2 * x res += 1 return res #函数式编程 def func(x): return 2 * x + 1
#高阶函数:
满足函数传入的参数是一个函数,或其返回值中包含函数的函数被称为高阶函数。如:
###函数传入的参数是一个函数名### def foo(n): #是高阶函数,传入的是函数bar print(n) def bar(name): #不是高阶函数,传入的是字符串’alex’ print('my name is %s' %name) foo(bar) foo(bar('alex')) ###返回值中包含函数### def test1(): #是高阶函数,返回值是函数test1 print('from test1') return test1 def test2(): #是高阶函数,返回值也是函数test1 print('from handle') return test1()
#函数式编程中三个重要函数的应用:
1.map函数:
map函数:将可迭代对象元素分别代入作为参数的函数,并将每个元素被参数函数处理后的结果返回生成一个迭代器。(即依次将列表中各个元素进行处理,并返回一个新的列表,不过该新列表为一个迭代器(迭代器只能被使用一次,随用随删))
实例如下:
num_1 = [1,2,10,5,3,7] #其它可迭代对象也可以 res = map(lambda x:x-1, num_1) #返回一个迭代器。前面参数可以是函数或lambda,后面参数可以是任意可迭代对象 print(res) #直接返回其结果将不是预期的值 # --> <map object at 0x014521F0> print(list(res)) #转换成list类型,就可看结果 for i in res: #或者使用for循环,依次输出其res值 print(i) print(list(res)) #使用map函数得到的结果只能读取一次,随用随删 # --> <map object at 0x032E21F0> #本段代码中第一次print的res # --> [0, 1, 9, 4, 2, 6] #第二个print的list(res) # --> [] #第四个print的list(res),可看出已经是空集了,且第三次for循环也没有输出任何值(迭代器特点)
2.filter函数:
filter函数:把可迭代对象的元素分别代入作为参数的函数,若返回值为True则保留该元素,否则删除该元素,最终返回一个迭代器。
实例如下:
movie_people = ['sb_alex','sb_wupeiqi','linhiafeng','yuanhao_sb'] #可迭代对象 res = filter(lambda n:not n.endswith('sb'), movie_people) #筛选出不是以sb结尾的字符串 print(list(res)) # --> ['sb_alex', 'sb_wupeiqi', 'linhiafeng'] res = filter(lambda n:not (n.endswith('sb') or n.startswith('sb')), movie_people) #筛选出开头和结尾都不是sb的字符串 print(list(res)) # --> ['linhiafeng']
3.reduce函数:
reduce函数:不同于map或filter函数,reduce函数中作为参数的函数的参数需要两个值,且其返回值不是迭代器。其作用是将作为参数的可迭代对象的元素,保持两个一组传入作为参数的函数,最终返回一个值。
如当调用 reduce(lambda x,y:x+y, [1, 3, 5, 7, 9])时,reduce函数将做如下计算:
1.先计算头两个元素:1+3,结果为4;
2.再把结果和第3个元素计算:4+5,结果为9;
3.再把结果和第4个元素计算:9+7,结果为16;
4.再把结果和第5个元素计算:16+9,结果为25;
5.由于没有更多的元素了,计算结束,返回结果25。
若加入了第三个参数:reduce(lambda x,y:x+y, [1, 3, 5, 7, 9],100),则第一轮计算是:
100+1,结果为101;
……
实例如下:
from functools import reduce #导入reduce函数 num_1 = [1,2,3] print(reduce(lambda x,y:x+y, num_1, 2)) #在2的基础上求num_1元素的和 # --> 8 (2 + 1 + 2 + 3) print(reduce(lambda x,y:x*y, num_1, 2)) #在2的基础上求num_1元素的积 #--> 12 (2 * 1 * 2 * 3)
#几个重要的内置函数:
## divmod函数:
print(divmod(10,6)) #实际意义:网页搜索结果分页,总共10条,每页应显示6个 # --> (1, 4) #说明可分满一整页,且多4条
## eval函数:
eval函数有两种用法,均作用于字符串,一个与字典有关,另一个与数学表达式有关
dic_str = "{'name':'alex','age':18}" #定义一个包含了字典格式的字符串 print(eval(dic_str)) #eval函数可将上述格式的字符串中字典格式的转换成字典 # --> {'name': 'alex', 'age': 18} express = "1 + 2 * 3 - 2" #定义一个数学表达式格式的字符串 print(eval(express)) #eval函数可将上述格式的字符串中的数学表达式的值算出来 # --> 5
## hash函数:
可哈希(hash)的数据类型即不可变数据类型,不可hash的数据类型即可变数据类型,不同的具体数据的哈希值不一样,相同数据的哈希值一样。借此可用来保证文件传输安全(只要文件在传输过程中受到改变,则其hash值将变化)
hash('alex')
## zip函数:
zip函数需要传入两个序列(列表、元组、字符串)作为参数,返回值为两个序列中各个元素一一对应所构成的若干元组。
p = {'name':'alex','age':18,'gender':'none'} print(list(zip(p.keys(),p.values()))) # --> [('name', 'alex'), ('age', 18), ('gender', 'none')] print(list(zip('hello','12345'))) # --> [('h', '1'), ('e', '2'), ('l', '3'), ('l', '4'), ('o', '5')]
##三个进制转换:
bin(12) #10进制->2进制 hex(12) #10进制->16进制 oct(12) #10进制->8进制