为什么python从字符串返回一个数字?

时间:2015-11-17 06:23:40

标签: python casting int calculus

好的,这让我感到困惑,我正在打印一个字符串及其返回的数字。 我不明白它是如何从字符串中返回数字的。

以下是代码段。

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

该代码段的输出是

48417935

我的朋友告诉我这与计算机生成字符串数字有关,但我很困惑。

有人可以善待并解释为什么会这样吗?

6 个答案:

答案 0 :(得分:5)

你正在接受这个片段

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

并将其转换为base36数字(类似于hexadecimal,但使用全部26个字母)

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

达到这个数字的另一种方法是:

>>> ["0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ".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方法的返回值,该方法返回一个数字,而不是字符串。

答案 2 :(得分:0)

您正在使用int内置功能将string转换为integer

来自,Python docs

  

class int(x = 0)class int(x,base = 10)

     

返回一个由数字或字符串x构成的整数对象,或   如果没有给出参数,则返回0。如果x是数字,则可以是a   普通整数,长整数或浮点数。如果x是   浮点,转换截断为零。如果是论点   在整数范围之外,该函数返回一个长对象   代替。

     

如果x不是数字或者给定了base,则x必须是字符串或   Unicode对象,表示基数中的整数文字。   可选地,文字可以在+或 - 之前(没有空格)   之间)和空白包围。 base-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 

答案 3 :(得分: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

答案 4 :(得分:0)

你应该总是尝试在python shell中一点一点地混淆你,这样你就可以理解发生了什么。使用像ipython这样的更好的shell,并自由地使用其?来查看背景中发生的事情。 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)意味着什么?

让我们回到shell:

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。所以它意味着base 36系统将有36-10=26个符号。这意味着它将所有的英文字母都作为符号表。这就是为什么它不会引发异常并且能够将任何字符串文字转换为数字表示。

答案 5 :(得分:0)

string[0:min(5,len(string))]的产品是Strin。然后我们在其上int(),这意味着你尝试将字符串设为int。作为int()状态的documentation

  

f x不是数字或者如果给出了base,则x必须是表示基数为整数的字符串或Unicode对象。可选地,文字可以在前面加+或 - (之间没有空格)并且用空格包围。 base-n文字由数字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 =&#34; 1&#34; &#34; 1&#34;是一个字符串文字,而不是整数文字,因为它是引号。字符串的值是1,恰好是一个整数字符串,但这是字符串文字的语义分析 - 在句法层面&#34; 1&#34;只是一个字符串,与&#34; foo&#34;没有区别。

所以口译员正在接受“Strin&#39;并使用base 36将其计算为数字。你可以使用它来看看你至少需要30才能抛出错误,因为0 - 9和a - t总共是30个字符。