解决Python编码问题的最佳方法

2021-04-21 11:02:11 浏览数 (1)

磐创AI分享

作者 | Luay Matalka 编译 | VK 来源 | Towards Data Science

对于Python编码网站(如codewars或leetcode)的好处,以及使用它们是否真的能让我们成为更好的程序员,肯定存在一些争议。

尽管如此,许多人仍然使用它们来准备Python面试问题,保持Python编程技能的敏锐。对于任何Python程序员或数据科学家来说,这些资源肯定有一席之地。

在本教程中,我们将研究从这些python编码问题中提取最大实用程序的最佳方法。我们将研究一个相当简单的Python编码问题,并通过适当的步骤来解决它。这包括首先使用伪代码提出计划或大纲,然后从最简单的解决方案开始以不同的方式解决它。

问题

我们需要编写一个函数,将单个整数值作为输入,并返回从零到该输入(包括该输入)的整数之和。如果传入非整数值,则函数应返回0。

如果我们把数字5传递给函数,那么它将返回0到5的整数之和,或者(0 1 2 3 4 5),等于15。如果传入除整数以外的任何其他数据类型,如字符串或浮点等,则函数应返回0。

制定计划

我们应该做的第一件事是用伪代码解决这个问题。伪代码只是一种规划步骤的方法,而不必担心编码语法。

我们可以这样做:

代码语言:javascript复制
def add(num):
    # 如果num是整数
        # 将整数0与num相加并返回sum

    # 如果num不是整数,则返回0

Sample inputs/outputs:

# input: 5, output: 15
# input: 'and', output: 0

我们定义了一个函数add,它接收一个输入num。在add函数中,我们使用注释编写步骤的大纲。如果传递给函数的值是整数,那么我们将通过该值加整数0,然后返回总和。如果传递给函数的值不是整数,那么我们只返回0。

让我们在上面的伪代码中展开这一步:

代码语言:javascript复制
# 将整数0与num相加并返回sum

这一步可以通过多种方式完成。如果我们尝试使用for循环执行此步骤,伪代码会是什么样子?

代码语言:javascript复制
def add(num):
    # 如果num是整数

        # 创建sum变量并将其赋值给0

        # 使用for循环,循环整数0到num

        # 通过添加num来更新sum值

        # 返回和

# 如果num不是整数,则返回0

让我们试着根据上面创建的蓝图来解决它!

使用For循环

我们可以使用for循环解决此提示,如下所示:

代码语言:javascript复制
def add(num):
    # 如果num是整数
    if type(num) == int:

        # 创建sum变量并将其赋值给0
                sum = 0

        # 使用for循环,循环整数0到num
                for x in range(num 1):

        # 更新和值
                    sum  = x

        # 返回和
                return sum

# 如果num不是整数,则返回0
    else:
        return 0
让我们剖析下面的代码。

我们首先使用type函数检查传入的值num是否为整数。

代码语言:javascript复制
if type(num) == int:

如果类型是整数,则创建一个sum变量并将其赋值为0。

代码语言:javascript复制
sum = 0

然后,我们使用for循环和range函数对从0到传递给我们的函数的整数进行循环。

请记住,range函数创建一个range对象,它是一个iterable对象,从0开始(如果我们不指定起始值),然后转到小于停止值的整数。

这就是为什么我们需要把1加到停止值(num 1)上,因为我们要把从0到(包括)这个数字num的所有整数相加。

range(start, stop[, step])

range函数将创建一个range对象,它是一个iterable对象,因此我们可以使用for循环来遍历它。当我们在这个iterable对象中循环时,我们将每个数字或x添加到sum变量中。

代码语言:javascript复制
for x in range(num 1):
    sum  = x

然后在for循环迭代完成后,函数返回总和。

代码语言:javascript复制
return sum

最后,如果传入的数字不是整数,则返回0。

代码语言:javascript复制
else:
    return 0
