1 输入和输出
input()
input(prompt: str)
内置函数。如果存在
prompt
实参,则将其写入标准输出,末尾不带换行符。接下来,该函数从输入中读取一行,将其转换为字符串(除了末尾的换行符)并返回。例如:>>> s = input('--> ') --> Monty Python's Flying Circus >>> s "Monty Python's Flying Circus"
2 函数
Python 定义函数使用关键字def
,后跟函数名与括号内的形参列表。函数语句从下一行开始,并且必须缩进。例如:
>>> def func(prompt: str) -> None:
... print(prompt)
...
>>> prompt = "这是一个函数!"
>>> func(prompt=prompt)
这是一个函数!
3 模块
3.1 模块的定义
Python 可以把各种定义和语句存入一个文件,在脚本或解释器的交互式实例中使用,这个文件就是模块。其文件名是模块名加后缀 .py
。模块中的定义可以导入到其它模块。模块中的语句用于初始化模块,且仅在 import
语句第一次遇到模块名时执行。或者文件作为脚本运行时,也会执行这些语句。
每个模块都有自己的私有命名空间,它会被用作模块中定义的所有函数的全局命名空间。因此,模块作者可以在模块内使用全局变量而不必担心与用户的全局变量发生冲突。要访问一个模块内的变量,可以通过点运算符 .
。
3.2 模块的属性
3.2.1 导入相关的模块属性
导入机制会在加载期间,根据模块的规格说明填充每个模块对象的以下属性,并在加载器执行模块之前完成。
__file__ -> str
该属性存储模块所在文件的路径,其值为字符串格式。例如,打印当前代码文件所在的路径
print(__file__)
,或打印os
模块所在文件的路径print(os.__file__)
,从而找到文件源代码。
3.3 模块的搜索路径
假设我们要导入一个名为 test
的模块,解释器首先会搜索具有该名称的内置模块,这些模块的名称在 sys.builtin_module_names
中列出。如果未找到,它将在变量 sys.path
所给出的目录列表中搜索名为 test.py
的文件。其中,sys.path
初始化后,程序可以任意更改其值。
4 包
4.1 包的定义
为了避免模块名冲突,Python 引入了按目录组织模块的方法,称之为包。包是一种用 “点式模块名” 构造 Python 模块命名空间的方法。例如,模块名 A.B
表示名为 A
的包中名为 B
的子模块。
简单来说,包是含有 Python 模块的文件夹。并且需要有 __init__.py
文件才能让 Python 将包含该文件的目录当作包来处理,其下的多个模块构成一个整体。
__init__.py
文件用于组织包,方便管理各个模块之间的引用、控制着包的导入行为。在最简单的情况下,__init__.py
可以只是一个空文件。当我们导入一个包时,实际上是导入它的 __init__.py
文件,该文件自动运行。
4.2 导入模块的方式
导入包时,Python 搜索 sys.path
里的目录,查找包的子目录。可以从包中导入单个模块和函数或变量。
一种方式是使用 import
语句。例如,import os.path
语句导入了 os.path
模块,使用时必须通过其全名来引用,例如 print(os.path.__file__)
。
另一种方式是使用 from ... import ...
语句。例如,from os import path
语句同样导入了 os.path
模块,但使用时不必加包前缀,例如 print(path.__file__)
。
使用 from ... import *
这种语法时,需要在文件中提供 __all__
变量,它用来指定此包的哪些模块会被导入,不在 __all__
列表中的模块不会被其它程序引用。否则,将花费很长的时间,并且可能会产生不想要的副作用。
5 系统相关的模块
5.1 sys
模块——系统相关的形参和函数
该模块提供了一些系统相关的形参和函数。这些形参可能被解释器使用,也可能由解释器提供。这些函数会影响解释器。
5.1.1 路径相关
sys.path -> list
该参数是一个由字符串组成的列表,用于指定模块的搜索路径。
sys.path
是从以下位置初始化的:
- 被命令行直接运行的脚本所在的目录(或未指定文件时的当前目录)。
- 环境变量
PYTHONPATH
,格式与终端的PATH
相同,即一个或多个由os.pathsep
分隔的目录路径名称。- 依赖于安装的默认值(按照惯例包括一个
site-packages
目录,由site
模块处理)。
PYTHONPATH
增加模块文件默认搜索路径,并默认忽略不存在的目录。例如:>>> import sys >>> print(sys.path) [ '', 'D:\\ProgramData\\anaconda3\\python312.zip', 'D:\\ProgramData\\anaconda3\\DLLs', 'D:\\ProgramData\\anaconda3\\Lib', 'D:\\ProgramData\\anaconda3', 'D:\\ProgramData\\anaconda3\\Lib\\site-packages', 'D:\\ProgramData\\anaconda3\\Lib\\site-packages\\win32', 'D:\\ProgramData\\anaconda3\\Lib\\site-packages\\win32\\lib', 'D:\\ProgramData\\anaconda3\\Lib\\site-packages\\Pythonwin' ] # 已手动换行
程序可以出于自己的目的随意修改此列表。应当只将字符串添加到
sys.path
中,所有其它类型的数据都将在导入期间被忽略。当我们要添加自己创建的模块到搜索路径时,可以使用列表的append()
,这样就可以在其它目录中导入该创建的模块。例如,我们在模块代码文件中添加以下代码,以将该模块所在路径添加到搜索路径:import sys sys.path.append('../') # 将该代码文件所在模块路径添加到搜索路径
5.1.2 输入输出
sys.stdin
、sys.stdout
、sys.stderr
解释器用于标准输入、标准输出、标准错误的文件对象:
stdin
用于所有交互式输入(包括对input()
的调用)。stdout
用于print()
和表达式语句的输出,以及用于input()
的提示符。- 解释器自身的提示符和它的错误消息都发往
stderr
。这些流都是常规文本文件,与
open()
返回的对象一致。要从stdin
中获取值可以使用for
语句。例如,输入一行字符串:import sys for line in sys.stdin: print(line) # 每次获取一行输入
连续输入两行字符串:
import sys a, b = [i.strip() for i in sys.stdin] print(a) # 输入的第一行字符串 print(b) # 输入的第二行字符串
6 路径操作
6.1 os.path
模块——常用的路径操作
该模块实现了一些路径名称相关的函数。
6.1.1 获取路径
os.path.abspath(path: str) -> str
返回路径
path
的绝对路径(标准化的)。
os.path.dirname(path: str) -> str
返回路径
path
的目录名称。例如:>>> import os >>> path = r'D:\ProgramData\anaconda3\Lib\os.py' >>> print(os.path.dirname(path)) D:\ProgramData\anaconda3\Lib >>> path = r"D:\ProgramData\anaconda3\Lib" >>> print(os.path.dirname(path)) D:\ProgramData\anaconda3