好吧,這完全讓我困惑,我正在打印一個字符串和它的返回數字。 我不明白它是如何從字符串返回數字。爲什麼python從字符串中返回數字?
這是代碼片段。
string = "String"
print int(string[0:min(5,len(string))],36)
該片段的輸出是
48417935
我的朋友告訴我它是與從琴絃計算機生成的數字,但我只是很困惑。
有人可以請客氣一點,並解釋爲什麼發生這種情況?
好吧,這完全讓我困惑,我正在打印一個字符串和它的返回數字。 我不明白它是如何從字符串返回數字。爲什麼python從字符串中返回數字?
這是代碼片段。
string = "String"
print int(string[0:min(5,len(string))],36)
該片段的輸出是
48417935
我的朋友告訴我它是與從琴絃計算機生成的數字,但我只是很困惑。
有人可以請客氣一點,並解釋爲什麼發生這種情況?
您正在這片
>>> 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
您正在打印返回值int me thod,它返回一個數字,而不是一個字符串。
您正在使用內置函數int
將string
轉換爲integer
。
類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
你的第一行代碼創建了一個變量字符串
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
你是一個傳奇,謝謝你:) –
@АлексейЛагунов高興我可以幫助:)請注意upvote,如果你喜歡它有用 –
你應該總是試一試在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號系統沒有符號S
或T
等基地16有額外的符號A
到F
。所以這意味着基地36系統將有36-10=26
符號。這意味着它將具有所有的英文字母,因爲它是符號表。這就是爲什麼它不會引發異常,並能夠將任何字符串文字轉換爲數字表示。
string[0:min(5,len(string))]
的產物是Strin。你然後我們int()
就可以了,這意味着你試圖讓一個字符串爲int。作爲documentation爲int()
狀態,
˚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個字符。
太容易的人,歡呼的解釋,我現在更好地理解:) –