近年python备受推崇,我之前只用来做跟atk的接口,最近终于认真用上它了。
然而。。。。我觉得和它有点不是太合得来。。
用这货的感觉和用mathematica颇像,都是极端高度面向对象的货。此前我编程的思路都是面向过程的,没怎么锻炼过面向对象的思维。以前用mathematica时就惊讶于它竟然会跑了几小时后返回一个相当于把我的输入抄一次的结果给我,让我简直想摔电脑,更别提那默认的画图风格是坐标轴在中心,虽然上了一个学期公选课,实用起来仍然用得简直吐血。
现在用python也是,好死不死浮夸地主要用类来实现我的目的,非常不熟练。结果debug的时间以天为单位。
例如刚才,我把可当成常量的数据做成列表存进了类A的属性B里,然后在一个循环里调用pos=A.B[i][j],想当成复合字典来引用,然后对pos进行修改。但是跑出来的结果让我非常吃惊。检查很久后发现print A.B[1][1]这样的命令竟然能每次出的结果都不一样。后来想了好久才想明白,它指向的是A.B[1][1]这个对象的id(或地址、句柄、指针之类的类似概念),而不是另辟内存来储存它的值。简直蛋碎………………能不能给我选择要值还是地址……
想通问题出在哪了,但是想要按原来思路修改的话,对专业术语不熟,还得试关键词来搜。现在困得要死。哎。如果就用它的这个指向id的思路,又得重新想。
其实就是这几天,我还写过一个脚本专门看对象引用时的地址问题,当时就很蛋疼了,没想到这时竟然再狠狠地绊一脚。。
早知道就继续用shell了,甚至用Excel手动弄都好,虽然普适性不强需要修改,但是效率比现在用python高几十倍。现在食之难咽(比无味更糟),弃之可惜,超级郁闷。
哎,给自己定deadline是明天(妈蛋应该是“今天”了)中午12点,还搞不掂的话就用Excel了。
想起要值的话也许可以用eval(不过不想试了)。我遇到很多麻烦的问题都会用eval和exec,被老程序员狂吐槽。但是对我来说它们只要不出错还是挺好用的。。PS:又想吐槽python块里有子函数的话exec会崩了。
长路漫漫。。。
随便搜了一下“python 引用变量”,就看到解决方法了。用copy模块生成副本。想起之前哪里就提过要小心python的浅复制。现在才知道原来是对可变对象和不可变对象的传递规则是固定无法选择的。
我怒了,竟然连deepcopy都解决不了!!!!!!!!!What the fuck!谁说python好入门的,这编写速度比我用shell和C都慢N倍!气死我了。
现在想到的办法只有写入文件再读出了,我就不信它这还不给我读值。但是好繁琐。。
为了能睡个正常觉以及赶上进度,还是放弃算了。。。Excel我来了~~~
2015.3.6
结果我说话不算数。。。今天还是继续折腾python了。期间有件突发事件(近几天总是发生各种奇葩的意外状况,诸如快递丢件、电暖器坏、被打电话催交一个不是我管的表),于是联系了小道士。他貌似心情不错,说要传授我编程秘技,说了几句后我就把这些天弄的几个脚本发给他看。没想到还得到了夸奖说写得这样算不错了,我感动得简直要内牛满面。认识的编程大牛太多了,我老被鄙视。
回想起来也好像有点厉害,我也就最近十天才看了python简明教程(如果monson见到这句可能又要吐槽我了,这么晚才看什么的)(简明教程果然非常简明,好多东西没提要另搜),五天前才知道类怎么实现(求不吐槽,C++书我只看到指针那章就没看了,大一时虽然学过java但是只记得个大概而且1/4学期能学个啥),现在用它实现我的批量制造和读取隧道结的需求了(要不是为了通用到atk,我早就用回shell了)。哎,不过这debug时间长得简直心碎……
我向他吐槽了这篇blog提到的问题,他提醒我类一定要好好设计不然会很蛋碎。。另外告诉我拿来存要读的数据的变量不要轻易修改(不过我觉得像python这种引用关系这么强的语言,想不被修改都难的样子)。最后我把
for ..........:
pos=class_x.attribute_xx
pos[2]=xxx+xx
xxxx=get_xxx(pos[0], pos[1], pos[2])
里的pos[2]全改成pos2,虽然(pos[0], pos[1], pos2)看着感觉有点不舒服,但是功能实现得很好。
他对我要做的事很感兴趣,要我向他解释我要做的是什么,他也做来玩玩。我费了一堆工夫去解释POSCAR的格式和隧道结的堆砌方式,眼看几小时就这样流逝了但他仍然兴致勃勃,我终于死活不肯说下去了,说等有空时如果他仍然感兴趣再详谈。。。