Py学习  »  Python

Python逆向工程——为什么代码会产生这种特殊的结果

Curios about Python • 3 年前 • 1417 次点击  

有人问我为什么下面的代码会给出以下结果:

def find(j):
    if(j>1):
        j=find(j//10)-(j%10)
        print(j)
    else:
        j=0
    return j
i=122
k=find(i)

结果:

-2
-4

为什么会有这样的结果?以下是我目前掌握的情况:

def find(j) 以j为参数的函数find 如果j大于1,则find函数中的参数j除以10 122 % 10 = 2 print (j) –调用函数find来显示

从这一点开始,我在挣扎。为什么-2和-4来自哪里?

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/130691
 
1417 次点击  
文章 [ 2 ]  |  最新文章 3 年前
Charles Duffy
Reply   •   1 楼
Charles Duffy    3 年前

修改代码的一个版本,以解释它在做什么以及为什么要这样做:

def find(j):
    if(j>1):
        find_result = find(j//10)
        new_j = find_result - (j%10)
        print("j == %r; find(%r) => %r; find(%r) - %r => %r" % (
            j, (j//10), find_result, (j//10), j % 10, new_j))
        j = new_j
    else:
        j=0
    return j

i=122
k=find(i)

...其产出如下:

j == 12; find(1) => 0; find(1) - 2 => -2
j == 122; find(12) => -2; find(12) - 2 => -4

所以:首先,你从 j=122 因此,它可以计算 find(12) 减去 2 从结果来看。所以,在我们知道这将做什么之前,我们需要 查找(12) .

查找(12) 检查是否 j > 1 因为 1 不是 > 1 ,这是假的,所以它返回 0 .调用方从中减去2,得到 -2 ,它会打印出来。

然后 find(122) 把这个结果 -2 ,并减去一个额外的 2. 从中得到,所以 -4 .

Samwise
Reply   •   2 楼
Samwise    3 年前

答案可能是由于Python版本的不同。Python的现代版本 / 作为浮点除法,即使操作数是整数。Python2相当于 // (整数除法)如果操作数是整数。

如果我修改你的代码使用int除法(这似乎是我的意图,因为它也使用 % 操作员)然后我得到了预期的结果:

>>> def find(j):
...     if(j>1):
...         j=find(j/10)-(j%10)
...         print(j)
...     else:
...         j=0
...     return j
...
>>> find(122)
-1.22
-3.419999999999999
-5.419999999999999
-5.419999999999999
>>> def find(j):
...     if(j>1):
...         j=find(j//10)-(j%10)
...         print(j)
...     else:
...         j=0
...     return j
...
>>> find(122)
-2
-4
-4