什么是“好的python代码”,这如何满足准则?

时间:2018-12-15 02:53:00

标签: python

当您刚开始时,我一直在听说编写好的代码和编写不好的代码。毕竟,如果它运行并完成了0个问题的工作,那还不够吗?您可以以此为例吗?我用我所知道的以及必须学习的知识进行工作,因此我确信可以将其拆开。除了PEP8和东西之外,什么是好代码?

import random
    def cownbull():
"""This one generates a non repeating random number"""
        def cownbull2():
    """This one is running the game due to local variable problems; keyboard 
                                                          almost thrown"""
            print(num2guess, 'is the generated number')
            print("Let's play a game of Cowbull!")  # explanation
            print("I will generate a number, and you have to guess the 
            numbers one digit at a time.")
            print("For every number in the wrong place, you get a cow. For 
            every one in the right place, you get a bull.")
            print("The game ends when you get 4 bulls!")
            print("There are no repeated digits")
            guesses = 0
            cow = 0
            bull = 0
            while True:
                print("cows:", cow,'|','bulls:',bull,'|','guesses:',guesses)
                cow = 0
                bull = 0
                user = input('Guess a four digit number: ')
                if len(user) >4:
                    print('type four digits!')
                    cownbull()
                guesses = guesses + 1

                for x in user:
                    for y in str(num2guess):
                        if x == y:
                            if user.index(x, 0, 4) ==
                                            str(num2guess).index(y, 0, 4):
                            bull += 1
                                if bull == 4:
                                    print('Nice game!')
                                    cownbull()
                            else:
                                cow += 1
                        else:
                            pass
        num2guess = random.randint(1000, 9999)
        count = 0
        while count < 4:
            for i in str(num2guess):
                count = count + 1
                print(i)
                str2guess = str(num2guess)
                print(str2guess.count(i))
            if str2guess.count(i) != 1:
                print('calculating new number....')
                cownbull()
            else:
                cownbull2()


cownbull()

1 个答案:

答案 0 :(得分:3)

  

毕竟,如果它运行并完成了0个问题的工作,那不是   足够吗?

OH BOY

不。差远了。这让我和几乎所有其他软件开发人员都感到困扰。 让我们来看一个经常发生的情况。

您制作了一个程序,它“有效”。但是,您的代码很糟糕。然后其他人必须努力。你猜怎么了?我开始研究一堆复制粘贴的垃圾,非Python代码,并对其进行全部重做,假设我什至可以解开有人设法将0条注释和逻辑思路集中在一起的科学怪人逻辑。这不是针对您的代码,而是针对“狂野”发生的程度。

这是难以控制的,尤其是在需要添加它的情况下,如果您从现在开始六个月后用您刚刚编写的代码打开编辑器,您是否还会知道它的作用?然后,以这种方式进行编码的人们期望其他开发人员能够使用其“功能”代码。还不够好。


有些代码库是人们多年不使用的代码库,后来变成了旧代码库。这些代码库是怪异的(看着您的COBOL),只有少数人知道任何事情,而对于下一个开发人员或开发人员来说几乎是不可能的团队进行合理程度的管理。

这是一个非常简单的情况。您这里可能有100行。当成千上万这样阅读时会发生什么?当您有一个“整个开发团队”时,会发生什么情况?每个开发团队都在推动代码,执行不同的分支,合并等工作。软件开发非常复杂,并且存在一些实践来最大程度地减少错误,减少开发人员之间的沟通和限制复杂性/错误的代码。


清洁代码是一种鲜为人知的艺术形式。

Zen of Python

Clean Code-如果成本是问题,则可以在其他地方或在您的图书馆(或根据地区而定的等效文件)中找到。我强烈建议您阅读某种形式的有关干净编码的书。会大开眼界。

  

除了PEP8之外,还有什么好代码?

在一个句子中,我应该能够打开编辑器,将您的代码读为一堆简单的逻辑-多亏了Python,它几乎与英语句子完全一样-自上而下地停下来,然后说“是的,这就是我的期望”

您会引起人们对某些设计模式的争论,例如测试驱动的开发或行为驱动的,而这些设计模式有很多优点和用例。但是,这纯粹是集中在代码读取的语义上。编写代码本身的技巧。


您自己的代码中的内容会立即进行重构,并考虑“代码气味”

  1. 评论:“”“由于局部变量问题,该游戏正在运行;键盘几乎被抛出”“”。

虽然这样的评论很可爱,但并没有帮助。您只想在需要代码的地方输入简短的简短注释,以便输入代码库的人和您自己。

  1. 类似这样的嵌套函数:有时使用闭包。这不是其中之一。

  2. 冗余的定义和逻辑:仅在需要时在需要时使用它。

  3. 常规重组和压缩代码。您的新产品,现在还不是真的,但是它们会随着时间而来。所以我不会太挑剔了。

  4. 文档字符串:顾名思义,在实际的代码库中,文档字符串用于文档化功能。参数,返回值,期望值等。甚至可以使用库来从中生成完整的文档页面,例如sphinx

  5. 向后兼容性:这适用于需要旧有支持的大型代码库。如果您访问几乎所有公共存储库,都会发现compat.py可以在版本之间架起桥梁。


面向对象的语言:

通常,我们可以说一些有关面向对象语言的干净代码的事情。

顾名思义,面向对象的语言以“对象”的定义为中心。在python中,这些将是您的类。

在python 2中(也可以在Python 3中使用“旧样式”):

class ClassName(object):
    ....

在python 3中:

class ClassName:
    ....

多态与继承

在这里,您的类用于封装对象及其方法/属性。此外,面向对象的语言固有地提供了 多态性。

多态允许您提供以多种形式起作用的接口。该名称本身从希腊词根“ poly”(意为“许多”)和“ morphism”(意为形式)的含义暗示了这一点。

比方说,我建立了一个类来描述动物及其属性。我可以为every.single.type.of.animal建立一个新的类。或者,提供常用方法和属性,并在必要时覆盖它们。这是practical example of the animal kingdom

多态是在适当的时候编写简洁代码的绝妙方法。同样,对于继承。


积木

有关面向对象语言的强大功能之一就是能够将它们分解为“构建块”,以便说出来并将它们混合在一起以提供混合功能。

但是,当您编写大量这些代码并将它们捆绑在一起以实现更高功能的对象,然后需要进行更改或要在其他地方使用它时,会发生什么呢?

您是否必须经过或带走整个面向对象的动物园?我认为这不是很干净,并且对开发人员感到沮丧。谨慎使用这种编程方法。

我个人很喜欢它,因为我非常喜欢Django Web框架,并且喜欢使用mixins以及这里和那里的一些技巧的灵活性。因此,我个人倾向于这种类型的编程。


使用Python编写干净代码的总结:

执行上述操作,精通多态性和继承性,遵循Zen,了解如何在不破坏可读性的情况下分解事物并保持简洁,并正确编写代码。这是干净代码的90%。其余的都在磨练手艺。