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