前言

最近在写学校Python测评题的时候看到了这么一个基础题目

题目描述:给定一个正整数,请将该数各位上数字反转得到一个新数。得到的新数的最高位数字不应为零,例如输入380,反转后得到的新数为83。

然后看到不同同学的各种做法(其中包括标题中所说的一行代码的解法),感觉很有意思,就打算在这里讲解一下主流的2种做法

正文

第一种解法:通过算法实现

代码如下:

1
2
3
4
5
6
num=int(input())
reverseNum=0
while num>0:
reverseNum=reverseNum*10+num%10
num=num//10
print(reverseNum)

原理:

如上(bushi(想必这么简单的算法网友们也不需要我讲解了哈哈

第二种解法:通过字符串倒序实现(一行代码)

代码如下:

1
print(int(input()[::-1]))

原理:

  • 获取用户输入的字符串
  • 通过序列操作将字符串倒序
  • 将倒序后的字符串转换成整形,以消除前面可能会出现的数字
  • 输出结果

语法讲解:

[:]的用法

s[i,j]
从下标i到下标j截取序列s中的元素

  • 如果i或j为负数,则下标从序列尾部算起。也就是说,下标i相当于下标len(s)+i,下标j相当于下标len(s)+j。另外,-0依然是0
  • 从序列s的下标i的元素(包含)到下标j的元素(不包含)之间所有元素,进行截取。另外,i<j
    1. 若i或j大于len(s),则i或j被len(s)取代
    2. 若i省略或i是None值,则i被0取代
    3. 若j省略或j是None值,则j被len(s)取代
    4. 若i>=j,返回没元素的序列

[::]的用法

s[i,j,k]
从下标i到下标j,步长为k,截取序列s中的元素

  • 如果i或j为负数,则下标从序列尾部算起。也就是说,下标i相当于下标len(s)+i,下标j相当于下标len(s)+j。另外,-0依然是0
  • 从序列s的下标i的元素(包含)到下标j的元素(不包含)之间,选取下标为i+nk的元素(0<=n<(j-i)/k),也就是说,选取下标为i,i+k,i=2k,i+3*k等等的元素,直到下标大于等于j为止
    1. 当k为正数,下标选取反向从0到len(s)-1
    2. 当k为附属,下标选取反向从len(s)-1到0
    3. 当i或j省略或是None值,则被端下标(0或len(s)-1)所取代(具体看k的正负符号)
    4. k不能为0.若k为None值,则被k看成1