2017-09-03 58 views
0

我試圖在python中複製abs函數。我認爲我的代碼很近,但不會給非兼容的輸入類型帶來錯誤。它也輸出絕對值+ 0j。那麼我應該編輯什麼?在python中創建絕對函數的副本

def abc(x): 
    if isinstance(x, complex): 
     y = (x.real**2 - (x - x.real)**2)**0.5 
    elif x>=0: 
     y = x 
    else: 
     y = -x 
    return y 

它輸出絕對值+ 0j。無論如何刪除?

+0

原始的源代碼是免費提供的... –

+0

*爲什麼*是你試圖複製abs功能? – EsotericVoid

回答

0

.real屬性似乎是爲intfloat定義的,因此您可以在最後一行中簡單地使用return y.real

雖然使用x.imag而不是x - x.real可能會更乾淨,這將完全避開這個問題。

+1

從技術上講,當你的方法給出屬性錯誤時,絕對的列表輸入會給出類型錯誤。但仍然足夠接近,我猜 – Ram

+0

@SurajRam這真的只是回到評論中的問題,這是:你爲什麼需要這個?你可以繼續黑客攻擊,直到你完全複製了'abs()'的行爲,但是爲什麼只要使用'abs()'就可以打擾? –

+1

我剛剛學習python,我的導師讓我試試這個練習 – Ram

0

您對複雜類型的虛部的計算給了您一個複雜的數字,這不是您想要的。你想要一個真實的號碼,所以結果是真實的。

變化:

y = (x.real**2 - (x - x.real)**2)**0.5 

要:

y = (x.real**2 + x.imag**2)**0.5 

演示:

>>> x = 4 + 6j 
>>> abs(x) 
7.211102550927978 
>>> (x.real**2 - (x - x.real)**2)**0.5 # your approach 
(7.211102550927978+0j)     # notice the 0j 
>>> (x.real**2 + x.imag**2)**0.5 
7.211102550927978