众所周知,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. [BOM]打包代码前,快速去除前端日志

    一般开发时使用console.log() 方法.于是可以在js文件的最开头加上: console.log = function(){}

  2. [node]启动一个简单的node接口

    来自知乎. 需要先安装一个node,安装过程不表. 新建文件: nodeServer.js // 复制这个文件到目录,再输入一下命令: // npm i express // node nodeSer ...

  3. CSS3滤镜属性filter让网页变黑白

    很多特殊的时候,我们向英雄们致敬,在互联网上最常见的方式就是整个网页变黑白,今天逛某博客收集一段代码,用于网页整体变黑白,用css3滤镜属性filter让网页马上变黑白,一行代码就搞定. 在你的css ...

  4. 060_关于Component Event的介绍 (本文为转载)

    转载自:https://www.cnblogs.com/zero-zyq/p/8977093.html lightning component基于事件驱动模型来处理用户界面的交互.这种事件驱动模型和j ...

  5. NCGROUP遍历成员用的cb

    1 static logical cycelGenerateCb(tag_t tag, void* data) 2 { 3 logical is_group; 4 char name[133]; 5 ...

  6. Typora的下载和MarkDown的相关操作

    MarkDown 作为程序员就要会写blog(网络日记),那么怎么让你的笔记写的排版舒适清晰?我们可以通过MarkDown来写笔记 首先我们要下载Typora,因为现在官网的Typora要付费,所以可 ...

  7. 问题:PHP扩展功能,去掉分号';'没有用,是怎么回事?(已解决)

    1. 环境:win10的操作系统,IIS的服务器. 2. 问题描述:PHP要开启访问MYSQL的模块mysqli,我打开配置文件,去掉相关扩展模块前面的分号';',然后重启服务器,但是无效 ~~ 3. ...

  8. 【git】 的基本命令

    1.push命令: 2.pull命令: 3.commit命令: 4.add命令: 5.checkout命令: 6.fetch/clone命令. 7.版本回退 git  log   查看版本号(每次提交 ...

  9. prophet安装(ubuntu16 python3.6)

    ubuntu16 python3.6 (ubuntu16自带的python3是3.5 升级至3.6可参考https://blog.csdn.net/weixin_42544006/article/de ...

  10. nvm在windows下安装与使用

    1.卸载本地已经安装的所有node 2.nvm下载 下载地址https://github.com/coreybutler/nvm-windows ,选择nvm-noinstall.zip 放在本地盘, ...