背景

sys.stdin主要用来读取键盘的一行或者多行输入,读取后表达形式为字符串

下文主要探讨sys.stdin.readline()的使用,sys.stdin.read()参考:

  • sys.stdin.readline()是逐行读取,通常会配合.strip()清除首尾的换行符/空格
  • sys.stdin.read()会读取所有行,并合并为一个字符串,同样可以搭配.strip()使用


1. 读取单行键盘输入

1.1 普通数字


这里的注释先不看,是1.2嵌套字符串的注释说明;

# input_ = sys.stdin.read().strip()  # 一次性读取多行内容并合并成一个字符串
# input_ = sys.stdin.readline()  # 一次读取一行,会带上(首尾的)行结束符/行回车符
input_ = sys.stdin.readline().strip()  # 删去首尾的空格符(一般都用这个)
# input_ = input()  # (不建议)多行情况下很不方便,单行等效于sys.stdin.readline().strip()print(input_)  # "abcde" | 'abcde'  <这里实际上是'"abcde"',字符串显示是不显示外层的双引号 | 如果输入是'abcde',则实际上是"'abcde'">
print(repr(input_))  # 验证一下有没有嵌套字符串,
print(type(input_))  # str
# 平常我们以为英文单引号,双引号是一样的即.split('"')?=.split("'")), 其实不一样,内层的' or "才是split的分割字符
# 还有一个细节是split的对象是字符串的内层,也就是打印出来的我们看到的那一部分
# 最难崩的一点是如果split生效,结果会在外层再套上一层''(注意这里不管内层是''还是""最后都会套上'')
# 这里split生效指的是分割字符存在于字符串的内层,如'"abcde"'.split('"')就会生效,否则会返回只包含字符串整体(即包含外层)的列表
print(input_.split('"'))  # ['', 'abcde', ''] | ["'abcde'"]
print(input_.split("'"))  # ['"abcde"'] | ['', 'abcde', '']
print(input_.split(','))

右键run,键盘输入123,回车!

1.2 嵌套字符串

输入"abcde",回车:

输入'abcde',回车:

  • 根据输入字符串中外层""或''的不同,以及split("'")与split('"')的不同,分割结果也不一样:
  • 具体可以通过repr()函数进行验证,repr()函数显示字符串整体,
  • 直接print会隐藏字符串外层的''或""


1.3 字符串+列表 (仍会在外层嵌套字符串)

输入"abcde",["a", "b", "c", "d", "e"],回车:

由两部分构成:
第一部分是字符串"abcde",第二部分是字符串列表["a", "b", "c", "d", "e"],中间用英文,隔开

那么怎么读取"abcde",["a", "b", "c", "d", "e"]并得到"abcde"和["a", "b", "c", "d", "e"]两部分呢?

--核心思想是找到分隔符所在的位置,然后分离两部分,之后使用json.loads方法解析回列表:

# 从标准输入读取内容并去除首尾空白
input_data = sys.stdin.readline().strip()# 分割输入为两部分(字符串部分和列表部分)
# 找到第一个点是第一个逗号,确保只在列表内部
split_index = input_data.find(',')
print(repr(input_data[:split_index]))  # '"abcde"'
str_part = input_data[:split_index].strip('"')  # 提取字符串部分并去除引号
list_part_str = input_data[split_index+1:]      # 提取列表部分的字符串# 将列表部分的字符串解析为Python列表
list_part = json.loads(list_part_str)# 输出结果及类型验证
print("字符串部分:", str_part)
print("字符串部分整体:", repr(str_part))
print("字符串部分类型:", type(str_part))
print("列表部分:", list_part)
print("列表部分整体:", repr(list_part))
print("列表部分类型:", type(list_part))

输入"abcde",["a", "b", "c", "d", "e"],回车:

2. 读取多行键盘输入

一个算法经典示例:

题目:第一行是数据的组数,接下来每一行都有俩整数(空格隔开),求每一行俩整数和

输入:

3
1 1
2 2
3 3

输出:

真正示例的输出应该直接是:(因为键盘输入已经完全提前写入了)

2
4
6

最后给一下code,结合着注释着看应该回好一些~

  • 1.1,1.2, 1.3
