python10 函数式编程

# -*- coding: utf-8 -*-
"""
Created on Thu Jul 11 19:27:42 2019

@author: cheng
"""

####Python语言的高级特性
#函数式编程
 -基于lambda演算的一种编程方式
 -函数可以作为参数,同样可以作为返回值
 -python函数式编程只是借鉴函数式编程的一种特点
 -高阶函数
 -返回函数
 -匿名函数
 -装饰器
 -偏函数

#lambda表达式
 -函数:最大程度复用代码
  -存在问题:如果函数很小,很短,会啰嗦
  -调用次数少,会造成浪费
  -对于阅读者,造成流程被迫中断
 -lambda表达式(匿名函数)
  -一个表达式,函数体相对简单
  -不是一个代码块,仅仅是一个表达式
  -可以有参数

#lambda表达式的用法
 -以lambda开头
 -紧跟一定的参数
 -参数后用冒号和表达式隔开
 -只是一个表达式
stm = lambda x: 100*x
stm(85)

st = lambda x,y,z:x + y*10 +z*100
st(6,5,4)
 
 -高阶函数
  -把函数作为参数使用的函数
 -变量可以赋值
a = 100
b = a
 -函数名称就是一个变量
def funA():
    print('In funA')
funB = funA
funB()
 
#高阶函数举例
#funA是普通函数,返回一个传入数字的100倍
def funA(n):
    return n * 100

#再写一个函数,把传入参数乘以300倍
def funB(n):
    return funA(n) * 3

print(funB(3))

#写一个高阶函数
def funC(n,f):
    #假定函数把N放大100倍
    return f(n) * 3

print(funC(3,funA))

def funD(n):
    return n * 10
   #需求变更,把N放大30倍
print(funC(3,funD))

####系统高阶函数-map
 -把集合或者列表的元素,每一个都按照一定的规则进行操作
 -map提供函数映射功能
l1 = [i for i in range(10)]
print(l1)
def my(n):
    return n * 10
l3 = map(my,l1)
 #map类型是可迭代的,可以使用for循环
for i in l3:
    print(i,end = ' ')    
 #reduce
  -归并,缩减
  -把一个可迭代对象最后归并成一个结果
  -对于作为参数的函数要求:必须由两个参数,必须由返回结果
  -reduce([1,2,3,4,5]) == f(f(f(f(1,2),3),4),5)
  -需要functools包
from functools import reduce
#定义一个操作函数
def m(x,y):
    return x+y
r = reduce(m,[1,2,3,4,5])
print(r)

#filter函数
 -过滤函数,对一组数据进行过滤,符合条件的留下
 -跟map比较:
   -相同:都对列表的每一个元素逐一进行操作
   -不同:
     -map会生成一个跟原来数据相对应的新队列
     -filter不一样
   -filter函数:
     -利用给定函数进行判断
     -返回值一定是布尔值

 -对于一个列表,对其进行过滤,偶数组成一个列表
def isEven(a):
    return a % 2 ==0
l = [1,2,3,4,5,6,9,8,7]
rst = filter(isEven,l)
print([i for i in rst])

####高阶函数-排序
 -key:在排序前对每一个元素进行key函数运算
a = [4,5,6,89,55,23,45]
a1 = sorted(a)
a2 = sorted(a,reverse=True)
print(a1)
print(a2)

-按绝对值排序
a = [-43,56,-89,65,2,31]
a1 = sorted(a,key=abs)
print(a1)

a = ['cheng','Dddd','qwert','ASdf']
a1 = sorted(a)
a2 = sorted(a,key=str.lower)
print(a1)
print(a2)

####返回函数
def myF(a):
    print('IN myF')
    return None
a = myF(8)
print(a)

 -函数作为返回值返回,被返回的函数在函数体内定义
def m2():
    def m3():
        print('in m3')
        return 3
    return m3

f3 = m2
print(f3)
f3()

#负责一点的返回函数的例子
def myf4( *args):
    def myf5():
        r = 0
        for n in args:
            r += n
        return r
    return myf5
f5 = myf4(1,2,3,4,5,6,7,8,9,0)
f5()
  
f6 = myf4(10,20,30,40,50)
f6()

####闭包(closur)
 -当一个函数在内部定义函数,并且内部的函数应用外部函数的参数或者局部变量,当内部函数被当做返回值的时候,
 相关参数和变量保存在返回的函数中

#闭包常见坑
 #返回闭包时,返回函数不能引用任何循环变量
def count():
    fs = []
    for i in range(1,4):
        #定义了一个函数f
        def f():
            return i * i
        fs.append(f)
    return fs
f1,f2,f3 = count()
print(f1())
print(f2())
print(f3())
  
 -修改之后的函数
def count1():
    def f(j):
        def g():
            return j * j
        return g
    fs = []
    for i in range(1,4):
        fs.append(f(i))
    return fs
f1,f2,f3 = count1()
print(f1())
print(f2())
print(f3())

####装饰器
 -在不改动函数代码的基础上无限制扩展函数功能
 -一旦定义,则可以装饰任意函数
def hello():
    print('hello world')
hello()

f = hello
f()

 -对hello功能进行扩展,每次打印hello之前打印当前时间
import time
def printTime(f):
    def wrapper(*args,**kwargs):
        print('Time',time.ctime())
        return f(*args,**kwargs)
    return wrapper
 -上面定义了装饰器,使用时用到@
@printTime
def hello():
    print('Hello world')
hello()

@printTime
def hello2():
    print('今天是个好日子')
hello2()


def hello3():
    print('手动执行')
hello3()

hello3 = printTime(hello3)
hello3()

####偏函数
 -把一个函数某些函数固定,返回一个新函数
#把字符串转化成十进制数字
int('12345')
 
 -八进制的12345,转化为10进制
int('12345',base=8)

 -新建一个函数,默认16进制返回10进制
def int16(x,base=16):
    return int(x,base)
int16('12345')

import functools
int16 = functools.partial(int,base=16)
int16('12345')

发布了89 篇原创文章 · 获赞 109 · 访问量 37万+

猜你喜欢

转载自blog.csdn.net/c1z2w3456789/article/details/96178170