计算化学公社

 找回密码 Forget password
 注册 Register
Views: 7447|回复 Reply: 12
打印 Print 上一主题 Last thread 下一主题 Next thread

[Python] 对我来说,极度灵活性,其实是python的“陷阱”

[复制链接 Copy URL]

593

帖子

12

威望

4720

eV
积分
5553

Level 6 (一方通行)

密度泛函·小卒

跳转到指定楼层 Go to specific reply
楼主
本帖最后由 yjcmwgk 于 2015-8-18 18:38 编辑

我觉得python害死了我。python这个语言简直就是个奇迹。以数组为例。
看看fortran吧,一个数组是real型,那么这个数组里的元素就都必须是real。
在python里,我搞一个数组出来,第一个元素是整形数,第二个元素是实形数,第三个元素是一个字符串,第四个元素是一个小数组,第五个元素是个对象……简直完全没有限制。
除非你事先声明某个数组是弹性的,否则fortran一定会给你一个固定大小的数组,而且数组里不能套小数组。
在python里,数组天生就是弹性的。我喜欢用字典形式定义数组。一开始直接规定空子典,var = {},然后你直接往里装任何东西都行,只要你的电脑内存够用。
在fortran里,你调用数组元素的方式是var[1],var[3][5],数组元素只能用数字或整型变量来调用。
在python里,你调用数组元素的方式是var['wokao'],var['hello'][5],var['王二']['成绩']['数学成绩'],完全是自然语言。
python的语言的极度灵活,让我的程序也极度“灵活”。
我又从不做注释,基本可以死翘翘了。自己写的代码,只要超过200行儿,一个星期,只要一个星期以后,我就无法继续维护它了,天知道我当初是怎么想的。
用python写东西,三个字儿,糙猛快。再加三个字儿,维护难(仅对我而言)
@raillgun
一出生响亮登场,十几岁快乐成长,
二十岁天天向上,三十岁基本定向,
四十岁拼命打创,五十岁回首一望,
六十岁告老还乡,七十岁搓搓麻将,
八十岁躺在床上,九十岁挂在墙上,
人生一世,匆匆忙忙,生得嘹亮,走得凄凉!
生活就像五味瓶,酸甜苦辣难消停!
该吃吃,该喝喝,遇事别去心里搁,
想哭哭,想笑笑,烦恼就往云外抛,
记住甜,忘掉苦,亲人朋友好相处,
心情好,最重要,自我麻痹乐逍遥!

294

帖子

0

威望

3528

eV
积分
3822

Level 5 (御坂)

2#
发表于 Post on 2015-8-18 18:33:36 | 只看该作者 Only view this author
只会 fortran来报个到,貌似python现在是大行其道

593

帖子

12

威望

4720

eV
积分
5553

Level 6 (一方通行)

密度泛函·小卒

3#
 楼主 Author| 发表于 Post on 2015-8-18 18:49:26 | 只看该作者 Only view this author
ruanyang 发表于 2015-8-18 18:33
只会 fortran来报个到,貌似python现在是大行其道

其实python对搞计算的意义不大充其量就是个大号儿的bash
一出生响亮登场,十几岁快乐成长,
二十岁天天向上,三十岁基本定向,
四十岁拼命打创,五十岁回首一望,
六十岁告老还乡,七十岁搓搓麻将,
八十岁躺在床上,九十岁挂在墙上,
人生一世,匆匆忙忙,生得嘹亮,走得凄凉!
生活就像五味瓶,酸甜苦辣难消停!
该吃吃,该喝喝,遇事别去心里搁,
想哭哭,想笑笑,烦恼就往云外抛,
记住甜,忘掉苦,亲人朋友好相处,
心情好,最重要,自我麻痹乐逍遥!

3622

帖子

3

威望

1万

eV
积分
18442

Level 6 (一方通行)

第一原理惨品小作坊

4#
发表于 Post on 2015-8-18 19:04:08 | 只看该作者 Only view this author
fortran不止数组要求数据类型一样,而且非常难于采用可变长度的数组,有时候觉得类更方便。
日常打哑谜&&探寻更多可能。
原理问题不公开讨论,非商业性质讨论欢迎私聊。
本周忙

403

帖子

4

威望

2874

eV
积分
3357

Level 5 (御坂)

5#
发表于 Post on 2015-8-18 19:30:22 | 只看该作者 Only view this author
想必楼主忘了鬼画符般的Perl。

3098

帖子

28

威望

1万

eV
积分
16892

Level 6 (一方通行)

6#
发表于 Post on 2015-8-18 20:44:29 | 只看该作者 Only view this author
你自己给自己规定调用只能用数字不就完了,谁要求你非要用字典下标了。
是在管不住自己的手往list里面乱压东西,自己override一个list类不就完了,我觉得这也比fortran方便。
(当然一说性能,大部分情况下python就捂脸了,不过人家本来就不是为了性能而生的)

294

帖子

0

威望

3528

eV
积分
3822

Level 5 (御坂)

7#
发表于 Post on 2015-8-18 20:54:28 | 只看该作者 Only view this author
差不多,python和perl.tcl,shell基本上差不多!

99

帖子

0

威望

1092

eV
积分
1191

Level 4 (黑子)

8#
发表于 Post on 2015-8-19 13:24:49 | 只看该作者 Only view this author
python的list的这个特性还是不错的,比如写分子动力学的时候,可以把坐标、元素名称、电荷数等等一股脑塞到同一个list里面,以后一直对这个list操作就可以了。
至于可维护性,我觉得python比C或者Fortran方便维护,因为结构更清晰(强制缩进);C和Fortran则是强迫写程序的时候就一定要写注释,否则可能写了后面忘了前面

