函数式编程——python为例

编程语言分类全解析:从编译型到函数式,一张选路地图 编程语言分类是理解技术选型的基础框架。从执行方式看,编译型语言在运行前将代码整体翻译为机器码,执行效率高但跨平台性差;解释型语言运行时逐行翻译,开发灵活但性能较低;混合型通过中间字节码与即时编译兼顾两者。类型系统则决定错误暴露时机与重构信心,静态类型在编译期检查,动态类型在运行期确定。这些分类维度共同构成语言选型的决策依据,直接影响开发效率、维护成本与系统性能。掌握分类逻辑,能帮助开发者在数据分析、后端服务、系统底层等场景中快速定位合适语言,避免盲目跟风。 阅读详情

FP-PY

​ 最近在学spark,接触到了scala这门编程语言,学到了许多函数式编程的知识,同时也被scala中各种各样的操作符恶心到了:(::、:+、+:、:::)。确实也很有趣。

​ 由于第一门接触到的语言是python,因此在这里写一些关于python的函数式编程相关知识。理解函数式编程相关概念对你阅读代码的能力会很有帮助,有助于帮助你写出更好的代码。同时,理解函数式编程的相关概念理论,也会让你学习其他编程语言时事半功倍。经典的函数式编程语言像是haskell,scala等,大家有兴趣可以去学习一下这些编程语言。

​ 在这篇文章里,笔者只给出了部分函数式编程的内容,如果你很有兴趣,可以去看补充的内容。在那里给出了几个学习函数式编程的很好的项目。

1.高阶函数 (HOF)

函数是“一等公民”

什么是一等公民呢?当我们说函数是“一等公民”的时候,我们实际上说的是它们和其他对象都一样…所以就是普通公民(坐经济舱的人?)。函数真没什么特殊的,你可以像对待任何其他数据类型一样对待它们——把它们存在数组里,当作参数传递,赋值给变量…等等。

将函数作为参数,或将函数的返回作为参数

  • 函数可以赋值给变量
  • 函数可以作为函数的参数
  • 函数可以作为函数的返回值

demo1:将列表中的整数过滤出来

# 函数作为参数
def filter(func,xs):
    ls = []
    for x in xs:
        if func(x):
            ls.append(x)
    return ls

# 函数作为函数的返回值
def is_a(T):
    def is_T(x):
        if type(x) is T:        # is 操作符是Python语言的一个内建的操作符。它的作用在于比较两个变量是否指向了同一个对象
            return True
    return is_T					# 函数作为函数的返回值
print(filter(is_a(int),[0,'1',2,None]))		# [0,2]

2.闭包

闭包是访问在其作用域外的变量的一种方式。正式地说,闭包是一种用于实现词法作用域命名绑定的技术。它是存储一个函数和它的环境的一种方法。

闭包是一个作用域,它会捕获函数的局部变量,因此即使执行过程已经移出了定义它的那个代码块,也可以访问它们。也就是说,它们允许在声明变量的代码块已经执行完成之后,还是可以引用这个作用域。

简单来说:如果一个函数,访问到了它的外部(局部)变量的值,那么这个函数和他所处的环境叫做闭包

demo2:

def add():
    a = 4
    def add_to_five(b):
        return a+b
    return add_to_five

add_ = add()
print(add_(5))      # or  print(add()(5))

# 这也叫柯里化,柯里化一定有闭包
def add(a):
    def add_to_five(b):
        return a+b
    return add_to_five
print(add(4)(5))

add = lambda x:lambda y:x+y
print(add(4)(5))

函数add()返回了一个函数(在内部调用了add()),我们将它保存在了一个叫做add_to_five的变量中,并且柯里化地用一个参数5来调用它。

理想情况下,当函数add执行完成后,它的作用域,包括本地变量add(即+),x,y,都应该无法访问了。但是,add_to_five()的调用返回了8。这说明,add函数的状态被保存了,即使在代码块已经完成执行之后。否则,就不会知道add曾经被add(5)这样调用过,且x的值被设为了5。

词法作用域(lexical scoping)是它能找到x和add这两个已经完成执行的父级私有变量的原因。这个值就称为闭包。

3.柯里化

将一个多元函数转变为一元函数的过程。 每当函数被调用时,它仅仅接收一个参数并且返回带有一个参数的函数,直到传递完所有的参数。

函数柯里化:把一个参数列表的多个参数,变成多个参数列表(只传递给函数一部分参数来调用它,让它返回一个函数去处理剩下的参数。)

demo:

def sum(a,b):
    return a+b

# 柯里化
def curried_sum(a):
    def curried_sum_(b):
        return a+b
    return curried_sum_

print(sum(4,5))
print(curried_sum(4)(5))

curried_sum_ = curried_sum(4)
print(curried_sum_(5))
自动柯里化

将一个包含多个参数的函数转换成另一个函数,这个函数如果被给到的参数少于正确的数量,就会返回一个接受剩余参数的函数。

from toolz import curry

@curry
def add(a:int,b:int):
    return a+b

print(add(1,2))
print(add(1)(2))
print(add(1))  #(y) = 1+y

4.偏函数

"部分地"应用一个函数,即预设原始函数的部分参数来创建一个新的函数。

5.函数组合

把两个函数放在一起形成第三个函数的行为,一个函数的输入为另一个函数的输出。

demo:


import math
def compose(f,g):
    def compose_(a):
        return f(g(a))
    return compose_

print(compose(str,math.floor)(121.1221))

函数g处理了参数a,将结果给函数f,最终返回结果

6.纯函数

纯函数是这样一种函数,即相同的输入,永远会得到相同的输出,而且没有任何可观察的副作用。

demo

s = "zhangsan"
def f(name):
 	print(f"hi,{name}")
f('lisi')


# 下面的不是
def f1():
 	print(f"hi,f{s}")
f1()


greeting = None
def greet(name):
    global greeting
    greeting = 'Hi, {}'.format(name)

greet('Brianne')

greeting # "Hi, Brianne"

7.副作用

如果一个函数或者表达式除了返回一个值之外,还与外部可变状态进行了交互(读取或写入),则它是有副作用的。

def f1():
 	print(f"hi,f{s}")
f1()


greeting = None
def greet(name):
    global greeting
    greeting = 'Hi, {}'.format(name)

greet('Brianne')

greeting # "Hi, Brianne"

让我们来仔细研究一下“副作用”以便加深理解。那么,我们在纯函数定义中提到的万分邪恶的副作用到底是什么?“作用”我们可以理解为一切除结果计算之外发生的事情。

“作用”本身并没什么坏处,而且在本书后面的章节你随处可见它的身影。“副作用”的关键部分在于“副”。就像一潭死水中的“水”本身并不是幼虫的培养器,“死”才是生成虫群的原因。同理,副作用中的“副”是滋生 bug 的温床。

副作用是在计算结果的过程中,系统状态的一种变化,或者与外部世界进行的可观察的交互。

副作用可能包含,但不限于:

  • 更改文件系统
  • 往数据库插入记录
  • 发送一个 http 请求
  • 可变数据
  • 打印/log
  • 获取用户输入
  • DOM 查询
  • 访问系统状态

8.幂等

如果函数执行多次结果还是相同的话,那就是幂等

sorted(sorted([2,1,12,31,42,]))

9.Point-free风格

定义函数时,不显式地指出函数所带参数。这种风格通常需要柯里化或者高阶函数。也叫 Tacit programming。

def map(func):
    def map_(xs):
        for x in xs:
            func(x)
    return map_

def add(a):
    def add_(b):
        return a+b
    return add_



print(map(add(1)))   # 并没有实际的输出

10.断定

根据输入返回 true 或 false。通常用在 filter 的回调函数中。

f = lambda a:a>2

print(list(filter(f,[1,2,3,5])))

11.契约(异常处理)

def throw(ex):
    raise ex

