磐创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式的解决方案。