# 通过sys实现键盘输入读取
# 注意sys读取输入为字符串形式,即会在外面套上''
import sys
import json# 1. sys读取一/多行输入
# input_ = sys.stdin.read().strip()  # 一次性读取多行内容并合并成一个字符串
# input_ = sys.stdin.readline()  # 一次读取一行,会带上(首尾的)行结束符/行回车符
input_ = sys.stdin.readline().strip()  # 删去首尾的空格符(一般都用这个)
# input_ = input()  # (不建议)多行情况下很不方便,单行等效于sys.stdin.readline().strip()print(input_)  # "abcde" | 'abcde'  <这里实际上是'"abcde"',字符串显示是不显示外层的双引号 | 如果输入是'abcde',则实际上是"'abcde'">
print(repr(input_))  # 验证一下有没有嵌套字符串,
print(type(input_))  # str
# 平常我们以为英文单引号,双引号是一样的即.split('"')?=.split("'")), 其实不一样,内层的' or "才是split的分割字符
# 还有一个细节是split的对象是字符串的内层,也就是打印出来的我们看到的那一部分
# 最难崩的一点是如果split生效,结果会在外层再套上一层''(注意这里不管内层是''还是""最后都会套上'')
# 这里split生效指的是分割字符存在于字符串的内层,如'"abcde"'.split('"')就会生效,否则会返回只包含字符串整体(即包含外层)的列表
print(input_.split('"'))  # ['', 'abcde', ''] | ["'abcde'"]
print(input_.split("'"))  # ['"abcde"'] | ['', 'abcde', '']
print(input_.split(','))"""
--例1【数字】:
123
123        <这里实际上是'123',数据类型是str>
'123'
<class 'str'>
['123']
['123']
['123']--例2【嵌套字符串】:
"abcde"  | 'abcde'
"abcde"    <这里实际上是'"abcde"',字符串显示是不显示最外层的双引号> | <如果输入是'abcde',则实际上是"'abcde'">
<class 'str'>
'"abcde"'  |   "'abcde'"
['', 'abcde', '']  |  ["'abcde'"]
['"abcde"']  | ['', 'abcde', '']
['"abcde"']  | ["'abcde'"]--例三【混合情况】:
由两部分构成,第一部分是字符串"abcde",第二部分是字符串列表["a", "b", "c", "d", "e"],中间用英文,隔开
"abcde",["a", "b", "c", "d", "e"]  <实际上是'"abcde",["a", "b", "c", "d", "e"]'>
'"abcde",["a", "b", "c", "d", "e"]'
<class 'str'>
['', 'abcde', ',[', 'a', ', ', 'b', ', ', 'c', ', ', 'd', ', ', 'e', ']']
['"abcde",["a", "b", "c", "d", "e"]']  <只包含字符串整体(即包含外层)的列表>
['"abcde"', '["a"', ' "b"', ' "c"', ' "d"', ' "e"]']
包含6个元素'"abcde"'和'["a"' 和 ' "b"' 和 ' "c"' 和 ' "d"' 和 ' "e"]'  (这里是因为列表中的字符串元素也是用英文,分割的,且,后有空格)
"""
  • 1.3解法
# 从标准输入读取内容并去除首尾空白
input_data = sys.stdin.readline().strip()# 分割输入为两部分(字符串部分和列表部分)
# 找到第一个点是第一个逗号,确保只在列表内部
split_index = input_data.find(',')
# print(repr(input_data[:split_index]))  # '"abcde"'
str_part = input_data[:split_index].strip('"')  # 提取字符串部分并去除引号
list_part_str = input_data[split_index+1:]      # 提取列表部分的字符串# 将列表部分的字符串解析为Python列表
list_part = json.loads(list_part_str)# 输出结果及类型验证
print("字符串部分:", str_part)
print("字符串部分整体:", repr(str_part))
print("字符串部分类型:", type(str_part))
print("列表部分:", list_part)
print("列表部分整体:", repr(list_part))
print("列表部分类型:", type(list_part))"""
字符串部分: abcde
字符串部分整体: 'abcde'
字符串部分类型: <class 'str'>
列表部分: ['a', 'b', 'c', 'd', 'e']
列表部分整体: ['a', 'b', 'c', 'd', 'e']
列表部分类型: <class 'list'>
"""
  • 2
