众所周知,python只能读字符串,你如果要读整数只能读一个字符串,split成列表,再用int或者float转换。

比如这样

s=input().split()
a,b=map(int,s)
#或者a,b=int(s[0]),int(s[1])

某种意义上复用性很低。

尤其是需要大量读入的竞赛题,或者实际开发中。

所以就会想着给他像比如c++一样,搞个cin>>x或者read(x)

但python没有>>,也不支持传址,所以就只能写

x=read()或者类似的形式。

//本文原作者XXOY

先直接放成品

1.非迭代器版本

def read():
def get_numbers():
try:#防止奇怪的东西出现
read.s = input().split()
read.s_len = len(read.s)
if(read.s_len==0):get_numbers()#空行就继续
read.cnt=0
return 1#可以正常读
except:#如果读到文件尾就不读了
return 0
if not hasattr(read, 'cnt'):
if not get_numbers():return 0
if read.cnt==read.s_len:
if not get_numbers():return 0
read.cnt+=1#下一个
return eval(read.s[read.cnt-1])#用eval,整数与小数通用,改成int或许会更快一点
#本文原作者[XXOY](https://www.cnblogs.com/xxoy/)

2.迭代器版本

def read():
def get_numbers():
try:#防止奇怪的东西出现
st=input()
while st=='':st=input() #这行可以去掉,主要是防止空行报错
read.s = map(eval,st.split()) #用eval,整数与小数通用,改成int或许会更快一点
return 1#可以正常读
except:#如果读到文件尾就不读了
return 0
if not hasattr(read, 's'):
if not get_numbers():return 0
try:
return next(read.s)
except StopIteration:
if not get_numbers(): return 0
else: return next(read.s)
#本文原作者[XXOY](https://www.cnblogs.com/xxoy/)

使用方法就直接



a,b,c=read(),read(),read()
print(a,b,c)

可以同一行输入,也可以跨行。

下面以非迭代器版本进行讲解。

首先,读入需要搞一个计数cnt,一个s(列表)用于存放数据。

用来记录当前读到的是哪一个值。

考虑到是这个变量所有read通用,所以搞一个类似静态变量的东西。

参考地址

然后写一个把字符串转化为数字列表的东西,写一个统计s中数字个数的东西。

考虑可能len(s)调用需要时间,就干脆再定义一个变量s_len,用于判定s是否到头。

def read():
def get_numbers():
read.s = list(map(eval,input().split())) #用eval,整数与小数通用,改成int或许会更快一点
read.s_len = len(read.s)
read.cnt=0

那就每一次调用就cnt++,返回s的对应位。

    read.cnt+=1#下一个,没找到python的++
return read.s[read.cnt-1] #用eval,整数与小数通用,改成int或许会更快一点

如果s读完了,那就读下一个s

判断条件就是cnt==read.s_len。

if read.cnt==read.s_len:get_numbers()

其实到这就写完了,但考虑读入的不一定是很标准的数字,或者可能读到结尾了会RE。

于是再加入一个

try-except语句

最后聚合一下

#本文原作者[XXOY](https://www.cnblogs.com/xxoy/)
def read():
def get_numbers():
try:#防止奇怪的东西出现
read.s = input().split()
read.s_len = len(read.s)
if(read.s_len==0):get_numbers()#空行就继续
read.cnt=0
return 1#可以正常读
except:#如果读到文件尾就不读了
return 0
if not hasattr(read, 'cnt'):
if not get_numbers():return 0
if read.cnt==read.s_len:
if not get_numbers():return 0
read.cnt+=1#下一个
return eval(read.s[read.cnt-1])#用eval,整数与小数通用,改成int或许会更快一点

最后的最后回答几个问题

1.Q:为什么用eval

A:为了照顾小数的情况,改成int或许更快

2.Q:为什么报错就返回0

A:因为我也不知道返回啥,返回0就相当于没读呗。

3.Q:迭代器和非迭代器时间复杂度一样吗

A:我觉得,看上去是迭代器更快,但有c++ Debug下那慢的要命的迭代器的前车之鉴,很可能最终是非迭代器更快,但差差不多,毕竟python你要什么速度吗~

4.未解决的问题:碰到中间出现字母的情况

解决方法:非迭代器版本最后一行使用read.s[cnt-1].isdigit()进行特判。

不加入进去主要是不知道你是要跳过还是怎么样。

好的终于结束了,本文原作者XXOY,有什么问题评论区提问,欢迎大家探讨。

