python-函数式编程与内置函数

#编程方法论:

  • 面向对象
  • 面向过程

    没有返回值的函数。

    一步一步来,可读性强。

  • 函数式编程

    函数式=编程语言定义的函数+数学意义的函数

    代码简洁但可读性差

    风格:不使用变量保存状态,不修改变量

面向过程和函数式编程的方式举例:

  实现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进制

 

posted @ 2018-11-17 23:32  馭龍  阅读(187)  评论(0编辑  收藏  举报