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
mianju
V2EX  ›  Python

有人和我一样觉得 Python 入门容易,深入却很难?

  •  
  •   mianju ·
    xinqiu · 2015-07-24 22:57:09 +08:00 · 13518 次点击
    这是一个创建于 3190 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我先学的是C,后来学了点C++。最近学Python,看完简明Python,感觉很容易,可是看廖雪峰的教程,有些技巧性的东西就觉得不是很好理解。
    比如

    f1, f2, f3 = [(lambda i = i: i * i) for i in range(1, 4)]
    

    可能是C语言的思维比较深入,对于Python的一些地方就容易转不过弯来。有没有大牛也是先学C然后学Python的?能分享点学习经验么> <感激不尽

    第 1 条附言  ·  2015-07-25 08:03:58 +08:00
    谢谢各位大牛指点,我就是只撸完了一遍A Byte of Python的水平,现在刚准备一边看文档一边看Learn Python,请轻拍> <
    80 条回复    2015-08-07 10:34:03 +08:00
    zhicheng
        1
    zhicheng  
       2015-07-24 23:00:14 +08:00 via Android   ❤️ 2
    所以你C必然也是学的一塌糊涂。
    townboy
        2
    townboy  
       2015-07-24 23:02:28 +08:00
    @zhicheng 哟 让我膜拜一下
    hebwjb
        3
    hebwjb  
       2015-07-24 23:07:53 +08:00
    理解这个应该跟先学什么没关系~
    pythonee
        4
    pythonee  
       2015-07-24 23:07:57 +08:00
    有,我就是
    imlonghao
        5
    imlonghao  
       2015-07-24 23:09:15 +08:00 via Android
    这觉得挺基础的,慢慢分析即可!

    [i for i in range(3)] 列表解析

    lambda 匿名函数
    crazyxin1988
        6
    crazyxin1988  
       2015-07-24 23:10:13 +08:00
    熟能生巧
    慢慢来 把基础语法学好了 就看懂了
    hahasong
        7
    hahasong  
       2015-07-24 23:11:28 +08:00
    没有,基本语法而已,不看文档的么
    Sabermadao
        8
    Sabermadao  
       2015-07-24 23:11:31 +08:00
    代码撸多了就自然而然了
    matthewz
        9
    matthewz  
       2015-07-24 23:11:34 +08:00
    python 里有很多语法糖而已 C 里则根本没有.

    简单的说 python 是预置了各种颜色的水彩颜料, 我记得有的套装里有好几百种颜色.

    而 C 只有三原色+白色, 想要什么颜色自己混合去吧.


    比如说匿名函数吧, C 不用匿名函数也能实现类似的结果, 但是会麻烦一些而已, 没有现成的东西一步到位.
    matthewz
        10
    matthewz  
       2015-07-24 23:13:37 +08:00
    为什么你觉得 C 简单? 我猜是因为你没做过什么复杂的项目, C 的语法本身很简单
    standin000
        11
    standin000  
       2015-07-24 23:19:52 +08:00
    学点lisp就好理解lambda了
    kevinreadonly
        12
    kevinreadonly  
       2015-07-24 23:21:20 +08:00
    也在学 python,试答一下。

    for i in range(1, 4) 是一个for循环,等价于c的 for(i=1;i++;i<4) { }
    用中括号括起来,这个在 python 里叫“列表生成器”,是一种比较快捷的生成列表的方法,没啥能理解不能理解的说话,记住可以这样用就行。

    lambda 是一种匿名函数
    lambda i: i * i 等价于def f(i): i = i * i ,(你的 lambda 里面有个i = i : i * i ,这点我也看不懂)

    前面for循环产生了三个函数,列表生成器生成一个有三个函数的列表。
    最后,就是把列表中的三个元素按顺序分别复制给 f1, f2, f3 ,同样不用知道为什么,只要记住python可以这样用就行了。


    我是前面学后面忘,刚才专门去查了廖教程,个人认为不必纠结于细节,我已经开始看 flask web 那本书了,用的同样是“死记硬背”大法,先学会怎么用,至于各种原理以后再搞。

    一家之言,轻拍。
    deanguqiang
        13
    deanguqiang  
       2015-07-24 23:32:07 +08:00   ❤️ 2
    @kevinreadonly
    lambda i = i: i * i 是一个带默认参数的匿名函数,等价于 def f(i = i): return i*i
    所以f1 f2 f3 是三个一样的函数,除了默认参数分别为1 2 3.
    imn1
        14
    imn1  
       2015-07-24 23:32:30 +08:00
    以入门的情况看,我是最难理解为什么这样写

    a = [['aa', 'bb'], ['cc', 'dd']]
    [x for y in a for x in y]

    一直以为是从里层往外层写
    leavic
        15
    leavic  
       2015-07-24 23:33:28 +08:00
    80后大部分都是到大学开始学C作为第一门语言的(我们高中都没什么机会碰到电脑,有也很少是拿来学习的),我到现在都觉得C是语言的根基,会C可以让你快速学会其他语言,而不是成为阻碍。
    sivacohan
        16
    sivacohan  
       2015-07-24 23:37:14 +08:00 via Android
    如果你理解的深入和我理解的一致的话。
    后面你还得撸一遍C。
    batstying
        17
    batstying  
       2015-07-24 23:40:45 +08:00
    都是大牛啊,我也看不懂~,看不懂没关系啊,查啊,感觉python封装好了很多东西,反正具体又不用自己实现,类似于调api,遇到不懂就查,又不丢人。
    ChangxuBlack
        18
    ChangxuBlack  
       2015-07-24 23:42:10 +08:00
    我觉得不难啊,可能是学的太少吧。。。坚持下去,多学点就好了
    leemw
        19
    leemw  
       2015-07-24 23:57:24 +08:00
    vb -> asp -> pascal -> c -> vba -> java -> c -> php -> matlab -> r
    我是这个流程,感觉很苦逼,最近因为D.S.方面r不够的地方大家普遍用python,所以也在学python。。。觉得看廖雪峰的东西坚持不下去,求其他高招。。。
    aheadlead
        20
    aheadlead  
       2015-07-25 00:05:44 +08:00
    支持LZ

    我更觉得很多东西深入都很难 就连易语言也是(别喷我……)
    endosome
        21
    endosome  
       2015-07-25 00:54:41 +08:00 via iPhone
    入门时学的是foxbase。
    msg7086
        22
    msg7086  
       2015-07-25 00:57:07 +08:00
    @leavic pascal就被吃了……
    dalang
        23
    dalang  
       2015-07-25 01:07:03 +08:00 via iPhone
    几乎所有的编程语言,易入门的都难精通。Python 的话网上的资源太多了,优秀的库那么多。多写,多看好的代码,回头再写。学语言就是这么个过程
    chengzhoukun
        24
    chengzhoukun  
       2015-07-25 01:15:33 +08:00   ❤️ 1
    @leemw 廖学峰的教程前面还是很好懂的,不做web后面的web开发就不用看了吧,再看看Python数据分析、数据挖掘和机器学习的书
    ericls
        25
    ericls  
       2015-07-25 01:15:34 +08:00
    楼主这个代码还是 Python 么。。。

    这样搞 有意思么

    无聊
    ligyxy
        26
    ligyxy  
       2015-07-25 02:23:00 +08:00   ❤️ 1
    @ericls 楼主的代码在我看来很Pythonic
    leemw
        27
    leemw  
       2015-07-25 03:10:54 +08:00
    @chengzhoukun 我主要走statistical目前,machine learning不怎么搞。。。所以看python这方面相关的书感觉和R差不多,但是R又用的更顺手。R又有不足,哎~囧啊。
    ligyxy
        28
    ligyxy  
       2015-07-25 03:31:33 +08:00
    @leemw 在统计方面Python和R恐怕难舍其一
    leemw
        29
    leemw  
       2015-07-25 03:43:53 +08:00
    @ligyxy 其实统计领域R基本是够用了(对我来说),尤其是R studio出来以后,编码方便很多,主要是考虑自己以后是不是会向M.L.方向上尝试的原因,PYTHON貌似M.L方面应用比统计方向更广泛。另外,想请教一下目前米帝的趋势,D.S这两个方向上工作哪个比较好找?待遇?
    echo1937
        30
    echo1937  
       2015-07-25 04:22:10 +08:00
    @kevinreadonly 我也没太看明白Lambda里面为什么有个i = i
    cadmuxe
        31
    cadmuxe  
       2015-07-25 04:26:33 +08:00
    @echo1937 因为python 的late binding啊
    qqblog
        32
    qqblog  
       2015-07-25 05:16:02 +08:00
    廖的问题去问廖
    echo1937
        33
    echo1937  
       2015-07-25 05:40:58 +08:00
    @cadmuxe 我想起来了,在 for 里面 i 的值是不断改写的,但是 lambda 里面只是储存了 i 的符号,调用的时候再查找。这就是你说的late binding。
    vinceguo
        34
    vinceguo  
       2015-07-25 07:09:23 +08:00 via Android
    Nothing special. RTFM!
    mianju
        35
    mianju  
    OP
       2015-07-25 07:57:02 +08:00
    @zhicheng
    @sivacohan
    C语言基础学的比较牢啊> <
    为此还特地啃了C专家编程
    mianju
        36
    mianju  
    OP
       2015-07-25 07:59:15 +08:00
    @matthewz 确实,大项目做不来啊。。。现在学C估计就是为了之后学写操作系统时用用
    mianju
        37
    mianju  
    OP
       2015-07-25 08:00:35 +08:00
    @kevinreadonly
    @deanguqiang
    对的,我其他都能理解,就是i = i 那边开始没弄懂,主要书和代码看的少,没怎么接触过lambda i = i这种用法,正常都是lambda i : 之类的
    mkeith
        38
    mkeith  
       2015-07-25 08:56:52 +08:00
    @deanguqiang lambda x = i:x *x 的意思吗?
    deanguqiang
        39
    deanguqiang  
       2015-07-25 09:25:42 +08:00 via iPad
    @mkeith 对的
    rainmakeroly
        40
    rainmakeroly  
       2015-07-25 09:35:47 +08:00
    基础的Python书籍还是别选国内了(Python源码分析不属于基础,所以除它外有无都可)。何况Python有那么多书与详细的官方文档。
    wizardoz
        41
    wizardoz  
       2015-07-25 10:11:52 +08:00
    我也觉得Python想深入不简单。
    Shazoo
        42
    Shazoo  
       2015-07-25 10:17:15 +08:00
    python其实用C的方法写,也没什么。

    如果要优雅,就得多看别人代码,记住各种tips。

    就像当年的perl。一直用C风格写,后来看别人代码,就慢慢的可以写出新手眼中的天书了。
    lancegin
        43
    lancegin  
       2015-07-25 10:47:57 +08:00
    看了你的描述,估计你是纠结于python的一些语法糖问题,这些语法糖会抽象多个操作,所以让你刚从c/c++这种注重细节的语言转过来的无法理解。这是许多脚本语言的特性,就是为了减少代码繁琐的操作会抽象出很多简洁的语法糖,正是因为这些语法糖,脚本语言的开发效率才会这么高。
    mianju
        44
    mianju  
    OP
       2015-07-25 10:48:50 +08:00
    @lancegin 是不是随着经常接触Python后会好点?
    loading
        45
    loading  
       2015-07-25 10:49:45 +08:00
    你就是想写出这类看起来很牛逼的代码而已?

    多模仿就好
    lancegin
        46
    lancegin  
       2015-07-25 10:58:40 +08:00
    @mianju 是的,脚本语言不需要注意那么多细节,不需要太谨慎。
    cc7756789
        47
    cc7756789  
       2015-07-25 11:35:55 +08:00 via iPhone
    我第一门编程就是Python,刚开始可能会感到不适应,多接触就习惯了。你可能还没有离开C/C++ 的思维。你可以拆分理解,a1, a2, a3 = [ ... ] 一看就是把右边的结果赋给左边的3个变量。所以只要分析列表生成式中语句生成什么结果就明白了。
    [ x for x in range(1,4)] 也就是生成列表 [1, 2, 3],
    cc7756789
        48
    cc7756789  
       2015-07-25 11:38:11 +08:00 via iPhone
    lambda x: x*x 是个匿名函数,这种其实接触多了不难理解,这些东西都是Python的特性,而特性这种东西熟悉它只需要时间罢了。
    tushiner
        49
    tushiner  
       2015-07-25 12:06:55 +08:00
    哪门语言不一样,有些所谓入门简单的语言不就是因为语法糖多、库多、框架多么,说白了还是跟“深入”没关系。
    sangmingming
        50
    sangmingming  
       2015-07-25 12:08:00 +08:00
    跟楼主同感,相比于其他语言,python为了更优雅,更多的语法糖。
    happlex
        51
    happlex  
       2015-07-25 12:45:14 +08:00
    理解不了很正常,函数式的写法一方面非常不同于以往接触的过程式语言,另一方面本来就和人的直觉相悖。如果之前接触的不是 C,而是 LISP,Javascript 这样的语言,类似的写法就是家常便饭了。
    另外,学习一门语言最重要的不是语法,这门语言体现核心思想。语法千变万化,核心思想都是一样的。你掌握了这种思想,也就一通百通了。这就是为什么有经验的程序员刚接触一门新的语言就能马上上手的缘故。
    所以楼主实际上欠缺的是一种思维,这方面可以看看斯坦福大学的一门公开课「编程范式」。
    http://v.163.com/special/opencourse/paradigms.html
    也建议楼主多接触一些其他的语言,Python 包罗万象是它的优点。但它也不如 C语言,LISP 那样纯粹,没有把某一个特性发挥到极致。
    不要畏惧,学习任何东西都不是一蹴而就的,最重要的还是坚持。
    最后祝您身体健康,再见。
    tracyone
        52
    tracyone  
       2015-07-25 12:49:23 +08:00
    编程语言只是工具.............看你实现什么
    zog
        53
    zog  
       2015-07-25 12:59:58 +08:00
    你需要做实际的项目和练习。看书和碎片化代码片段,不管用。
    tini28
        54
    tini28  
       2015-07-25 13:17:45 +08:00
    别钻牛角尖
    felixzhu
        55
    felixzhu  
       2015-07-25 14:55:10 +08:00
    感觉你理解错了什么叫做深入。。

    因为这都是入门的东西啊。。
    SoloCompany
        56
    SoloCompany  
       2015-07-25 14:59:11 +08:00
    1. python 的 lambda 语法比较累赘且奇葩(见仁见智)
    2. 允许命名空间内同名变量存在而不管阅读者的混淆这才是真正的奇葩

    机器可以很容易的识别不等于人可以很容易的识别,语言设计者允许这样的存在我无从评价,但至少从规范上就要禁止把代码真写成这样
    wuyu1998
        57
    wuyu1998  
       2015-07-25 15:03:19 +08:00
    你用c的思维模式(or 编程模型),去写pythan程序,当然会有这样的问题。
    建议读《learning python》,学习python的思维模式。
    unity0703
        58
    unity0703  
       2015-07-25 15:08:02 +08:00 via Android
    学点lisp就好理解了,推荐《计算机程序的构造和解释》,能让你功力大增
    neutrino
        59
    neutrino  
       2015-07-25 15:14:08 +08:00
    python入门也不容易,和vim差不多了。。
    mianju
        60
    mianju  
    OP
       2015-07-25 16:08:05 +08:00
    @unity0703 You are bad bad= =我还是安心先啃玩CSAPP再说
    wingyiu
        61
    wingyiu  
       2015-07-25 17:05:02 +08:00
    那些觉得py简单的来讲讲yield
    chengzhoukun
        62
    chengzhoukun  
       2015-07-25 17:15:41 +08:00
    @wingyiu yield不算复杂吧
    baichi
        63
    baichi  
       2015-07-25 19:07:35 +08:00
    Draplater
        64
    Draplater  
       2015-07-25 19:39:45 +08:00
    感觉这段写得不好,lambda的参数循环的变量都用i,容易混淆
    这样写好一些
    [(lambda x=i: x * x) for i in range(1, 4)]
    unity0703
        65
    unity0703  
       2015-07-25 20:17:26 +08:00
    @mianju CSAPP也是本好书,不过是关于计算机体系结构的,这本书侧重点在于理解计算机如何运作,但和楼主提到的lambda表达式关系不大,想理解编程语言的话,还是读SICP(计算机程序的构造和解释)吧,这本书全是Lisp代码,看完以后你对程序的理解会大幅提高,引用知乎的回答( http://www.zhihu.com/question/19931095 ):学 Lisp 付出和获得不成正比,是指数比
    kamushin
        66
    kamushin  
       2015-07-26 03:23:50 +08:00
    @wingyiu 没用过异常处理吗?我觉得yield和异常处理是一回事情啊。都是setjump嘛。
    bramblex
        67
    bramblex  
       2015-07-26 08:56:03 +08:00 via Smartisan T1
    @unity0703 还是更喜欢Haskell,Haskell更美,我是一个颜控
    airqj
        68
    airqj  
       2015-07-26 09:41:19 +08:00
    C 熟悉了python就是个脚本....
    lambda 是FP的东西,可以先去看一下
    wingyiu
        69
    wingyiu  
       2015-07-26 10:37:47 +08:00
    @baichi 这我看过 跟没讲一样
    Taojun0714
        70
    Taojun0714  
       2015-07-27 05:09:54 +08:00
    去学一下函数式编程吧,SICP,Haskell的也行,你都知道都是最简单的东西
    Taojun0714
        71
    Taojun0714  
       2015-07-27 06:53:35 +08:00
    @unity0703 现在可以直接看新的python版的SICP,我觉得楼主如果能读得懂英语文档,第一章看完就没这个问题了
    duobei
        72
    duobei  
       2015-07-27 09:23:13 +08:00
    我也遇到了同样的问题,一开始就是那样,然后心里特别着急想一下子全部吃透,稍后发现,先用着熟悉的,然后慢慢熟悉就自然而然的会了。
    hitmanx
        73
    hitmanx  
       2015-07-27 12:29:35 +08:00
    @unity0703 多谢推荐!我觉得有一点很难的是怎么样说服一个没学过函数式编程的人去进行尝试,我看到的回答都是形如,“你只要学过lisp就会发现.....”这种前提是学之前所不具备的。又或者例如"lisp比某某语言好在.....",这儿往往给出的理由是很形而上、很高屋建瓴的层面。我不知道有没有人写过一些非常精简、易懂的例子,能明显地告诉你同样的功能,在比如c\c++之类的语言里实现会怎么样写,需要多少倍的功夫和小心避免各种问题等等,而在lisp里又是能如何优雅地解决。
    hitmanx
        74
    hitmanx  
       2015-07-27 12:39:07 +08:00
    @mianju Hi,我也不太了解python,不过我也碰到过类似你这个问题,就是初看c++11标准的代码时,对于里面的lambda等等各种新feature看着很别扭,觉得这不是我熟悉的语言了。所以我相信你可能也是对于这些新标准不太熟。

    我的意思是尽管你可能很熟悉c\c++,但是你熟悉的是c\c++旧的标准,现在新的标准也都在向其他语言借鉴,互相之间的差距也都在缩小,如果你完全理解了c++11中的lambda搭配比如比如新的for写法,我觉得再理解这儿的python就容易多了
    mianju
        75
    mianju  
    OP
       2015-07-27 14:34:03 +08:00
    @hitmanx 谢谢
    Feiox
        76
    Feiox  
       2015-07-29 09:57:01 +08:00
    @happlex Python 和 C 是工程语言里的杰作。不完美但巨实用 ~ 大爱,对了,再带上 Rust ~
    Feiox
        77
    Feiox  
       2015-07-29 09:58:19 +08:00
    @felixzhu 同感。这些是能说是入门中的入门,LZ 可能还没接触过 元类 这种东西。。。
    lidiya
        78
    lidiya  
       2015-07-29 17:55:54 +08:00
    建议你再学一遍C语言 然后看下这个教程 http://www.maiziedu.com/course/python/
    Fing
        79
    Fing  
       2015-08-04 15:28:19 +08:00
    我的感觉跟你相反,但是对于我而已却多了一条:python找工作难。
    cary7
        80
    cary7  
       2015-08-07 10:34:03 +08:00
    说点实在东西吧,理解不了的时候就去跑一遍代码,还理解不了就再跑。多print,多修改参数,对比结果值。之前看不懂的时候,就是这么学过来的。笨办法,但是很有用
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5555 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 01:33 · PVG 09:33 · LAX 18:33 · JFK 21:33
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.