Python实现方便的读入数字的更多相关文章

  1. Python基础(10)--数字

    本文的主题是 Python 中的数字.会详细介绍每一种数字类型,它们适用的各种运算符, 以及用于处理数字的内建函数.在文章的末尾, 简单介绍了几个标准库中用于处理数字的模块. 本文地址:http:// ...

  2. Python数据类型深入学习之数字

    一. 数字常量 1. 下面来看看Python的数字常量中都要哪些类型: 数字 常量 129,-89,0 一般整数 9999848499999L,4594646469l 长整型数(无限大小) 1.232 ...

  3. C++手写快读详解(快速读入数字)

    众所周知,C++里是自带读入的(这不废话吗) 例如: int a; cin>>a; 这样的读入理解简单,适合初学者,但是非常慢. 再例如: int a; scanf("%d&qu ...

  4. python中输入多个数字(代码实现)

    不多说,直接上代码: list1 = [] #定义一个空列表 str1 = input("请输入数值,用空格隔开:") # list2 = str1.split(" &q ...

  5. python学习1-字符串数字基本运算以及if条件和while循环

    python学习1-字符串数字基本运算以及if条件和while循环 字符串表达形式共四种: name = "string" name = 'string' name = " ...

  6. 关于C++读入数字按位取出与进制转换问题

    这一片博客我就不写具体的一个题了,只是总结一种典型问题——读入数字按位取出. 就拿数字12345举例吧. 是首先,我们要取出个位.这样取出: 12345/1=12345 12345%10=5.    ...

  7. Python魔法缓存,以数字开始

    Python魔法缓存,以数字开始 众所周知,Python是弱类型的脚本语言,变量的定义是不用声明类型的. a = 1 Python所有数字的本质都是对象, 他们是不可改变的数据类型,这意味着改变数字数 ...

  8. 每天学一点——python变量、常量与数字类型

    python变量.常量与数字类型 常量 (一句话能概括先讲它) 严格来讲,python中除了π与N就没有不变的量 所以,在python中我们识别常量是看它是否全大写(如下图) 变量 变量,顾名思义,就 ...

  9. python小练习:读入一个考试得分,判断这个分数是哪个等级,并输出,考虑异常场景

    读入一个考试得分,判断这个分数是哪个等级,并输出. 等级:>=90 优 ,>=80且小于90 良,>=70 且小于80,中,>=60且<70及格  <60 不及格 ...

  10. Python小游戏之猜数字

    最近师兄师姐毕业,各种酒席,酒席上最常玩的一个游戏就是猜数字,游戏规则如下: 出题人在手机上输入一个0-100之间的数字,其它人轮流猜这个数字,如果你不幸猜中则要罚酒一杯.每次猜数字,出题人都要缩小范 ...

随机推荐

  1. idea集成maven插件 使用骨架创建maven的java工具 不使用骨架创建maven的java工程

    idea集成maven插件   使用骨架创建maven的java工具  new-->FIle-->Model 选择Maven对勾选上要不不能使用骨架 找到这个,选上下一步 Finish即可 ...

  2. django学习:转载

    https://www.cnblogs.com/ginvip/p/6894690.html https://www.cnblogs.com/yangmv/p/5327477.html https:// ...

  3. varchar(1)占用几个字节

    在version4之前,MySQL中varchar长度是按字节:而version5之后,按字符.如varchar(6),在version4,表示占用6个字节,而在version5中,表示占用6个字符. ...

  4. Linux基础第八章:操作系统引导过程、运行级别及开机问题处理

    一.操作系统引导过程 1.开机自检(bios) 2.MBR引导 3.grub菜单 4.加载内核(kernel) 5.init进程初始化 二.操作系统运行级别(init0-init6) 1.init 0 ...

  5. Study python_01

    Python历史事件 1989 年 --- 荷兰人吉多·范罗苏姆决心开发一个新的脚本解释程序: 1991 年 --- 第一个用C语言实现的Python编译器诞生,Python 的代码对外公布,版本为 ...

  6. FPGAUSB控制器编程

    FPGA产生PLL LED子module,显示FPGA在运行 USB控制子module,USB时钟输入,状态输入,总线输出,USBFIFO地址总线,数据双向总线. USB状态机,Flaga有效时,转为 ...

  7. Vue.js + TypeScript 项目构建

    一:全局安装vue/cli  npm install -g @vue/cli安装完成后检查版本vue --version 二:构建项目创建文件 vue create projectName 有的刚开始 ...

  8. JAVA——》微信分账

    做一个推荐分享的功能,场景:每推荐成功奖励推荐人一定的推荐金. 这里,我就用调用了微信支付分账接口.链接:https://pay.weixin.qq.com/wiki/doc/api/allocati ...

  9. div隐藏、显示

    JS隐藏和显示div的方式有两种: 需要注意的是用JS设置div的属性,必须在ccs中设置对应属性,否则报错. 同理可以设置相同class,进行批量设置. display--隐藏后释放占用的页面空间. ...

  10. UI自动化之【maven+selenium环境搭建】

    一.下载maven包 官网: http://maven.apache.org/download.cgi 二.配置maven环境变量  配置完之后验证一下:(若出现以下信息可看到maven的版本号就表示 ...