3098

帖子

28

威望

1万

eV
积分
16892

Level 6 (一方通行)

9#
发表于 Post on 2015-8-21 00:32:29 | 只看该作者 Only view this author
qwoop 发表于 2015-8-19 13:24
python的list的这个特性还是不错的,比如写分子动力学的时候,可以把坐标、元素名称、电荷数等等一股脑塞到 ...

我觉得这样应用还不如定义一个class,而不是用list
self.coord = ...
self.ele_name = ...
self.charge = ...

99

帖子

0

威望

1092

eV
积分
1191

Level 4 (黑子)

10#
发表于 Post on 2015-8-22 15:33:51 | 只看该作者 Only view this author
liyuanhe211 发表于 2015-8-21 00:32
我觉得这样应用还不如定义一个class,而不是用list
self.coord = ...
self.ele_name = ...

list操作的速度比class快多了啊

9

帖子

0

威望

570

eV
积分
579

Level 4 (黑子)

11#
发表于 Post on 2016-1-21 21:47:15 | 只看该作者 Only view this author
其实真的能意识到问题出在哪 反而问题就不大了。

比如说Python的数组元素的类型太灵活了,可以写一个自定义类,做一个接口,用来过滤存入这个类的数据类型。完全可以像Fortran一样,虽然限制得死死的,但是不会出难维护的问题。

反倒是对Python没有经验按照Fortran来写时,潜在的麻烦会一不小心给你搞个大事件。

用之前想好用它的定位嘛,如果是用来大部分代替Fortran,真得花时间来细细整一整。如果用来代替BASH,其实倒无所谓啦。用着趁手就行。

评分 Rate

参与人数
Participants 1
eV +2 收起 理由
Reason
sobereva + 2

查看全部评分 View all ratings

1063

帖子

0

威望

3276

eV
积分
4339

Level 6 (一方通行)

12#
发表于 Post on 2016-4-21 05:31:09 | 只看该作者 Only view this author
本帖最后由 乐平 于 2016-4-21 00:25 编辑

这个……  简直是乱吐槽啊…… 是楼主自己没有正确理解 Python 中的概念,完全是冤枉了 Python。

首先,如果楼主要定义一个数组 【注意!楼主说的是数组!】,应该用 Numpy 的 array() 函数来定义,这样才是标准的 “N维数组”。定义的数组内的元素是统一类型的,要么全是 real,要么全是 int,要么全是 string,和 Fortran,C 的数组(概念上)是一模一样的(当然,在操作上,Fortran 和 C 在取行和取列的默认参数是相反的风格)。详见如下链接:
http://docs.scipy.org/doc/numpy- ... arrays.ndarray.html

楼主说“在python里,数组天生就是弹性的”,楼主你的概念是模糊的……  你说的其实是 Python 里列表(list),根本不是数组啊。如果楼主用 numpy.array() 定义了的数组之后,数组的大小是固定的,没有 .append() 的属性,不能通过这个方式增加元素。但是 Numpy 提供了很多操作数组的函数,比如水平堆积numpy.hstack(),纵向堆积 numpy.vstack(),拆分 numpy.split(),合并 numpy.concatenate() 等等一系列的数组操作函数。
详见如下链接:
http://docs.scipy.org/doc/numpy- ... y-manipulation.html

其次,楼主说“我喜欢用字典形式定义数组”,我只能呵呵呵了…… 楼主你定义的是字典好吗,不是数组啊!

楼主说“在python里,你调用数组元素的方式是var['wokao'],var['hello'][5],var['王二']['成绩']['数学成绩'],完全是自然语言。”  这再次暴露了楼主概念不清,楼主你用的不是数组,你用的是 lists of list 的数据结构。

如果楼主用 Numpy.array() 定义了数组,那么调用数组元素的方式同样是 array[1], array[3][5], 还可以用切片方式 array[3:10][::2] 调用,甚至还可以 array_1[ array_2[:10] ],array[ array > -3 ] 来调用。
详见如下链接:
http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html


最后,楼主说到注释。我只能说,如果用 Python 来写代码,至少我个人觉得可读性是最强的。只要你写代码的思路够清晰,基本上可以不写注释(当然,写注释是个很好的习惯)。我半年前写的 500 多行的代码,拿出来修改整理,看上十来分钟就能回忆起来。如果楼主说难以维护,只能是楼主自己没理清思路罢了。






评分 Rate

参与人数
Participants 3
eV +13 收起 理由
Reason
hcxytpp@163.com + 5 牛!
yjcmwgk + 5 赞!
sobereva + 3 欢迎讨论

查看全部评分 View all ratings

30

帖子

0

威望

584

eV
积分
614

Level 4 (黑子)

13#
发表于 Post on 2017-4-10 17:08:03 | 只看该作者 Only view this author
顶12楼。而且numpy运算速度比起毫无优化的手写fortran是相差不大甚至更好的
毕竟numpy内核是用了几十年久经考验的fortran代码

本版积分规则 Credits rule

手机版 Mobile version|北京科音自然科学研究中心 Beijing Kein Research Center for Natural Sciences|京公网安备 11010502035419号|计算化学公社 — 北京科音旗下高水平计算化学交流论坛 ( 京ICP备14038949号-1 )|网站地图

GMT+8, 2024-11-27 10:54 , Processed in 0.530597 second(s), 22 queries , Gzip On.

快速回复 返回顶部 返回列表 Return to list