zoukankan      html  css  js  c++  java
  • Python中的sys.stdin和input、sys.stdout与print--附带讲解剑指offer42-连续子数组的最大和

    2020秋招季,终于开始刷第一套真题了,整套试卷就一道编程题,还是剑指offer上的原题,结果答案死活不对,最后干脆直接提交答案算了,看了下别人的答案,原来是输入数据没有获取的原因,不过这个语法sys.stdin以前还真是没有碰到过,以前用的都是input,不得不感慨一句,永远不要觉得自己学的多牛x,还是有很多东西都是自己根本不知道的,或者根本就没有意识到自己不知道,好了下面回到正题!

    下面的讲解参考文章链接:

    https://blog.csdn.net/CAU_Ayao/article/details/81985103【只结合了sys.stdin和input进行讲解,给出的例子也比较全面】

    https://www.cnblogs.com/keye/p/7859181.html【不仅对sys.stdin和input进行讲解,对sys.stdout和print也进行了对比讲解】

    下面根据参考文章写得自己的理解

    一、sys.stdout与Print

    原始的sys.stdout指向控制台,如果把文件的对象引用赋给sys.stdout,那么print调用的就是文件对象的write方法。即在调用print方法的时候,事实上调用了sys.stdout.write(obj+' ')

    print 将需要的内容打印到控制台,然后追加一个换行符

    以下两行代码等价:

    sys.stdout.write('hello' + '
    ')
    print('hello')

    二、sys.stdin与input

    1、sys.stdin是一个标准化的输入方法,以sys.stdin.readline()为例讲解,下面先来看看一个小例子。

    import sys
    print('Plase input your name: ')
    name = sys.stdin.readline()
    print('Hello ', name)

    输出结果:

    Plase input your name: 
    marry
    Hello  marry

    2、python3中使用sys.stdin.readline()可以实现标准输入,其中默认输入的格式是字符串,如果是int,float类型则需要强制转换。

    import sys
    try:
        while True:
            print('Please input a number1:')
            n1 = sys.stdin.readline().strip('
    ')  # 去掉输入行最后的
    ,
            print('Please input a number2:')
            n2 = sys.stdin.readline()  # 对比上面的输入结果,说明最后读取的数据最后将
    一起读取,最后是“字符串+
    ”的形式
            print('Please input some numbers:')
            sn = sys.stdin.readline().strip()  # 若是多输入,strip()默认是以空格分隔
            print(sn)  # 直接输出结果,说明读取的数据将最后的空格给去掉了,这里输入的时候在结尾的位置特意多加了一个空格
            if sn == '':
                break
            sn = list(map(int, sn.split()))  # 如果要强制转换成int等类型,可以调用map()函数。
            print(n2+n1)  # 44 55
     77 88
            print(n1+n2)  # 77 8844 55 
     用于演示说明strip可以实现将最后输入的指定字符去掉
    
            print(sn)
    except:
        pass

     输出结果:

    Please input a number1:
    77 88
    Please input a number2:
    44 55
    Please input some numbers:
    78 45 12 # 备注:这里输入的时候在最后是特意加了一个空格的,下一行是输出结果,可以看到,空格是没有读取到的,读取的内容是去掉空格之后的字符。
    78 45 12
    44 55  
    77 88#备注:这里是为了验证加了strip和不加strip的区别,strip可以实现将最后输入的指定字符去掉,不读取。
    77 8844 55
    
    [78, 45, 12]

    3、python3中sys.stdin与input的区别

    (1)input()括号内可以直接填写说明文字,sys.stdin还需要加个print方法给出提示信息。

    import  sys
    name1 = input('请输入姓名1:')
    print('请输入姓名2:')
    name2 = sys.stdin.readline()
    print(name1)
    print(name2)

     输出结果:

    请输入姓名1:mike
    请输入姓名2:
    tom
    mike
    tom

    (2)sys.stdin.readline( )会将标准输入全部获取包括末尾的' ',因此用len计算长度时是把换行符' '算进去了的,但是input( )获取输入时返回的结果是不包含末尾的换行符' '的。

    import  sys
    name1 = input()
    name2 = sys.stdin.readline()
    print(len(name1))
    print(len(name2))

      输出结果:

    mike
    mike
    4
    5

    因此如果在平时使用sys.stdin.readline( )获取输入的话,不要忘了去掉末尾的换行符,可以用strip( )函数(sys.stdin.readline( ).strip(' '))或sys.stdin.readline( )[:-1]这两种方法去掉换行。

    # 示例二:比较使用strip方法之后的区别
    import  sys
    name1 = input()
    name2 = sys.stdin.readline()
    name3 = sys.stdin.readline().strip('
    ')
    name4 = sys.stdin.readline()[:-1]
    print(len(name1))
    print(len(name2))
    print(len(name3))
    print(len(name4))

      输出结果:

    mike
    mike
    mike
    mike
    4
    5
    4
    4

     三、sys.stdin循环读取输入数据

    下面给出的示例用于跟牛客网的代码解析器进行对比,结果表明,两个代码都是可以运行的,为了方便使用,推荐用第一种,第一种不好理解的话,其原理参考示例二。

    # 示例:循环读取输入结果,下面的示例一是参考答案给的输入代码,但是没有弄明白这个程序怎么结束输入,
    # 牛客网有自己的程序验证机制,两个程序进行对比,两个代码都是可以实现循环读取数据,
    # 为了方便使用,推荐用第一种,不好理解的话,实现原理参考示例二。
    import  sys
    # 示例一:循环读取输入的数据,不考虑以什么结尾来结束输入
    names = []
    for each in sys.stdin:
        names.append(int(each))
    print(names)
    # 示例二:循环读取输入的数据,以
    结尾来结束输入
    names = []
    for each in sys.stdin:
        if each == '
    ':
            break
        else:
            names.append(int(each))
    print(names)

    四、把读取输入数据拿下后,结合真题来看看求连续子数组的最大和怎么解决?

    输入一个整形数组(可能有正数和负数),求数组中连续子数组(最少有一个元素)的最大和。要求时间复杂度为O(n)。

    def Find_max_num(array):
        if not array:
            return None
        pre_count = 0
        max_count = -0xffffff
        for each in array:
            if pre_count < 0:
                pre_count = each
            else:
                pre_count += each
            if pre_count > max_count:
                 max_count = pre_count
        return max_count
    import sys
    N = input()
    nums = []
    for each in sys.stdin:
        nums.append(int(each))
    maxnum = Find_max_num(nums)
    print(maxnum)

    由于牛客网上提交代码的时候不能添加中文注释,所以单独给出以下注释:

    N = input() # 获取第一行的数据,数组的长度N
    nums.append(int(each))  # 由于sys.stdin输入的是字符类型的数据,所以需要进行数据格式转化

    好了,到这就写完了,虽然花了很长时间进行代码验证,但是还是很值得的!

    最后说明:博主尊重原创,如有侵权,联系删帖,欢迎监督和提醒!

  • 相关阅读:
    Web开发人员必备工具-Emmet (Zen Coding)
    Zerver是一个C#开发的Nginx+PHP+Mysql+memcached+redis绿色集成开发环境
    jquery 插件站
    数据挖掘项目之---通过对web日志的挖掘来实现内容推荐系统
    类似wordpress的网站模板
    浅谈 SOAP
    在Livemedia的基础上开发自己的流媒体客户端 V 0.01
    模式识别之分类器knn---c语言实现带训练数据---反余弦匹配
    多项式相乘快速算法原理及相应C代码实现---用到fft
    模式识别之基础---常用分类算法特性归纳
  • 原文地址:https://www.cnblogs.com/ljxh/p/11189384.html
Copyright © 2011-2022 走看看