我先学的是C,后来学了点C++。最近学Python,看完简明Python,感觉很容易,可是看廖雪峰的教程,有些技巧性的东西就觉得不是很好理解。
比如
f1, f2, f3 = [(lambda i = i: i * i) for i in range(1, 4)]
可能是C语言的思维比较深入,对于Python的一些地方就容易转不过弯来。有没有大牛也是先学C然后学Python的?能分享点学习经验么> <感激不尽
1
zhicheng 2015-07-24 23:00:14 +08:00 via Android 2
所以你C必然也是学的一塌糊涂。
|
3
hebwjb 2015-07-24 23:07:53 +08:00
理解这个应该跟先学什么没关系~
|
4
pythonee 2015-07-24 23:07:57 +08:00
有,我就是
|
5
imlonghao 2015-07-24 23:09:15 +08:00 via Android
这觉得挺基础的,慢慢分析即可!
[i for i in range(3)] 列表解析 lambda 匿名函数 |
6
crazyxin1988 2015-07-24 23:10:13 +08:00
熟能生巧
慢慢来 把基础语法学好了 就看懂了 |
7
hahasong 2015-07-24 23:11:28 +08:00
没有,基本语法而已,不看文档的么
|
8
Sabermadao 2015-07-24 23:11:31 +08:00
代码撸多了就自然而然了
|
9
matthewz 2015-07-24 23:11:34 +08:00
python 里有很多语法糖而已 C 里则根本没有.
简单的说 python 是预置了各种颜色的水彩颜料, 我记得有的套装里有好几百种颜色. 而 C 只有三原色+白色, 想要什么颜色自己混合去吧. 比如说匿名函数吧, C 不用匿名函数也能实现类似的结果, 但是会麻烦一些而已, 没有现成的东西一步到位. |
10
matthewz 2015-07-24 23:13:37 +08:00
为什么你觉得 C 简单? 我猜是因为你没做过什么复杂的项目, C 的语法本身很简单
|
11
standin000 2015-07-24 23:19:52 +08:00
学点lisp就好理解lambda了
|
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 那本书了,用的同样是“死记硬背”大法,先学会怎么用,至于各种原理以后再搞。 一家之言,轻拍。 |
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. |
14
imn1 2015-07-24 23:32:30 +08:00
以入门的情况看,我是最难理解为什么这样写
a = [['aa', 'bb'], ['cc', 'dd']] [x for y in a for x in y] 一直以为是从里层往外层写 |
15
leavic 2015-07-24 23:33:28 +08:00
80后大部分都是到大学开始学C作为第一门语言的(我们高中都没什么机会碰到电脑,有也很少是拿来学习的),我到现在都觉得C是语言的根基,会C可以让你快速学会其他语言,而不是成为阻碍。
|
16
sivacohan 2015-07-24 23:37:14 +08:00 via Android
如果你理解的深入和我理解的一致的话。
后面你还得撸一遍C。 |
17
batstying 2015-07-24 23:40:45 +08:00
都是大牛啊,我也看不懂~,看不懂没关系啊,查啊,感觉python封装好了很多东西,反正具体又不用自己实现,类似于调api,遇到不懂就查,又不丢人。
|
18
ChangxuBlack 2015-07-24 23:42:10 +08:00
我觉得不难啊,可能是学的太少吧。。。坚持下去,多学点就好了
|
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。。。觉得看廖雪峰的东西坚持不下去,求其他高招。。。 |
20
aheadlead 2015-07-25 00:05:44 +08:00
支持LZ
我更觉得很多东西深入都很难 就连易语言也是(别喷我……) |
21
endosome 2015-07-25 00:54:41 +08:00 via iPhone
入门时学的是foxbase。
|
23
dalang 2015-07-25 01:07:03 +08:00 via iPhone
几乎所有的编程语言,易入门的都难精通。Python 的话网上的资源太多了,优秀的库那么多。多写,多看好的代码,回头再写。学语言就是这么个过程
|
24
chengzhoukun 2015-07-25 01:15:33 +08:00 1
@leemw 廖学峰的教程前面还是很好懂的,不做web后面的web开发就不用看了吧,再看看Python数据分析、数据挖掘和机器学习的书
|
25
ericls 2015-07-25 01:15:34 +08:00
楼主这个代码还是 Python 么。。。
这样搞 有意思么 无聊 |
27
leemw 2015-07-25 03:10:54 +08:00
@chengzhoukun 我主要走statistical目前,machine learning不怎么搞。。。所以看python这方面相关的书感觉和R差不多,但是R又用的更顺手。R又有不足,哎~囧啊。
|
29
leemw 2015-07-25 03:43:53 +08:00
@ligyxy 其实统计领域R基本是够用了(对我来说),尤其是R studio出来以后,编码方便很多,主要是考虑自己以后是不是会向M.L.方向上尝试的原因,PYTHON貌似M.L方面应用比统计方向更广泛。另外,想请教一下目前米帝的趋势,D.S这两个方向上工作哪个比较好找?待遇?
|
30
echo1937 2015-07-25 04:22:10 +08:00
@kevinreadonly 我也没太看明白Lambda里面为什么有个i = i
|
32
qqblog 2015-07-25 05:16:02 +08:00
廖的问题去问廖
|
33
echo1937 2015-07-25 05:40:58 +08:00
@cadmuxe 我想起来了,在 for 里面 i 的值是不断改写的,但是 lambda 里面只是储存了 i 的符号,调用的时候再查找。这就是你说的late binding。
|
34
vinceguo 2015-07-25 07:09:23 +08:00 via Android
Nothing special. RTFM!
|
37
mianju OP @kevinreadonly
@deanguqiang 对的,我其他都能理解,就是i = i 那边开始没弄懂,主要书和代码看的少,没怎么接触过lambda i = i这种用法,正常都是lambda i : 之类的 |
38
mkeith 2015-07-25 08:56:52 +08:00
@deanguqiang lambda x = i:x *x 的意思吗?
|
39
deanguqiang 2015-07-25 09:25:42 +08:00 via iPad
@mkeith 对的
|
40
rainmakeroly 2015-07-25 09:35:47 +08:00
基础的Python书籍还是别选国内了(Python源码分析不属于基础,所以除它外有无都可)。何况Python有那么多书与详细的官方文档。
|
41
wizardoz 2015-07-25 10:11:52 +08:00
我也觉得Python想深入不简单。
|
42
Shazoo 2015-07-25 10:17:15 +08:00
python其实用C的方法写,也没什么。
如果要优雅,就得多看别人代码,记住各种tips。 就像当年的perl。一直用C风格写,后来看别人代码,就慢慢的可以写出新手眼中的天书了。 |
43
lancegin 2015-07-25 10:47:57 +08:00
看了你的描述,估计你是纠结于python的一些语法糖问题,这些语法糖会抽象多个操作,所以让你刚从c/c++这种注重细节的语言转过来的无法理解。这是许多脚本语言的特性,就是为了减少代码繁琐的操作会抽象出很多简洁的语法糖,正是因为这些语法糖,脚本语言的开发效率才会这么高。
|
45
loading 2015-07-25 10:49:45 +08:00
你就是想写出这类看起来很牛逼的代码而已?
多模仿就好 |
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], |
48
cc7756789 2015-07-25 11:38:11 +08:00 via iPhone
lambda x: x*x 是个匿名函数,这种其实接触多了不难理解,这些东西都是Python的特性,而特性这种东西熟悉它只需要时间罢了。
|
49
tushiner 2015-07-25 12:06:55 +08:00
哪门语言不一样,有些所谓入门简单的语言不就是因为语法糖多、库多、框架多么,说白了还是跟“深入”没关系。
|
50
sangmingming 2015-07-25 12:08:00 +08:00
跟楼主同感,相比于其他语言,python为了更优雅,更多的语法糖。
|
51
happlex 2015-07-25 12:45:14 +08:00
理解不了很正常,函数式的写法一方面非常不同于以往接触的过程式语言,另一方面本来就和人的直觉相悖。如果之前接触的不是 C,而是 LISP,Javascript 这样的语言,类似的写法就是家常便饭了。
另外,学习一门语言最重要的不是语法,这门语言体现核心思想。语法千变万化,核心思想都是一样的。你掌握了这种思想,也就一通百通了。这就是为什么有经验的程序员刚接触一门新的语言就能马上上手的缘故。 所以楼主实际上欠缺的是一种思维,这方面可以看看斯坦福大学的一门公开课「编程范式」。 http://v.163.com/special/opencourse/paradigms.html 也建议楼主多接触一些其他的语言,Python 包罗万象是它的优点。但它也不如 C语言,LISP 那样纯粹,没有把某一个特性发挥到极致。 不要畏惧,学习任何东西都不是一蹴而就的,最重要的还是坚持。 最后祝您身体健康,再见。 |
52
tracyone 2015-07-25 12:49:23 +08:00
编程语言只是工具.............看你实现什么
|
53
zog 2015-07-25 12:59:58 +08:00
你需要做实际的项目和练习。看书和碎片化代码片段,不管用。
|
54
tini28 2015-07-25 13:17:45 +08:00
别钻牛角尖
|
55
felixzhu 2015-07-25 14:55:10 +08:00
感觉你理解错了什么叫做深入。。
因为这都是入门的东西啊。。 |
56
SoloCompany 2015-07-25 14:59:11 +08:00
1. python 的 lambda 语法比较累赘且奇葩(见仁见智)
2. 允许命名空间内同名变量存在而不管阅读者的混淆这才是真正的奇葩 机器可以很容易的识别不等于人可以很容易的识别,语言设计者允许这样的存在我无从评价,但至少从规范上就要禁止把代码真写成这样 |
57
wuyu1998 2015-07-25 15:03:19 +08:00
你用c的思维模式(or 编程模型),去写pythan程序,当然会有这样的问题。
建议读《learning python》,学习python的思维模式。 |
58
unity0703 2015-07-25 15:08:02 +08:00 via Android
学点lisp就好理解了,推荐《计算机程序的构造和解释》,能让你功力大增
|
59
neutrino 2015-07-25 15:14:08 +08:00
python入门也不容易,和vim差不多了。。
|
61
wingyiu 2015-07-25 17:05:02 +08:00
那些觉得py简单的来讲讲yield
|
62
chengzhoukun 2015-07-25 17:15:41 +08:00
@wingyiu yield不算复杂吧
|
63
baichi 2015-07-25 19:07:35 +08:00
|
64
Draplater 2015-07-25 19:39:45 +08:00
感觉这段写得不好,lambda的参数循环的变量都用i,容易混淆
这样写好一些 [(lambda x=i: x * x) for i in range(1, 4)] |
65
unity0703 2015-07-25 20:17:26 +08:00
@mianju CSAPP也是本好书,不过是关于计算机体系结构的,这本书侧重点在于理解计算机如何运作,但和楼主提到的lambda表达式关系不大,想理解编程语言的话,还是读SICP(计算机程序的构造和解释)吧,这本书全是Lisp代码,看完以后你对程序的理解会大幅提高,引用知乎的回答( http://www.zhihu.com/question/19931095 ):学 Lisp 付出和获得不成正比,是指数比
|
68
airqj 2015-07-26 09:41:19 +08:00
C 熟悉了python就是个脚本....
lambda 是FP的东西,可以先去看一下 |
70
Taojun0714 2015-07-27 05:09:54 +08:00
去学一下函数式编程吧,SICP,Haskell的也行,你都知道都是最简单的东西
|
71
Taojun0714 2015-07-27 06:53:35 +08:00
@unity0703 现在可以直接看新的python版的SICP,我觉得楼主如果能读得懂英语文档,第一章看完就没这个问题了
|
72
duobei 2015-07-27 09:23:13 +08:00
我也遇到了同样的问题,一开始就是那样,然后心里特别着急想一下子全部吃透,稍后发现,先用着熟悉的,然后慢慢熟悉就自然而然的会了。
|
73
hitmanx 2015-07-27 12:29:35 +08:00
@unity0703 多谢推荐!我觉得有一点很难的是怎么样说服一个没学过函数式编程的人去进行尝试,我看到的回答都是形如,“你只要学过lisp就会发现.....”这种前提是学之前所不具备的。又或者例如"lisp比某某语言好在.....",这儿往往给出的理由是很形而上、很高屋建瓴的层面。我不知道有没有人写过一些非常精简、易懂的例子,能明显地告诉你同样的功能,在比如c\c++之类的语言里实现会怎么样写,需要多少倍的功夫和小心避免各种问题等等,而在lisp里又是能如何优雅地解决。
|
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就容易多了 |
78
lidiya 2015-07-29 17:55:54 +08:00
建议你再学一遍C语言 然后看下这个教程 http://www.maiziedu.com/course/python/
|
79
Fing 2015-08-04 15:28:19 +08:00
我的感觉跟你相反,但是对于我而已却多了一条:python找工作难。
|
80
cary7 2015-08-07 10:34:03 +08:00
说点实在东西吧,理解不了的时候就去跑一遍代码,还理解不了就再跑。多print,多修改参数,对比结果值。之前看不懂的时候,就是这么学过来的。笨办法,但是很有用
|