I just recently started reading the python.org documents and it looked like a really interesting language. Now, since Visual Studio 2017 supports Python, I decided to finally actually start learning it. My friend challenged me to write a program that checks if a number is an Armstrong number.
import sys
def isArmstrong(number):
arr = str(number)
count = len(arr)
res = 0
for x in range(0, count):
res += int(arr[x]) ** count
return res == number
if len(sys.argv) > 1:
arg = sys.argv[1]
print(arg + " is an armstrong number: " + str(isArmstrong(int(arg))))
else:
print("No arguments passed! :-(");
Now this is the first solution that I could come up with. As you can see, it converts the number to a string to determine the amount of digits, and then handle them individually. Is this the smartest way to do it, or can it be done without converting to a string? If not: Is there anything I can do to improve this code performance-wise?
-
5\$\begingroup\$ Hi. Welcome to Code Review! I would find something like this easier to read if it explained what an Armstrong number is. Saves a trip to Google. \$\endgroup\$mdfst13– mdfst132016年11月22日 02:36:07 +00:00Commented Nov 22, 2016 at 2:36
-
\$\begingroup\$ @mdfst13 You're right, that would've been smart. Thanks! \$\endgroup\$Sulakore– Sulakore2016年11月22日 16:48:15 +00:00Commented Nov 22, 2016 at 16:48
1 Answer 1
By PEP 8, Python's official style guide, function names should generally be lower_case_with_underscores
. Also, the final semicolon should be omitted.
The function would typically be written more elegantly using the sum()
builtin function, with a generator expression. (It's not any faster than your original code, though. Actually, a tiny bit slower.)
I don't recommend using arr
as a variable name, since it's neither descriptive (what does the array represent?) nor accurate (it's actually a string).
For the printout, I recommend using str.format()
or one of the other formatting mechanisms.
import sys
def is_armstrong(number):
digits = str(number)
length = len(digits)
return number == sum(int(digit) ** length for digit in digits)
if len(sys.argv) > 1:
arg = int(sys.argv[1])
print('{} is an Armstrong number? {}'.format(arg, is_armstrong(arg)))
else:
print("No arguments passed! :-(")
-
\$\begingroup\$ Wow, that style guide is really useful. Also had never heard of
.format()
orsum()
, thanks for all this! Also I called it "arr" because I'm used tochar[]
for character arrays in C# haha \$\endgroup\$Sulakore– Sulakore2016年11月22日 16:50:48 +00:00Commented Nov 22, 2016 at 16:50 -
1\$\begingroup\$ The only change I'd make to this answer is to use f-strings, ie
f'{arg} is an Armstrong number? {is_armstrong(arg}'
. The advantage is pretty obvious. It just looks so much nicer. The only downside is they need python 3.6 or newer. \$\endgroup\$Oscar Smith– Oscar Smith2018年11月23日 08:59:36 +00:00Commented Nov 23, 2018 at 8:59