推荐学习书目
› 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 · Jul 24, 2015 · 15416 views
    This topic created in 4120 days ago, the information mentioned may be changed or developed.

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

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

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

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

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

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

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

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


    比如说匿名函数吧, C 不用匿名函数也能实现类似的结果, 但是会麻烦一些而已, 没有现成的东西一步到位.
    matthewz
    matthewz
    Jul 24, 2015
    10
    为什么你觉得 C 简单? 我猜是因为你没做过什么复杂的项目, C 的语法本身很简单
    standin000
    standin000
    Jul 24, 2015
    11
    学点lisp就好理解lambda了
    kevinreadonly
    kevinreadonly
    Jul 24, 2015
    12
    也在学 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
    deanguqiang
    Jul 24, 2015❤️2
    13
    @kevinreadonly
    lambda i = i: i * i 是一个带默认参数的匿名函数,等价于 def f(i = i): return i*i
    所以f1 f2 f3 是三个一样的函数,除了默认参数分别为1 2 3.
    imn1
    imn1
    Jul 24, 2015
    14
    以入门的情况看,我是最难理解为什么这样写

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

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

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

    这样搞 有意思么

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

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

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

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

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

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

    我的意思是尽管你可能很熟悉c\c++,但是你熟悉的是c\c++旧的标准,现在新的标准也都在向其他语言借鉴,互相之间的差距也都在缩小,如果你完全理解了c++11中的lambda搭配比如比如新的for写法,我觉得再理解这儿的python就容易多了
    mianju
    mianju
    OP
    Jul 27, 2015
    75
    @hitmanx 谢谢
    Feiox
    Feiox
    Jul 29, 2015
    76
    @happlex Python 和 C 是工程语言里的杰作。不完美但巨实用 ~ 大爱,对了,再带上 Rust ~
    Feiox
    Feiox
    Jul 29, 2015
    77
    @felixzhu 同感。这些是能说是入门中的入门,LZ 可能还没接触过 元类 这种东西。。。
    lidiya
    lidiya
    Jul 29, 2015
    78
    建议你再学一遍C语言 然后看下这个教程 http://www.maiziedu.com/course/python/
    Fing
    Fing
    Aug 4, 2015
    79
    我的感觉跟你相反,但是对于我而已却多了一条:python找工作难。
    cary7
    cary7
    Aug 7, 2015
    80
    说点实在东西吧,理解不了的时候就去跑一遍代码,还理解不了就再跑。多print,多修改参数,对比结果值。之前看不懂的时候,就是这么学过来的。笨办法,但是很有用
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   4929 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 147ms · UTC 06:06 · PVG 14:06 · LAX 22:06 · JFK 01:06
    ♥ Do have faith in what you're doing.