def contract(value):
    if type(value) is int:
        return True
    else:
        return throw(Exception("Contract violated: expected int -> boolean"))       # 自定义异常的抛出 


add1 = lambda num: contract(num) and num + 1

print(add1(2)) # 3
print(add1('some string')) # Contract violated: expected int -> boolean)

12.范畴

在范畴论中,范畴是指对象集合及它们之间的态射 (morphism)。在编程中,数据类型作为对象,函数作为态射。

一个有效的范畴遵从以下三个原则:

  1. 必有一个同一态射(identity morphism)将一个对象映射到它自身。即当 a 是范畴里的一个对象时,必有一个函数使 a -> a。
  2. 态射必是可组合的。a,b,c 是范畴里的对象,f 是态射 a -> b,g 是 b -> c 态射。g(f(x)) 一定与 (g • f)(x) 是等价的。
  3. 组合满足结合律。f • (g • h) 与 (f • g) • h 是等价的。

由于这些准则是在非常抽象的层面控制着组合方式,因此范畴论对于发现组合的新方法来说是伟大的。

数学上,态射(morphism)是两个数学结构之间保持结构的一种过程抽象。

13.值跟变量

  • 任何可以赋给变量的东西叫做值。
  • 一旦被定义之后就不可以被重新赋值。

14.函子

函子是一个实现了 map 函数的对象。map 函数会遍历对象中的每个值并生成一个新的对象,遵守两个准则

1.一致性

形式:

object.map(x => x) ≍ object
2.组合性

形式:

object.map(compose(f, g)) ≍ object.map(g).map(f)
def f(x):
    x +=1
    return x
def g(x):
    x = x*2
    return x

result1 = list(map(f,[1,2,3]))				# 在这里object放在了map里面
result2 = list(map(f,map(g,[1,2,3])))
print(result1)
print(result2)		# [3,5,7]
3.指示函子

一个对象,拥有一个of函数,可以将一个任何值放入它自身。

class Array(list):

  of = lambda *args: Array([a for a in args])

print(Array.of(1)) # [1]

15.引用透明性

如果一个表达式能够被它的值替代而不改变程序的行为,则它是引用透明的。

例如我们有 greet 函数:

greet = lambda x: 'hello, world.'

任何对 greet() 的调用都可以被替换为 Hello World!, 因此 greet 是引用透明的。

16.等式推理

当一个应用程序由表达式组成并且没有副作用时,我们可以从这些组成部分中得知系统的真相。

1.lambda函数(匿名函数)

也许你已经看到了,在前面我们用到了许多匿名函数

f = lambda x:x+1
# 等价于
def f_(x):
    return x+1
print(f(2))
print(f_(2))



f2 = lambda x,y: [x(i) for i in y]
print(f2(lambda x:x+1,[1,2,3]))
# 等价于
def f2_(func:Function,y:List) -> List:
    tmp_list = []
    for i in y:
        tmp_list.append(func(i))
    return tmp_list
print(f2_(lambda x:x+1,[1,2,3])) 
2.lambda演算

数学的一个分支

推荐一个小视频:https://www.bilibili.com/video/BV1d34y1v7xr?spm_id_from=333.999.0.0&vd_source=660c5a54096b80be102b4f1e8974debe

17.惰性求值

惰性求值是一种按需调用的求值机制,它将表达式的求值延迟到需要它的值为止,在函数式语言中,允许类似无限列表这样的结构存在,而这在非常重视命令顺序的命令式语言中通常是不可用的。

import random
def rand(): 
  while True:
    yield random.randint(1,101)		#生成器
    
randIter = rand()
print(next(randIter))

补充

这里大概介绍了函数式编程的一半知识。之后的某些内容会涉及到群论等数学知识;如果想要获得更多的知识:

  • https://github.com/llh911001/mostly-adequate-guide-chinese

    这是一份使用javascript介绍函数式编程的书籍,内容详细

  • https://github.com/jmesyou/functional-programming-jargon.py

    这是一份介绍python函数式编程的项目,笔者所写大部分来自这个项目,但由于这个项目很多使用 lambda 函数来介绍函数式编程,对于新手而言不太友好。因此在这里改成一些更容易接受的完整函数语句

  • https://github.com/hemanth/functional-programming-jargon

    这是一份包含多种语言函数式编程的项目

