众所周知,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. Qframework UIKit

    用QFramework的UIKit 功能很容易实现UI模块的MVC功能,但MVC模式构造起来还是会有些繁琐, 两个相互直接的UIElement 之间的一些数据传输和调用都要用Msg通过UIPanel ...

  2. Java构造器详解

    java 构造器详解 一个构造器即使什么都不写 ,他也会默认存在一个构造器. 构造器的作用; ①:使用new关键字.本质是在调用构造器 ②:用来初始化值 定义了一个有参构造之后,如果想使用无参构造,显 ...

  3. evalJS代替mui.fire

    之前一直用mui.fire调用自定义事件以达到监听目标窗口的目的. 页面为双webview,页面跳转时 mui.openWindow({ url: '../choose/food-choose-con ...

  4. Knowledge Fusion例子

    #! NX/KF 5.0 # #************************************************************************************ ...

  5. Simple Algebra

    题意 给定方程\(f(x)=ax^2+bxy+cy^2\)和参数\(a\),\(b\),\(c\),试确定该方程的取值是否恒非负. 题解 参照文章http://math.mit.edu/~mckern ...

  6. <<Python编程:从入门到实践>>踩坑记 Django

    <<Python编程:从入门到实践>>踩坑记 Django Django Python 19.1.1.5 模板new_topic 做完书上的步骤后,对主题添加页面经行测试,但是 ...

  7. nginx服务器有什么作用?什么叫反向代理?为什么要使用反向代理?

    1 背景介绍 1.1 Nginx是什么? Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器.其特点是占有内存少,并发能力强,事实上nginx的并发能力确 ...

  8. ES6 函数的扩展 rest参数

    function add(...values) { let sum = 0; for (var val of values) { sum += val; } return sum; } add(2, ...

  9. 快速搭建基于webpack的babylon.js开发手脚架

    原文:https://doc.babylonjs.com/how_to/page2 目录 创建一个项目 安装Babylon.js 设置webpack 安装依赖 配置webpack 插件 创建场景 设置 ...

  10. 学Java的第5天,今天做了个双色球系统

    今天是学JAVA的第5天,刚刚把方法学完,然后就在这做黑马的题. 用了一个多小时时间,把他的 这些题都做完了 但是最后一道题,这个双色球系统我感觉挺有意思的 我看到这个题,分析后感觉需要4种方法: 1 ...