2015-11-17 35 views
1

好吧,這完全讓我困惑,我正在打印一個字符串和它的返回數字。 我不明白它是如何從字符串返回數字。爲什麼python從字符串中返回數字?

這是代碼片段。

string = "String" 
print int(string[0:min(5,len(string))],36) 

該片段的輸出是

48417935 

我的朋友告訴我它是與從琴絃計算機生成的數字,但我只是很困惑。

有人可以請客氣一點,並解釋爲什麼發生這種情況?

回答

5

您正在這片

>>> string[0:min(5,len(string))] 
'Strin' 

,並將其轉換爲一個base36號(類似於hexadecimal但使用所有的26個字母)

>>> int('Strin', 36) 
48417935 

另一種方法是在這個數字到達是:

>>> ["ABCDEFGHIJKLMNOPQRSTUVWXYZ".index(x) for x in 'STRIN'] 
[28, 29, 27, 18, 23] 
>>> 28*36**4 + 29*36**3 + 27*36**2 + 18*36**1 + 23*36**0 
48417935 
+1

太容易的人,歡呼的解釋,我現在更好地理解:) –

0

您正在打印返回值int me thod,它返回一個數字,而不是一個字符串。

0

您正在使用內置函數intstring轉換爲integer

從,Python docs

類int(X = 0)類int(X,鹼= 10)

返回從一個數字或串x構造的整數對象,或 返回0如果沒有參數給出。如果x是一個數字,它可以是一個 純整數,一個長整數或一個浮點數。如果x是 浮點數,則轉換會向零截斷。如果參數 不在整數範圍內,則該函數會改爲返回長對象 。

如果x不是數字或給定了基數,則x必須是一個字符串或 Unicode對象,表示以基數爲基數的整數文字。 或者,文字可以前面加上+或 - (在 之間沒有空格)並且被空白包圍。基數n文字由 數字0到n-1組成,其中a到z(或A到Z)的值爲10到35. 默認基數爲10.允許的值爲0和2-36。 Base-2,-8, 和-16文字可以選擇以0b/0B,0o/0O/0或 0x/0X作爲前綴,如同代碼中的整數文字一樣。基數0意味着將 字符串完全解釋爲整數字面值,以便實際基數爲2,8, 10或16。

如果你打破你的代碼片段小,這將是更具可讀性和清晰的給你::

string = "String" 
len_of_str = len(string) # get length of "string" i.e., 6 
var_a_minimum = min(5, len_of_str) # get the minimum of 5 or len_of_str 
var_x_string = string[0:var_a_minimum ] # slice the string from 0 to var_a_minimum 
var_y_integer = int(var_x_string,36) # get the integer value of var_x_string to the base-36 
print var_y_integer 
0

你的第一行代碼創建了一個變量字符串

string = "String" 

讓你的印刷說明更易於理解。

length=len(string) #finds the length of text in string variable in this case 6 

然後你在做min(5,length)。該表達式找到5到6之間的最小整數。所以它的計算結果爲5.

最後字符串[0:5]將字符串分片,並獲取從0到4的所有字符。因此它的計算結果爲「Strin」在你的例子中Read about slicing here

然後最後你在做print int("Strin",36)這將返回一個base36整數。 Read about int() here

+0

你是一個傳奇,謝謝你:) –

+0

@АлексейЛагунов高興我可以幫助:)請注意upvote,如果你喜歡它有用 –

0

你應該總是試一試在python shell中一片混亂,這樣你就能明白髮生了什麼。使用更好的外殼,如ipython,並且可以自由使用它的?來查看背景中發生了什麼。 Python是一種「自我記錄」語言。

讓我們通過代碼一塊一塊:

print int(string[0:min(5,len(string))],36) 

好讓我們開始min(5,len(string))

In [2]: string = "String" 

In [3]: min(5,len(string)) 
Out[3]: 5 

In [4]: min? 
Docstring: 
min(iterable[, key=func]) -> value 
min(a, b, c, ...[, key=func]) -> value 

With a single iterable argument, return its smallest item. 
With two or more arguments, return the smallest argument. 
Type:  builtin_function_or_method 

漂亮的自我解釋。

好讓我們領先一步:

string[0:min(5,len(string))] 

我們已經有了一個值超出min()調用的,所以這歸結做:

string[0:5] 

正如我們已經從python的列表切片的方式,它將返回從string[0]開始並以string[4]結尾的字符串的5個元素。

因此,在我們給定的字符串的情況下,它會返回:

In [5]: string[0:min(5,len(string))] 
Out[5]: 'Strin' 

現在什麼呢int('Strin',36)手段?

讓我們回到貝:

In [6]: int?? 
Docstring: 
int(x=0) -> int or long 
int(x, base=10) -> int or long 

Convert a number or string to an integer, or return 0 if no arguments 
are given. If x is floating point, the conversion truncates towards zero. 
If x is outside the integer range, the function returns a long instead. 

所以它轉換爲數字在基於36位的系統。讓我們看看最後一次的默認調用...

In [7]: int('Strin') 
--------------------------------------------------------------------------- 
ValueError        Traceback (most recent call last) 
<ipython-input-7-a13c6c79aa49> in <module>() 
----> 1 int('Strin') 

ValueError: invalid literal for int() with base 10: 'Strin' 

那麼這意料之中的,因爲基地10號系統沒有符號ST等基地16有額外的符號AF。所以這意味着基地36系統將有36-10=26符號。這意味着它將具有所有的英文字母,因爲它是符號表。這就是爲什麼它不會引發異常,並能夠將任何字符串文字轉換爲數字表示。

0

string[0:min(5,len(string))]的產物是Strin。你然後我們int()就可以了,這意味着你試圖讓一個字符串爲int。作爲documentationint()狀態,

˚Fx不是數,或者如果底座給出,則x必須是字符串或Unicode對象表示基數基字面的整數。或者,文字可以在前面加上+或 - (兩者之間沒有空格)並用空格包圍。甲基 - 正文字由數字0到n-1,用a到z(或A至Z)具有值10至35。

integer literal由維基百科定義爲:

整型文字是一個整數,其值直接在源代碼中表示。例如,在賦值語句x = 1中,字符串1是指示值1的整數字面值,而在語句x = 0x10中,字符串0x10是指示值16的整數字面值,其以十六進制表示爲10由0x前綴指示)。相比之下,在x = cos(0)中,表達式cos(0)的計算結果爲1(作爲0的餘弦值),但值1不是字面上包含在源代碼中。更簡單地說,在x = 2 + 2中,表達式2 + 2的計算結果爲4,但值4不是字面上包含的。此外,在x =「1」中,「1」是字符串文字,而不是整數文字,因爲它在引號中。字符串的值是1,它恰好是一個整數字符串,但這是對字符串文字的語義分析 - 在句法級別,「1」只是一個字符串,與「foo」沒有區別。

所以解釋正在採取「〜應變」和使用基本36.你可以玩這個,看看那個,你至少需要基座30到不會引發錯誤計算它作爲一個數,因爲0 - 9和 - t共30個字符。

相關問題