python函数式编程 大家好,这里还还还是长弓 今天我们来讲讲python中的函数式编程 函数式编程 有些同学疑惑了,我们已经学了函数,为什么还要学这个函数式编程呢? 两者的区别是什么呢? 函数是一个语法,函数式编程是一种编程的思路 是将本是CPU加减乘除的过程封装成一个个函数,调用函数的过程,更整体,更人性 函数式编程允许传入一个函数作为函数... 阅读详情

相关推荐

【Python】函数式编程

函数式编程(Functional Programming, FP)并非一种全新的编程语言,而是一种编程范式,一种思考和构造程序的方式。它根植于数学中的函数概念,强调程序的执行过程应如同数学函数的求值,避免状态的改变和可变数据。要真正掌握Python中的函数式编程,我们必须首先从其最底层的基石和核心哲学开始理解。在深入理解函数式编程之前,我们有必要先明确“编程范式”(Programming Paradigm)这一概念。编程范式是指一种编写代码和组织程序思想的“风格”或“方法论”。它提供了一套原则和结构,指导开

宅男很神经 1375

几种函数式编程语言

1、函数式编程语言有:lisp,hashshell,erlang等。 2、在函数中的参数,有一一对应的,也有指定模式的,还有使用能数组。如*argp(元组),**argp(字典)。 3、在pyphon语言中有一些内置的函数,如abs求绝对值,eval()转字典。 转载于:https://www.cnblogs.com/lyzfp/p/11391296.html...

weixin_30245867的博客 3626

【Python】函数式编程2

在软件开发中,我们常常面临一个挑战:如何让业务专家或非程序员能够以更自然、更直观的方式表达他们的需求或定义复杂的规则。传统的命令式代码往往过于详细和技术化,难以被领域专家理解或修改。而**领域特定语言(Domain Specific Languages, DSLs)**正是为了解决这个问题而生。DSLs 是一种专门为特定应用领域设计的计算机语言。与通用编程语言(如Python、Java)不同,DSLs 的语法和语义都围绕着一个特定的领域概念进行设计,使得在该领域内的问题表达变得更加简洁、直观和高效。DSLs

宅男很神经 1127

4) 将多元函数转换为一元函数unaryFunctionConverter [原创,泛型编程,自由下载转载,需注明出处]

在既有代码中编程时,如果想对一个数据集(容器/数组)中的所有元素进行处理时,其处理函数一般只能接受一个参数--数据集的数据类型,而既有的接口可能需要多个参数--数据集的数据类型只是这多个需求参数中的一个参数。在通常情况下,如果想使用标准算法中的forEach算法,则需要就此功能另外再写一个函数/函数对象以把额外的参数封装在函数内部,或者直接自己遍历这个数据集,把既有函数中的代码Ctrl+C/Ctr

申晓龙的专栏 2265

QT下利用FFTW实现功率谱密度分析(周期图法)

写在前面 出于项目需求,需要在QT的msvc 2015编译环境下实现功率谱密度估计。 所以这个需求很直接的关键词就是 1. C++ 2. QT 3. 傅里叶变换 4. 功率谱密度估计 但是在网上搜索了很久,没有一个非常直接的答案。所以我觉得很有必要写一篇文章来说明,在QT msvc2015 32bit环境下如何实现功率谱密度估计。 本文并没有经过严格编辑,但代码是已经可以跑通的,如...

李时珍食疗志的博客 5223

使用Python进行核磁数据预处理

