python 中的int函数怎么用

Python012

python 中的int函数怎么用,第1张

int()是Python的一个内部函数

Python系统帮助里面是这么说的

[python] view plain copy

>>> help(int)

Help on class int in module __builtin__:

class int(object)

|  int(x[, base]) -> integer

|

|  Convert a string or number to an integer, if possible.  A floating point

|  argument will be truncated towards zero (this does not include a string

|  representation of a floating point number!)  When converting a string, use

|  the optional base.  It is an error to supply a base when converting a

|  non-string.  If base is zero, the proper base is guessed based on the

|  string content.  If the argument is outside the integer range a

|  long object will be returned instead.

 

[python] view plain copy

>>> int(12.0)

12

 

int()函数可以将一个数转化为整数

[python] view plain copy

>>> int('12',16)

18

 

这里有两个地方要注意:1)12要以字符串的形式进行输入,如果是带参数base的话

2)这里并不是将12转换为16进制的数,而是说12就是一个16进制的数,int()函数将其用十进制数表示,如下

[python] view plain copy

>>> int('0xa',16)

10

>>> int('10',8)

结果是 -4

对正数是向下取整,对负数是向上取整。

学python的一个缺点就是对数据类型的基础理解比较少,

你可以用二进制来理解下,举一个有符号的二进制为例子:

对于无符号的 0b000~0b111 来说分别有

0b000 = 0

0b001 = 1

0b010 = 2

0b011 = 3

0b100 = 4

0b101 = 5

0b110 = 6

0b111 = 7

比如 uint 就是 int 的无符号形式。

当相同数据为有符号形式时变为:

0b000 = 0

0b001 = 1

0b010 = 2

0b011 = 3

0b100 = -4

0b101 = -3

0b110 = -2

0b111 = -1

(参考原码、反码、补码)

所以根据这个规则,对float,double等数字是同理,在floor时将有符号位进行省略,如以下位运算(>>):

0b000 >> 1 = 0b000

0b001 >> 1 = 0b000

有 0->0 和 1 -> 0

0b010 >> 1 = 0b001

0b011 >> 1 = 0b001

有 2-> 1 和 3 -> 1

按照这个丢失精度的方法计算负数呢?

0b111 >> 1 = 0b111

0b110 >> 1 = 0b111

0b101 >> 1 = 0b110

0b100 >> 1 = 0b110

可知:

-1 -> -1 与 -2 -> -1

-3 -> -2 与 -4 -> -2

所以对负数的 floor 会向上取整,因为丢失精度的方法是直接根据小数点截断的。

这个问题的原因是你用的np.zeros(count),它的默认数据类型是float类型的,而且不管你往这个np列表传入什么类型的值,它都是自动改为float类型。注意这个float类型可不是原生的浮点类型, 虽然“看”起来差不多, 但如果用type函数的话就能看出来区别了。

有两种解决方法可以解决你的问题。

list = np.zeros(count)   改为  list = np.zeros(count,dtype=int)。 这样就不会出现你所说的问题, 但对于你的这段程序用numpy有点大材小用了。 建议你用下面的方法。

list = np.zeros(count)   改为  list = [0 for i in range(count)]

然后第二张图的错误提示正是因为numpy试图把字符串自动转换为浮点数,但显然是不可能的。为了避免这个错误就必要用我上面的第二个解决方法才行了。

最后,你的代码有可优化的空间,太多遍历和判断条件了。可能会很长,但可能会对你有一些启发,如果没有耐心的话,可以看最后一条就是最终完成的代码。

slice函数处理逻辑过于复杂了。 你是想把如361变成[3,6,1]这样的情况吧。那为何不使用list(str(361))呢,虽然最后的结果里面的元素是字符串类型,但后面直接用int(i)的方式解决了。这样的话,count函数都可以省略了。

看到slice函数下面的for遍历语句,我明白了你的用意,就是为了计算各个位数相加的和,这样的话,就连slice函数都没必要了。直接下面代码就可以了:

for i in str(n):

    sum += int(i)

3.再继续,发现又是slice和for循环,原来是要继续把sum分开。直接list(str(sum))即可。

4.到最后了,我看到了很多条件判断,总觉得条件判断这么写,显得有点罗嗦了点。可以把你这个条件判断写一个类似配置文件的对象,其实就是字典对象。 最终给你总结一下你的代码就是下面这样的:

#input直接用字符串类型就够用了。然后去掉所有import

inputStr = input()

sum = 0

#这条赋值语句其实无所谓, 但对于理解代码来说还是很重要的,反正也不影响性能,何乐而不为呢。

result = []

#下面的是类似配置文件的字典对象

convertDic = {'1':'yi','2':'er','3':'san','4':'si','5':'wu','6':'liu','7':'qi','8':'ba','9':'jiu','0':'ling'}

#算出input的各个位相加的和

for i in inputStr:

    sum += int(i)

#str也是可迭代的类型,所以通过map和lambda匿名函数把各个值变成相对应的拼音。

result = list(map(lambda x:convertDic[x], str(sum)))

print(result)

#去掉注释和print语句,这段程序只用了7行,而且理解起来是不是还挺简单的(除了最后一条)

#我相信你对于上面的语句不是很懂,里面涉及了两个看起来“高达上的东西”,但其实就是一种简写形式。

#map就是映射,简单说就是一个循环,就是把每一个元素经过一个函数处理后再返回来的过程。

#lambda是一个匿名函数,没有函数名,只能有一个表达式,且这个表达式就是返回值。它就是一个精简版的函数而已。当然,map里面也可以直接写已定义好的函数名。

#最后我用比较通俗的代码给你解释一下上面那句语句的大致的工作流程。

#定义一个函数,相当于上面的匿名函数.

def convert(x):

    return convertDic[x]

#然后遍历sum,并把每个元素替换成相应的拼音。现在的sum是一个int类型,int类型是不能迭代的或者遍历的,所以需要把int转换成str类型。

#这里讲一点map和这个循环遍历的区别,首先map会把已有的元素替换成经过函数处理的值。但这条循环是在一个空的list对象里添加数据,这是区别。当然,也可以写替换数据的循环,但代码量不是这2行了,会更多。如果要遍历的话,这种写法还是比较推荐的。

for i in str(sum):

    result.append(convert(i))

    #result.append(convertDic[x]) 也可以这样写,但为了解释上面那条语句,所以这条注释掉当给你的启发。

#最后print就可以看到结果了,也就是说,我们把4条一句压缩成了一天语句了。如果还是不了解的话,可以翻翻文档什么的,里面会有一些例子可当参考。

print(result)