V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
JYLu
V2EX  ›  问与答

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

  •  
  •   JYLu · 58 天前 · 410 次点击
    这是一个创建于 58 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    我的问题:

    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  
       58 天前
    代码质量也看是哪个方面吧,就刷题而言的话,就起好变量名函数名,抽取公共代码块作为一个函数就行;对做工程而言,面向对象的思想总是要有的,比如设计模式之类的,这样好分模块,有些模式也是针对特殊问题的一种解决方案;对于更大的系统而言,就不仅仅是代码质量了
    JYLu
        2
    JYLu  
    OP
       58 天前
    @cniter 谢谢.其实我时常好奇,所谓面向对象的思想, 究竟是怎样的一种思想? 我学过的 Java, python, 还有大概了解的 Julia 都是支持面向对象的.老师强调封装,继承,多态,这些就是面向对象('Java 是一门语言艺术,讲究的是封装,继承,多态'.LOL).但是可能是没干过工程,实际没什么体验.特别是封装,到底有什么用?
    monster1priest
        3
    monster1priest  
       58 天前
    多看,多写,多改
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2722 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 10:59 · PVG 18:59 · LAX 03:59 · JFK 06:59
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.