Python笔记15~函数式编程map,filter

#coding:utf-8

#函数式-->写函数--->编程范式
#Python中一切皆为对象
#函数当做参数传递
#理解函数式编程范式
#匿名函数
#高阶函数

x=2
y=x=2
def run(a,b):
    return a*b
print(type(run))
#输出 <type 'function'>
print(run.__name__)
#输出  run
z=run  #函数当做对象--->变量z
print(type(z))
#输出 <type 'function'>
print(run(1,2))
#输出 2
print(z(2,3))  #z---->函数对象 z(参数)
#输出 6


import  random
def make_num():
    return random.randint(1,9)
def work(fun,num): #第一个参数是函数对象,第二个是数值
    return fun()*num
result=work(make_num,8)  #函数对象当做参数传递
print(result)
#输出 64


print('3*3')
#输出  3*3
print(type(eval('2*8')))
#输出 <type 'int'>

a_str='[1,2,3 ]'
print(type(eval(a_str)))
#输出 <type 'list'>

#eval--->字符串--->字典
c_str='{1:9,2:8}'
print(eval(c_str))
#输出 {1: 9, 2: 8}



#print(eval("__import__('os').system('dir')")) #有风险
#安全性问题,安全机制
from ast import literal_eval #函数-->判断能不能得到字符串的表达式的值
print(literal_eval('(99,33,22)')) #安全
#print(literal_eval("open('ben.py','w',write('哈哈'))")) #不安全 ValueError: malformed string


#zip函数--->内置函数(传递的序列数据类型)
print(list(zip([1,2,3],[4,5,6]))) #zip压缩对象
#输出 [(1, 4), (2, 5), (3, 6)]

#反转函数 reverse
a_list=[1,2,3,4,5,6]
a_list.reverse()
print(a_list)
#输出 [6, 5, 4, 3, 2, 1]


#递归函数
#函数内部去调用函数自身
#6!=6*5*4*3*2*1=n*(n-1)!
def digui(num):
    if not isinstance(num,int):
        raise  TypeError('传入的参数类型不是整数')
    if num==1 or num==0:
        return 1
    if num<0:
        raise  ValueError('传入的参数不能小于0')
    return num*(digui(num-1))
result=digui(10)
print(result)
#输出 3628800


#高阶函数
#面向对象编程--->
#函数式编程--->编程范式-->使用一系列函数去解决问题(介于面向过程编程和面向对象编程之间)
#map()--->
#reduce()--->内置函数,直接使用----->移植到其他模块

#匿名函数
func=lambda x,y:x+y
num=func(2,3)
print(num)
#匿名函数-->函数部分(当前模块没有函数的引用,而只是使用一次)

#高阶函数filter函数(函数式编程)
#filter()#接收参数:参数一:函数  参数二:序列对象
#filter 作用,当前序列里面每一个元素传递函数(参数一),然后判断返回的结果是True,False,如果是True保留

#使用匿名函数
f=filter(lambda x:x%2==0,[1,2,3,4,5,6])
print(f)
#输出 [2, 4, 6]
print(list(f))
#输出 [2, 4, 6]

#高阶函数map
#参数一:函数对象 参数二:序列对象
m=map(int,['9','8','7'])
print(list(m))
#输出[9, 8, 7]
print(list(map(lambda x:x%2,[2,4,6,8,10])))
#输出[0, 0, 0, 0, 0]

#reduce-->处理累计操作,不再是内置函数,返回不再是对象,一般是数值
from  functools import reduce
print(reduce(lambda x,y:x+y,[1,2,3,4]))
#输出10
print(reduce(lambda x,y:x*y,range(1,9)))
#输出 40320
print(reduce(lambda x,y:x+y,['b','e','n']))
#输出 ben


#函数式编程
#代码更简洁
#数据集,操作,返回值都放到了一起
#没有写 循环代码,减少了临时变量

 

posted @ 2018-03-08 12:02  零度咖啡  阅读(122)  评论(0)    收藏  举报