新手在学习编程时怎样提高自己的代码质量呢? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
JYLu
V2EX    问与答

新手在学习编程时怎样提高自己的代码质量呢?

  •  
  •   JYLu 2022-06-21 21:48:11 +08:00 1684 次点击
    这是一个创建于 1276 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我是数学专业的,研究生作最优化 /数值计算方向的.虽然不是计算机科班专业,但是也会要经常要写些程序跑一些实验看看算法效率和稳定性.当然,我们主要的功夫在推导和证明上,写的这些这些程序应该不会有专业计科同学做的项目复杂了.

    我想提高编程能力,除了是因为学习工作中很有用之外,还有一个原因可能是:我现在觉得编程很有趣.掌握数据结构对于提高编程能力很有好处,所以我打算假期自己学学数据结构.其实这些数据结构理解起来还不算很难,但是具体练习时的项目会复杂一些.

    我的问题:

    1.自学的话也常常不知道自己的代码写得对不对(因为没有那种 JO 系统),都只好自己输入些简单例子看一看这样.有时挣扎一番应该是说写出来一个能不报错的,但是因为测试集很小(都是自己手敲的)不知道是不是写得对.

    2.如果写对了,不知道自己写得好不好.之前上课的话老师会抓些作业典型讲哪里哪里写得好或者不好.

    3.除了 CS 科班专业的同学以外,你当初为什么考虑学习编程,你学习编程的心态是怎样的呢?

    所以大家有什么建议?

    我的基础:

    我之前学过一个学期的 JAVA 程序设计课,就是学校开设的为非 CS 专业同学算是半个必修课吧(程序设计是必修,有几种语言可以选,但是非 CS 专业可以随便挑一种学).后来我在 Coursera 上自己学了一点 Python,大概就是基本的 control flow, exception, class 之类.

    另外随便贴出一段代码(解汉诺塔问题),请大家看看有没有问题.

    '''Write a program that can solve instances of the Tower of Hanoi problem (from Exercise C-4.14).''' class Hanoi : '''Hanoi tower.''' class pag : '''Pag of a Hanoi tower''' def __init__(self, name : str, disk = [] ): '''Create a pag of a Hanoi tower with given disk as stack.''' self.disk = disk self.name = name def __str__(self) -> str: return self.name + ':' + str(self.disk) def __init__(self, n : int): '''Create a Hanoi tower with n disks.''' self.a = Hanoi.pag(name = 'a') self.b = Hanoi.pag(name = 'b') self.c = Hanoi.pag(name = 'c', disk = [i for i in range(n)]) self.n = n self.pags = {self.a, self.b, self.c} def __str__(self) -> str: x = str(self.a) y = str(self.b) z = str(self.c) return x + '\n' + y + '\n' + z def move_disk(self, pag1 : pag, pag2 : pag): '''move the top element from pag1 to pag2.''' if (len(pag2.disk) == 0) or (pag1.disk[0] < pag2.disk[0]): x = pag1.disk[0] pag1.disk = pag1.disk[1:] pag2.disk = [x] + pag2.disk print('disk element',x,'on the top of pag',pag1.name,'has been moved to the top of',pag2.name) else: raise ValueError('illegal move.') def move_Hanoi(self, pag1 : pag, pag2 : pag, k : int ): '''move the top k elements on the top of pag1 to pag2''' def find_transfer(): '''Find tansfer station.''' s1 = {pag1, pag2} s2 = self.pags.difference(s1) pag3 = s2.pop() return pag3 pag3 = find_transfer() if (k <= 0) or (k > len(pag1.disk)): raise IndexError('k must be a positve integer less than length of pag2.disk.') if k == 1: self.move_disk(pag1, pag2) else: self.move_Hanoi(pag1, pag3, k-1) self.move_disk(pag1, pag2) self.move_Hanoi(pag3, pag2, k-1) def solve_Hanoi(self): '''Solve the Hanoi tower.''' self.move_Hanoi(self.c, self.a, self.n) print(self) if __name__ == '__main__': hanoi = Hanoi(5) print(hanoi) hanoi.solve_Hanoi() 
    cniter
        1
    cniter  
       2022-06-21 22:58:50 +08:00
    代码质量也看是哪个方面吧,就刷题而言的话,就起好变量名函数名,抽取公共代码块作为一个函数就行;对做工程而言,面向对象的思想总是要有的,比如设计模式之类的,这样好分模块,有些模式也是针对特殊问题的一种解决方案;对于更大的系统而言,就不仅仅是代码质量了
    JYLu
        2
    JYLu  
    OP
       2022-06-21 23:11:49 +08:00
    @cniter 谢谢.其实我时常好奇,所谓面向对象的思想, 究竟是怎样的一种思想? 我学过的 Java, python, 还有大概了解的 Julia 都是支持面向对象的.老师强调封装,继承,多态,这些就是面向对象('Java 是一门语言艺术,讲究的是封装,继承,多态'.LOL).但是可能是没干过工程,实际没什么体验.特别是封装,到底有什么用?
    monster1priest
        3
    monster1priest  
       2022-06-21 23:15:06 +08:00
    多看,多写,多改
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3265 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 22ms UTC 00:43 PVG 08:43 LAX 16:43 JFK 19:43
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86