V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
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
sensui7
V2EX  ›  Python

js 党可以吐槽一下 Python 吗

  •  
  •   sensui7 · 2017-09-12 00:49:17 +08:00 · 19486 次点击
    这是一个创建于 2628 天前的主题,其中的信息可能已经有所发展或是发生改变。

    缩进真的不习惯, map 返回的竟然是一个迭代器, 也许这就是大佬吧, 匿名函数 还要写 lambda 这么长的单词, 列表的长度还要用 len 函数而不是 len 属性, 您的列表到底是不是对象呢? 要不是对象您的 append 方法又是怎么回事? 我大 js

    js:
    arr.map(x => x*2)
    python:
    list(map(lambda x: x*2, arr))
    

    非引战, python 的优点就是生态环境, 我也是看中这点...

    156 条回复    2019-09-27 13:58:27 +08:00
    1  2  
    bramblex
        101
    bramblex  
       2017-09-12 10:53:04 +08:00
    @Kisesy

    类型约束,类型检查,函数类型,高阶类型,类型类。

    就一个类型检查的话,说难听点,这叫做玩具,我花两天时间自己也能造一个。
    Kisesy
        102
    Kisesy  
       2017-09-12 11:09:21 +08:00
    @bramblex 额,我只是说类型检查...并不是它只有类型检查
    这个 pyx 源码会被翻译为 C,然后交给 C 编译器编译,这些类型什么的是会当作 C 的一样看待
    bramblex
        103
    bramblex  
       2017-09-12 11:16:08 +08:00
    @Kisesy

    大哥,C 类型和没有类型没什么差别,真的。

    跟你说个笑话,c 是强类型语言。
    wwqgtxx
        104
    wwqgtxx  
       2017-09-12 11:25:23 +08:00 via iPhone
    @Chingim 说到底,python 的默认行为就是所有 object 基类提供的需要重载的函数都是__xxx__的形式,而经常为了方便调用,在__buildin__中都提供了 xxx()的函数方便访问,这个不仅仅是在于 len 这一个,还有很多类似的其他属性,比如
    getattr
    setattr
    iter
    next
    这些都是,说到底这只是人家的一种设计思路,作为一款 1991 年就诞生的语言,他本来就比 js 出现的要早得多,人家为什么要按照其他 oop 语言的习惯去设计

    你要是说不适应,人家的构造函数还是叫__init__()呢,传递 this 指针还用 self 呢,这些其实都只是不同语言的设计理念问题,有什么对于不对之分,大家用的方便就好

    计算机语言经过这么多年的发展,本来就产生了各种各样的风格,照你这么说 golang 更是一个异端,人家还非要把产量类型放在变量名后面呢

    说到底不要用一种语言的定向思维写另一种语言,这样会掉进坑的
    Chingim
        105
    Chingim  
       2017-09-12 11:32:03 +08:00
    @wwqgtxx 谢谢, 如果说这是风格, 我理解并接受.
    但是如果说全局 len()方法是为了运行效率, 那么我并不是很理解
    Eds1995
        106
    Eds1995  
       2017-09-12 11:32:07 +08:00
    @iFlicker js 我一直在找括号,但是 python 就不用
    kenshinji
        107
    kenshinji  
       2017-09-12 11:42:27 +08:00
    @Miy4mori 用 IntelliJ 也很累,也许你打开的方式更高级一点?
    alexzhou
        108
    alexzhou  
       2017-09-12 11:43:48 +08:00
    啥也没说 找存在感
    notreami
        109
    notreami  
       2017-09-12 12:36:07 +08:00
    反正都不用长期维护,有啥好纠结的。尤其是 js,3 年前的 js 项目,还能正常工作嘛?
    wxjeacen
        110
    wxjeacen  
       2017-09-12 12:58:10 +08:00
    [ x*2 for x in arr]
    wxjeacen
        111
    wxjeacen  
       2017-09-12 13:00:25 +08:00
    其实我想说,js 怎么跟 python 比函数式,python 怎么能跟 clojure 比函数式。
    SuperMild
        112
    SuperMild  
       2017-09-12 13:03:01 +08:00
    @notreami 逻辑反了吧,如果 3 年前的项目现在能正常工作,就不用维护了呀。正因为不能正常工作,才需要维护呀。
    RW667
        113
    RW667  
       2017-09-12 13:12:13 +08:00
    非 python 语言最害怕 IDE 提示你多了或少了一个括号, 这搞不好就是一下午的事情。
    类似 JS, JAVA, 行数一多,如果没有格式化好,看得真心累。
    还有 RUBY, 经常最后两行都是 end , 不累吗?
    python 的缩进看起来就很直观。
    fyxtc
        114
    fyxtc  
       2017-09-12 13:14:08 +08:00
    管你们怎么说。。。反正 python 我写起来贼爽。。。
    WangYanjie
        115
    WangYanjie  
       2017-09-12 13:25:53 +08:00
    没怎么用过 js,所以不太好评论,不过你的 python 写的真入门

    ```
    [x * 2 for x in x in arr]
    ```
    jimrok
        116
    jimrok  
       2017-09-12 13:33:09 +08:00
    @RW667 python 没有 End 吗?有的呀

    def help(self):
    if a is not None:
    print a

    if b is not None:
    print b

    if c is not None:
    print c

    if d is not None:
    print d

    #end if d

    #end if c

    #end if b

    #end if a

    所以,我做为 ruby 党,没有觉得 end 很烦.
    Osk
        117
    Osk  
       2017-09-12 13:33:20 +08:00 via Android
    python 的缩进最头疼的是这些情况:编辑器不支持自动缩进,以及混用编辑器导致 tab 和 space 灾难,以及在 v2 贴代码。。。
    其它情况还好,结构清晰,看着舒服。

    不需要纠结:这个 { 是起一行呢还是写在本行尾?
    lrxiao
        118
    lrxiao  
       2017-09-12 14:04:40 +08:00
    @bramblex 严格说 Haskell 那叫对齐了..更蛋疼
    神 tm C 类型跟没有没区别 你开了-Wconversion 吗
    >> Python 抄 Haskell [来源请求]
    Haskell 1.0 是 1990, Python 最早版本 0.9 也是 1990 在 Report/源码中均有对齐 /缩进
    lrxiao
        119
    lrxiao  
       2017-09-12 14:06:34 +08:00
    @bramblex 还是你说 lazy lazy 又不是只有 Hs 一家= =
    RW667
        120
    RW667  
       2017-09-12 14:15:54 +08:00
    @jimrok 你那只是注释好么? 并没有强制你写。

    你试过用慢整终端登到服务器上,用 vi 打开一个.rb :$ 最后一屏 全是 end 往上再翻一屏还是全 end 的那种欲哭无泪的感觉么?

    其实我上面还写错了,不是最后 2 排全是 END, 是最后 2 屏。
    bramblex
        121
    bramblex  
       2017-09-12 14:16:49 +08:00
    说个笑话,C 是强类型语言。呵呵
    fhefh
        122
    fhefh  
       2017-09-12 14:19:23 +08:00
    正在逐渐逃离 js 向 php、python 靠拢~~~
    bramblex
        123
    bramblex  
       2017-09-12 14:19:30 +08:00
    @lrxiao

    以及,你家 Haskell 和 python 只有缩进一样?而且 python Lazy 你逗我?
    bramblex
        124
    bramblex  
       2017-09-12 14:23:44 +08:00
    @lrxiao

    举个简单例子,列表推导。为什么 Haskell 能有列表推导?因为有 List Monad 啊,把 List Monad 是列表推导的理论基础啊。你 Python 没 List Monad 你的列表推导怎么出来的?强行抄一个实现一个语法糖而已。
    edwardpro
        125
    edwardpro  
       2017-09-12 14:31:24 +08:00
    要写大括号的语言都是异类!
    bramblex
        126
    bramblex  
       2017-09-12 14:32:18 +08:00
    @lrxiao 以及最后,各个语言相互借鉴优秀的地方本是无可厚非的,我那句 python 抄 haskell 不过是恢复前面某 xx 说 es6 抄 python 的言论而已。
    ryuzaki113
        127
    ryuzaki113  
       2017-09-12 14:33:30 +08:00
    @lovestudykid 标号多难看,不如用彩色笔给括号着色
    ioth
        128
    ioth  
       2017-09-12 14:36:43 +08:00
    js
    php
    c 的痕迹太重
    lz 等们,没学过 c 吧
    早期不是 c,就是 pascal,当然 fortran(basic)、cobol 都有个性
    java 不过是脑子没转过来的 c++
    ivechan
        129
    ivechan  
       2017-09-12 14:52:22 +08:00
    python 早就不鼓励用 reduce, map 这些了吧, 心疼你们这些用劣质教材的。
    ssxn58
        130
    ssxn58  
       2017-09-12 15:08:12 +08:00
    管他 C 是什么强类型弱类型,我只认指针,想指哪里指哪里,用起来爽极了
    Keyes
        131
    Keyes  
       2017-09-12 15:13:22 +08:00
    @bramblex 好战力,以理服人!
    Keyes
        132
    Keyes  
       2017-09-12 15:28:28 +08:00
    @ioth 唔嗯当年老大让写个简单的论坛,让用 PHP 写,还一脸懵逼,直到看见语法,“哦~原来 PHP 就是 C 变量前面加个$”,hhhhhhh
    66beta
        133
    66beta  
       2017-09-12 15:32:36 +08:00
    打工是不可能打工的,只好写 JS 混饭吃啦
    lrxiao
        134
    lrxiao  
       2017-09-12 15:46:33 +08:00
    @bramblex
    我说 map 这几个 lazy
    C 强类型怎么就笑话了 UB 写习惯了而已
    Monad 首先是个数学概念
    instance Monad [] 和这个 comprehension 糖只有[|...]后面一半 do-notation 的糖关系
    还只是[]的糖不能用在其他 Traversable 上
    py 还可以用 for-in 语法搞搞 generator/iterator 的 list comprehension 当然 python 后面这个语法太残了 不如 do-notation 灵活
    lrxiao
        135
    lrxiao  
       2017-09-12 15:48:09 +08:00
    list comprehension 的理论基础= = 那不就是个集合定义式吗 还 Monad Monad 只要求了态射的幺元和结合律
    lrxiao
        136
    lrxiao  
       2017-09-12 15:49:47 +08:00
    不过 py 也用不着后面跟一大坨..不是 Hs 那种严苛的纯 FP 存个 VM 里的状态无所谓
    ty89
        137
    ty89  
       2017-09-12 15:51:28 +08:00   ❤️ 3
    说句不该说的,如果你连
    “配置编辑器让它在编辑 py 文件的时候,换行自动缩紧 4 个空格”
    都搞不定的话

    还做程序员干什么?卖红薯多好
    Miy4mori
        138
    Miy4mori  
       2017-09-12 15:54:58 +08:00 via iPhone
    @kenshinji 那怕是不写代码才不会累哦
    lrxiao
        139
    lrxiao  
       2017-09-12 16:00:38 +08:00
    @lrxiao 说错了 这个是 Category 定义 Functor 是把 Category 作为 obj fmap 作为态射的 Category Monad 是 Endofunctor ( Hask 范畴里的所有 Functor 都是 Endofunctor Hask->Hask ) 上定义 Monoid 单位元 Id functor Endofunctor 组合为 Compose 或者说能实现 join :: F (F a) -> F a
    ashin
        140
    ashin  
       2017-09-12 16:56:49 +08:00
    尽管吐槽,反正 php 才是最好的语言
    weishu
        141
    weishu  
       2017-09-12 17:00:45 +08:00
    python 列表,不想用 len()函数,可以用 `__len__()`:

    ```python
    l = [1, 2, 3]
    print(l.__len()__)
    ```
    SharkU
        142
    SharkU  
       2017-09-12 18:51:44 +08:00
    吐槽完了不还得用、
    CodemonkeyM
        143
    CodemonkeyM  
       2017-09-12 18:54:18 +08:00 via Android
    @dikT 看到这样的 js 就想一行行的敲回车....
    goodspb
        144
    goodspb  
       2017-09-12 18:57:48 +08:00
    恩?看到楼主的头像,我还以为 V2EX 出了“点赞”的新功能。。
    kkzxak47
        145
    kkzxak47  
       2017-09-12 19:15:29 +08:00 via Android
    Python 真正的万物皆对象
    oneisall
        146
    oneisall  
       2017-09-12 19:46:50 +08:00
    我以为有点赞功能了。。。。。。。?????
    srlp
        147
    srlp  
       2017-09-12 22:51:16 +08:00 via iPhone   ❤️ 1
    len() 的问题,那是设计如此,楼上有个回复说得好,用的是 adapter 的思维方式。

    lambda 没啥好洗地的,python 的弱项。

    至于吐槽缩进的,不明白这有什么好黑的……有什么生产环境下的代码不缩进比缩进好吗?难道有括号的语言就不缩进了???说个笑话:左大括号写在行末还是另起一行。呵呵呵呵
    prenwang
        148
    prenwang  
       2017-09-12 23:04:14 +08:00
    说了半天,该回到主题了,快去找女朋友吧
    ioth
        149
    ioth  
       2017-09-13 09:54:46 +08:00
    js 和 py 吵什么?
    不还得用 php,工资有新 x 方,B 大青 D 的大 java 工资高吗?
    XIVN1987
        150
    XIVN1987  
       2017-09-13 11:45:44 +08:00
    lambda 方面 python 确实是弱项,,

    可这也并非全是缺点,,毕竟写一堆没名称的函数写的时候爽、以后维护就噩梦了。

    所以复杂的逻辑还是写在有名称的函数里比较好,,毕竟一个好的函数名能很好的说明函数的功能和意图
    sensui7
        151
    sensui7  
    OP
       2017-09-13 12:06:09 +08:00
    本帖不是引战的, 那没意义, 交流学习, 大鸣大放, 我的教材是 learn python in y minutes, 看了下列表推导式, 挺方便的. 有特色, len 函数的原因, 算是学习到了.

    至于 map 返回迭代器, 之前实在恼火遂搜索, SO 某个答案说的, 完整的列表和迭代器都有需求, 从迭代器产生列表容易, 从完整的列表产生迭代器较麻烦, 再加上性能原因, 它就被设计成返回迭代器, 我觉得也有道理.

    顺便鄙视下某个用户, 山寨我的头像, 这个用户完全就是个营销号的样子. 已经拉黑.
    crash
        152
    crash  
       2017-09-13 13:55:17 +08:00
    python 坑多了去了,不过还是比 es5 强,被 es6 碾压。
    kuro1
        153
    kuro1  
       2017-09-13 15:03:15 +08:00
    [ x*2 for x in arr]
    keisuu
        154
    keisuu  
       2017-09-13 16:22:09 +08:00
    python2 才是真正的坑多
    suntxy
        155
    suntxy  
       2017-09-13 19:15:26 +08:00
    不管你们怎么说,我开发快生态好支持多胶水语言瑞士军刀。
    bnm965321
        156
    bnm965321  
       2019-09-27 13:58:27 +08:00
    map 返回迭代器,是因为从 haskell 借鉴的 lazy evaluation。如果你用 js 的各种函数编程库,也会是这样的,比如 lodash。

    __len__ 是 python 最大的优点之一,这个“约定重于配置”的设计体现了 python 的一致性,推荐看 python 官方文档的 data model 一节,很多大佬都觉得 van guido 的语言设计水平是相当高的。
    1  2  
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5352 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 08:34 · PVG 16:34 · LAX 00:34 · JFK 03:34
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.