Python「八宗罪」

SimilarImageSearch:基于 Neal Krawetz 博士算法的相似图像搜索 相似图像搜索 基于相似图像搜索 Java 代码 算法步骤: 1.缩小尺寸。 去除高频和细节的最快方法是缩小图像。 在这种情况下,将其缩小到 8x8,以便总共有 64 个像素。 不要费心保持纵横比,只需将其压碎以适合 8x8 正方形。 这样,无论比例或纵横比如何,哈希都将匹配图像的任何变化。 2.减少颜色。 微小的 8x8 图片被转换为灰度。 这会将哈希值从 64 个像素(64 个红色、64 个绿色和 64 个蓝色)更改为 64 种颜色。 3.平均颜色。 计算 64 种颜色的平均值。 4.计算位。 这是有趣的部分。 根据颜色值是高于还是低于平均值来简单地设置每个位。 5.构造散列。 将 64 位设置为 64 位整数。 顺序无关紧要,只要您保持一致即可。 (我使用 big-endian 从左到右、从上到下设置位。) 立即下载

选自hackerfactor,作者:Neal Krawetz,机器之心编译。

本文作者有一群 geek 朋友,经常一起讨论技术话题,有时候也会谈到编程语言。「I hate Python」,作者表示。他对 Python 厌恶至极。即使有现成的 Python 代码可用,他也宁愿用 C 语言重写。为了系统地吐槽 Python,作者专门写了这篇博客,细数 Python 的「八宗罪」。

这个话题已经在 Hacker News 上引发了热烈的讨论(评论 400+),感兴趣的读者可以去围观或参与一下。

1. 版本

如果要安装一个默认的 Linux 操作系统,那你很有可能需要安装多个版本的 Python:Python2、Python3 甚至是 3.5、3.7。原因在于:Python3 无法与 Python2 完全兼容。甚至一些用小数表示的版本(如 3.5、3.7)也明显缺乏向后的兼容性。

我完全赞成往编程语言中添加新的功能,我甚至不介意淘汰一些旧的版本。但 Python 却要分开安装。我的 Python 3.5 代码不适用于 Python 3.7 安装版本,除非我特意将其导入 3.7。很多 Linux 开发者都觉得导出太麻烦,因此安装 Ubuntu 的时候会一并安装 Python2 和 Python3——因为有的核心功能需要前者,而有的需要后者。

向后兼容性的缺乏和各自为政的版本通常会为其敲响丧钟。Commodore 创造了第一批家用电脑(比 IBM PC 和苹果都要早很多)。但 Commodore PET 不能与后续的 Commodore CBM 兼容。CBM 又不与 VIC-20、Commodore-64、Amiga 等兼容。因此,你要么选择花很多时间将代码从一个平台导到另一个,要么选择放弃这个平台。(Commodore 今天何在?早被用户抛弃凉凉了……)

类似地,Perl 也火过一阵。但 Perl3 与 Perl2 的很多代码也不兼容。社区骂声一片,于是一些好的代码导了出来,其他的则被抛弃了。Perl4 也是如此。等 Perl5 出来的时候,人们干脆改用另一种更稳定的编程语言。如今,只有一小部分人还在频繁使用 Perl 来维持之前的项目。但已经没有人用 Perl 创建新的大项目了。

同理,Python 的每个版本也都存在谷仓效应。之前的版本还要留着,最终造成手里有一堆旧的无用 Python 代码,因为大家都不想花时间将其移到最新版上。据我所知,没有人为 Python2 创建新代码了,但我们还留着它,因为没有人想将所需代码移到 Python3.x 中。Python 2.7、3.5、3.6、3.7 的文档都还在 Python 官网上积极维护着,因为他们无法下决心弃用之前的代码。Python 就像一种僵尸编程语言——已经死掉的部分还在以行尸走肉的方式存在着。

2. 安装

很多软件包都可以帮你轻松地运行 apt、yum、rpm 或其他一些安装库,并获得最新版本的代码。但 Python 并非如此。如果用「apt-get install python」安装,你都不知道自己安的是哪个版本,它可能也无法与你所需的所有代码兼容。