随着医学与人工智能技术的快速崛起,伴随算法算力、数据等关键要素的积累和突破,人工智能技术在精准医学领域的科研应用也随之飞快增长,相关科研成果和学术论文数量逐年激增,医学影像人工智能涉及的技术如图像分割、病灶识别、病灶自动勾画、影像组学、深度学习模型构建和临床信息解析越来越趋于分析流程化,模块化,帮助越来越多的医生在临床科研实践中获得突破性的进展。根据具体的应用和数据类型,你可能需要调整或添加额外的步骤。对于更高级的处理,如图像分割或NMR数据的复杂处理,你可能需要查阅更专业的文献或使用更专业的软件工具。

xhlo521的博客 3132

函数式编程语言

 1、什么是函数式编程语言?   函数式编程语言(functional programminglanguage)或称函数程序设计,又称泛函编程,是一种编程典范,它将计算机运算视为数学上的函数计算,并且避免使用程序状态以及易变对象。函数编程语言最重要的基础是λ演算(lambda calculus)。   函数式编程语言的特征:   (1)以“函数”为首,如同命令式语言中的“变量”,...

dingtongfan1183的博客 537

T265摄像头插着开机后,需要重新插拔才能正常启动

T265摄像头插着开机后,需要重新插拔才能正常启动

qq_35598561的博客 1080

什么是函数式编程?主流的几种编程范式简单介绍

函数式编程(Functional Programming)是一种编程范式,它将计算机运算视为数学上的函数计算,并强调函数作为一等公民,可以像其他值一样被传递、组合和操作,函数式编程起源于学术界,从lambda演算演变而来(一种仅基于函数的正式计算系统)。在函数式编程中,函数可以接受函数作为输入和输出,这使得函数式编程具有高度模块化和组合性的特点。此外,函数式编程还强调不可变性和无副作用,即函数的执行不会改变程序状态或外部环境,这使得函数式编程更容易进行推理和测试,并且可以更好地支持并发和并行计算。

lrcoop的专栏 1939

【GameFramework框架内置模块】8、文件系统(File System)

最近好忙,鸽了好久。不能颓废了,继续发力。今天分享的是GF框架的文件系统。首先,引用比较官方的说法:GF的FileSystem虚拟文件系统,使用类似磁盘存储的感念对零散的文件进行集中管理,优化资源加载时产生的内存分配,也可以对资源进行局部片段加载,极大的提升了资源加载的性能。通俗点讲就是,我这个模块就是加载磁盘文件的,优化加载时产生的内存分配。那么,它是怎么优化的呢?

优快云博客专家,Unity3D高级软件工程师,《Unity 3D从入门到实战》作者。 2452

4-都2026年了,嵌入式发展前景怎么样,还适合入行吗?

本文系统分析了嵌入式行业的发展前景,指出到2026年嵌入式将迎来由"万物智联"驱动的黄金周期。文章回顾了嵌入式技术的四个演进阶段,从专用计算机到AIoT时代,强调其技术积累的延续性。作者从人才流向、产业智能化转型、高校新增专业等角度论证嵌入式行业的蓬勃发展,并提出"铁三角"模型分析其驱动力和护城河。最后给出职业发展路径建议,认为嵌入式适合长期主义者,在智能汽车、边缘计算等领域有广阔前景。文章建议读者抓住产业升级机遇,选择这一稳定且有复利效应的技术赛道。

指尖动听知识库 390

函数式编程(以Python编程语言为例)介绍

函数式编程(Functional Programming),以Python编程语言为例介绍

cnds123的专栏 1646

13、7自由度机械臂混合逆运动学算法解析

本文介绍了一种针对7自由度机械臂的混合逆运动学算法,通过引入额外参数Φ解决冗余自由度问题,并实现了避障、避免关节超限和扩大工作空间。该方法采用解析逆运动学求解策略,克服了机械臂在奇异位姿时的配置不连续性问题。通过对比实验验证了该算法在腕部关节角度连续性和位姿可达性方面的优越性,同时结合躯干逆运动学显著扩展了机械臂的工作空间。

rgv23456789的博客 237

Python函数式编程指南

