Karinoya 学习室 资格考试 Cloud / AI / Python 合格实验室 Python的数据类型与字符串
日本語 English Français Bahasa Indonesia 한국어 Română ไทย Tiếng Việt 简体中文 繁體中文
资格考试 · Cloud / AI / Python 合格实验室
Python的数据类型与字符串 可以用简体中文阅读题目和解说。讲义(解说文章)仅有日文版。
查看日文版(含讲义) →
第1题 | 主教材
作为Python 3工程师认定基础考试的主教材,正确的书籍是哪一项?
欧莱礼日本出版的《Python教程》 翔泳社出版的《新版数据分析教科书》 Impress出版的《Python数据分析实践手册》 技术评论社出版的《Python实践食谱》 正确答案 A. 欧莱礼日本出版的《Python教程》 基础考试的主教材是欧莱礼日本出版的《Python教程》,官方页面标明自2021年9月1日起对应第4版。出题范围也是按该书的章号和章名公开的,因此备考要按各章的比重来掌握该书内容。技术评论社的《Python实践食谱》是实践考试的主教材,翔泳社的《用Python写的新版数据分析教科书》是数据分析考试的主教材,Impress的《Python数据分析实践手册》是数据分析实践考试的主教材,它们都是同一协会举办的其他考试所用的教材。教材如果弄错,就会一直学习范围之外的内容,因此最初就应确认清楚。
第2题 | 题目最多的章节
在基础考试的出题范围中,主教材里出题最多的章节是哪一项?
第5章「数据结构」 第4章「控制结构工具」 第3章「轻松入门篇」 第8章「错误与异常」 正确答案 B. 第4章「控制结构工具」 出题最多的是第4章「控制结构工具」,40题中占9题。其次是第5章「数据结构」7题,第3章「轻松入门篇」6题,第8章「错误与异常」4题。仅第3、4、5这3章合计就有22题,超过全体的一半。因此把学习时间也重点分配到这3章是合理的,尤其是涉及for语句和函数定义的第4章,如果拖到最后再学就很难补救。
第3题 | 各章的比重
在基础考试的出题范围中,第4章「控制结构工具」所占的比例是哪一项?
17.5% 10.0% 22.5% 15.0% 正确答案 C. 22.5% 第4章「控制结构工具」在40题中占9题,换算成比例是22.5%。按章节来看是最高的,其次是第5章「数据结构」的7题,占17.5%。15.0%对应的是第3章「轻松入门篇」的6题,10.0%对应的是第8章「错误与异常」及第10章「标准库巡礼」各4题所占的比例。这一比例并非运营层面的统计数字,而是作为出题范围本身公开的,可以作为学习计划的依据来使用。
第4题 | 第13章的比重
在基础考试的出题范围中,分配给第13章「接下来该做什么?」的题目数是哪一项?
0题 1题 4题 2题 正确答案 A. 0题 第13章「接下来该做什么?」是0题,是出题范围中唯一完全不出题的章节。其内容是引导学习的下一步,因此作为考查语法的考试,被排除在出题对象之外。分配1题的是第1、2、7、11、12、14章,2题的是第6章和第9章,4题的是第8章「错误与异常」和第10章「标准库巡礼」。除第13章外其余各章都至少有1题,因此即便是比重较少的章节,也应做到大致浏览一遍术语的程度。
第5题 | print的sep参数
执行以下程序时,屏幕上输出的字符串是哪一项?
print('Python', 3, 'exam', sep='/') Python3exam Python 3 exam Python/3/exam/ Python/3/exam 正确答案 D. Python/3/exam print() 会用关键字参数 sep 把接收到的参数连接起来并排列输出。sep 的默认值是1个半角空格,若不指定则得到 Python 3 exam,但这里指定了 sep='/',因此用斜杠连接,得到 Python/3/exam。Python3exam 是把 sep 设为空字符串时的输出。选择末尾也带分隔符的 Python/3/exam/,是把 sep 误以为会加在每个元素之后的情况,实际上它只加在参数与参数之间。加在末尾的是 end 参数。
第6题 | print的end参数
从上到下依次执行以下3行时,屏幕上出现的内容是哪一项?
print('A', end='') print('B', end='') print('C') AB 与 C 分2行输出 ABC 只输出1行 A B C 只输出1行 A、B、C 分3行输出 正确答案 B. ABC 只输出1行 print() 会在输出末尾加上关键字参数 end。默认值是换行符,因此若不指定,每次调用 print() 都会换行。这里前两次指定了 end='',阻止了换行,所以 A 和 B 会连续输出,最后一次 print() 使用默认的换行,因此整体作为 ABC 只输出1行。像 A B C 那样中间带空格,是1次 print() 传入3个参数的情况;分成3行是完全没有指定 end 的情况;分成2行是只去掉了其中一处 end='' 的情况。
第7题 | 解包输出
把列表展开后显示的以下程序,其输出是哪一项?
nums = [10, 20, 30] print(*nums, sep=', ') 输出 10, 20, 30 输出 102030 输出 [10, 20, 30] 输出 10 20 30 正确答案 A. 输出 10, 20, 30 带星号的 print(*nums) 会把列表的各个元素作为独立的参数传给 print()。因此3个参数会用 sep 连接,由于 sep=', ',得到 10, 20, 30。不带星号写成 print(nums),列表会作为一个参数整体传入,因此会原样带方括号输出 [10, 20, 30]。若不指定 sep,则用默认的半角空格得到 10 20 30;若 sep='' 则紧挨着输出 102030。
第8题 | 注释符号
关于Python注释的说明,正确的是哪一项?
被 /* 和 */ 包围的范围会被当作注释忽略 从 # 到行末会被当作注释忽略 从 -- 到行末会被当作注释忽略 从 // 到行末会被当作注释忽略 正确答案 B. 从 # 到行末会被当作注释忽略 Python的注释用井号书写,从那里到行末都会被忽略。放在行首则整行都是注释,放在中途则从那里往后是注释。没有专门用于跨多行的语法,因此要逐行放置井号。用三重引号包起来的写法有时被当作块注释的替代使用,但那在语法上是字符串字面量,若放在函数或类的开头,会作为docstring在运行时被保留下来。双斜杠在Python中是地板除运算符,斜杠和星号的组合、以及两个连字符,是其他语言的注释写法。
第9题 | 缩进
把以下程序保存到文件并执行时,会发生什么?
if True: print('one') print('two') 只输出 two 就结束处理 只输出 one 就结束处理 依次输出 one 和 two 发生 IndentationError 而停止 正确答案 D. 发生 IndentationError 而停止 Python用缩进的深浅来表示代码块,因此属于同一代码块的语句必须对齐缩进宽度。这里只有第3行缩进变深,而且紧邻的上一行并非引出新代码块的语句(即以冒号结尾的行),因此会发生 IndentationError: unexpected indent。这是在执行前的语法解析阶段就会被检测出来的,因此第2行的 print 也不会被执行,连 one 都不会输出。该缩进的地方没有缩进会得到 expected an indented block,中途缩进宽度不一致会得到 unindent does not match any outer indentation level 这样的另一种提示信息,但两者都属于 IndentationError。
第10题 | 字符编码
关于Python 3源文件的字符编码,正确的说明是哪一项?
默认是Shift_JIS,声明后可以更改 默认是UTF-8,日语可以直接书写 默认是EUC-JP,日语可以直接书写 默认是ASCII,要包含日语需要声明 正确答案 B. 默认是UTF-8,日语可以直接书写 Python 3的源文件默认按UTF-8读取,因此无论注释还是字符串字面量都可以直接书写日语。Python 2的默认编码是ASCII,要包含日语时需要在文件第1行或第2行写coding声明,但在Python 3中已不再需要这一声明。只有在想让程序读取以UTF-8以外编码保存的文件时,才需要写声明。此外,标识符(变量名或函数名)虽然也可以使用日语,但从可读性角度并不推荐。
第11题 | 除法的类型
处理整数间除法的以下程序,第1行输出值、第2行输出类型名。它们的组合是哪一项?
print(9 / 3) print(type(9 / 3).__name__) 值为 3.0,类型为 int 值为 3.0,类型为 float 值为 3,类型为 int 值为 3,类型为 float 正确答案 B. 值为 3.0,类型为 float 单斜杠 / 是真除法,结果一定是float。即使能整除也不例外,因此 9 / 3 不是 3 而是 3.0,类型也是float。如果认为『整数相除就该是int』,就会误选3和int,但如果想要int,需要用地板除写成 9 // 3,这样才会得到3和int。这个表达式不会产生3和float、或3.0和int这种数值外观与类型不一致的组合。
第12题 | 负数的地板除
并列使用地板除的以下程序的输出是哪一项?
print(9 // 4) print(-9 // 4) 第1行为 2.0,第2行为 -3.0 第1行为 2,第2行为 -3 第1行为 2.25,第2行为 -2.25 第1行为 2,第2行为 -2 正确答案 B. 第1行为 2,第2行为 -3 双斜杠 // 是地板除,会把商向下(即数轴上较小的一侧)截断。9 / 4 是2.25,所以 9 // 4 是2;-9 / 4 是-2.25,所以 -9 // 4 不是-2而是-3。要点在于并不是朝0靠拢的方向,选择-2是按照像C语言那样朝0方向截断来考虑的情况。2.25和-2.25是用 / 而非 // 时的值,2.0和-3.0是操作数混入了float、写成 9.0 // 4 时的值,若两边都是int,结果也是int。
第13题 | divmod
divmod(-11, 3) 返回的值是哪一项?
(-4, 1) (-3, -2) (-4, -2) (-3, 2) 正确答案 A. (-4, 1) divmod(a, b) 返回 (a // b, a % b) 这个元组。Python的 // 是向下截断,因此 -11 // 3 是-4,余数的符号与右边的符号保持一致,因此 -11 % 3 是1。所以结果是 (-4, 1)。如果按朝0方向截断的方式考虑,商会是-3、余数是-2,从而误选 (-3, -2),但Python并不采用这种方式。商和余数之间始终保持『除数乘以商加上余数等于原值』这一关系,用3乘以-4再加1得到-11,可以据此验算。用这一关系来检验,(-3, 2) 和 (-4, -2) 都无法还原成-11。
第14题 | int的截断
比较截断方向的以下程序的输出是哪一项?
print(int(-2.7)) print(-2.7 // 1) 第1行为 -2,第2行为 -2.0 第1行为 -3,第2行为 -3.0 第1行为 -2,第2行为 -3.0 第1行为 -3,第2行为 -2.0 正确答案 C. 第1行为 -2,第2行为 -3.0 内置函数 int() 会舍去小数部分、朝0方向截断,因此 int(-2.7) 不是-3而是-2。另一方面 // 是向下截断,因此 -2.7 // 1 落在-3那一侧,并且操作数中含有float,所以结果也是float型的-3.0。对于正数,int(2.7) 和 2.7 // 1 都落在2那一侧,看不出区别,但对于负数方向就会分开。两者都不是四舍五入,如果想把-2.7变成-3,应使用round(-2.7)。
第15题 | 小数的误差
以下把真值分两行输出的程序,其输出是哪一项?
print(0.1 + 0.7 == 0.8) print(round(0.1 + 0.7, 2) == 0.8) 第1行为 False,第2行为 False 第1行为 True,第2行为 True 第1行为 True,第2行为 False 第1行为 False,第2行为 True 正确答案 D. 第1行为 False,第2行为 True float以二进制保存小数,因此在十进制中看似简洁的0.1或0.7无法被精确表示。实际显示 0.1 + 0.7 会得到 0.7999999999999999,与0.8存在微小差异,因此第1行为False。第2行用round()先四舍五入到小数点后2位再比较,两边都变成0.8,因此为True。这并非Python特有的缺陷,而是IEEE 754二进制浮点数的性质,0.1 + 0.2 得到 0.30000000000000004、1.1 + 2.2 得到 3.3000000000000003 也是同样的原因。应避免对float做相等比较,而是先按所需位数四舍五入再比较,或比较误差绝对值与容许误差,在金额这类需要精确的场合则使用decimal模块。
第16题 | round的舍入
把舍入后的值排成一行的以下程序,其输出是哪一项?
print(round(1.5), round(2.5), round(3.5)) 2 2 4 2 3 4 1 3 3 1 2 3 正确答案 A. 2 2 4 Python的round()采用『银行家舍入』,即舍入到最接近的偶数。只有恰好为一半的值才会靠向较近的偶数,因此1.5变为2、2.5变为2、3.5变为4,输出为 2 2 4。若按学校教的四舍五入,则会是 2 3 4,但Python并不采用这种方式。1 2 3 是对小数部分单纯截断时的值,1 3 3 是向奇数一侧靠拢时的值,两者都与实际行为不同。此外,省略第2参数的round()会返回int,若像round(2.5, 0)那样指定位数,则会返回float型的2.0。
第17题 | bool即int
把真值当作数值处理的以下程序,其输出是哪一项?
print(True + True) print(isinstance(True, int)) 第1行为 True,第2行为 True 第1行为 2,第2行为 False 第1行为 2,第2行为 True 第1行为 True,第2行为 False 正确答案 C. 第1行为 2,第2行为 True bool是继承自int的类型,因此True可以直接当作整数1、False当作整数0参与数值运算。True + True 就是1加1得到2,isinstance(True, int) 返回True。把第1行想成True,是把 + 误当作逻辑或的情况,Python的逻辑或是or,True or True 会得到True。issubclass(bool, int) 同样为True,sum([True, False, True]) 得到2也是同样的原因。在统计满足条件的个数时,经常会用到这一性质。
第18题 | 整数的精度
关于Python 3的int类型,正确的说明是哪一项?
位数没有上限,只要内存允许就能处理再大的值 超过32位的值有时会溢出变为负值 位数超过上限时会抛出 OverflowError 超过64位会自动转换为float进行计算 正确答案 A. 位数没有上限,只要内存允许就能处理再大的值 Python 3的int是任意精度的,位数没有上限。3 ** 40 能精确求得12157665459056928801,这已超出有符号64位的范围,但类型仍是int。也能处理像2 ** 1000这样的值,用len(str(2 ** 1000))数一下位数会得到302位。它不像C语言那样是固定长度的整数,因此不会溢出变成负值,也不会自行切换为float。OverflowError是在float能表示的范围被超出等情况下才会出现的,仅仅是int的位数增加并不会引发。不过位数越多,计算时间和内存占用也会随之增加。
第19题 | bytes的下标
处理字节串的以下程序,第2行和第3行的输出是哪一项?
b = 'abc'.encode() print(b[0]) print(b[0:1]) 第1行为 b'a',第2行为 b'a' 第1行为 97,第2行为 b'a' 第1行为 97,第2行为 97 第1行为 a,第2行为 b'a' 正确答案 B. 第1行为 97,第2行为 b'a' 用整数下标访问bytes时,会返回该位置字节值的int。'abc'用UTF-8编码得到的b'abc',其首字节是'a'的码点,因此是97。而用切片取出时,返回的是长度为1的bytes,因此 b[0:1] 是 b'a'。对于str来说,s[0]和s[0:1]都会得到同样的str类型的'a',这正是str与bytes形成对照的地方。显示为 b'a' 而非 a,是因为print()会以repr的形式输出bytes,若想还原成字符串,需要使用b.decode()。
第20题 | 进制与字符
并列进行进制转换与字符编码转换的以下程序,其输出是哪一项?
print(int('1010', 2), bin(10), hex(255), ord('A')) 10 0b1010 0xff 65 10 0b1010 0xFF 65 10 0b1010 0xff 97 1010 0b1010 0xff 65 正确答案 A. 10 0b1010 0xff 65 int()的第2个参数是基数,因此int('1010', 2)会把字符串按二进制读取,返回10。若认为会原样得到1010,就是漏看了基数的指定。bin()返回带0b前缀的字符串,因此是'0b1010';hex()返回带0x前缀的小写字符串,因此是'0xff'。不会得到大写的0xFF,若想要大写表示,应使用format(255, 'X')。ord()返回字符的码点,大写的A是65。97是小写a的码点,反方向的转换写作chr(65)即可还原为'A'。
第21题 | 切片
处理字符串切片的以下程序,其输出是哪一项?
s = 'Pythonic' print(s[2:5]) print(s[-3:]) 第1行为 tho,第2行为 nic 第1行为 tho,第2行为 ic 第1行为 thon,第2行为 nic 第1行为 yth,第2行为 nic 正确答案 A. 第1行为 tho,第2行为 nic s[2:5]会从下标2的位置开始,取到下标5之前为止。'Pythonic'的下标2是t,因此取t、h、o这3个字符,得到tho。由于不包含终点位置,所以不会是thon。若把下标从1数起、理解成『从第2个字符开始』,就会误选相当于s[1:4]的yth。s[-3:]是负数下标,从末尾数起,以倒数第3个字符n为起点直到最后,因此是nic。若把-3误解为『到倒数第3个字符为止』,就会误选相当于s[-2:]的ic。只要记住下标从0开始、负数下标以末尾为-1数起这两点,就不会弄错。
第22题 | 越界与in运算符
显示两个判定结果的以下程序,其输出是哪一项?
s = 'Python' print(s[100:200] == '') print('py' in s) 第1行为 True,第2行为 False 第1行为 True,第2行为 True 第1行为 False,第2行为 True 第1行为 False,第2行为 False 正确答案 A. 第1行为 True,第2行为 False 切片即使范围超出字符串长度也不会引发异常,只会返回重叠的部分。'Python'只有6个字符,因此s[100:200]是空字符串,与空字符串比较结果为True。而单独的下标s[100]则会引发IndexError,这正是两者形成对照的地方。第2行的in运算符用于检查子字符串是否存在,但会区分大小写,小写的'py'不包含在'Python'中,因此为False。如果是'Py'或'th'则为True。
第23题 | 字符串不可变
把以下程序写入文件并执行,会发生什么?
s = 'abc' s[0] = 'z' print(s) 发生 TypeError,无法赋值 被替换为 zbc 后输出 发生 IndexError,无法赋值 保持 abc 不变后输出 正确答案 A. 发生 TypeError,无法赋值 str是不可变(immutable)类型,即生成后无法更改其内容,因此不能用下标改写其中一部分字符。s[0] = 'z' 会引发 TypeError: 'str' object does not support item assignment,程序在此停止,print也不会被执行。IndexError是在下标越界时才会出现的,而这里0是合法的范围内,属于另一回事。想更改内容时,需要像 s = 'z' + s[1:] 那样构造新的字符串重新绑定。列表是可变的,因此用同样的写法可以改写其中的元素。
第24题 | 方法的返回值
调用字符串方法的以下程序,其输出是哪一项?
s = 'exam' s.upper() print(s) print(s.replace('e', 'E')) 第1行为 EXAM,第2行为 Exam 第1行为 EXAM,第2行为 EXAM 第1行为 exam,第2行为 exam 第1行为 exam,第2行为 Exam 正确答案 D. 第1行为 exam,第2行为 Exam 字符串方法不会改写原字符串,而是新建一个字符串返回。第2行的s.upper()会生成'EXAM',但由于没有赋值给任何变量,这个值会被丢弃,s仍保持'exam'不变。因此print(s)的输出是exam。第4行是直接显示s.replace('e', 'E')的返回值,因此会输出Exam,但这同样没有改变s本身。想保留结果时,需要像 s = s.upper() 那样重新赋值。这与列表的sort()那种就地排序并返回None的方法形成对照。
第25题 | f-string
指定格式显示的以下程序,其输出是哪一项?
n = 2.71828 print(f'{n:.2f}') print(f'{"ok"!r}') 第1行为 2.71,第2行为 'ok' 第1行为 2.72,第2行为 ok 第1行为 2.718,第2行为 ok 第1行为 2.72,第2行为 'ok' 正确答案 D. 第1行为 2.72,第2行为 'ok' f-string的格式说明:.2f会把小数四舍五入保留到小数点后2位显示,因此2.71828变为2.72。这不是截断,所以不会是2.71,2.718是写成:.3f时的值。第2行的!r是转换标志,会把值以repr()的形式显示。用在字符串上会带上引号,因此是'ok';若不加!r则只显示ok。格式说明的语法与str.format()通用,因此写成'{n:.2f}'.format(n=2.71828)同样能得到2.72。
第26题 | split
分割字符串的以下程序,其输出是哪一项?
print('a b c'.split()) print('a,b,c'.split(',', 1)) ['a', 'b', 'c'] 与 ['a', 'b', 'c'] ['a', 'b', '', 'c'] 与 ['a', 'b,c'] ['a', 'b', 'c'] 与 ['a', 'b,c'] ['a', 'b', '', 'c'] 与 ['a', 'b', 'c'] 正确答案 C. ['a', 'b', 'c'] 与 ['a', 'b,c'] 不带参数调用split()时,会把连续的空白当作一个整体的分隔符,不产生空元素。因此'a b c'.split()会得到3个元素的['a', 'b', 'c']。若明确指定分隔符写成'a b c'.split(' '),则按每一个空格切分,会留下空字符串,得到4个元素的['a', 'b', '', 'c']。第2个参数是maxsplit,表示分割次数的上限,传入1则只切第一次,得到['a', 'b,c'],剩余部分不再切分、合并为一个元素。省略的话会全部切开,得到['a', 'b', 'c']。
第27题 | strip
削去两端字符的以下程序,其输出是哪一项?
print('xxabxx'.strip('x')) print('xxabxx'.lstrip('x')) 第1行为 abxx,第2行为 ab 第1行为 ab,第2行为 abxx 第1行为 xabx,第2行为 abxx 第1行为 ab,第2行为 xxab 正确答案 B. 第1行为 ab,第2行为 abxx strip()的参数是『要去除的字符集合』,会从两端持续削去只要属于该集合的字符。它并不是只删除一个作为子字符串的'x',因此'xxabxx'.strip('x')会把两端的x全部削去,得到ab。若以为每次只削去一个字符,就会误选xabx。lstrip()只处理左端,因此得到abxx;rstrip()只处理右端,因此得到xxab。省略参数则会删除空白字符。由于是作为集合处理,若写成'xxabxx'.strip('xa'),左端的xx和a都会被削去,只剩下b。
第28题 | join与重复
连接字符串的以下程序,其输出是哪一项?
print('-'.join('abc')) print('ab' * 3) 第1行为 -a-b-c-,第2行为 ababab 第1行为 abc,第2行为 ababab 第1行为 a-b-c,第2行为 ab ab ab 第1行为 a-b-c,第2行为 ababab 正确答案 D. 第1行为 a-b-c,第2行为 ababab join()会以调用方的字符串作为分隔符,把传入的可迭代对象的各个元素连接起来。字符串本身也是可以逐字符取出的可迭代对象,因此'-'.join('abc')会把'a'、'b'、'c'用连字符连接,得到a-b-c。分隔符只会加在元素与元素之间,不会加在开头或末尾,因此不会是-a-b-c-。不带分隔符的abc是写成''.join('abc')时的结果。*运算符会把字符串重复指定的次数,因此'ab' * 3是ababab,中间不会插入空格。如果想要ab ab ab,需要写成' '.join(['ab'] * 3)。
第29题 | find与index
查找子字符串的以下程序,其输出是哪一项?
print('banana'.find('z')) print('banana'.index('n')) 第1行为 -1,第2行为 2 第1行为 -1,第2行为 3 第1行为 -1,第2行为 4 第1行为 0,第2行为 2 正确答案 A. 第1行为 -1,第2行为 2 find()在找不到子字符串时会返回-1,不会引发异常。'banana'中没有'z',因此结果是-1。0是在开头找到时的值,不要与找不到的情况混淆。index()在找到时返回位置这一点与find()相同,'banana'中'n'最先出现的位置是下标2,因此结果是2。3是把下标从1数起、理解成『第3个字符』时的结果,4是最后出现的位置,想得到它应使用rfind()或rindex()。两者的区别只在找不到的情况:index()会抛出ValueError: substring not found,使处理中止。
第30题 | 原始字符串
统计字符数的以下程序,其输出是哪一项?
print(len(r'a\nb'), len('a\nb')) 3 4 4 4 3 3 4 3 正确答案 D. 4 3 在字面量前加r的原始字符串中,反斜杠不会被当作转义的开始来解释。r'a\\nb'是a、反斜杠、n、b这4个字符,因此len为4。而普通字符串'a\\nb'中,\\n会被替换为1个换行字符,因此是a、换行、b这3个字符,len为3。若把两者都当作转义来数会得到3 3,都当作原始字符来数会得到4 4,但有无r会改变处理方式,这正是要点所在。即使加了r,类型仍然是普通的str,并不会变成特殊类型。此外len('\\\\')是1,之所以写两个反斜杠,是为了表示1个反斜杠字符。
练习:做本页的题目 这是随机出题的练习工具(在启用 JavaScript 时运行)。即使不使用此工具,也可以阅读上方的全部题目和解说。
※ 解说是供学习用的信息。考试的出题范围和制度每年可能变化,请务必确认主办机构的官方公告。
本页面译自日文原文。如译文与原文内容不一致,以日文版为准。 查看日文原文