因此,你要安装你需要的那版 Python。我的其中一个项目用到 Python,但必须用 Python3.5。所以最后,我的电脑安装了 Python2、Python2.6、Python3 及 Python3.5。其中两个来自操作系统,一个用于项目,另外一个服务于出于其他原因安装的无关软件。虽然都是 Python,但此 Python 非彼 Python。

如果你想安装 Python 包,你应该使用「pip」(Pip Installs Packages)。但由于系统上有一堆 Python,你要注意使用正确版本的 pip。否则,「pip」可能运行「pip2」,而不是你需要的「pip3.7」。(如果名称不存在,你需要为 pip3.7 指定明确的真实路径)

一位队友建议我配置自己的环境,这样的话每种软件都可以使用 Python3.5 的 base 环境。在我需要用 Python3.6 开展另一个项目之前,这种做法是非常行得通的,但是需要 Python 3.6 就得创建另外一个环境。两个项目,两版 Python,一点都不会混,真的(用生命在假笑)。

pip 安装程序将文件放置在用户的本地目录。安装系统级的库时不用 pip。Gawd 不允许你在运行「sudo pip」时出错,因为那会毁了你的整个电脑!运行 sudo 可能会使一些软件包在系统级别安装,有些是为错误版本的 Python 安装的,而你的主目录中的一些文件可能最终归 root 所有,因此未来的非 sudo pip 安装可能会因权限问题而失败。不要这样做。

这些 pip 模块由谁来维护呢?当然是社区。也就是说,没有明确的所有者,也没有强制性的来源链或责任链。今年早些时候,PyPI 的一个版本中发现了一个窃取 SSH 凭证的后门。这也是意料之中。(出于同样的原因,我不用 Node.js 和 npm;我不信任他们的社区项目。)

3. 句法

我非常主张代码的可读性要强。乍一看,Python 的可读性似乎不错。但当你开始创建大型代码库的时候你就不会这么想了。

大多数编程语言使用某种符号来标识范围——函数的开始和结束位置、条件语句中包含的操作、变量的定义范围等。C 语言、Java、JavaScript、Perl 和 PHP 都用 {...} 来定义范围,Lisp 使用 (...)。Python 呢?它用空格!如果你要定义复杂代码的范围,你可以缩进接下来的几行代码,缩进结束时,该范围也截止。

Python 手册说,你可以用任意数量的空格或制表符来定义范围。但是,每次缩进最好使用四个空格!如果你想缩进两次进行嵌套,使用八个空格!Python 社区已经对此进行标准化,即使 Python 手册中并没有明文规定。这个社区就喜欢用四个空格。所以,除非你不打算将自己的代码向任何人展示,否则的话每次缩进最好用四个空格。

我第一次看到 Python 代码时,觉得用缩进来定义范围还挺好的,但这么做有一个巨大的缺陷。你可以进行深度嵌套,但这么做使得每一行都会很长,导致不得不在文本编辑器中换行。较长的函数和条件语句可能会使开始和结束范围很难匹配。而且当你不小心把三个空格当成四个空格,还容易出现计算错误,进而花几个小时来调试和追踪。

对于其它语言,我已经养成了调试代码不带任何缩进的习惯。这样,我可以快速浏览代码,然后轻松地识别和删除调试代码。但 Python 呢?任何没有适当缩进的代码都会产生缩进错误。

4. includes

大部分编程语言都有办法导入其它代码块。比如,C 语言用「#include」,PHP 语言可以用「include、include_once、require、require」。而 Python 用的是「import」。

Python 可以导入整个模块、模块的一部分或模块中的特定函数。C 语言?你可以查看「/usr/include/」。Python 的话,最好用「python -v」列出所有路径,然后从列表中搜索每个目录和子目录中的每个文件。我有些朋友很喜欢 Python,但我看到他们想导入东西时,总得浏览标准模块。

导入功能还允许用户重命名导入的代码。它们基本上定义了一个自定义的命名空间。乍一看,你会觉得挺不错的,但这最终会影响可读性和长期支持。重命名对于较小的脚本来说还是不错的,但对于长期项目来说真的不适用。那些使用 1-2 个字母作为命名空间(比如「import numpy as n」),而且还不按约定俗成的方式来命名的,简直应该拉出去枪毙!

