我嘗試撰寫一個函式,如果給定引數是素數,則回傳“True”,否則回傳“False”。從某種意義上說,我實作了我的目標,但我只是想知道一種更好、更 Python 的方式來做到這一點,這就是我想出的:
def prime_one_liner(n):
return True if len([i for i in range(2,n) if n % i == 0]) == 0 else False
uj5u.com熱心網友回復:
“實作你的‘目標’”
如果這是您的目標,您可以使用any它來縮短它:
def prime(n): return not any(n % i == 0 for i in range(2,n))
雖然,“pythonic”不是我要描述的方式。它更像是“難以閱讀”。然而,它可能比你的版本更 Pythonic。
更好的方法:
更易讀的版本是:
def prime(n):
for i in range(2, n): #for every value between 1 and n
if n%i == 0: #check if i divides n
return False #if this is true, n is not prime
return True
適當的功能:
但是,您需要考慮小于 2 的值,因此您還需要像這樣編輯代碼:
def prime(n): return not any(n % i == 0 for i in range(2,n)) if n > 1 else False
和/或:
def prime(n):
for i in range(2, n): #for every value between 1 and n
if n%i == 0: #check if i divides n
return False #if this is true, n is not prime
return True if n > 1 else False
基本資訊:
n考慮到,您的代碼不適用于所有整數值n=1(請參閱上面修復此問題的修改示例),但無論如何,如果這是您的目標(如上所示),可以將其縮短,但這只是因為它很短并不意味著它是“pythonic”。目前您的代碼很難閱讀。所以也許擴展代碼會更好(類似于上面的代碼擴展)。
uj5u.com熱心網友回復:
我認為這是最“pythonic”的方式:
def prime_one_liner(n):
return all((n%i)>0 for i in range(2, int(n**.5) 1))
請注意,它僅適用于n>0.
uj5u.com熱心網友回復:
你的想法我的版本看起來像這樣:
x = lambda n: False if False in map(lambda i: False if n % i == 0 else True, range(2, n)) else True
因為這是一個由一條線而不是兩條線組成的單線
但可能有很多好的/更好的方法可以做到這一點,但它在某種程度上是 pythonic
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/427045.html
上一篇:使用函式將整數轉換為字母序列