# 算法示例题(用sys读取多行输入)
# 题目:第一行是数据的组数,接下来每一行都有俩整数(空格隔开),求每一行俩整数和
n = int(sys.stdin.readline().strip())  # 得到第一行数据,即数据组数(下面一共有多少行)
for _ in range(n):pair = sys.stdin.readline().strip()  # 开始读空格隔开的整数对num1, num2 = int(pair.split()[0]), int(pair.split()[1])print(num1 + num2)"""
--测试样例:
3
1 1
2 2
3 3--输出:
2
4
6
"""

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/93583.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/93583.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/93583.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

近阈值技术引领者:STM32U3系列的能效与安全革新

引言 当电池供电设备已深度融入生活的每一个角落&#xff0c;功耗控制与续航能力俨然成为制约技术演进的核心瓶颈。在此背景下&#xff0c;超低功耗新系列STM32U3凭借前沿的近阈值设计理念&#xff0c;为受功耗瓶颈限制的设备提供了突破性解决方案&#xff0c;也为能耗管理开启…

Vue3 中的 provide 和 inject 详解:实现跨组件通信

一、provide 和 inject 概述在 Vue3 中&#xff0c;provide 和 inject 是一对用于实现跨层级组件通信的 API&#xff0c;它们解决了 props 需要逐层传递的繁琐问题。1.1 基本概念provide (提供)&#xff1a;在祖先组件中提供数据inject (注入)&#xff1a;在任意后代组件中注入…

Kafka 零拷贝(Zero-Copy)技术详解

文章目录1. 什么是零拷贝2. Kafka 如何实现零拷贝2.1 sendfile 系统调用2.2 mmap 内存映射3. 传统拷贝 vs 零拷贝3.1 传统文件传输流程3.2 零拷贝文件传输流程4. Kafka 零拷贝的具体实现4.1 消息消费时的零拷贝4.2 日志段文件的零拷贝5. 零拷贝带来的性能优势6. 零拷贝的适用场…

Vue 中 v-for 的使用及 Vue2 与 Vue3 的区别

v-for 基本用法v-for 是 Vue 中用于循环渲染列表的指令&#xff0c;基本语法如下&#xff1a;运行<!-- Vue2 和 Vue3 通用基本语法 --> <div v-for"(item, index) in items" :key"item.id">{{ index }} - {{ item.name }} </div>Vue2 和…

本地搭建dify+deepseek智能体

今天开始搭建智能体&#xff0c;学习一下&#xff0c;也是公司转型所需。(Windows下的docker安装给我差点干破防了&#xff0c;安装了一周docker才成功。我真就要放弃的时候&#xff0c;又意外成功了/(ㄒoㄒ)/~~)0、准备阶段 配置Windows10的基本配置。 按下键盘Windows键&…

网络常识-SSE对比Websocket

SSE&#xff08;Server-Sent Events&#xff09;和Websocket都是用于实现服务器与客户端实时通信的技术&#xff0c;但它们的设计理念、通信模式和适用场景有显著区别。以下从核心差异和适用场景两方面具体说明&#xff1a; 一、核心区别维度SSE&#xff08;Server-Sent Events…

lamp架构部署wordpress

CentOS 7主机&#xff1a;lamp.example.comIP&#xff1a;192.168.100.101、关闭防火墙与selinux# 关闭防火墙systemctl stop firewalldsystemctl disable firewalld# 关闭selinuxvim /etc/selinux/config # 或vim /etc/sysconfig/selinuxSELINUXdisabled:wq# 重启reboot 2、开…

DC6v-36V转3.2V1A恒流驱动芯片WT7017

DC6v-36V转3.2V1A恒流驱动芯片WT7017WT7017是一款于连续工作模式下的降压LED恒流转换器&#xff0c;可驱动单只或多只LED,内置高精度电流检测器&#xff0c;能通过外置电阻设定输出电流,开关式1A恒流芯片。软启动、高达1MHZ开关频率,开路保护,输入范围在6V-40VDC内都能稳定可靠…

js如何循环HTMLCollection

场景 当使用document.getElementsByClassName方法获取一个包含DOM节点的集合arr时&#xff0c;正常的forEach和map操作都会报一个arr.map is not a function的错误因为这里的arr并不是标准的 数组 (Array)&#xff0c;而是一个 HTMLCollection 解决 使用document.querySelector…

Dart 逆袭之路:Flutter 4.0 如何推动移动端开发变革?

本文深入探讨 Dart 语言在 Flutter 4.0 框架下如何推动移动端开发变革。开篇回顾 Dart 诞生背景与初期困境&#xff0c;阐述其在与 Flutter 结合后崭露头角。进而详细剖析 Flutter 4.0&#xff0c;从全新渲染引擎带来的性能飞跃、丰富实用新组件简化开发&#xff0c;到手势系统…

基于MATLAB的卷积神经网络手写数字识别

一、系统架构设计 #mermaid-svg-QQU8judlmQgHc2Lh {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-QQU8judlmQgHc2Lh .error-icon{fill:#552222;}#mermaid-svg-QQU8judlmQgHc2Lh .error-text{fill:#552222;stroke:#5…

从废弃到珍宝——旧物二手回收小程序系统的价值发现之旅

在我们的生活中&#xff0c;总有一些旧物因为各种原因而被遗弃在角落&#xff0c;它们或许不再新潮&#xff0c;或许不再实用&#xff0c;但它们却承载着我们的记忆和情感。旧物二手回收小程序系统的出现&#xff0c;让这些被遗忘的旧物重新焕发了生机&#xff0c;开启了一段从…

从0开始学习Java+AI知识点总结-16.web基础知识

一、SpringBoot Web 入门开发SpringBoot 简化了传统 Spring 应用的配置流程&#xff0c;通过 "约定大于配置" 的理念实现快速开发。以下是入门核心要点&#xff1a;1. 工程创建与依赖配置工程初始化&#xff1a;通过 Spring Initializr 创建工程&#xff0c;选择Spri…

代码随想录Day51:图论(岛屿数量 深搜广搜、岛屿的最大面积)

一、实战 99岛屿数量 深搜 99. 岛屿数量 本题中每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成&#xff0c;也就是说斜角度链接是不算的。思路是用遇到一个没有遍历过的节点陆地&#xff0c;计数器就加一&#xff0c;然后把该节点陆地所能遍历到的陆地都标记上。在…

读取数据excel

import pandas as pd from datetime import datetimedef generate_questions():excel_path df pd.read_excel(excel_path)theme []time_list []tag1 []tag2 []tag3 []word_count 800questions []for index, row in df.iterrows():if isinstance(row[时间], datetime):…

前端环境安装

1.vsCode 下载链接&#xff1a;Visual Studio Code - Code Editing. Redefined 添加一个wiz code扩展&#xff08;提示你需要升级的依赖&#xff09; wiz code 使用方法 效果 2.git 下载链接&#xff1a;Git - Downloads 先下载 Homebrew&#xff08;https://brew.sh/ &a…

零基础学Java第十八讲---抽象类和接口(3)

续接上一讲 目录 一、内部类 1、内部类的分类 2、静态内部类 3、实例内部类---未被static修饰的成员内部类 4、局部内部类 5、匿名内部类 二、Object类 1、获取对象信息 2、equals方法 3、hashcode方法 一、内部类 当⼀个事物的内部&#xff0c;还有⼀个部分需要⼀个…

字节数据流

记录 干货&#xff5c;8000字长文&#xff0c;深度介绍Flink在字节跳动数据流的实践 字节跳动基于Flink的MQ-Hive实时数据集成

Vision Master的C#脚本与opencv联合编程

需要在VM的C#脚本设置string类型Out变量和float类型OutF变量&#xff0c;python的输出信息会在Out变量显示 using System; using System.IO; using Script.Methods; using System.Diagnostics; using System.Net.Sockets; using System.Text; using System.Threading;public pa…

运维工作架构流程搭建

前言 在解决了运维是干什么的&#xff0c;运维的工作的意义后&#xff0c;这一章我们系统性的讲讲运维工作流程搭建&#xff0c;希望大家能通过我的分享有所收获&#xff0c;这一章干货满满。 一、网络服务器架构 按照一般的访问方式&#xff0c;按照我自己的理解画了一个网络服…