这还不是最糟糕的。大部分编程语言 include 代码的时候就只是导入代码而已。如果有一个带有构造函数的全局对象,有些语言,如面向对象的 C++可能会执行代码。类似地,有些 PHP 代码可能会定义全局变量,所以导入可以运行代码——但这种做法通常被认为很糟糕。相比之下,很多 Python 模块包含在导入期间运行的初始化函数。你不知道在运行的是什么,它要干什么,你甚至可能不会注意到。除非存在命名空间冲突,如果这样就好玩了,你得花很多时间来寻找原因。

5. 命名法

在其它语言中,数组(array)直接称之为'arrays',但是在 Python 中,它们被称为 'lists'。关联数组在某些地方被称为 'hash' (Perl),但是 Python 将其称为「字典」(dictionary)。Python 似乎完全按照自己的节奏来,不使用计算机科学和信息科学领域的常见术语。

此外,Python 库的命名也有问题。PyPy、PyPi、NumPy、SciPy、SymPy、PyGtk、Pyglet、PyGame……(前两个库的发音一样,但是它们的功能完全不同)。我理解「py」表示 Python,但是它们就不能统一出现在前面或后面吗?

一些常见库放弃了类似双关语的「Py」命名约定,包括 matplotlib、nose、Pillow和 SQLAlchemy。虽然有一些命名可能暗示其目的(如 SQLAlchemy 包含 SQL,所以它可能是一个 SQL 接口),但是其它的可能只是随机的单词。如果你不知道「BeautifulSoup」这个库是干什么的,那么你能从命名看出来它是一个 HTML/XML 解析器吗?不过,BeautifulSoup 有很完善的文档且易于使用,如果每一个 Python 模块都这样,我也就不抱怨了,但是大多数 Python 库的文档非常烂。

总的来说,我认为 Python 是一个具有不一致命名约定的函数库集合。我经常抱怨开源项目的命名非常可怕。除非你知道这些项目在干什么,否则你从命名本身中什么都看不出来。除非你知道在寻找什么样的库,不然只能通过别人偶然提及的名字或偶然的机会发现一些库。大多数 Python 库加重了这种现象,也加重了 Python 的负面体验。

6. 奇怪的操作

每种语言都有自己比较奇特的操作。C 语言中使用 & 和 * 获取地址空间和值的命名法非常奇怪。C 语言中还有用 ++ 和—实现 increment/decrement 的捷径。Bash 语言中,在引用特定字符(如用于正则表达式的圆括号和句号)时需要一直考虑「什么时候使用转义符 (\)」。JavaScript 兼容性有问题(并非每个浏览器都支持所有有用的功能)。但 Python 的奇怪操作比我见过的其他语言都多。如:

  • 在 C 语言中,双引号里的是字符串,单引号里的是字符。
  • 在 PHP 和 Bash 中,两种引号都能包含字符串。但是,双引号里的字符串可以嵌入变量。相比之下,单引号的字符串是文字;任何嵌入的类似变量的名称都不可扩展。
  • 在 JavaScript 中,单引号和双引号没什么区别。
  • 在 Python 中,单引号和双引号也没有什么区别。但是,如果你想让字符串跨行,就得用三重引号,如"""string""" 或 '''string'''。如果你想用二进制,那你需要优先选择带有 b(b'binary')或 r(r'raw')的字符串。有时你要用 str(string) 把字符串转换为字符串,或使用 string.encode('utf-8') 将其转换为 utf8 格式。

如果你一开始认为 PHP 和 JavaScript 中的=、==、===有点奇怪,那等你用 Python 中的引号时可能不会这么想了。

7. 通过对象 Reference 传递

大多数编程语言的函数参数传递是传值。如果函数改变了值,结果不会传递回调用代码。但正如我解释过的,Python 偏偏要有所不同。Python 默认使用 pass-by-object-reference 来传递函数参数。这意味着改变源变量可能最终会改变值。