这是没有注释的代码:
代码语言:javascript复制
def add(num):
    if type(num) == int:
        sum = 0
        for x in range(num 1):
            sum  = x
        return sum
    else:
        return 0

如果我们测试add函数,就会得到正确的输出:

代码语言:javascript复制
add(5) 
# 15

add('and')
# 0

这是一个很好的方法来解决这个编码问题,它得到了工作完成。它很容易阅读和正确的工作。

但是,在我看来,通过尝试以其他方式解决这个问题,我们也许可以利用我们的其他python知识和解决问题的技能从中获得更多的知识。这些其他的方法可能更像python,也可能不是,但是想出不同的方法来解决同一个问题是非常有趣和有用的。

让我们试着用另一种方法来解决这个编码问题。

有关iterable对象的详细信息:

https://towardsdatascience.com/three-concepts-to-become-a-better-python-programmer-b5808b7abedc

使用Reduce函数

我们最近在上一个教程中了解了reduce函数的作用。reduce函数接受一个iterable对象,并将其缩减为一个累积值。reduce函数可以接受三个参数,其中两个是必需的。两个必需的参数是:一个函数(它本身接受两个参数)和一个iterable对象。

我们可以用reduce函数来求一个iterable对象的和。

因此,我们可以使用reduce来解决Python问题,而不是for循环:

代码语言:javascript复制
from functools import reduce

def add(num):
    if type(num) == int:
        return reduce(lambda x,y: x y, range(num 1))
    else:
        return 0

就这样!我们使用lambda函数作为函数参数,使用range对象作为iterable对象。reduce函数将range对象缩减为一个值,即sum。然后我们返回总数。

有关reduce函数的详细信息:

https://towardsdatascience.com/three-functions-to-know-in-python-4f2d27a4d05

使用三元运算符

通过使用三元运算符,我们可以进一步缩短代码。使用三元运算符,我们可以使用以下格式将上面的if/else语句缩短为一行:

代码语言:python代码运行次数:0复制
x if C else y

C是我们的条件,它首先被评估。如果计算结果为True,则计算x并返回其值。否则,计算y并返回其值。

我们可以将其实现到我们的代码中,如下所示:

代码语言:javascript复制
def add(num):
    return reduce(lambda x,y: x y, range(num 1)) if type(num) == int else 0

通过这些更改,我们成功地将函数中的代码减少到一行。它可能不是解决这个问题的最具可读性或python的方法,但在我看来,它通过强迫我们找出解决同一个问题的不同方法,帮助我们提高编码和解决问题的技能。

让我们看看能否用另一种方法解决这个编码问题。

有关三元运算符的详细信息:

https://towardsdatascience.com/three-concepts-to-become-a-better-python-programmer-b5808b7abedc

sum函数

我们可以使用Python内置的sum函数以不同的方式解决这个编码问题。sum函数可以接收iterable对象并返回其元素的和。如果我们想先将起始值添加到元素中,我们也可以传入起始值。

sum(iterable, start)

让我们用sum函数来解决编码问题:

代码语言:javascript复制
def add(num):
    return sum(range(num 1)) if type(num) == int else 0

就这样!这可能是解决这个编码问题的最佳方法,因为它是最简洁和易于阅读的解决方案。此外,它可能也会有最好的表现。

有关代码性能的详细信息:

https://towardsdatascience.com/become-a-more-efficient-python-programmer-3850c94b95a4

结论

在本教程中,我们了解到使用不同方法解决Python问题可以通过扩展知识库来增强我们的编码和解决问题的技能。

我们看了一个python编码问题的例子,并完成了解决这个问题的步骤。我们首先计划如何使用伪代码来解决它。然后,我们首先通过使用for循环来解决提示,从而实现了这个步骤概要。

后来,我们用reduce函数解决了同样的问题。我们还实现了三元运算符以进一步缩短代码,但仍然保持可读性。

最后,我们使用Python内置的sum函数和三元运算符来获得最短但仍然是最Python式的解决方案。

0 人点赞