Peteryo01223 发表于 2021-1-13 17:31:08

第23课:递归。打印了五个 None...

题目:
写一个函数get_digits(n),将参数n分解出每个位的数字并按顺序存放到列表中。举例:get_digits(12345) ==>

我的尝试,出错了,打印出连续五个 None。请帮我看看,哪里错了呀?估计又是基本功问题
def get_digit(n):
    list1 = []
    if n > 0:
      list1 = list1.append("n%10")
      n = n//10
      get_digit(n)
      print(list1)

get_digit(12345)

Twilight6 发表于 2021-1-13 17:33:56



列表大多数方法没有返回值,例如你代码中的 append

因为 append 函数没有返回值,则 Python 默认返回一个 None

使得你 list1 = list1.append("n%10") 相当于 list1 = None

自然导致你每次 print(list1) 打印都一定是 None

Peteryo01223 发表于 2021-1-13 17:39:52

本帖最后由 Peteryo01223 于 2021-1-13 17:43 编辑

Twilight6 发表于 2021-1-13 17:33
列表大多数方法没有返回值,例如你代码中的 append

因为 append 函数没有返回值,则 Python 默认返 ...

def get_digit(n):
    list1 = []
    if n > 0:
      list1 = list1.append("n%10")
      n = n//10
      get_digit(n)
      print(list1)
    return list1

get_digit(12345)
那么,请问,我在哪里加个return,来返回这个值好?以上修改,没成功。
难道,我只能用 insert 么?append 这么没用,设立它,不是浪费么?append 给我的印象还挺深的。

Twilight6 发表于 2021-1-13 17:43:45

Peteryo01223 发表于 2021-1-13 17:39
那么,请问,我在哪里加个return,来返回这个值好?以上修改,没成功。


呃,刚刚没太认真看代码,你的 append 参数不能加引号,否则加入列表的都是 'n%10' 这个字符串

代码你可以这样改,用 insert 比较方便:

list1 = []
def get_digit(n):
    if n > 0:
      list1.insert(0,n%10)
      n = n//10
      get_digit(n)

get_digit(12345)
print(list1)

Peteryo01223 发表于 2021-1-13 17:46:15

Twilight6 发表于 2021-1-13 17:43
呃,刚刚没太认真看代码,你的 append 参数不能加引号,否则加入列表的都是 'n%10' 这个字符串

代码 ...

难道,我只能用 insert 么?append 这么没用,设立它,不是浪费么?append 给我的印象还挺深的。

昨非 发表于 2021-1-13 17:48:39

Peteryo01223 发表于 2021-1-13 17:46
难道,我只能用 insert 么?append 这么没用,设立它,不是浪费么?append 给我的印象还挺深的。

可以,直接把你的“”去掉就可以
但是会造成反序

Peteryo01223 发表于 2021-1-13 17:50:53

昨非 发表于 2021-1-13 17:48
可以,直接把你的“”去掉就可以
但是会造成反序

去掉“”后,将结果没变,还是5个None。奇怪。

Twilight6 发表于 2021-1-13 17:51:59

Peteryo01223 发表于 2021-1-13 17:46
难道,我只能用 insert 么?append 这么没用,设立它,不是浪费么?append 给我的印象还挺深的。


这样即可,进入递归不改变 n 原数值:

list1 = []
def get_digit(n):
    if n > 0:
      get_digit(n//10)
      list1.append(n%10)

get_digit(12345)
print(list1)

Twilight6 发表于 2021-1-13 17:54:18

Twilight6 发表于 2021-1-13 17:51
这样即可,进入递归不改变 n 原数值:



另外如果需要加 return 可以直接这样加:

list1 = []
def get_digit(n):
    if n > 0:
      get_digit(n//10)
      list1.append(n%10)
    return list1

print(get_digit(12345))

昨非 发表于 2021-1-13 17:55:51

Peteryo01223 发表于 2021-1-13 17:50
去掉“”后,将结果没变,还是5个None。奇怪。

list1 = []#放到外面,避免每层递归时,被覆盖掉
def get_digit(n):
    if n > 0:
      list1.append(n%10)#append没有返回值(none),而是直接对list1进行的操作,所以不能list1=...
      n = n//10
      get_digit(n)
      #把这个打印去掉
    return list1

print(get_digit(12345))#将返回值打印
测试结果:

Peteryo01223 发表于 2021-1-13 17:57:45

昨非 发表于 2021-1-13 17:55
测试结果:

牛!刚我点快了,没给你最佳,抱歉。

jackz007 发表于 2021-1-13 17:58:24

def get_digit(n):
    list1 = []
    while n:
      list1 . insert(0 , n % 10)
      n //= 10
    return list1

print(get_digit(12345))

昨非 发表于 2021-1-13 17:59:34

Peteryo01223 发表于 2021-1-13 17:57
牛!刚我点快了,没给你最佳,抱歉。

加注释费了点儿时间
不过解决就好哈{:10_297:}
(twilight老哥很强的,大概率我还是抢不过他)

Peteryo01223 发表于 2021-1-13 18:01:07

昨非 发表于 2021-1-13 17:55
测试结果:

list1 = []#放到外面,避免每层递归时,被覆盖掉
def get_digit(n):
    if n > 0:
      list1.append(n%10)#append没有返回值(none),而是直接对list1进行的操作,所以不能list1=...
      n = n//10
      get_digit(n)
      #把这个打印去掉
      list1.sort()
    return list1

print(get_digit(12345))#将返回值打印
我加了一行,list1.sort(),顺序正过来了。虽然不简洁,但是自己的思路,比看答案有趣哈。

昨非 发表于 2021-1-13 18:03:05

Peteryo01223 发表于 2021-1-13 18:01
我加了一行,list1.sort(),顺序正过来了。虽然不简洁,但是自己的思路,比看答案有趣哈。

确实,自己写出来东西感觉还是很不错的
页: [1]
查看完整版本: 第23课:递归。打印了五个 None...