菜鸟教程 -- 学的不仅是技术,更是梦想!

Python 3 教程
Python3 教程 Python3 简介 Python3 环境搭建 Python3 VScode Python3 基础语法 Python3 基本数据类型 Python3 数据类型转换 Python3 解释器 Python3 注释 Python3 运算符 Python3 数字(Number) Python3 字符串 Python3 列表 Python3 元组 Python3 字典 Python3 集合 Python3 条件控制 Python3 循环语句 Python3 编程第一步 Python3 推导式 Python3 迭代器与生成器 Python3 with Python3 函数 Python3 lambda Python3 装饰器 Python3 数据结构 Python3 模块 Python __name__ Python3 输入和输出 Python3 File Python3 OS Python3 错误和异常 Python3 面向对象 Python3 命名空间/作用域 Python 虚拟环境的创建 Python 类型注解 Python3 标准库概览 Python3 实例 Python 测验

Python3 高级教程

Python3 正则表达式 Python3 CGI编程 Python3 MySQL(mysql-connector) Python3 MySQL(PyMySQL) Python3 网络编程 Python3 SMTP发送邮件 Python3 多线程 Python3 XML 解析 Python3 JSON Python3 日期和时间 Python3 内置函数 Python3 MongoDB Python3 urllib Python uWSGI 安装配置 Python3 pip Python3 operator Python math Python requests Python random Python OpenAI Python 有用的资源 Python AI 绘画 Python statistics Python hashlib Python 量化 Python pyecharts Python selenium 库 Python 爬虫 Python Scrapy 库 Python Markdown Python sys 模块 Python Pickle 模块 Python subprocess 模块 Python queue 模块 Python StringIO 模块 Python logging 模块 Python datetime 模块 Python re 模块 Python csv 模块 Python threading 模块 Python asyncio 模块 Python PyQt Python for 循环 Python while 循环
(追記) (追記ここまで)

Python3 模块

在前面的几个章节中我们基本上是用 python 解释器来编程,如果你从 Python 解释器退出再进入,那么你定义的所有的方法和变量就都消失了。

为此 Python 提供了一个办法,把这些定义存放在文件中,为一些脚本或者交互式的解释器实例使用,这个文件被称为模块。

Python 中的模块(Module)是一个包含 Python 定义和语句的文件,文件名就是模块名加上 .py 后缀。

模块可以包含函数、类、变量以及可执行的代码。通过模块,我们可以将代码组织成可重用的单元,便于管理和维护。

模块的作用

  • 代码复用:将常用的功能封装到模块中,可以在多个程序中重复使用。

  • 命名空间管理:模块可以避免命名冲突,不同模块中的同名函数或变量不会互相干扰。

  • 代码组织:将代码按功能划分到不同的模块中,使程序结构更清晰。

下面是一个使用 python 标准库中模块的例子。

实例(Python 3.0+)

#!/usr/bin/python3# 文件名: using_sys.pyimportsysprint('命令行参数如下:')foriinsys.argv: print(i)print('\n\nPython 路径为:', sys.path, '\n')

执行结果如下所示:

$ python using_sys.py 参数1 参数2
命令行参数如下:
using_sys.py
参数1
参数2
Python 路径为: ['/root', '/usr/lib/python3.4', '/usr/lib/python3.4/plat-x86_64-linux-gnu', '/usr/lib/python3.4/lib-dynload', '/usr/local/lib/python3.4/dist-packages', '/usr/lib/python3/dist-packages'] 
  • 1、import sys 引入 python 标准库中的 sys.py 模块;这是引入某一模块的方法。
  • 2、sys.argv 是一个包含命令行参数的列表。
  • 3、sys.path 包含了一个 Python 解释器自动查找所需模块的路径的列表。

import 语句

想使用 Python 源文件,只需在另一个源文件里执行 import 语句,语法如下:

import module1[, module2[,... moduleN]

当解释器遇到 import 语句,如果模块在当前的搜索路径就会被导入。

搜索路径时一个解释器会先进行搜索的所有目录的列表。如想要导入模块 support,需要把命令放在脚本的顶端:

support.py 文件代码

#!/usr/bin/python3# Filename: support.pydefprint_func(par): print("Hello : ", par)return

test.py 引入 support 模块:

test.py 文件代码

#!/usr/bin/python3# Filename: test.py# 导入模块importsupport# 现在可以调用模块里包含的函数了support.print_func("Runoob")

以上实例输出结果:

$ python3 test.py 
Hello : Runoob

下载代码

一个模块只会被导入一次,不管你执行了多少次 import。这样可以防止导入模块被一遍又一遍地执行。

当我们使用 import 语句的时候,Python 解释器是怎样找到对应的文件的呢?

这就涉及到 Python 的搜索路径,搜索路径是由一系列目录名组成的,Python 解释器就依次从这些目录中去寻找所引入的模块。

模块的搜索路径

当导入一个模块时,Python 会按照以下顺序查找模块:

  1. 当前目录。

  2. 环境变量 PYTHONPATH 指定的目录。

  3. Python 标准库目录。

  4. .pth 文件中指定的目录。

搜索路径是在 Python 编译或安装的时候确定的,安装新的库应该也会修改。搜索路径被存储在 sys 模块中的 path 变量,做一个简单的实验,在交互式解释器中,输入以下代码:

>>> import sys
>>> sys.path
['', '/usr/lib/python3.4', '/usr/lib/python3.4/plat-x86_64-linux-gnu', '/usr/lib/python3.4/lib-dynload', '/usr/local/lib/python3.4/dist-packages', '/usr/lib/python3/dist-packages']
>>> 

sys.path 输出是一个列表,其中第一项是空串 '',代表当前目录(若是从一个脚本中打印出来的话,可以更清楚地看出是哪个目录),亦即我们执行 python 解释器的目录(对于脚本的话就是运行的脚本所在的目录)。

因此若像我一样在当前目录下存在与要引入模块同名的文件,就会把要引入的模块屏蔽掉。

了解了搜索路径的概念,就可以在脚本中修改 sys.path 来引入一些不在搜索路径中的模块。

现在,在解释器的当前目录或者 sys.path 中的一个目录里面来创建一个 fibo.py 的文件,代码如下:

实例

# 斐波那契(fibonacci)数列模块deffib(n): # 定义到 n 的斐波那契数列a, b = 0, 1whileb < n: print(b, end='')a, b = b, a+bprint()deffib2(n): # 返回到 n 的斐波那契数列result = []a, b = 0, 1whileb < n: result.append(b)a, b = b, a+breturnresult

然后进入Python解释器,使用下面的命令导入这个模块:

>>> import fibo

这样做并没有把直接定义在fibo中的函数名称写入到当前符号表里,只是把模块fibo的名字写到了那里。

可以使用模块名称来访问函数:

实例

>>>fibo.fib(1000)1123581321345589144233377610987 >>> fibo.fib2(100)[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89] >>> fibo.__name__'fibo'

如果你打算经常使用一个函数,你可以把它赋给一个本地的名称:

>>> fib = fibo.fib
>>> fib(500)
1 1 2 3 5 8 13 21 34 55 89 144 233 377


from ... import 语句

Python 的 from 语句让你从模块中导入一个指定的部分到当前命名空间中,语法如下:

from modname import name1[, name2[, ... nameN]]

例如,要导入模块 fibo 的 fib 函数,使用如下语句:

>>> from fibo import fib, fib2
>>> fib(500)
1 1 2 3 5 8 13 21 34 55 89 144 233 377

这个声明不会把整个fibo模块导入到当前的命名空间中,它只会将fibo里的fib函数引入进来。

给模块起别名

使用 as 关键字为模块或函数起别名:

import numpy as np # 将 numpy 模块别名设置为 np
from math import sqrt as square_root # 将 sqrt 函数别名设置为 square_root


from ... import * 语句

把一个模块的所有内容全都导入到当前的命名空间也是可行的,只需使用如下声明:

from modname import *

这提供了一个简单的方法来导入一个模块中的所有项目。

不推荐,容易引起命名冲突。


深入模块

模块除了方法定义,还可以包括可执行的代码。这些代码一般用来初始化这个模块。这些代码只有在第一次被导入时才会被执行。

每个模块有各自独立的符号表,在模块内部为所有的函数当作全局符号表来使用。

所以,模块的作者可以放心大胆的在模块内部使用这些全局变量,而不用担心把其他用户的全局变量搞混。

从另一个方面,当你确实知道你在做什么的话,你也可以通过 modname.itemname 这样的表示法来访问模块内的函数。

模块是可以导入其他模块的。在一个模块(或者脚本,或者其他地方)的最前面使用 import 来导入一个模块,当然这只是一个惯例,而不是强制的。被导入的模块的名称将被放入当前操作的模块的符号表中。

还有一种导入的方法,可以使用 import 直接把模块内(函数,变量的)名称导入到当前操作模块。比如:

>>> from fibo import fib, fib2
>>> fib(500)
1 1 2 3 5 8 13 21 34 55 89 144 233 377

这种导入的方法不会把被导入的模块的名称放在当前的字符表中(所以在这个例子里面,fibo 这个名称是没有定义的)。

这还有一种方法,可以一次性的把模块中的所有(函数,变量)名称都导入到当前模块的字符表:

>>> from fibo import *
>>> fib(500)
1 1 2 3 5 8 13 21 34 55 89 144 233 377

这将把所有的名字都导入进来,但是那些由单一下划线(_)开头的名字不在此例。大多数情况, Python程序员不使用这种方法,因为引入的其它来源的命名,很可能覆盖了已有的定义。


__name__ 属性

一个模块被另一个程序第一次引入时,其主程序将运行。

如果我们想在模块被引入时,模块中的某一程序块不执行,我们可以用 __name__ 属性来使该程序块仅在该模块自身运行时执行。

#!/usr/bin/python3
# Filename: using_name.py
if __name__ == '__main__':
 print('程序自身在运行')
else:
 print('我来自另一模块')

运行输出如下:

$ python using_name.py
程序自身在运行
$ python
>>> import using_name
我来自另一模块
>>>

说明:每个模块都有一个 __name__ 属性。

  • 如果模块是被直接运行,__name__ 的值为 __main__

  • 如果模块是被导入的,__name__ 的值为模块名。

说明:__name____main__ 底下是双下划线, _ _ 是这样去掉中间的那个空格。


dir() 函数

内置的函数 dir() 可以找到模块内定义的所有名称。以一个字符串列表的形式返回:

>>> import fibo, sys
>>> dir(fibo)
['__name__', 'fib', 'fib2']
>>> dir(sys) 
['__displayhook__', '__doc__', '__excepthook__', '__loader__', '__name__',
 '__package__', '__stderr__', '__stdin__', '__stdout__',
 '_clear_type_cache', '_current_frames', '_debugmallocstats', '_getframe',
 '_home', '_mercurial', '_xoptions', 'abiflags', 'api_version', 'argv',
 'base_exec_prefix', 'base_prefix', 'builtin_module_names', 'byteorder',
 'call_tracing', 'callstats', 'copyright', 'displayhook',
 'dont_write_bytecode', 'exc_info', 'excepthook', 'exec_prefix',
 'executable', 'exit', 'flags', 'float_info', 'float_repr_style',
 'getcheckinterval', 'getdefaultencoding', 'getdlopenflags',
 'getfilesystemencoding', 'getobjects', 'getprofile', 'getrecursionlimit',
 'getrefcount', 'getsizeof', 'getswitchinterval', 'gettotalrefcount',
 'gettrace', 'hash_info', 'hexversion', 'implementation', 'int_info',
 'intern', 'maxsize', 'maxunicode', 'meta_path', 'modules', 'path',
 'path_hooks', 'path_importer_cache', 'platform', 'prefix', 'ps1',
 'setcheckinterval', 'setdlopenflags', 'setprofile', 'setrecursionlimit',
 'setswitchinterval', 'settrace', 'stderr', 'stdin', 'stdout',
 'thread_info', 'version', 'version_info', 'warnoptions']

如果没有给定参数,那么 dir() 函数会罗列出当前定义的所有名称:

>>> a = [1, 2, 3, 4, 5]
>>> import fibo
>>> fib = fibo.fib
>>> dir() # 得到一个当前模块中定义的属性列表
['__builtins__', '__name__', 'a', 'fib', 'fibo', 'sys']
>>> a = 5 # 建立一个新的变量 'a'
>>> dir()
['__builtins__', '__doc__', '__name__', 'a', 'sys']
>>>
>>> del a # 删除变量名a
>>>
>>> dir()
['__builtins__', '__doc__', '__name__', 'sys']
>>>

标准模块

Python 本身带着一些标准的模块库,在 Python 库参考文档中将会介绍到(就是后面的"库参考文档")。

模块名功能描述
math数学运算(如平方根、三角函数等)
os操作系统相关功能(如文件、目录操作)
sys系统相关的参数和函数
random生成随机数
datetime处理日期和时间
json处理 JSON 数据
re正则表达式操作
collections提供额外的数据结构(如 defaultdict、deque)
itertools提供迭代器工具
functools高阶函数工具(如 reduce、lru_cache)

有些模块直接被构建在解析器里,这些虽然不是一些语言内置的功能,但是他却能很高效的使用,甚至是系统级调用也没问题。

这些组件会根据不同的操作系统进行不同形式的配置,比如 winreg 这个模块就只会提供给 Windows 系统。

应该注意到这有一个特别的模块 sys ,它内置在每一个 Python 解析器中。变量 sys.ps1 和 sys.ps2 定义了主提示符和副提示符所对应的字符串:

>>> import sys
>>> sys.ps1
'>>> '
>>> sys.ps2
'... '
>>> sys.ps1 = 'C> '
C> print('Runoob!')
Runoob!
C> 

包是一种管理 Python 模块命名空间的形式,采用"点模块名称"。

比如一个模块的名称是 A.B, 那么他表示一个包 A中的子模块 B 。

就好像使用模块的时候,你不用担心不同模块之间的全局变量相互影响一样,采用点模块名称这种形式也不用担心不同库之间的模块重名的情况。

这样不同的作者都可以提供 NumPy 模块,或者是 Python 图形库。

不妨假设你想设计一套统一处理声音文件和数据的模块(或者称之为一个"包")。

现存很多种不同的音频文件格式(基本上都是通过后缀名区分的,例如: .wav,:file:.aiff,:file:.au,),所以你需要有一组不断增加的模块,用来在不同的格式之间转换。

并且针对这些音频数据,还有很多不同的操作(比如混音,添加回声,增加均衡器功能,创建人造立体声效果),所以你还需要一组怎么也写不完的模块来处理这些操作。

这里给出了一种可能的包结构(在分层的文件系统中):

sound/ 顶层包
 __init__.py 初始化 sound 包
 formats/ 文件格式转换子包
 __init__.py
 wavread.py
 wavwrite.py
 aiffread.py
 aiffwrite.py
 auread.py
 auwrite.py
 ...
 effects/ 声音效果子包
 __init__.py
 echo.py
 surround.py
 reverse.py
 ...
 filters/ filters 子包
 __init__.py
 equalizer.py
 vocoder.py
 karaoke.py
 ...

在导入一个包的时候,Python 会根据 sys.path 中的目录来寻找这个包中包含的子目录。

目录只有包含一个叫做 __init__.py 的文件才会被认作是一个包,主要是为了避免一些滥俗的名字(比如叫做 string)不小心的影响搜索路径中的有效模块。

最简单的情况,放一个空的 :file:__init__.py就可以了。当然这个文件中也可以包含一些初始化代码或者为(将在后面介绍的) __all__变量赋值。

用户可以每次只导入一个包里面的特定模块,比如:

import sound.effects.echo

这将会导入子模块:sound.effects.echo。 他必须使用全名去访问:

sound.effects.echo.echofilter(input, output, delay=0.7, atten=4)

还有一种导入子模块的方法是:

from sound.effects import echo

这同样会导入子模块: echo,并且他不需要那些冗长的前缀,所以他可以这样使用:

echo.echofilter(input, output, delay=0.7, atten=4)

还有一种变化就是直接导入一个函数或者变量:

from sound.effects.echo import echofilter

同样的,这种方法会导入子模块: echo,并且可以直接使用他的 echofilter() 函数:

echofilter(input, output, delay=0.7, atten=4)

注意当使用 from package import item 这种形式的时候,对应的 item 既可以是包里面的子模块(子包),或者包里面定义的其他名称,比如函数,类或者变量。

import 语法会首先把 item 当作一个包定义的名称,如果没找到,再试图按照一个模块去导入。如果还没找到,抛出一个 :exc:ImportError 异常。

反之,如果使用形如 import item.subitem.subsubitem 这种导入形式,除了最后一项,都必须是包,而最后一项则可以是模块或者是包,但是不可以是类,函数或者变量的名字。


从一个包中导入*

如果我们使用 from sound.effects import * 会发生什么呢?

Python 会进入文件系统,找到这个包里面所有的子模块,然后一个一个的把它们都导入进来。

但这个方法在 Windows 平台上工作的就不是非常好,因为 Windows 是一个不区分大小写的系统。

在 Windows 平台上,我们无法确定一个叫做 ECHO.py 的文件导入为模块是 echo 还是 Echo,或者是 ECHO。

为了解决这个问题,我们只需要提供一个精确包的索引。

导入语句遵循如下规则:如果包定义文件 __init__.py 存在一个叫做 __all__ 的列表变量,那么在使用 from package import * 的时候就把这个列表中的所有名字作为包内容导入。

作为包的作者,可别忘了在更新包之后保证 __all__ 也更新了啊。

以下实例在 file:sounds/effects/__init__.py 中包含如下代码:

__all__ = ["echo", "surround", "reverse"]

这表示当你使用from sound.effects import *这种用法时,你只会导入包里面这三个子模块。

如果 __all__ 真的没有定义,那么使用from sound.effects import *这种语法的时候,就不会导入包 sound.effects 里的任何子模块。他只是把包sound.effects和它里面定义的所有内容导入进来(可能运行__init__.py里定义的初始化代码)。

这会把 __init__.py 里面定义的所有名字导入进来。并且他不会破坏掉我们在这句话之前导入的所有明确指定的模块。看下这部分代码:

import sound.effects.echo
import sound.effects.surround
from sound.effects import *

这个例子中,在执行 from...import 前,包 sound.effects 中的 echo 和 surround 模块都被导入到当前的命名空间中了。(当然如果定义了 __all__ 就更没问题了)

通常我们并不主张使用 * 这种方法来导入模块,因为这种方法经常会导致代码的可读性降低。不过这样倒的确是可以省去不少敲键的功夫,而且一些模块都设计成了只能通过特定的方法导入。

记住,使用 from Package import specific_submodule 这种方法永远不会有错。事实上,这也是推荐的方法。除非是你要导入的子模块有可能和其他包的子模块重名。

如果在结构中包是一个子包(比如这个例子中对于包sound来说),而你又想导入兄弟包(同级别的包)你就得使用导入绝对的路径来导入。比如,如果模块sound.filters.vocoder 要使用包 sound.effects 中的模块 echo,你就要写成 from sound.effects import echo。

from . import echo
from .. import formats
from ..filters import equalizer

无论是隐式的还是显式的相对导入都是从当前模块开始的。主模块的名字永远是"__main__",一个Python应用程序的主模块,应当总是使用绝对路径引用。

包还提供一个额外的属性__path__。这是一个目录列表,里面每一个包含的目录都有为这个包服务的__init__.py,你得在其他__init__.py被执行前定义哦。可以修改这个变量,用来影响包含在包里面的模块和子包。

这个功能并不常用,一般用来扩展包里面的模块。

AI 思考中...

6 篇笔记 写笔记

  1. #0

    malan

    may***im.ac.cn

    71
    from modname import *

    这一句里的星号应该是沿用自正则中一样的意义,表示的是全部的意思,文中指出少用这种导入方式,我觉得是如果将一个模块的所有函数名导入当前命名空间中,如果不同模块包含了函数名相同的函数,或者是与自己编写得函数名相同将会导致混乱,而且在 debug 时还不容易发现。

    malan

    may***im.ac.cn

    8年前 (2018年05月30日)
  2. #0

    居家

    496***[email protected]

    74

    回楼上:

    在需要导入包中所有模块时,import* 还是有意义的。

    只需要在 __init__.py 文件里面将所有模块名定义在列表 __ALL__ 中就能解决你最后的担忧。

    居家

    496***[email protected]

    8年前 (2018年07月13日)
  3. #0

    原聪

    158***[email protected]

    70

    回楼上,经测试,用:

    from modname import *

    这种方式进行导入,如果不同模块之间有相同的函数命名,最后导入的会覆盖前面的,也就是说只会调用到最后导入进的函数。

    原聪

    158***[email protected]

    8年前 (2018年12月12日)
  4. #0

    像是一个菜鸟

    141***[email protected]

    277

    关于导入模块,自己写的程序,自己也可以把它保存下来,以后需要的时候导入使用,例如下面所示。

    我有个代码名称为 test1.py,它的所在路径为 D:\test 下面。那我只需要完成以下步骤就可以把它作为模块 import 到其他代码中了。

    • 1.import sys
    • 2.sys.path.append("D:\\test")

    在 test2.py 中我们就可以直接 import test1.py 了。成功导入后,test1中 的方法也就可以在 test2 中进行使用。

    import test1

    像是一个菜鸟

    141***[email protected]

    8年前 (2019年01月24日)
  5. #0

    於黾

    252***[email protected]

    87
    from modname1 import *
    from modname2 import *
    from modname3 import *

    当你这样写代码的时候,代码中的变量会变得非常混乱。不仅仅是后面导入的同名函数会覆盖前面的问题,而且导致你在写一个函数的时候不能确定它到底来自哪里,代码可读性会变得非常差。

    其实就不要懒,调用函数的时候直接这样调用:

    import modname1
    import modname2
    import modname3
    modname1.def1()
    modname2.def1()
    modname3.def1()

    这样不仅不会让你找不见同名函数,也可以非常确切的看到这个函数来自哪里

    如果你的库一层套一层,是这样的结构:

    import path1.path2.path3.modname1

    那么你可以用as关键字给它重命名,以便于缩短代码宽度,维持可读性

    於黾

    252***[email protected]

    5年前 (2021年08月06日)
  6. #0

    kingzong

    kin***[email protected]

    14

    模块的概念

    • 模块是一个包含Python代码的文件,通常以.py为扩展名。

    • 模块可以包含函数、类和变量,方便代码的组织和重用。

    • 例子:创建一个名为mymodule.py的文件,内容为def greet(): print("Hello!")

    导入模块

    • 使用import语句导入模块,例如:import module_name

    • 可以使用from module_name import function_name导入模块中的特定函数或变量。

    • 使用as关键字为模块或函数设置别名,例如:import module_name as alias

    • 例子:import mymodulefrom mymodule import greetimport mymodule as mm

    标准库模块

    • Python自带丰富的标准库模块,如mathrandomos等。

    • 这些模块提供了许多常用的功能,无需额外安装即可使用。

    • 例子:import math 后使用 math.sqrt(16) 计算平方根。

    自定义模块

    • 用户可以创建自己的模块,只需将代码保存为.py文件。

    • 自定义模块可以通过import语句导入并使用。

    • 例子:创建mymodule.py,内容为def add(a, b): return a + b,然后在其他文件中使用import mymodule并调用mymodule.add(2, 3)

    模块的搜索路径

    • Python在导入模块时会按照一定的路径顺序搜索模块。

    • 搜索路径包括当前目录、环境变量PYTHONPATH指定的目录以及Python安装目录。

    • 例子:使用import sys; print(sys.path)查看模块搜索路径。

    __name__属性

    • 每个模块都有一个__name__属性,用于标识模块的名称。

    • 当模块作为主程序运行时,__name__的值为"__main__"

    • 例子:在mymodule.py中添加if __name__ == "__main__": print("Running as main program")

    包(Package)

    • 包是一个包含多个模块的目录,通常包含一个__init__.py文件。

    • 包可以更好地组织和管理模块。

    • 例子:创建一个名为mypackage的目录,其中包含__init__.pymodule1.py,然后使用from mypackage import module1导入。

    第三方模块

    • 可以通过pip工具安装第三方模块,例如:pip install module_name

    • 第三方模块扩展了Python的功能,常用于各种开发场景。

    • 例子:安装并导入requests模块:pip install requests,然后使用import requests

    模块的重新加载

    • 使用importlib.reload(module)可以重新加载已导入的模块,适用于模块代码修改后的更新。

    • 例子:import importlib; importlib.reload(mymodule)

    模块的文档和帮助

    • 使用help(module_name)可以查看模块的帮助文档。

    • 模块的文档字符串(__doc__属性)提供了模块的说明信息。

    • 例子:在mymodule.py中添加"""This is a custom module.""",然后使用help(mymodule)查看文档。

    kingzong

    kin***[email protected]

    1年前 (2025年02月11日)

点我分享笔记

  • 昵称 (必填)
  • 邮箱 (必填)
  • 引用地址

AltStyle によって変換されたページ (->オリジナル) /