Python练习:将数字转换为相反的数字数组
Python练习:将数字转换为相反的数字数组
题目
给定一个随机非负数,你必须按相反顺序返回数组中该数字的位数。
示例(输入 => 输出):
35231 => [1,3,2,5,3]
0 => [0]
代码
def digitize(n):
my_list = []
for x in str(n):
my_list.append(int(x))
my_list.reverse()
return my_list
def digitize(n):
return [int(x) for x in str(n)[::-1]]
知识点:
在第一个函数中,你首先创建了一个空列表
my_list
。然后,你将输入的整数n
转换为字符串,并遍历每个字符。对于每个字符,你将其转换为整数,然后将其添加到my_list
中。最后,你使用list.reverse()
方法对列表进行就地反转,并返回结果。在第二个函数中,你使用了一种 Python 的特性,称为列表推导式(list comprehension)。列表推导式是一种简洁的创建列表的方法。在这个例子中,你首先将输入的整数
n
转换为字符串,然后使用切片操作[::-1]
将字符串反转。然后你遍历反转后的字符串的每个字符,将每个字符转换为整数,并在一个新的列表中返回结果。
错误代码
'int' object is not iterable
def digitize(n): my_list = [] for x in n: my_list.append(x) return my_list.reverse() print(digitize(123)) # TypeError: 'int' object is not iterable
就地操作问题
def digitize(n): my_list = [] for x in str(n): my_list.append(x) return my_list.reverse() print(digitize(123)) # None
因为
list.reverse()
是一个就地操作,它直接修改了原列表并返回None
。你应该先反转列表,然后再返回。此外,你的函数应该返回数字列表,而不是字符列表。你需要在
append
时将字符转换为数字。下面是修改后的代码:
def digitize(n): my_list = [] for x in str(n): my_list.append(int(x)) my_list.reverse() return my_list print(digitize(123)) # 输出: [3, 2, 1]
这段代码会将数字转换为字符串,然后将每个字符转换为数字并添加到列表中,然后反转列表并返回。
深入理解代码
我不理解:
为什么我的代码return my_list.reverse() 返回了 None
list.reverse() 是一个就地操作,就地操作什么意思
解释说明:
在Python中,
list.reverse()
是一个就地操作,也就是说它会直接修改原列表并返回None
。当你尝试返回my_list.reverse()
的结果时,你实际上是在返回None
,因为list.reverse()
操作完毕后没有返回任何值,只是直接修改了原列表。"就地操作"是一个编程术语,意思是操作直接修改数据,而不是创建新的修改后的数据副本。在这种情况下,
list.reverse()
就是一个就地操作,因为它直接在原列表上进行操作,而不是创建一个新的反转后的列表。这与一些其他的Python操作不同,例如切片操作,切片操作会返回一个新的列表,而不会修改原列表。
例如:
list1 = [1, 2, 3] list2 = list1.reverse() print(list1) # 输出:[3, 2, 1] print(list2) # 输出:None
在这段代码中,
list1.reverse()
直接修改了list1
,而list2
是None
,因为list.reverse()
没有返回任何值。相比之下,切片操作会返回一个新的列表:
list1 = [1, 2, 3] list2 = list1[::-1] print(list1) # 输出:[1, 2, 3] print(list2) # 输出:[3, 2, 1]
在这段代码中,
list1
没有被修改,而list2
是list1
的一个反转后的副本。
测试
import codewars_test as test
from solution import digitize
@test.describe("Fixed Tests")
def basic_tests():
@test.it('Basic Test Cases')
def basic_test_cases():
test.assert_equals(digitize(35231),[1,3,2,5,3])
test.assert_equals(digitize(0),[0])
test.assert_equals(digitize(23582357),[7,5,3,2,8,5,3,2])
test.assert_equals(digitize(984764738),[8,3,7,4,6,7,4,8,9])
test.assert_equals(digitize(45762893920),[0,2,9,3,9,8,2,6,7,5,4])
test.assert_equals(digitize(548702838394),[4,9,3,8,3,8,2,0,7,8,4,5])
@test.describe("Random Tests")
def random_tests():
from random import randint
sol = lambda n: list(map(int, str(n)[::-1]))
for x in range(100):
num = randint(10, 99 * 2 ** x)
@test.it(f"Testing for digitize({num})")
def test_case():
test.assert_equals(digitize(num), sol(num), "It should work for random inputs too")