撰寫一個函式 nondec(n),它接收一個整數 n>0,并報告其數字(以 10 為底)是否形成一個非遞減序列(即每個數字大于或等于前一個數字)。
我在做這個練習時遇到了麻煩。到目前為止,我的代碼是:
def nondec(n):
'''
>>> nondec(113355779)
True
>>> nondec(44569)
True
>>> nondec(346234)
False
>>> nondec(222)
True
>>> nondec(789)
True
>>> nondec(55555)
True
>>> nondec(1234123)
False
>>> nondec(98765)
False
'''
prev = 9
while n>0 :
lastdigit = n%10
if lastdigit > prev:
return False
prev = lastdigit
n = n/10
return True
if __name__ == "__main__":
import doctest
doctest.testmod(verbose=True)
它適用于所有情況,但對于那些重復數字的情況:222、55555。我嘗試了很多東西,但它讓我的代碼變得更糟。謝謝。
uj5u.com熱心網友回復:
也許這是您正在尋找的代碼:
def nondec(n):
'''
>>> nondec(113355779)
True
>>> nondec(44569)
True
>>> nondec(346234)
False
>>> nondec(222)
True
>>> nondec(789)
True
>>> nondec(55555)
True
>>> nondec(1234123)
False
>>> nondec(98765)
False
'''
prev = 9
while n>0 :
lastdigit = n % 10
if lastdigit > prev:
return False
prev = lastdigit
n = n // 10
return True
我對您的代碼所做的唯一更改是您使用 10: 進行除法的部分n = n / 10。
問題是這個部門回傳了一個float但你想要一個int
例如,如果您將222當它除以10then 的新值n時22.2,您希望它是22。(您可以通過列印您撰寫的每一行代碼的結果來檢查此類問題!)
您可以通過使用//代替來完成此操作/。
你可以檢查這個答案Python 除以 10來看看我在說什么
uj5u.com熱心網友回復:
你可以這樣做:
def nondec(n):
return all(int(x)<=int(y) for x,y in zip(str(n), str(n)[1:]))
測驗它:
for n in (113355779,44569,346234,222,789,55555,1234123,98765):
print(n, nondec(n))
印刷:
113355779 True
44569 True
346234 False
222 True
789 True
55555 True
1234123 False
98765 False
因為'0'<'1' ... '8'<'9'您實際上可以一直使用字串:
def nondec(n):
s=str(n)
return all(x<=y for x,y in zip(s, s[1:]))
# same result...
uj5u.com熱心網友回復:
另一種更語言化的方式:
def nondec(n):
'''
>>> nondec(113355779)
True
>>> nondec(44569)
True
>>> nondec(346234)
False
>>> nondec(222)
True
>>> nondec(789)
True
>>> nondec(55555)
True
>>> nondec(1234123)
False
>>> nondec(98765)
False
'''
n = str(n)
for e,_ in enumerate(n):
if e:
if int(n[e]) < int(n[e-1]):
return False
return True
if __name__ == "__main__":
import doctest
doctest.testmod(verbose=True)
uj5u.com熱心網友回復:
變數n應該是一個整數。你應該投到你n的int回圈里面。
def nondec(n):
'''
>>> nondec(113355779)
True
>>> nondec(44569)
True
>>> nondec(346234)
False
>>> nondec(222)
True
>>> nondec(789)
True
>>> nondec(55555)
True
>>> nondec(1234123)
False
>>> nondec(98765)
False
'''
prev = 9
while n > 0:
lastdigit = n % 10
if lastdigit > prev:
return False
prev = lastdigit
n = int(n / 10)
return True
if __name__ == "__main__":
import doctest
doctest.testmod(verbose=True)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/524663.html
