首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python 学习手册
Python Cookbook
Python 基础教程
Python Sites
PyPI - Python Package Index
http://www.simple-is-better.com/
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
V2EX  ›  Python

[可能引战] 用过 Python 也没法理解为什么 Python 是个好语言

  •  
  •   noli · 114 天前 · 10428 次点击
    这是一个创建于 114 天前的主题,其中的信息可能已经有所发展或是发生改变。
    看完标题请先冷静。

    Python 除了标准库功能多来源繁杂,好像并没有什么可取之处。
    毕竟真实项目中也不太可能只用标准库解决问题。

    GIL 简直反进化
    静态类型但是变量类型是可以重新绑定的……

    求一个我没有想到的 Python 的优点
    172 回复  |  直到 2019-07-12 21:56:57 +08:00
    1  2  
        101
    woshi88   113 天前
    @Jirajine PYCharm 怎么说
        102
    woshi88   113 天前   ♥ 4
    1. Python 是一种解释型语言。这就是说,与 C 语言和 C 的衍生语言不同,Python 代码在运行之前不需要编译。其他解释型语言还包括 PHP 和 Ruby。

    2. Python 是动态类型语言,指的是你在声明变量时,不需要说明变量的类型。你可以直接编写类似 x=111 和 x="I'm a string"这样的代码,程序不会报错。

    3. Python 非常适合面向对象的编程( OOP ( Object Oriented Programming )),因为它支持通过组合( composition )与继承( inheritance )的方式定义类( class )。Python 中没有访问说明符( access specifier,类似 C++中的 public 和 private ),这么设计的依据是“大家都是成年人了”。

    4. 在 Python 语言中,函数是第一类对象( first-class objects )。这指的是它们可以被指定给变量,函数既能返回函数类型,也可以接受函数作为输入。类( class )也是第一类对象。

    5. Python 代码编写快,但是运行速度比编译语言通常要慢。好在 Python 允许加入基于 C 语言编写的扩展,因此我们能够优化代码,消除瓶颈,这点通常是可以实现的。numpy 就是一个很好地例子,它的运行速度真的非常快,因为很多算术运算其实并不是通过 Python 实现的。

    6. Python 用途非常广泛——网络应用,自动化,科学建模,大数据应用,等等。它也常被用作“胶水语言”,帮助其他语言和组件改善运行状况。

    7. Python 让困难的事情变得容易,因此程序员可以专注于算法和数据结构的设计,而不用处理底层的细节。

    8. 优雅,简单,开发效率高,第三方包多,高级语言,可移植,可嵌入,胶水语言,脚本语言。
        103
    LokiSharp   113 天前
    本来我也觉得 Python 是个好语言,直到我知道了 Kotlin
        104
    tohearts   113 天前
    好语言的关键,难道不是取决于用的顺不顺手吗?
        105
    askfilm   113 天前
    @noli 在这里不能说 python 不好 , 还有 go
        106
    guolaopi   113 天前
    在做简单抓黄图或者帮人在简单网站刷赞的话我选择 PY,
    别的时候还是用自己常用的语言。
    今天下午帮同事调 py 代码的时候那个空格要死了。

    “最好的语言”这种噱头和 CSDN 右侧广告一样( XX 天精通 XXX,9102 年了学什么语言 XXX )正在毁掉这个语言。
        107
    exonuclease   113 天前 via iPhone
    除了慢别的都挺好
        108
    annielong   113 天前
    和 php 一样,编辑简单,无需编译,最头大的就是 java,如果不是专职 java,临时用一下就很麻烦
        109
    ben1024   113 天前
    python 的游标卡尺的梗是十分难受
    golang 的语法习惯也是难受
    还是习惯了 PHP,JS,JAVA 一类的语法
        110
    2gua   113 天前
    不知道 Python 好在哪儿。就是每每用到它时,感觉写代码很愉悦就是了。比如这样我就觉得很方便:
    In [79]: m1 = {'a': 1, 'b': 2}

    In [80]: m2 = {'c': 3, 'd': 4}

    In [81]: {**m1, **m2}
    Out[81]: {'a': 1, 'b': 2, 'c': 3, 'd': 4}
        111
    noli   113 天前
    @2gua

    这种东西,C# 什么的,也能直接搞定啊,不就是字典字面量,然后展开再合并而已嘛。
    人家还能不创建新对象的情况下完成呢。
        112
    cnanyi   113 天前
    如果跟 java 做对比的话, 脑中在勾画程序逻辑时, 用 python 可以顺手就做了一个简单的实现原型,用代码验证一下大体逻辑,也不会影响思考。 用 java 可能还没声明完实体类
        113
    chenqh   113 天前
    @2gua js dict 的语法糖比 py 甜呀
        114
    chengxiao   113 天前
    用不惯就不用嘛,又不是人逼着你用
    v2 豆瓣 python 不都用着好好的
    youtube instagram 这种体量的大站不也存在着大量 python 么
        115
    hmxxmh   113 天前 via Android
    存在即合理,好不好,用不用,都取决于你自己的想法。
        116
    misssvn   113 天前 via Android
    @Vegetable 深有体会,学起来比较容易,专起来还是有难度的。而且感觉比较贴合自然语言
        117
    watsy0007   113 天前
    你先说哪里不好
    你觉得什么样的语言好, 然后再来一条一条辩论.
        118
    zone10   112 天前
    首先 Python 是动态语言这点前面很多人也说了,然后 GIL 是 CPython 的锅不是 Python 的锅, 你用其他的解释器像 Jython 就没 GIL, 还有性能更强悍的 Pypy 正在考虑干掉 GIL, 吐槽一门语言前请对这门语言有足够的了解
        119
    skinny   112 天前
    @lolizeppelin 对,各种基本类型的内存占用太大就大大拉低了性能,然而很多人认识不到这点,你讲这个还会有人跟你抬杠说你不会用,我就遇到过这种杠精。
        120
    noli   112 天前
    @zone10

    吐槽我不了解 python 之前请在本帖中查找我不懂 python 的迹象。
    不然的话,你也只是跟你吐槽的一样,凭着莫名其妙的印象来吐槽,一点价值都没有。

    何止有 Jython, .Net 上也有 python 呢,实际项目中有多少人用你知道吗?
    GIL 是 CPython 的锅,那你告诉我 Pypy 现在有没有 GIL ?

    吐槽之前请先多了解你要护的。
        121
    ytymf   112 天前
    你说的第一条就已经很重要了,对于编程水平不怎么好的人来说,python 上来能实现很多功能
        122
    silkriver   112 天前
    Python 关键的杀手级特性还是语法简洁自然,基本上就是可执行的英语
    因为便于学习和分享,从而积累起不计其数的第三方包,建成可持续生态系统
        123
    VZXXBACQ   112 天前
    我觉得对我来说有一个优点就是比 Bash 好用。(真的,即使有 Bash 更好用的时刻我也可以轻松调用 Bash 完成更复杂的工作。
        124
    lolizeppelin   112 天前
    @noli

    python 的线程本来就是稍微做点异步的,稍微注重点性能都是用协程,锁都是用排序实现

    所以 GIL 不管是谁的锅对 python 来说真不是最大的问题

    即使没有 GIL 的限制, PYTHON 能像 dart 一样用协程+多线程(go 不熟悉,理论上应该是一样的)也没用
    因为 python 的性能本来就是坨屎, python2 我有次测 monotonic 时间调用,就 ctype 返回的时间再算一次除法
    比直接调用 time 慢了 60 倍, python3 用同样写法提升不少但是也有 20 多倍差距

    所以才说 GIL 根本不是黑点,python 到处都慢, 那这个来黑 python 根本没什么卵意思

    了解 python 的的话,一开始就应该知道,必须单进程里用多核就应该 pass 了
    可以多进程但是涉及到大量计算,如果不方便胶水到 c 里做,也不应该用 python

    python 一开始就不适合你要做的东西, 然后你用 python 这些缺点来说 python 不好有啥意思呢?

    只盯着缺点不,看不到优点,python 自然是个渣
        125
    lolizeppelin   112 天前
    python 有优秀的路径处理库,我用过的语言里都怎么见过
    python 有 psutil, 没见哪个语言提供了这么方便的进程管理库
    python 把各种系统调用封装得非常方便,没哪个语言在这方面能这么舒服的
    python 有 rpm 库, 如果你发布的代码用 rpm 管理,python 处理起来非常舒服,哪个语言有?
    gdb 里有 python 虚拟机, gdb 的时候可以用 python 辅助调试,你告诉我哪个语言有?

    操作系统选 python 来管理淘汰了 perl,openstack 选择了 python 都不是偶然的.

    python 在很多不是那么注重性能的场合真的非常好用.没那么多地方对性能要求那么高的,要求高就胶水,胶水不行换语言,不要只看到 python 慢不看 python 好.
        126
    noli   112 天前   ♥ 1
    @lolizeppelin

    你的回复代表了一部分“迷信”。

    Python 有优秀的路径处理库,其他语言能不能有?如果不能有,那说明 python 真的优秀,只有他能做出这么好用的库。
    你的说法只能体现一个事实,很多人用 Python 的时候需要处理路径,所以有了这样的库

    Python 有 psutil, 没见哪个语言提供了这么方便的进程管理库。
    你的说法只能体现一个事实,很多人写 Python 需要手动管理进程。

    python 把各种系统调用封装得非常方便,没哪个语言在这方面能这么舒服的。
    这个我有话说,python 如果不靠 gevent 这种外挂,封装一下异步调用链试试?当然,现在有 asyncio 可以跟上了。

    剩下的我不一一反驳了
    当你陷进了一种路径依赖,或者所谓变相的人择原理的时候,python 什么都是香的。
    只有跳出这种狭隘环境比对,你才能发现别的语言的好。
        127
    noli   112 天前   ♥ 1
    @woshi88

    2. Python 是动态类型语言,指的是你在声明变量时,不需要说明变量的类型。你可以直接编写类似 x=111 和 x="I'm a string"这样的代码,程序不会报错

    C# 也可以,rust 也可以,var x = 111; var x = "I'm a string"; var x = new Something();
    并且还是强类型静态类型的,绝对不会突然变成 OtherThing 并且运行时才报错。

    3. 要说 OO 的话,继承、封装、多态。Python 的封装就做不好吧?

    4. C# 还专门把函数引用抽象出一个 delegate 概念,还可以运行时生成范型类呢

    5. 写得快,重构的时候也快吗?

    6. .Net 系里面无缝调用各种其他语言的代码,不比你 Python 爽?

    7. “程序员可以专注于算法和数据结构的设计” 我专门写多线程下数据安全的数据结构的,Python 拿一个出来看看?

    8. 在 .Net 上你可以用 Lua, Python, F#, 实在不喜欢,C# unsafe 直接操纵内存和指针也行。 要不你学一个 Cython 先?
        128
    ptrees   112 天前
    对我来说最大的优点就是简洁,写起来舒服.至于性能上的优劣,我不懂,好像也没人吹吧
        129
    lolizeppelin   112 天前
    @noli

    你这不 TM 是废话么
    别的语言为什么都没做好或者不做,因为别人不用那些语言干这些活或者那些语言做这些活太麻烦

    我 TM 做一些系统管理的事情不上 python 我直接拿 c 写拿 go 写拿其他的的写有 python 方便?
    不是能不能而是更适合 OK,照你说法不如都不 C 大家都用 C 算了?
    用起来爽用起来方便,在很多领域性能可以接受这不是优点?

    算了和你扯浪费时间,python 就垃圾得了
        130
    silkriver   112 天前
    嗯正如上面说的强制缩进就是 Python 最大的杀手级特性,任何用花括号或 begin/end 来标示结构的语言全都没资格跟 Python 比简洁自然……
        131
    lolizeppelin   112 天前
    我要用 rpm 管理程序版本, 你拿其他语言封装好 rpm 库给我用?
    我要 gdp 调试程序用 python 辅助, 你给写个 gdp 插件?

    go/java/再牛逼还能把 python 现有的各种方便库都做好了?
    还是你觉得自己有本事可以用其他语言做没问题
    我没本事我需要啊,OK ?

    你对 python 特有的东西没需求所以 python 渣?
    妈的 go 没泛型难用的 1B,所以我可以说 go 就是渣,我用 go 干嘛不用 c ?
        132
    woshi88   112 天前
    @noli 既然你不喜欢 python 那你去学其他语言啊,你不喜欢这个为什么还要研究它?我就搞不清楚你是怎么想的,己所不欲勿施于人,难道别人的喜好你就要去否定吗?你说 python 封装不好?我想知道他哪里不好,是你自己学的不到位还是是 python 本身的问题,没有哪个语言是完美的,你又何必再鸡蛋里挑骨头,就例如爬虫来讲,Java 也可以写,但是效率没有 python,所以大家都用 python 写爬虫。
        133
    lolizeppelin   112 天前
    还有,别扯什么 gevent, 谁和你扯这种系统调用

    go/java 里才封装了几个系统调用,大部分要自己写 system call,用起来不如直接写 c

    我所见的语言 python 里才有那么多系统封装

    我写相关代码不用 python 用 go/java 吃屎?
        134
    noli   112 天前
    @lolizeppelin

    好笑了,C# 源代码中直接调用 C 的都笑而不语了。
    似乎在你的理解里面除了 C++ 没别的语言能直接调用 C,同时又够优雅?

    你喜欢 python 就好,反正我享受着你带着我复习知识。
    而我给你说的你不爱听,那就不听吧。
        135
    noli   112 天前
    @woshi88

    关于封装性。

    我在 python 里面能不能写一个函数,只有我愿意的调用的时候才可以被调用,其他人调用不了,但我又能保证它是可服用的(说白了就是 private method)

    据我所知是不能,期待你给我新的知识。

    啊,顺带一说,我不研究 python,我只是调查一下用 python 的人怎么想的。
        136
    silkriver   112 天前
    private method in python

    In [1]: class Test:
    ...: def __privMeth(self):
    ...: return 1
    ...: def invoke(self):
    ...: return self.__privMeth()

    In [2]: t = Test()

    In [3]: t.__privMeth()
    Traceback (most recent call last):

    File "<ipython-input-3-37e2c9517af3>", line 1, in <module>
    t.__privMeth()

    AttributeError: 'Test' object has no attribute '__privMeth'

    In [4]: t.invoke()
    Out[4]: 1
        137
    noli   112 天前
    @silkriver

    t._Test.__privMeth()
        138
    silkriver   112 天前
    In [5]: t._Test.__privMeth()
    Traceback (most recent call last):

    File "<ipython-input-5-f7b5ca82cf86>", line 1, in <module>
    t._Test.__privMeth()

    AttributeError: 'Test' object has no attribute '_Test'
        139
    silkriver   112 天前
    as Guido van Rossum put it: "we are all adults."
        140
    noli   112 天前
    @silkriver

    你的意思是 Python 是 Adult Only 的话我也不反对。

    我只是对 “ Python 非常适合面向对象的编程” 这句话有异议。
        141
    www5070504   112 天前
    @noli private 的问题 如果导弹发射按钮上边有个盖子 谁也不能阻止你打开盖子按下按钮 真觉得 private 跟上了锁了一样安全了么
        142
    silkriver   112 天前
    随便你,我只是不明白 t._Test__privMeth()
    跟最面向对象的 Java 的 Method.setAccessible 有什么本质区别
        143
    cordea   112 天前
        144
    noli   112 天前
    @www5070504

    如果是导弹发射按钮,为什么只装一个没有锁的盖子?
    这是设计师的严重渎职啊。

    如果只有一个盖子,谁知道下面发射的是导弹还是跳蛋?
    这还是设计师渎职啊。

    如果只有一个盖子,我觉得我自己知道盖子下面是什么,结果是导弹!噢真遗憾!
        145
    noli   112 天前
    @silkriver 那是因为你以为 Java 是最面向对象的而已。

    了解一下只允许构造函数里面 set 的设计,或者完全是 immutable 不让改的设计。

    这些不完全是性能考虑的原因,也是为了优雅地设计。
        146
    lolizeppelin   112 天前
    @noli

    又来,谁 TM 说了其他语言不能调 C 了?
    python 封装好了的库我不用我专门去写个 c ?
    语言原生对系统管理友好其他语言要自己来一套就不是优点?

    什么叫方便? C 要是写起来方便还写其他语言干个屌?方便就不是优点?
        147
    noli   112 天前
    @lolizeppelin

    "我所见的语言 python 里才有那么多系统封装"

    考虑到现行大多数系统调用主要都是 C 库形式,
    然而 python 又不能直接调用 C。

    所以我对此(你把这个当作 python 的优点)感到非常奇怪。
        148
    silkriver   112 天前
    不继续抬杠了,总而言之我认同 import this 里的那十九句话
    好语言并不需要最好、最优雅、最面向对象
        149
    ManjusakaL   112 天前
    @lolizeppelin 说的太绝对了

    > python 把各种系统调用封装得非常方便,没哪个语言在这方面能这么舒服的

    Python 系统封装还是有很多坑的。。。举两个例子

    在 3.6 之前 Python 默认不支持 EPOLLEXCLUSIVE 参数

    再举个例子

    之前处理过一个 BPO https://bugs.python.org/issue36054

    大概意思是 Python 一些系统封装,对于容器环境中失效。没有针对容器环境做优化。而 Java 在 JDK 9
    之后默认支持,而且也 backport 到 JDK8 了

    https://blogs.oracle.com/java-platform-group/java-se-support-for-docker-cpu-and-memory-limits

    所以还是客观看待为好
        150
    noli   112 天前
    @silkriver

    如果你喜欢的语言就是最好的语言,我想也不会反对。

    但出于求知和对他人有所启发的目的,我只是想指出,即使你们都喜欢,python 还是有很多缺陷使之不能适应现代编程需要,称之为好语言实在非常不讲理。
        151
    mink   112 天前
    越来越像微博了。。
        152
    silkriver   112 天前
    最好的语言才需要有最多的人来认可,Python 称之为好语言你实在没资格反对
        153
    noli   112 天前
    @silkriver

    同样的话我也可以和你说,你认为好不必然是真的好。

    怕较真的编程语言不是好的编程语言,这是我的观点。

    我不用说服你,你也说服不了我。
        154
    silkriver   112 天前
    借人气推一下 Python 文档翻译项目,热情过剩那就用爱发电~

    https://github.com/python/python-docs-zh-cn/issues/10
        155
    araraloren   112 天前
    @woshi88 #102 ...动态类型不是那个意思,讲的不对要被喷的,先做做功课吧
        156
    vindurriel   112 天前 via iPhone
    我抽烟 喝酒 说脏话 但我是个好女孩
        157
    darknoll   112 天前
    python 已经非常厉害了,你别鸡蛋里挑骨头
        158
    woshi88   111 天前
    @araraloren 所谓动态类型语言,就是类型的检查是在运行时才做。

    类型对于变量,属性,方法以及方法的返回类型都是可有可无的,在给变量赋值时才决定它的类型, 之后,还可以赋值不同类型的值,即使是基本类型,比如 C# 装箱( boxing )和拆箱( unboxing ),可以把值类型转换成引用类型,引用类型转换成值类型。当需要时,很多类型之间都会发生自动转换,可以把不同的基本类型添加到同一数组( collections )中。
    动态类型在解释语言中极为普遍,如 JavaScript、Perl、Python、Ruby 等等。
    某些人真把无知当个性?那您说 python 是什么类型的语言。
        159
    www5070504   111 天前
    @noli 多说无益
        160
    XIVN1987   111 天前
    应该先给“好语言”下个定义,,不然争论不出个所以然来。。
        161
    XIVN1987   111 天前
    其实 Python 的优点和缺点都极其显而易见,,只不过:
    有些人觉得 Python 的优点很重要、缺点不那么重要,所以就喜欢它
    有些人觉得 Python 的优点不那么重要、缺点不可忍受,所以就不喜欢它
        162
    silkriver   111 天前
    好语言肯定不需要完美无缺
    想要完美无缺的好女孩,那你没有女朋友
        163
    noli   111 天前
    @silkriver

    想不到孔子的思维方式还可以用在写程序上啊。
    真后悔和你正儿八经地讨论过。
        164
    silkriver   111 天前
    和你讨论倒是很刷新我的认知,祝你最终找到完美无缺的好语言和好女朋友~
        165
    noli   111 天前
    @silkriver

    说我对 python 的批评无效 -> 说我要完美的语言 -> 又说完美的语言和完美的女友一样不存在

    这就是你在脑海中构想的和我辩论的方式,真是浪漫啊。

    实际的情况是:我用过 python 做过各式项目;现在我用多种语言做项目;以及,我过二人世界很多年了。

    你们不要总是以你们的那丁点体验瞎猜别人的想法。好好琢磨代码吧。

    顺带说一句:完美的语言确实不存在,完美的女朋友确实存在,不承认这一点的话你比较像单身狗,哈哈。
        166
    silkriver   111 天前
    我的实际情况和你一致,讨论可以结束了
    最后绝对客观地说一句:上面讨论所提过的语言都是好语言,PHP 是最好的语言~
        167
    zkqiang   111 天前
    Python 治好了我一半的强迫症,另一半是 Go
        168
    encro   111 天前
    我:来个 html 解析!

    百度:pyquery,还有 bs4 都不错,你要来哪个?

    我:虽然既然大家都说 bs4 好,但是我对 jq 语法非常熟悉有好感啊

    。。。1 个小时后。。。

    我:怎么 from_string 后,一堆操作,再 to_string 就不是想要的结果啊???还是试试 bs4 吧

    。。。1 个小时后。。。

    我:怎么 bs4 语法这么奇怪啊,怎么也是一样不行呢,google stackoverflow 看下吧

    。。。1 个小时后。。。

    我:原来解析库还有 html.parser,lxml,xml 还是 html5lib 之分啊,都 9102 年了,我要 html5lib

    。。。30 分钟后。。。

    我:html5lib 不行,试试 lxml 吧

    。。。5 分钟后。。。

    我:终于可以了, 法克。。。
        169
    encro   111 天前
    刚学 Python:解决问题最好的办法只有一种。
    学了后:每个库都算一种。
        170
    luozic   111 天前 via iPhone
    符合直觉和思维方式,考虑性能 各种胶水,上别的语言,想一个语言极限性能又符合人的思维而不是机器执行,去做梦吧,梦里啥都有
        171
    zh584728   110 天前
    每一种语言都有它的使用环境,就像前端用 js,后端用 java,游戏开发用 c#一样,python 的在科学计算、深度学习、自然语言处理方面也有它自己的优势
        172
    yumenoks   102 天前
    你觉得好用或者不好用都没关系,不需要让被人赞同你..
    1  2  
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   3536 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 31ms · UTC 01:05 · PVG 09:05 · LAX 18:05 · JFK 21:05
    ♥ Do have faith in what you're doing.