python3入门与实践(六):函数式编程

栏目: Python · 发布时间: 6年前

内容简介:lambda用lambda标示调用lambda 复制给变量

lambda

# 1.parameter_list 参数列表
# 2.expression 函数体,只能是有一些简单的,注意不是代码块,比如不能写赋值语句
# 3.不需要return
lambda parameter_list: expression
复制代码
def add(x,y):
    return x+y;
复制代码

用lambda标示

lambda x,y: x+y
复制代码

调用lambda 复制给变量

f = lambda x,y: x+y
print(f(1,2))
复制代码

三元表达式

# x,y x大于y x 否则 y
x > y ? x : y

# 条件为真时返回的结果 if 条件判断 else 条件为假时的返回结果
r = x if x > y else y
复制代码

map 内置类

python3入门与实践(六):函数式编程

将原来集合中的每一个集合的元素,都通过函数映射到新的集合里面来

假设有很多个抛物线的点,已知每个点的x坐标,y坐标需要用平方函数求出

list_x = [1,2,3,4,5,6,7,8]
def square(x):
    return x*x
复制代码

循环方式解决

for x in list_x:
    square(x)
复制代码

map方式解决

r = map(square,list_x)
print(list(r))
# 输出:[1, 4, 9, 16, 25, 36, 49, 64]
复制代码

map结合lambda表达式

r = map(lambda x:x*x,list_x)
复制代码

多参数的lambda表达式

list_x = [1,2,3,4,5,6,7,8]
list_y = [1,2,3,4,5,6,7,8]
# 可传入多个参数列表,返回的结果元素个数与参数列表集合里元素数较小的个数
r = map(lambda x,y:x*x+y,list_x,list_y)
复制代码

reduce

使用

from functools import reduce
复制代码
python3入门与实践(六):函数式编程
运算原理:连续调用lambda表达式,
# 第一次运行,取参数列表的前2个元素(2为lambda参数个数)
# 第二次运行,取上一次运算结果和下一个元素
r = reduce(lambda x,y:x+y,list_x)
print(list(r))
# 输出 36


# 注意,10是初始值,不是最后运算
r = reduce(lambda x,y:x+y,list_x,10)
print(list(r))
# 输出 46
复制代码

filter

python3入门与实践(六):函数式编程

过滤掉不符合规则的元素

# 要求传入函数必须返回能够代表真和假的值(True/False)(1/0)
r = filter(lambda x: True if x==1 else False,list_x)
print(list(r))
# 输出[1, 1, 1]
复制代码

函数式编程与命令式编程

命令式编程:

  • def 方法定义
  • if else 流程控制
  • for 循环

函数式编程:

  • map reduce filter
  • lambda 算子

一定程度下lambda可以替换命令式编程的函数,reduce可以替换命令式编程的循环

装饰器

类似于C#的特性,java的注解 体现了AOP的编程思想

def f1():
    print('This is a function')
    
# 现在需要在方法上添加打印时间

## 方案1:不推荐,没有体现出对原来函数的扩展,调用也变化了)
def print_current_time(func):
    print(time.time())
    func()
    
print_current_time(f1)

## 方案2:通过wrapper外面分装了一层decorator,实现不改变原有函数实现过程,但是仍然改变了方法调用,不推荐

# 装饰器
def decorator(func):
    # 包装
    def wrapper():
        print(time.time())
        func()
    return wrapper

f = decorator(f1)
f()

## 方案3:语法糖 @符号,可以不改变方法调用,推荐!
@decorator
def f1():
    print('This is a function')
    
f1()

复制代码

带参数的方法的装饰器的使用

def f1(name):
    print('This is a function named '+name)
 
## 方案1:不推荐,无法为多个函数提供增强支持    
def decorator(func):
    # 包装
    def wrapper(func_name):
        print(time.time())
        func(func_name)
    return wrapper  
    
## 方案2:可变参数列表,不支持关键字参数
def decorator(func):
    # 包装
    def wrapper(*args):
        print(time.time())
        func(*args)
    return wrapper
    
## 方案3:推荐
@decorator
def f2(func_name1,func_name2,**kw):
        print('This is a function named '+func_name1)
        print('This is a function named '+func_name2)
        print(kw)
        
def decorator(func):
    # 包装 args 参数,kw key word
    def wrapper(*args,**kw):
        print(time.time())
        func(*args, **kw)
    return wrapper
复制代码

小技巧

# 可以处理任何参数列表
def fun1(*args,**kw):
    pass
复制代码

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

概率论基础教程

概率论基础教程

罗斯 / 赵选民 / 机械工业出版社 / 2006-4 / 42.00元

本书是一本概率论的入门教材,系统介绍了概率论的基础理论及应用,在取材、结构和写作方法等方面具有鲜明的特点。通过例题阐述概率论的基本概念与方法是本书的一大特色。作者独具匠心地选择和编排了大量例题与习题,这些内容约占全书的三分之二。通过这些例题和习题,读者可以了解概率论在各个领域的广泛应用,如基因、彩票、法庭判决、NBA选秀等。   本书系统介绍了概率论的基础理论及应用,主要内容包括组合......一起来看看 《概率论基础教程》 这本书的介绍吧!

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具