这是面向程序、函数和对象的编程语言之间的最大区别。如果每个变量都由对象引用来传递,并且变量的任何变化都会改变所有的引用,那你可能使用的都是全局对象。通过不同的命名调用相同的对象不会改变对象,所以实际上它就是全局的。此外,正如 C 的程序员早就学到的,全局变量太恶心了,别用。

在 Python 中,你必须通过值来传递变量,例如「a=b」只是给相同的对象空间分配了另一个命名,但并没有复制 b 的值给 a。如果你真的想要复制 b 的值,你需要使用一个 copy 函数,通常是「a=b.copy()"的形式。然而,注意我说的是「通常」。不是所有数据类型都有一个「copy」原型,或者 copy 函数可能是不完整的。在这种情况下,你可以使用单独的「copy」库:"a=copy.deepcopy(b)"。

8. 本地命名

用所用的库或函数的名字来命名程序是常见的编程技巧。例如,如果我用一个叫做「libscreencapture.so」的 C 库来测试一个截屏程序,我会将该程序命名为「screencapture.c」并编译为「screencapture.exe」。

gcc -o screencapture.exe screencapture.c -lscreencapture

在 C、Java、JavaScript、Perl、PHP 等语言中,这通常很有效,因为这些语言可以轻易地辨别本地程序和资源库,它们有不同的路径。但 Python 呢?还是算了吧,千万别这样做。为什么?Python 会假定你首先要导入本地代码。如果我有一个名为「screencapture.py」的程序使用了「import screencapture」,那么它将导入自己而不是系统库。至少,你应该调用本地程序「myscreencapture.py」吧。

并非一无是处

Python 是一门非常流行的编程语言,有很多粉丝。甚至我的很多朋友都很喜欢 Python。多年来,我和他们讨论过这些问题,每次他们都点头表示同意。他们并不反对 Python 存在这些问题,只是认为这不足以浇灭他们对这种语言的热情。

我的朋友经常提到那些非常酷的 Python 库。我同意一些库非常有用。例如,BeautifulSoup 是我用过最好的 HTML 解析器之一,NumPy 使多维数组和复杂的数学更容易实现,而 TensorFlow 对于机器学习非常有用。但是,我不会因为喜欢 TensorFlow 或 SciPy 而用 Python 创建单片程序。我不打算为了这些「蝇头小利」而放弃可读性和可维护性,这不值得。

通常当我写一篇关于某个主题的批评时,我也会尝试写一些积极的东西。但我没办法列出关于 Python 的好的方面,因为我真的认为 Python 很糟糕。

                                                                                      

声明

本文转载自知乎:机器之心

原文地址:https://www.hackerfactor.com/blog/index.php?/archives/825-8-Reasons-Python-Sucks.html

bh-usa-07-krawetz-wp.pdf A pictures worth digital image analysis and forensics,这篇文章,共31页 立即下载

相关推荐

VCS和UVM常用编译选项

