我们编写的大部分程序,都需要读取输入并对其进行处理,而基本的输入操作是从键盘键入数据。Python从键盘键入数据,大多使用其内置的input()函数。但是,不同于程序设计初学者常接触的C和C++,我们不需要在输入之时规定变量的类型。相反,我们可以非常便捷的使用a = input()对任何数据类型的变量a进行赋值,无论是int,float还是列表等等。但是这并不代表Python将程序员的判断数据类型工作完全省去了,如果这样想,那么在编程过程中很容易出现问题。我们知道,在对变量进行赋值时,Python会帮助判断存储数据的类型,不需要我们进行操作,但是input不是这样。
首先,我们需要弄明白我们赋值的变量在python内部到底是以什么形式存在的。下面我将展示一个程序片段
>>> x = input() 4.5 >>> type(x) <class 'str'> >>> y = input() Do you love python? >>> type(y) <class 'str'>那么我们可以看到,通过type()函数,我们看到无论我们输入的值是int,float还是sring,最后input()i函数返回的这个数据的类型均为string型。了解了这一点,将有利于我们更好的使用input()函数。因为在算术运算中,字符串是没法直接和int或float数据进行算术运算的,如果直接使用,那么必然带来TypeError报错。
>>> x = input() abc >>> x * 3 'abcabcabc' >>> y = input() 123 >>> x + y 'abc123
输入的字符串可以通过运算符进行连接、复制等操作 。但是无法直接使用算术运算
1 >>> x = input() 2 5 3 >>> x + 5 4 Traceback (most recent call last): 5 File "<stdin>", line 1, in <module> 6 TypeError: must be str, not int 7 >>> x * 5 8 '55555' 9 >>> y = input() 10 6 11 >>> x * y 12 Traceback (most recent call last): 13 File "<stdin>", line 1, in <module> 14 TypeError: can't multiply sequence by non-int of type 'str'
使用时需要转换,方法有两种
1.指定类型转换
>>> y = int(input()) 10 >>> type(y) <class 'int'>
2.自动转换
函数eval() 用来执行一个字符串表达式,并返回表达式的值
eval(expression, globals[ ], locals[ ])
global 和 locals 分别相当于全局和局部变量,eval函数会优先在局部变量存储空间中检索
>>> y = eval(input()) 4.5 >>> type(y) <class 'float'>
3.切割转换(可以用此方法完成多次输入)
利用函数split()通过指定分隔符对字符串进行切片。
str.split(str="", num=string.count(str))
str为分割符,包括空格、\n,\t 等 ,num是分割次数。
1):利用split()函数进行输入,同时,我们不仅可以利用split()函数一次性输入多个数,我们还可以设置分隔符,除了传统的空格形式,也可以用逗号“,”这种更符合语言习惯的方式分隔输入字符。其原理是因为input()输入了一个字符串,而split()函数能根据设定的分割点分割字符串并返回分割后的字符串列表,所以能实现一次性输入多个数据值。范例如下:
但是,这样输入的值仍是字符串型,我们在上面已经说过字符串无法直接参与运算,最好输入时进行类型转换,那么,按照我们第二点的方法转换多输入值可行吗?
可以看到,这样是不可以的,那么为什么上面单输入可以而多输入报错呢?原因我们其实已经说过了,split()函数返回的是一个列表,spring当然能被转换成int型,但是列表是没法被这样直接转换的,所以我们需要用另一个函数map()来实现多输入的强制类型转换。
map()函数接受两个接收两个参数,一个是函数,一个是序列,map()将传入的函数依次作用到序列的每个元素,并把结果作为新的list返回。我们将传入的函数设置为强制类型转换函数int,则split()函数返回的列表里的每一个值都将被强制转换类型,从而实现多输入的类型转换。范例如下: