2013-04-02 22 views
0

大家好,我有一個noob問題。Python循環:1/30 + 2/29 + 3/28

我怎麼設置下面的代碼打印:

1/30 + 2/29 + 3/28..........30/1

分子爲增加\分母減小

我有以下幾點:

for i in range(1,31): 
    v = i 
for j in range(30,0,-1): 
    t = j 
    print(v/t) 

但打印

1.0 
1.0344827586206897 
1.0714285714285714 
1.1111111111111112 
1.15384615384......... 

我該如何獲得1/30 + 2/29 + 3/28.....

感謝您的幫助和指導。

+3

[每一個程序員/ CS主要應該知道的浮點數什麼(HTTP://文檔。 oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html)對於理解爲什麼打印它的功能將是非常寶貴的。 – Makoto

+1

您沒有指定:1)是否要打印「1/30 + 2/29 + 3/28 + ...」的實際文字? 2)你想要一個分數表示確切答案嗎? 3)你是否必須按照上面的方法計算它? ... – John

+1

@約翰對不起需要的實際文字:'1/30 + 2/29 + 3/28 ...' –

回答

1

我相信你想要的字符串,而不是數值,正確的這個名單?

s = '' 
for j in range(30, 0, -1): 
    s += "{}/{} + ".format(31-j, j) 
print s[:-2] 

閱讀this documentation瞭解它。本質上,它將格式化字符串,使用兩對大括號作爲佔位符,並在第一個槽中傳遞值31-j,並在第二個中傳遞j。

當然,有一種更優雅的方式來做到這一點,但這是一種快速和骯髒的方法。

+0

你是對的格式是我最弱的一個優點。該文件是一個很好的閱讀! –

3

您只需要一個循環!分母總是31減去分子。

r = 0 
for i in range(1,31): 
    r += i/(31 - i) 
print(r) 
+0

我不認爲這是他想要的....我認爲他想要字符串,,,不要評估它 –

+0

哦,我以爲你想評估的總和而不是字符串。我的錯。 – wwww

+0

這與原始海報有相同的問題;但用於識別模式的+1。 –

1

這裏發生了什麼是您的號碼在打印之前正在評估爲浮點數。既然你想打印它們而沒有評估,你應該把它們插入到一個字符串中。下面一行演示瞭如何變量插入到輸出不加評估了:

print "%d/%d" % (v,t) 

有關如何格式化字符串打印功能信息,請參閱http://docs.python.org/release/2.5.2/lib/typesseq-strings.html

但是,這仍將每個結果放在一個單獨的行上,因爲打印功能會自動插入一個新行。你可以建立與下面的循環一個字符串(請注意,你怎麼能整齊地打包成一個圈,而不是兩個,因爲你可以通過減去得到分母):

string = '' 
for i in range(1,31): 
    string += "{}/{} + ".format(i, 31-i) 
print string 

,這會給你「1/30 + 2/29 + ... + 30/1 +「,但仍然包含最後加號和周圍空格。要解決該問題,請將最後一行更改爲

print string[:-3] 

刪除最後一個字符。有關如何使用格式功能的信息,請參閱http://docs.python.org/2/library/string.html#formatstrings

+1

既然分割是真正的分割而不是整數除法,可以假定這是Python 3是安全的。在Python 3中,['%'作爲格式化程序已被棄用。](http://docs.python.org/3.0/ whatsnew/3.0.html#changes-already-present-in-python-2-6) – Makoto

+1

我很確定我聽說他們推翻了這個決定,因爲公衆譁然:P –

+0

@JoranBeasley yup - 棄用已經走了渡渡鳥 –

1
print (" + ".join(["%s/%s"%(num,denom)for num,denom in zip(range(1,31),range(30,0,-1))])) 

我覺得至少

荏苒一起(1,2,3...,30)(30,29,28...,1)導致新的元組((1,30),(2,29),...,(30,1))

你再在這個迭代將每個分子和分母爲導致列表的字符串一樣,我們使用格式字符串"%s/%s"%numerator,denominator來做到這一點,儘管使用"%d/%d"代替它可能會更好,但那就是另一個故事

["1/30","2/29",...,"30/1"]

那麼你只需加入使用' + '作爲膠水

+3

可能是太多了,這傢伙消化;進一步解釋代碼會給你我的+1 –

1

我不確定你想要做什麼,但你可以只用一個循環來完成。通過每一次循環中,分母就是31減去分子:

from fraction import Fraction 
for num in range(1,31): 
    den = 31 - num 
    fraction_string = "%d/%d" % (num, den) 
    fraction_value = Fraction(num, den) 
    quotient = num/den 
    #... do stuff with whichever of the above you want 

當你正在構建一個結果 - 要麼增加的總和,或者附加到字符串,或在每次迭代輸出的東西 - 你可以更清楚地理解列表理解和列表功能。例如,而不是像這樣:

quotientList = [] 
for n in range(1,31):   
    quotientList.append(n/(31 - n)) 

你可以只是這樣做:

quotientList = [ n/(31 - n) for n in range(1,31) ] 

,而是這個:

total = 0 
for n in someList: 
    total = total + n 

你可以只是這樣做:

total = sum(someList) 

把這些概念放到醚,這裏有三種可能性我看到你想要做什麼:

  1. 打印出來的文字串1/30 + 2/29 + 3/28 + ... +30/1

    print(" + ".join("%d/%d" % (n, 31-n) for n in range(1,31)))

  2. 評估,作爲一個算術表達並打印結果:

    print(sum(n/(31.0-n) for n in range(1,31)))

  3. ...但作爲一個部分,而不是一個小數:

    from fractions import Fraction
    ...
    print(sum(Fraction(n,31-n) for n in range(1,31)))