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

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

内容简介: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
复制代码

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

查看所有标签

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

The Book of CSS3

The Book of CSS3

Peter Gasston / No Starch Press / 2011-5-13 / USD 34.95

CSS3 is the technology behind most of the eye-catching visuals on the Web today, but the official documentation can be dry and hard to follow. Luckily, The Book of CSS3 distills the heady technical la......一起来看看 《The Book of CSS3》 这本书的介绍吧!

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具