VCS编译选项 -full64 在64bit模式下编译、仿真,用于64位操作系统 -j8 指定编译器可以并行编译的进程数为8 -timescale=1ns/1ps 指定仿真时间和精度 +libext+.v+.V+.sv+.svh 识别.v、.sv、.svh等多种格式文件 -sverilog 支持system verilog 编译 -f xxx.lisf 指定包含所有设计文件列表的文件名 -top test 设置顶层模块为test。(指包含.

qq_40571921的博客 9932

囚徒困境 python

囚徒困境:若两囚徒都认罪,则各判10年;一个认罪一个抵赖,则前者判1年,后者判20年;两人都抵赖,各判3年。只有两人都不认罪,程序才会停止。 现在有一个社会学家,在不同的人群中做这个实验,一旦遇到都不认罪的情况,就停止该人群中的实验。 同时,他希望程序能记录每一对实验者的选择,以及记录第几对实验者都选择不认罪。 代码: # 需要的变量放到开头,明显一些。 n = 0 list_answer = [] while True: a = input('A,你认罪吗?请回答认罪或者不认:')

kk321的博客 2579

安卓风控对抗实战:如何用AOSP定制ROM绕过Momo、AIDA64等检测(从环境搭建到设备画像)

本文详细解析了如何通过定制AOSP ROM绕过Momo、AIDA64等安卓风控检测工具的设备指纹识别。从环境搭建到硬件参数修改,再到内核级特征混淆,提供了一套完整的底层对抗方案,显著提升设备伪装通过率。

weixin_30687051的博客 488

关于python语言下列说法错误的是_在Python中下列说法错误的是()

在Python中下列说法错误的是()答:Python语言只能用4个空格的缩进来实现程序的强制可读性比赛中,运动员击出的球压在端线上,则判该运动员失分答:×虚证的症状表现是( )答:神疲乏力青书学堂: (单选题) 母婴同室是指产后母婴24小时在一起,由于治疗等需要,母婴分离不超过答:1小时The salary raise for the other employees was ——答:2 perce...

weixin_39531834的博客 5736

运算放大器噪声分析实战:从理论到TINA-TI仿真的完整指南

本文深入探讨运算放大器噪声分析的完整流程,从基础理论到TINA-TI仿真实践。详细解析噪声来源、运放噪声模型建立、手工计算方法,并结合TI工具进行高效仿真验证,提供低噪声电路设计优化策略,帮助工程师提升精密电子系统性能。

Jerry的专栏 947

SAP生产订单技术性完成(TECO)操作指南与实战应用

生产订单技术关闭操作指南主要包括单笔和批量关闭两种方式,通过CO02/COHV事务码完成。

m0_47402127的博客 1932

囚徒困境博弈Python

最近看了《囚徒的困境》这本书,里面提到了有关二难推论,我对佛勒德-德莱歇试验很感兴趣,故试着使用Python来模拟各种策略的结果 佛勒德和德莱歇认为纳什的平衡点可能是无法满足的。记住,所谓平衡点解是指以马后炮方式进行博弈时,在其他参与者选择已经确定的情况下,没有任何参与者对自己选择的策略表示后悔时的结果。但可能存在这样的情况,即平衡点未必是一个好的结果。 于是他们立即开始做实验。他们找来两个朋友,一个是加州大学洛杉矶分校的阿门·阿尔钦(以下简称为AA),一个是兰德的约翰·威廉斯(以下简称JW)。并让他

qq_60690015的博客 1178

华为OD机试真题2025双机位A卷 C语言 实现【采购订单】

在一个采购系统中,采购申请(PR)需要经过审批后才能生成采购订单(PO)。每个PR包含商品的单价(假设相同商品的单价一定是一样的)及数量信息。系统要求对商品进行分类处理:单价高于100元的商品需要单独处理,单价低于或等于100元的相同商品可以合并到同一采购订单PO中。针对单价低于100的小额订单,如果量大可以打折购买。

MISAYAONE的博客 350

Python是垃圾?千万不要再学Python了?

Python是垃圾?千万不要再学Python了?

z099164的博客 2077

如何解决Dify重新部署(升级到最新版)后出现的Setup failed: PermissionDenied等问题

重新部署(升级)Dify后遇到Permission denied错误?🚫 本文详细分析了这个问题的原因🔐,并提供了完整的解决步骤来修复这个问题✨

XiaoqiangClub的博客 1653

EtherCAT ROS2 入门教程(一)

本文介绍了EtherCAT驱动与ROS2的集成方案,主要包括三部分内容:1)在Ubuntu 22.04上安装IgH EtherCAT主站的详细步骤,包括内核配置、源码编译和网络适配器设置;2)构建ethercat_driver_ros2,通过ros2_control描述文件配置硬件接口和EtherCAT从站模块插件;3)使用方法,包括启动EtherCAT主站和运行配置包。该方案支持通过参数文件定义硬件接口,并提供通用和专用两种EtherCAT模块插件,便于开发基于EtherCAT的工业应用。

机器人控制与仿真应用 1528

Python太烂了!