函数式编程是一种编程范式,强调使用纯函数和不可变数据结构。Python虽然不是一种纯粹的函数式编程语言,但它提供了足够的工具和支持,使得我们可以在Python中实现函数式编程的风格。函数式编程的好处包括代码更加清晰、易于测试以及更容易进行并行化处理。接下来,我们将探讨几个Python函数式编程的关键概念,并通过实际的例子来加深理解。

master_chenchen的博客 1191

【Bug已解决】Codex App returns 401 Missing bearer/basic authentication after login on multiple Windows la

原始报错:Codex App returns 401 Missing bearer/basic authentication after login on multiple Windows laptops场景:用户在 Windows 笔记本上登录应用成功了,但随后每个业务请求都返回 401,提示"Missing bearer/basic authentication"。登录态像是"假的"——明明登了,请求却没带任何认证信息。多台 Windows 设备都能复现。

一键难忘的博客 595

我装了10个ClawHub技能,这些最好用!

ClawHub就是Clawdbot的"应用商店"。Clawdbot是手机ClawHub是App Store技能就是各种App装了技能,Clawdbot才能干更多事。这个技能解决了我的信息过载问题。为什么装我订阅了很多Newsletter。每天收到一堆长文章,根本看不完。怎么用“总结这篇文章的核心观点”“把这个Newsletter提炼成3个要点”“这篇技术博客有哪些可以实践的建议?安装命令真实体验现在我收到长文章,直接转发给Clawdbot。它会提炼出核心要点和行动清单。

Maynor的博客 6102

Python 高级教程之函数式编程

Python 函数是一组相关语句,旨在执行计算、逻辑或评估任务。这个想法是将一些常见或重复完成的任务放在一起并创建一个函数,这样我们就可以一次又一次地为不同的输入编写相同的代码,而不是一次又一次地调用函数来重用其中包含的代码。

努力是为了站在万人之中,成为别人的光 4233

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Python函数式编程

介绍了函数式编程知识:函数式编程基本、函数式编程的三大基础函数和装饰器等内容

2302_76708905的博客 1957

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

python函数式编程例子-浅析Python函数式编程 Python中函数式编程问题

python是函数式编程吗python是函数编程 函数编程定义: 小编猜小编们的爱情已走到尽头无话可说比争吵更折磨"函数式编程"是一种"编程范式"(programming paradigm),也就是如何编写程序的方法论。 小编记得小编问过你,最后一面你转身回头看小编的时候在想什么呢,你说,你在想以后都不会再见了。你看,小编还没说什么呢,你就提前判了死刑。它属...

weixin_37988176的博客 184

python支持函数式编程吗_Python函数式编程

函数式编程函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计。函数就是面向过程的程序设计的基本单元。函数式编程Functional Programming,虽然也可以归结到面向过程的程序设计,但其思想更接近数学计算。函数式编程就是一种抽象程度很高的编程范式。在计算机的层次上,CPU执行的是...

weixin_39966602的博客 725

Python函数式编程进阶

ddd

临渊-测试开发 1302

函数式编程语言python-Python函数式编程

在 Python 中使用函数式编程的最佳实践!简 介Python 是一种功能丰富的高级编程语言。它有通用的标准库,支持多种编程语言范式,还有许多内部的透明度。如果你愿意,还可以查看 Python 的底层并修改,甚至能在程序运行的时候直接修改运行时。我最近注意到一个有经验的 Python 程序员使用 Python 的新方法。就像许多 Python 新手一样,我在第一次看到 Python 时喜欢它...

weixin_37988176的博客 278

python 函数式编程

Log模块资料 http://www.cnblogs.com/yyds/p/6901864.html python语言的高级特性 函数式编程(FunctionalProgramming) 基于lambda演算的一种编程方式 程序中中有函数 函数可以作为参数,同样可以作为返回值 纯函数式编程语言:LISP,Haskell、 python函数式编程只是借鉴函数式编程的一些特点,可以理解成一...

若尘的博客 1693
上一篇: 二分法——一文学会如何确定边界
下一篇: Jupyter 导出html 报错 KeyError: ‘state‘
Xcodd
博客等级 码龄6年 36粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值