python语法高级 — chap2-04 函数式编程

函数式编程

  • Python函数式编程只是借鉴函数式编程的一些特点,可以理解成一半函数式一半Python

1 匿名函数(lambda表达式)

  • 函数: 最大程度复用代码
    • 存在问题: 如果函数很小,很短,则会造成啰嗦
    • 如果函数被调用次数少,则会造成浪费
    • 对于阅读者来说,造成阅读流程的被迫中断
  • lambda表达式(匿名函数):
    • 一个表达式,函数体相对简单
    • 不是一个代码块,仅仅是一个表达式
    • 可以有参数,有多个参数也可以,用逗号隔开
  • lambda表达式的用法
    • 以lambda开头
    • 紧跟一定的参数(如果有的话)
    • 参数后用冒号和表达式主题隔开
    • 只是一个表达式,所以,没有return
# 计算一个数字的100倍数
# 因为就是一个表达式,所以没有return
stm = lambda x: 100 * x 

# 调用函数
stm(89)

2 高阶函数

  • 把函数作为参数使用的函数,叫高阶函数
'''
 函数名称是变量
 funB 和 funA只是名称不一样而已
 既然函数名称是变量,则应该可以被当做参数传入另一个函数
'''
# 函数名称就是一个变量
def funA():
    print("In funA")
    
funB = funA
funB()

3 map函数

  • 原意就是映射,即把集合或者列表的元素,每一个元素都按照一定规则进行操作,生成一个新的列表或者集合
  • map函数是系统提供的具有映射功能的函数,返回值是一个迭代对象
# map举例
# 将列表里的每一个元素乘以10, 并得到新的列表

list1 = [i for i in range(10)]

def mulTen(n):
    return n*10
    
list2 = map(mulTen, list1 )  # map()返回iterators类型
print(list(list2))           # list()对list2进行转换

4 filter函数

  • 过滤函数: 对一组数据进行过滤,符合条件的数据会生成一个新的列表并返回

  • 跟map相比较:

    • 相同:都对列表的每一个元素逐一进行操作
    • 不同:
      • map会生成一个跟原来数据想对应的新队列
      • filter不一定,只要符合条件的才会进入新的数据集合
  • filter函数写法:

    • 利用给定函数进行判断
    • 返回值一定是个布尔值
  • 调用格式:

      filter(func, data)
      	func为过滤函数 
      	data为数据
    
# filter案例
# 对于一个列表,对其进行过滤,偶数组成一个新列表

# 需要定义过滤函数
# 过滤函数要求有输入,返回布尔值
def double(a):
    return a % 2 == 0

list1 = [3,4,56,3,2,3,4556,67,4,4,3,23455,43]

rst = filter(double, list1)
# 返回的filter内容是一个可迭代对象
print(type(rst))
print(list(rst))

5 排序函数(sorted)

  • 把一个序列按照给定算法进行排序
  • key: 在排序钱对每一个元素进行key函数运算,可以理解成按照key函数定义的逻辑进行排序
# 案例1
# 对列表a按降序排列,生成新列表a1
a = [234,22312,123,45,43,2,3,66723,34]
a1 = sorted(a, reverse=True)
print(a1)
# 案例2
# 按照绝对值进行排序
# abs是求绝对值的意思
# 即按照绝对值的倒叙排列

a = [-43,23,45,6,-23,2,-4345]
a1 = sorted(a, key=abs, reverse=True)
print(a1)
# 案例3

a = ['dana', 'Danaa', 'wangxiaojing', 'jingjing', 'haha']
# 按照A-Z a-z进行排列
a1 = sorted(a)
print(a1)
# 全部小写后,按照a-z进行排列
a2 = sorted(a, key=str.lower)
print(a2)

6 装饰器(Decrator)

  • 在不改动函数代码的基础上无限制扩展函数功能的一种机制,本质上讲,装饰器是一个返回函数的高阶函数
  • 装饰器的使用: 使用@语法, 即在每次要扩展到函数定义前使用@+函数名
# 任务:对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()

目录
上一篇:chap2-03 异常处理
下一篇:chap2-05 文件

本次笔记来自于“免费Python全系列教程全栈工程师”的学习

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值