据我所知,没有人在Python2上创建新的代码,但我们还让它苟延残喘着,因为没人将所需的代码导到Python3.x. 在官方Python网站上,这些文档被主动维护并可用于Python 2.7、3.5、3.6和3.7——因为他们无法放弃旧代码。总的来说,我认为Python对库的命名非常混乱,缺乏一致性的原则。看看这些名字吧,PyPy、PyPi、NumPy、SciPy,SymPy、PyGtk、Pyglet,PyGame ...(是的,前两个名称发音一模一样,但是它们的功能和用途有很大区别。Python用空格。

Peter的博客 7451

区块链技术概述:从比特币到Web3.0

区块链技术正重塑数字世界的信任机制。本文系统梳理了区块链的发展路径:从比特币的PoW共识和UTXO模型,到以太坊的智能合约和账户体系,直至Web3.0的去中心化互联网愿景。文章详细解析了区块链的核心特性(去中心化、不可篡改等)和数据结构,通过流程图展示了比特币交易生命周期和智能合约执行流程,并对比了Web2.0与Web3.0的关键差异。最后,用Python代码实现了包含区块类、交易处理和挖矿机制的简易区块链系统,为理解区块链底层原理提供了实践参考。

闲人编程的博客 455

Python “八宗罪”,看了都说好!

点击上方 "程序员小乐"关注公众号,星标或置顶一起成长每天凌晨00点00分,第一时间与你相约每日英文We don't need to meet again for w...

吧主 174

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

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

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

python采用强制自动缩进使得代码具有极佳的可读性_Python“八宗罪”?你怎么看...

来源:机器之心本文作者有一群 geek 朋友,经常一起讨论技术话题,有时候也会谈到编程语言。「I hate Python」,作者表示。他对 Python 厌恶至极。即使有现成的 Python 代码可用,他也宁愿用 C 语言重写。为了系统地吐槽 Python,作者专门写了这篇博客,细数 Python 的「八宗罪」。这个话题已经在 Hacker News 上引发了热烈的讨论,感兴趣的读者可以...

weixin_33171058的博客 240

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Python八宗罪

经常一起讨论技术话题,有时候也会谈到编程语言。「I hate Python」,作者表示。他对 Python 厌恶至极。即使有现成的 Python 代码可用,他也宁愿用 C 语言重写。为了系统地吐槽 Python,作者专门写了这篇博客,细数 Python 的八宗罪。  如果想了解更多Python的伙伴或者小白中有任何困难不懂的可以加入我的python交流学习QQ群:973998104,多多交流问题...

weixin_43858004的博客 278

“学了半年后,我要揭开Python 3宗罪!”

有人曾说,未来只有2种人,会Python的人和....不懂Python的小学生,虽有夸张,这也意味着Python越来越重要了,究竟这门语言厉害在哪里?以下为你总结了Python3宗“罪”! Python凭啥这么优秀? 作为一个计算机初级爱好者,据笔者这些年敲过的代码所反馈(是的,我的代码是有灵魂的),他们还是比较喜欢 Python,因为 Python 干净利索,简单直接。 Python代码简...

优快云学习 1881

精心总结 Python『八宗罪』,邀你来吐槽

本文转自『机器之心编译』(almosthuman2014)这个话题已经在 Hacker News 上引发了热烈的讨论(评论 400+),感兴趣的读者可以去围观或参与一下。Hacker News 讨论:https://news.ycombinator.com/item?id=187061741. 版本如果要安装一个默认的 Linux 操作系统,那你很有可能需要安装多个版本的 Python:Pytho...

机器学习算法与Python学习 458

python逢七拍手游戏_古人“八不归”,今人逢“八”必喜,“八”字究竟有何楩?...

今人手机号码喜“8”,车牌号喜“8”,购买房屋楼层也喜“8”……然而,古人却有“七不出,八不归”的说法。今昔竟大相径庭,有点让人啼笑皆非,也有点无所适从。图片来源网络甲骨文和金文的“八”字和简体中文写法相似,形状相同,由两条相背、分开的曲线组成,是一种近似符号性质的指事字。我们先来看看古人为何“八不归”。“归”是指“回家”的意思,“不归”即是指本来在外的人,不会选择有“八”的日子回家。离家在外,思...

weixin_28826521的博客 572
上一篇: 如何用Python发一个高逼格的朋友圈
下一篇: PyTorch彻底放弃Python2
python之光
博客等级 码龄7年 114粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值