0%

简介

  • 使用Python开发GUI应用程序并打包的相关笔记

Tkinter 详解

很高兴为您介绍 Python 中的 Tkinter 模块,它是一个用于创建图形用户界面(GUI)的标准库。下面是关于 Tkinter 的详细解释,以及一些基本示例代码。

什么是 Tkinter?

Tkinter 是 Python 提供的一个内置模块,用于创建桌面应用程序的图形用户界面。它基于 Tk GUI 工具包,并且在大多数 Python 发行版中都预装了。使用 Tkinter,您可以创建窗口、按钮、标签、文本框等 GUI 元素,以便用户与您的应用程序进行交互。

Tkinter 的基本组件

1. 主窗口(Root Window)

主窗口是 Tkinter 应用程序的顶级窗口,您可以在其上添加其他 GUI 元素。以下是创建主窗口的基本示例:

1
2
3
4
5
import tkinter as tk

root = tk.Tk()
root.title("我的第一个Tkinter窗口")
root.mainloop()

2. 标签(Label)

标签用于显示文本或图像。以下是创建标签的示例:

1
2
label = tk.Label(root, text="欢迎使用Tkinter")
label.pack()

3. 按钮(Button)

按钮允许用户在点击时执行特定的操作。以下是创建按钮并添加点击事件的示例:

1
2
3
4
5
def on_button_click():
label.config(text="按钮被点击了!")

button = tk.Button(root, text="点击我", command=on_button_click)
button.pack()

4. 文本框(Entry)

文本框用于接收用户的输入。以下是创建文本框并获取输入的示例:

1
2
3
4
5
6
7
8
9
entry = tk.Entry(root)
entry.pack()

def on_submit():
text = entry.get()
label.config(text="您输入的内容是:" + text)

submit_button = tk.Button(root, text="提交", command=on_submit)
submit_button.pack()

Tkinter 布局管理器

Tkinter 提供了几种布局管理器,用于组织和排列 GUI 元素。常用的布局管理器包括:

  • pack():按照添加顺序自动排列元素。
  • grid():使用表格布局排列元素。
  • place():通过指定坐标来定位元素。

Tkinter 高级功能

除了上述基本组件和布局管理器,Tkinter 还支持更多功能,如菜单、滚动条、对话框等。您可以根据需要深入研究这些功能以构建更复杂的 GUI 应用程序。

以下是创建一个具有菜单的简单示例:

1
2
3
4
5
6
7
8
9
10
menu_bar = tk.Menu(root)

file_menu = tk.Menu(menu_bar, tearoff=0)
file_menu.add_command(label="打开")
file_menu.add_command(label="保存")
file_menu.add_separator()
file_menu.add_command(label="退出", command=root.quit)

menu_bar.add_cascade(label="文件", menu=file_menu)
root.config(menu=menu_bar)

总结

这是对 Tkinter 的简要介绍,希望能够帮助您开始使用 Python 来创建图形用户界面应用程序。要深入了解 Tkinter 的所有功能和选项,您可以查阅 Tkinter 的官方文档或其他教程资源。

pillow 详解

当然,我很乐意为您详细介绍 Python 中的 Pillow 库,它是一个用于图像处理的强大工具。以下是关于 Pillow 库的详细解释,以及一些基本示例代码。

什么是 Pillow?

Pillow(PIL Fork)是 Python 编程语言的图像处理库,它提供了丰富的图像处理功能,包括打开、保存、编辑图像以及执行各种图像操作。Pillow 是 Python Imaging Library(PIL)的一个分支,旨在提供更好的性能和维护性。

安装 Pillow

在使用 Pillow 之前,您需要先安装它。您可以使用以下命令使用 pip 安装 Pillow:

1
pip install pillow

基本图像操作

打开和显示图像

1
2
3
4
5
6
7
from PIL import Image

# 打开图像
image = Image.open("example.jpg")

# 显示图像
image.show()

调整图像尺寸

1
2
3
4
# 调整图像尺寸
new_size = (800, 600)
resized_image = image.resize(new_size)
resized_image.show()

裁剪图像

1
2
3
4
# 裁剪图像
box = (100, 100, 500, 400) # 左上角和右下角坐标
cropped_image = image.crop(box)
cropped_image.show()

旋转图像

1
2
3
# 旋转图像
rotated_image = image.rotate(45) # 逆时针旋转 45 度
rotated_image.show()

添加滤镜

1
2
3
4
5
from PIL import ImageFilter

# 添加模糊滤镜
blurred_image = image.filter(ImageFilter.BLUR)
blurred_image.show()

保存图像

1
2
# 保存图像
resized_image.save("resized_image.jpg")

图像合成

合并图像

1
2
3
4
5
6
# 合并图像
image1 = Image.open("image1.jpg")
image2 = Image.open("image2.jpg")

merged_image = Image.blend(image1, image2, alpha=0.5)
merged_image.show()

图层叠加

1
2
3
4
5
6
# 图层叠加
image1 = Image.open("image1.jpg")
image2 = Image.open("image2.jpg")

composite_image = Image.alpha_composite(image1.convert("RGBA"), image2.convert("RGBA"))
composite_image.show()

文字和绘图

添加文本

1
2
3
4
5
6
7
8
9
10
11
from PIL import ImageDraw, ImageFont

# 打开图像
image = Image.open("example.jpg")

# 添加文本
draw = ImageDraw.Draw(image)
font = ImageFont.truetype("arial.ttf", 36)
text = "Hello, Pillow!"
draw.text((50, 50), text, fill=(255, 0, 0), font=font)
image.show()

绘制形状

1
2
3
4
5
6
7
8
9
10
# 绘制矩形
draw.rectangle([100, 100, 300, 300], outline="red")

# 绘制圆
draw.ellipse([400, 100, 600, 300], outline="green")

# 绘制线段
draw.line([(700, 100), (900, 300)], fill="blue", width=5)

image.show()

总结

这是一个简要的 Pillow 库介绍,希望能够帮助您开始使用 Python 进行图像处理。Pillow 提供了丰富的功能,可以进行各种图像操作和处理,从基本的图像编辑到高级的合成和绘图。要深入了解 Pillow 的所有功能和选项,您可以查阅 Pillow 的官方文档或其他教程资源。

pyinstaller 详解

当然,我很乐意为您详细介绍 Python 中的 PyInstaller 工具,它是一个用于将 Python 程序打包成可执行文件的工具。以下是关于 PyInstaller 的详细解释,以及一些基本示例代码。

什么是 PyInstaller?

PyInstaller 是一个用于将 Python 脚本打包成独立的可执行文件的工具。它可以将您的 Python 代码及其依赖的库、资源文件等一起打包成一个单独的可执行文件,使您可以在没有 Python 解释器的环境中运行您的应用程序。

安装 PyInstaller

在使用 PyInstaller 之前,您需要先安装它。您可以使用以下命令使用 pip 安装 PyInstaller:

1
pip install pyinstaller

打包 Python 程序

以下是使用 PyInstaller 打包 Python 程序的基本步骤:

  1. 打开终端或命令提示符。

  2. 切换到包含您的 Python 脚本的目录。

  3. 运行以下命令以创建可执行文件:

1
pyinstaller your_script.py

这将在当前目录下创建一个名为 “dist” 的文件夹,其中包含了可执行文件和其他必要的文件。

高级选项

PyInstaller 提供了许多选项,以便您可以更精细地控制打包过程。以下是一些常用的选项示例:

  • 指定输出目录:
1
pyinstaller --distpath /path/to/output your_script.py
  • 指定可执行文件的名称:
1
pyinstaller --name myapp your_script.py
  • 打包成单个可执行文件:
1
pyinstaller --onefile your_script.py
  • 包含额外的文件或目录:
1
pyinstaller --add-data "resources;resources" your_script.py

打包 GUI 应用程序

如果您要打包一个带有图形用户界面(GUI)的应用程序,例如使用 Tkinter 或 PyQt,您可能需要做一些额外的配置。

对于 Tkinter 应用程序,可能需要添加以下选项:

1
pyinstaller --onefile --add-data "path/to/tcl/tcl8.6:tkinter/tcl8.6" your_script.py

对于 PyQt 应用程序,您可能需要添加以下选项:

1
pyinstaller --onefile --add-binary "path/to/Qt/QtWidgets.dll;." your_script.py

总结

这是一个简要的 PyInstaller 工具介绍,希望能够帮助您将 Python 程序打包成可执行文件。PyInstaller 提供了丰富的选项,可以满足不同的需求,从简单的命令行脚本到复杂的图形用户界面应用程序。要深入了解 PyInstaller 的所有功能和选项,您可以查阅 PyInstaller 的官方文档或其他教程资源。

简介

  • PCL(Point Cloud Library)常用的编程技巧

pcl::PointCloudpcl::PointXYZ对象怎么转为pcl::PointCloudpcl::PointXYZ::Ptr 指针

pcl::PointCloud<pcl::PointXYZ> 对象转换为 pcl::PointCloud<pcl::PointXYZ>::Ptr 指针可以通过以下几种方法实现,具体取决于您希望如何进行转换。这里提供了两种常用的方法:

  1. 使用 boost::make_shared(或 std::make_shared

    您可以使用 boost::make_shared 或 C++11 中的 std::make_shared 来创建一个智能指针,并将其指向现有的 pcl::PointCloud<pcl::PointXYZ> 对象。这种方法非常简洁,因为它利用了智能指针的构造函数,而无需手动进行分配和释放。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    #include <pcl/point_cloud.h>
    #include <pcl/point_types.h>
    #include <boost/make_shared.hpp> // 或者 #include <memory>(C++11)

    int main()
    {
    pcl::PointCloud<pcl::PointXYZ> cloud; // 假设已经有一个点云对象

    // 使用 boost::make_shared(或 std::make_shared)进行转换
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloudPtr = boost::make_shared<pcl::PointCloud<pcl::PointXYZ>>(cloud);

    // 使用 cloudPtr 进行操作

    return 0;
    }
  2. 使用显式赋值

    另一种方法是通过显式赋值创建指针并将其指向现有的 pcl::PointCloud<pcl::PointXYZ> 对象。这种方法需要手动进行指针的分配和释放。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include <pcl/point_cloud.h>
    #include <pcl/point_types.h>

    int main()
    {
    pcl::PointCloud<pcl::PointXYZ> cloud; // 假设已经有一个点云对象

    // 创建指针并赋值
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloudPtr(new pcl::PointCloud<pcl::PointXYZ>(cloud));

    // 使用 cloudPtr 进行操作

    return 0;
    }

这两种方法都能将现有的 pcl::PointCloud<pcl::PointXYZ> 对象转换为 pcl::PointCloud<pcl::PointXYZ>::Ptr 指针。您可以根据您的代码风格和需求选择其中之一。需要注意的是,在任何情况下,确保在不再需要智能指针时正确释放内存,以避免内存泄漏。

vtkDebugLeaksManager 定义

vtkDebugLeaksManager 是 Visualization Toolkit(VTK)库中的一个类,用于在调试和测试过程中检测内存泄漏。VTK 是一个用于处理和可视化科学和工程数据的开源软件系统。它提供了广泛的功能,包括图形渲染、图像处理、体积可视化、几何建模等,常用于科学计算、医学图像处理和工程仿真等领域。

vtkDebugLeaksManager 类主要用于在程序执行过程中跟踪 VTK 对象的创建和销毁,以帮助开发者发现是否有未释放的内存资源。它通常在开发和测试阶段使用,因为在正式发布的代码中,应该尽量避免内存泄漏。

该类的定义和使用可以在 VTK 的源代码中找到,下面是一个可能的伪代码示例,演示了它的基本用法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <vtkDebugLeaksManager.h>

int main() {
// 启用内存泄漏检测
vtkDebugLeaksManager::GetInstance()->SetDebugLeaks(true);

// ... 创建和使用 VTK 对象 ...

// 在程序结束前,析构 VTK 对象

// 输出内存泄漏信息
vtkDebugLeaksManager::GetInstance()->DumpLeaks(std::cerr);

// 禁用内存泄漏检测
vtkDebugLeaksManager::GetInstance()->SetDebugLeaks(false);

return 0;
}

请注意,上述示例是伪代码,实际的使用方式可能会有所不同,具体取决于你所编写的代码和项目的需求。如果你正在使用 VTK 并且想要了解更多关于 vtkDebugLeaksManager 类的详细信息,建议查阅 VTK 的官方文档或源代码。

简介

  • Python GUI开发常见函数

Tkinter packer() 详解

pack() 函数是 Python 中 tkinter 模块中用于布局和排列控件(widgets)的一个方法。它是一种简单的布局管理器,用于在父容器中自动排列控件。

以下是 pack() 函数的详细解释和参数说明:

pack() 函数的语法:

1
widget.pack(options)

参数说明:

  • options:一个可选的参数,用于配置控件在布局时的行为。这是一个字典(或关键字参数)的集合,其中包含各种选项。下面列出了一些常用的选项:

    • side:表示控件在父容器中的位置,可以是 "top"(上方,默认值)、"bottom"(下方)、"left"(左侧)、"right"(右侧)。
    • fill:设置控件在自身区域内的填充方式,可以是 "none"(默认值,不填充)、"x"(水平方向填充)、"y"(垂直方向填充)、"both"(水平和垂直方向填充)。
    • expand:如果设置为 True,则控件将尝试填充所有可用的空间。
    • anchor:用于指定控件在其空间内的对齐方式,可以是 "n"(北,顶部)、"s"(南,底部)、"e"(东,右侧)、"w"(西,左侧)等。
    • ipadxipady:在控件内部内容周围添加水平和垂直方向的内边距。
    • padxpady:在控件周围添加水平和垂直方向的外边距。

示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import tkinter as tk

root = tk.Tk()
root.title("pack() 函数示例")

# 创建控件
label1 = tk.Label(root, text="Label 1", bg="red")
label2 = tk.Label(root, text="Label 2", bg="green")
label3 = tk.Label(root, text="Label 3", bg="blue")

# 使用 pack() 布局
label1.pack(side="top", fill="both", expand=True, padx=10, pady=10)
label2.pack(side="left", fill="both", padx=10, pady=10)
label3.pack(side="right", fill="both", padx=10, pady=10)

root.mainloop()

在上面的示例中,我们创建了三个标签控件,并使用 pack() 方法对它们进行了布局。side 参数指定了标签在父容器中的位置,fill 参数指定了填充方式,expand 参数启用了扩展,padxpady 参数设置了外边距。

需要注意的是,pack() 布局管理器在简单的界面布局时非常方便,但在复杂的布局需求下可能会受到限制。如果需要更高级的布局管理,可以考虑使用 grid()place() 方法。

简介

  • python3 常用的编程技巧

python3 写入文件 追加模式

在 Python 3 中,可以使用 open() 函数以 追加模式 ('a''a+') 写入文件。以下是几种常见的方式:

1. 追加写入文本文件

1
2
with open("example.txt", "a", encoding="utf-8") as file:
file.write("这是追加的一行内容。\n")
  • 'a' 模式:如果文件不存在,会自动创建;如果文件存在,则从末尾追加内容。
  • encoding="utf-8":保证支持中文等字符,防止乱码。

2. 追加写入并读取文件

1
2
3
4
with open("example.txt", "a+", encoding="utf-8") as file:
file.write("追加的内容,带换行符。\n")
file.seek(0) # 将文件指针移到开头
print(file.read()) # 读取整个文件内容
  • 'a+' 模式:允许追加 (write) 和读取 (read)。
  • seek(0):让 read() 读取文件内容,否则它会从文件末尾开始,返回空字符串。

3. 追加二进制文件(如图片、视频)

1
2
with open("example.bin", "ab") as file:
file.write(b"\x00\x01\x02\x03") # 追加字节数据
  • 'ab' 模式:以二进制方式追加写入。

这样你就可以在 Python 3 中以追加模式写入文件了!

python3 pair类型

在 Python 3 中,没有专门的 pair 类型(像 C++ 中的 std::pair)。但是,你可以使用 元组 (tuple)列表 (list) 来表示一个 键值对成对数据


1. 使用元组 (tuple) 作为 pair

元组是 Python 中最常用的方式:

1
2
3
pair = (1, "apple")  # 一个整数和字符串的配对
print(pair[0]) # 输出 1
print(pair[1]) # 输出 "apple"

元组是 不可变的,适用于存储固定配对数据。


2. 使用列表 (list) 作为 pair

如果你需要修改 pair,可以使用列表:

1
2
3
pair = [1, "banana"]
pair[1] = "orange" # 修改第二个元素
print(pair) # 输出 [1, 'orange']

列表是 可变的,可以修改元素。


3. 使用字典 (dict) 处理键值对

如果要存储键值关系,dict 是更好的选择:

1
2
pair_dict = {"key": "value"}
print(pair_dict["key"]) # 输出 "value"

4. 使用 namedtuple(更具可读性)

如果你想让 pair 具有 结构化命名,可以使用 collections.namedtuple

1
2
3
4
5
6
7
from collections import namedtuple

Pair = namedtuple("Pair", ["first", "second"])
pair = Pair(1, "grape")

print(pair.first) # 输出 1
print(pair.second) # 输出 "grape"

这样比普通的 tuple 代码更清晰。


5. 使用 dataclass(更灵活的方式)

如果需要 更多功能,可以使用 dataclass

1
2
3
4
5
6
7
8
9
10
from dataclasses import dataclass

@dataclass
class Pair:
first: int
second: str

pair = Pair(1, "cherry")
print(pair.first) # 输出 1
print(pair.second) # 输出 "cherry"

dataclass 适用于需要进一步扩展的情况,比如方法或默认值。


结论:

方式 是否可变 适用场景
tuple ❌ 不可变 存储固定配对数据
list ✅ 可变 需要修改的配对
dict ✅ 可变 存储键值对
namedtuple ❌ 不可变 结构化、可读性好
dataclass ✅ 可变 需要扩展功能

如果你只是想存两个值,tuple 是最常用的方式。如果需要更高级的功能,可以用 namedtupledataclass

python3 字典按键排序

在 Python 3 中,可以使用 sorted() 函数按照 键(key) 对字典进行排序。以下是几种常见的方法:


1. 按键升序排序

1
2
3
4
data = {"banana": 3, "apple": 5, "cherry": 2}

sorted_dict = dict(sorted(data.items())) # 默认按键升序
print(sorted_dict)

输出:

1
{'apple': 5, 'banana': 3, 'cherry': 2}

sorted(data.items()) 默认按键升序排列


2. 按键降序排序

1
2
sorted_dict = dict(sorted(data.items(), reverse=True))
print(sorted_dict)

输出:

1
{'cherry': 2, 'banana': 3, 'apple': 5}

reverse=True 让键按降序排列


3. 自定义排序规则(忽略大小写)

如果键是字符串,并且想要 忽略大小写排序

1
2
3
4
data = {"Banana": 3, "apple": 5, "Cherry": 2}

sorted_dict = dict(sorted(data.items(), key=lambda x: x[0].lower()))
print(sorted_dict)

输出:

1
{'apple': 5, 'Banana': 3, 'Cherry': 2}

使用 key=lambda x: x[0].lower() 进行不区分大小写排序


4. 按键的长度排序

如果想要按 键的长度 排序:

1
2
sorted_dict = dict(sorted(data.items(), key=lambda x: len(x[0])))
print(sorted_dict)

使用 key=lambda x: len(x[0]) 按键的长度排序


5. 使用 collections.OrderedDict 保持顺序

如果你需要一个有序字典(Python 3.7+ 的 dict 默认保持顺序,但旧版本需要 OrderedDict):

1
2
3
4
from collections import OrderedDict

ordered_dict = OrderedDict(sorted(data.items()))
print(ordered_dict)

OrderedDict 在 Python 3.6 及以下版本中能保持顺序


🔥 总结:

方式 代码
按键升序排序 dict(sorted(data.items()))
按键降序排序 dict(sorted(data.items(), reverse=True))
忽略大小写排序 dict(sorted(data.items(), key=lambda x: x[0].lower()))
按键长度排序 dict(sorted(data.items(), key=lambda x: len(x[0])))
保持顺序的排序字典(旧版 Python) OrderedDict(sorted(data.items()))

推荐方式: dict(sorted(data.items())) 是最简洁、最快的排序方法! 🚀

python3 判断字符串中不包含指定子字符串

在 Python 3 中,判断一个字符串是否不包含指定的子字符串,可以通过几种不同的方式来实现:

1. 使用 not in 操作符

not in 是 Python 中最直观和常见的方式:

1
2
3
4
5
6
7
string = "Hello, world!"
substring = "python"

if substring not in string:
print("子字符串未找到")
else:
print("子字符串已找到")

输出:

1
子字符串未找到

not in 是判断子字符串不存在的简洁方法。


2. 使用 find() 方法

find() 方法返回子字符串第一次出现的位置,如果未找到则返回 -1

1
2
3
4
5
6
7
string = "Hello, world!"
substring = "python"

if string.find(substring) == -1:
print("子字符串未找到")
else:
print("子字符串已找到")

输出:

1
子字符串未找到

find() 也可以达到相同效果,不过它比较 -1 的结果,代码稍微冗长一些。


3. 使用 index() 方法

index() 方法与 find() 类似,但如果未找到子字符串会抛出异常 ValueError。一般不推荐直接用于检查是否包含,因为可能需要额外的错误处理。

1
2
3
4
5
6
7
8
string = "Hello, world!"
substring = "python"

try:
string.index(substring)
print("子字符串已找到")
except ValueError:
print("子字符串未找到")

输出:

1
子字符串未找到

4. 使用正则表达式

如果你需要更复杂的匹配条件,可以使用正则表达式模块 re

1
2
3
4
5
6
7
8
9
import re

string = "Hello, world!"
substring = "python"

if not re.search(substring, string):
print("子字符串未找到")
else:
print("子字符串已找到")

输出:

1
子字符串未找到

小结:

  • 最简单直观not in 操作符。
  • **find()index()**:适合判断具体的位置,但比 not in 稍微复杂。
  • 正则表达式:适合复杂匹配条件。

如果仅仅是判断是否不包含子字符串,**推荐使用 not in**,因为它简洁且易于理解。

python 调用edge打开指定网址

在 Python 中,可以使用 webbrowser 模块调用默认浏览器(如 Microsoft Edge)打开指定网址。如果需要明确指定 Edge,可以使用 Edge 的路径或通过命令行调用。以下是实现方法的示例:

方法一:通过 webbrowser 模块调用 Edge

1
2
3
4
5
6
7
8
9
10
import webbrowser

# 指定 Microsoft Edge 的路径(Windows 系统默认路径)
edge_path = r"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe"

# 注册 Microsoft Edge
webbrowser.register('edge', None, webbrowser.BackgroundBrowser(edge_path))

# 使用 Edge 打开指定网址
webbrowser.get('edge').open('https://www.example.com')

方法二:通过 subprocess 模块调用 Edge

1
2
3
4
5
6
7
8
import subprocess

# Microsoft Edge 的路径(Windows 系统默认路径)
edge_path = r"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe"

# 打开指定网址
url = "https://www.example.com"
subprocess.run([edge_path, url])

方法三:调用系统命令(适用于已将 Edge 设置为默认浏览器)

1
2
3
4
5
import os

# 打开指定网址
url = "https://www.example.com"
os.system(f"start microsoft-edge:{url}")

注意事项

  1. Edge 路径:确保 Edge 的路径正确。如果使用的是 64 位版本的 Edge,路径可能是 C:\Program Files\Microsoft\Edge\Application\msedge.exe
  2. 权限问题:运行程序时,需要有足够的权限调用系统路径或命令。
  3. Windows 专属:上述方法主要针对 Windows 系统。如果是其他操作系统,需根据实际环境调整。

python 根据指定分隔符分割字符串

在 Python 中,可以使用内置的 str.split() 方法根据指定分隔符分割字符串。以下是多种方式和示例:


基本用法:split()

split() 按照指定的分隔符将字符串分割成一个列表。

示例

1
2
3
4
5
# 使用逗号作为分隔符
text = "apple,banana,cherry"
result = text.split(",")

print(result) # 输出: ['apple', 'banana', 'cherry']

指定分隔符

默认情况下,split() 会以任意空白字符(如空格、制表符、换行符)作为分隔符。可以通过指定参数来自定义分隔符。

示例

1
2
3
4
5
# 按空格分割
text = "Hello World Python"
result = text.split(" ")

print(result) # 输出: ['Hello', 'World', 'Python']

限制分割次数

可以通过 maxsplit 参数限制分割的次数。maxsplit 表示最大分割次数,剩余部分作为最后一个元素返回。

示例

1
2
3
4
5
# 限制分割次数
text = "apple,banana,cherry,dates"
result = text.split(",", maxsplit=2)

print(result) # 输出: ['apple', 'banana', 'cherry,dates']

分割多种分隔符:使用 re.split()

如果字符串中存在多种分隔符,可以使用正则表达式模块 rere.split() 方法。

示例

1
2
3
4
5
6
7
import re

# 多种分隔符
text = "apple;banana|cherry,dates"
result = re.split(r"[;|,]", text)

print(result) # 输出: ['apple', 'banana', 'cherry', 'dates']

分割后去除空字符串

如果分割后的结果中可能存在空字符串,可以结合列表解析进行过滤。

示例

1
2
3
4
text = "apple,,banana,,cherry"
result = [item for item in text.split(",") if item]

print(result) # 输出: ['apple', 'banana', 'cherry']

按换行符分割

1
2
3
4
5
# 按换行符分割
text = "line1\nline2\nline3"
result = text.splitlines()

print(result) # 输出: ['line1', 'line2', 'line3']

常见场景

  1. 处理 CSV 数据

    1
    2
    3
    text = "name,age,city"
    data = text.split(",")
    print(data) # 输出: ['name', 'age', 'city']
  2. 解析日志

    1
    2
    3
    log = "INFO: 2025-01-11 12:34:56 - User logged in"
    result = log.split(" - ")
    print(result) # 输出: ['INFO: 2025-01-11 12:34:56', 'User logged in']
  3. 多分隔符解析

    1
    2
    3
    4
    5
    import re

    text = "apple;banana|cherry,dates"
    result = re.split(r"[;|,]", text)
    print(result) # 输出: ['apple', 'banana', 'cherry', 'dates']

总结

  • 单一分隔符:使用 str.split()
  • 多种分隔符:使用 re.split()
  • 限制分割次数:设置 maxsplit 参数。

如果需要对分割后的数据进一步处理或过滤,结合列表解析可以提高代码的简洁性和可读性。

python 读取文件数据直到结尾

在 Python 中,可以使用以下方法读取文件数据直到文件结尾:


方法 1:使用 read() 方法

read() 会读取整个文件内容,适合小文件。

1
2
3
4
5
6
# 读取整个文件内容
with open("example.txt", "r") as file:
data = file.read()

print("File content:")
print(data)

方法 2:使用 readline() 方法逐行读取

readline() 每次读取一行,直到文件结尾返回空字符串。

1
2
3
4
5
6
# 使用 readline() 逐行读取
with open("example.txt", "r") as file:
line = file.readline()
while line:
print(line.strip()) # strip() 去除换行符
line = file.readline()

方法 3:使用 readlines() 方法读取所有行

readlines() 将文件的所有行读入一个列表,适合需要处理每一行的场景。

1
2
3
4
5
6
# 读取所有行并逐行处理
with open("example.txt", "r") as file:
lines = file.readlines()

for line in lines:
print(line.strip()) # strip() 去除换行符

方法 4:使用文件对象迭代(推荐)

文件对象本身是可迭代的,每次迭代会返回一行内容。这是处理大文件的推荐方法。

1
2
3
4
# 迭代文件对象逐行读取
with open("example.txt", "r") as file:
for line in file:
print(line.strip())

方法对比

方法 适用场景 优点 缺点
read() 小文件,读取所有内容 简单易用,直接获取完整内容 大文件可能耗尽内存
readline() 按行处理内容,适合流式处理 控制读取过程,节约内存 需手动管理循环
readlines() 小文件,需要按行存储到列表中 获取完整的行列表,操作方便 大文件可能耗尽内存
文件对象迭代 逐行处理大文件(推荐) 高效,内存占用低 无法随机访问

文件末尾的标志

  • read()readline() 或文件迭代到文件末尾时,会返回空字符串 ''
  • 如果需要判断文件是否已经读取完毕,可以检查返回值是否为空。

错误处理

在读取文件时,可以使用 try...except 块捕获异常:

1
2
3
4
5
6
7
8
try:
with open("example.txt", "r") as file:
for line in file:
print(line.strip())
except FileNotFoundError:
print("The file does not exist.")
except IOError as e:
print(f"An I/O error occurred: {e}")

总结

  • 使用 文件对象迭代 是处理大文件的推荐方式,结合 with 语句可以确保文件资源的自动释放。
  • 对于简单的读取需求,小文件可以直接使用 read()readlines()

如果有特定需求(如按行过滤数据或逐块读取大文件),可以进一步优化代码!

python 程序运行参数

在 Python 中,可以通过以下方式获取程序的运行参数:


方法 1:使用 sys.argv

sys.argv 是一个列表,包含从命令行传递给 Python 脚本的参数。

示例代码

1
2
3
4
5
6
7
8
import sys

# 输出所有命令行参数
print("Arguments:", sys.argv)

# 获取特定参数
if len(sys.argv) > 1:
print("First argument:", sys.argv[1])

运行脚本

1
python script.py arg1 arg2

输出

1
2
Arguments: ['script.py', 'arg1', 'arg2']
First argument: arg1

注意

  • sys.argv[0] 是脚本的文件名。
  • 参数以字符串形式存储。

方法 2:使用 argparse 模块

argparse 是一个标准库,用于定义和解析命令行参数,适合处理更复杂的参数。

示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import argparse

# 创建解析器
parser = argparse.ArgumentParser(description="A sample script.")

# 添加参数
parser.add_argument("name", help="Your name") # 位置参数
parser.add_argument("-a", "--age", type=int, help="Your age") # 可选参数
parser.add_argument("-v", "--verbose", action="store_true", help="Increase output verbosity") # 开关参数

# 解析参数
args = parser.parse_args()

# 使用参数
print(f"Hello, {args.name}!")
if args.age:
print(f"You are {args.age} years old.")
if args.verbose:
print("Verbose mode is on.")

运行脚本

1
python script.py Alice -a 30 -v

输出

1
2
3
Hello, Alice!
You are 30 years old.
Verbose mode is on.

注意

  • add_argument 的参数可以自定义位置参数、类型和选项。
  • --help 会自动生成帮助信息。

方法 3:使用 optparse 模块

optparse 是一个早期的参数解析库,但已被 argparse 替代。一般不推荐新项目使用。

示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from optparse import OptionParser

# 创建解析器
parser = OptionParser()

# 添加参数
parser.add_option("-n", "--name", dest="name", help="Your name")
parser.add_option("-a", "--age", dest="age", type="int", help="Your age")

# 解析参数
(options, args) = parser.parse_args()

# 使用参数
if options.name:
print(f"Hello, {options.name}!")
if options.age:
print(f"You are {options.age} years old.")

运行脚本

1
python script.py -n Alice -a 30

比较

特性 sys.argv argparse optparse
复杂参数解析 不支持 支持 支持
自动生成帮助信息 不支持 支持 支持
推荐度 简单脚本可用 推荐 不推荐(已弃用)

总结

  • 简单参数:使用 sys.argv
  • 复杂解析:使用 argparse,它功能强大且易于使用。
  • 已弃用工具:避免使用 optparse,尽量迁移到 argparse

如果需要详细示例或进一步自定义,请告诉我!

windows下python执行命令

在Windows下使用Python执行命令,可以通过以下几种方式:


1. 使用os.system

用于执行简单的系统命令,返回命令的退出状态码。

1
2
3
4
import os

# 执行命令
os.system("dir") # 在当前目录下列出文件

2. 使用subprocess模块

更强大且推荐使用的方法,可以捕获输出或处理更复杂的命令。

执行命令并直接查看输出

1
2
3
4
import subprocess

# 执行命令
subprocess.run("dir", shell=True)

获取命令输出

1
2
3
4
5
6
7
8
import subprocess

# 获取命令结果
result = subprocess.run("dir", shell=True, capture_output=True, text=True)

# 打印输出
print(result.stdout) # 标准输出
print(result.stderr) # 错误输出(如果有)

执行带参数的命令

1
2
3
4
import subprocess

# 通过列表方式传递参数(推荐)
subprocess.run(["ping", "127.0.0.1", "-n", "4"], shell=True)

3. **使用os.popen**(较旧,已不推荐)

可以捕获命令的输出,但功能有限。

1
2
3
4
5
import os

# 捕获命令输出
output = os.popen("dir").read()
print(output)

4. 使用shutil模块执行简单操作

如果只是执行文件操作(如复制、删除),可以使用shutil模块。

1
2
3
4
import shutil

# 复制文件
shutil.copy("source.txt", "destination.txt")

注意事项

  1. 使用shell=True时需谨慎

    • 会调用系统的命令解释器(如cmd),可能存在安全风险(如命令注入)。
    • 如果可以,尽量使用参数列表的方式传递命令。
  2. 管理员权限

    • 某些命令需要管理员权限,需以管理员身份运行Python程序。
  3. 路径问题

    • 如果涉及路径,使用Python的ospathlib模块生成正确的路径,避免路径分隔符问题(如反斜杠\)。

需要帮助具体实现某个命令吗?

python3 拷贝文件和目录

在 Python3 中,拷贝文件和目录可以使用内置的 shutil 模块,它提供了高效的方法来复制、移动和删除文件和目录。

以下是一些常用的 shutil 操作:

1. 拷贝文件

可以使用 shutil.copy() 来复制文件。此函数会将源文件复制到目标文件或目录,并保持文件的权限位不变。

1
2
3
4
5
6
7
import shutil

# 复制文件到指定目录
shutil.copy('source_file.txt', 'destination_directory/')

# 复制并重命名
shutil.copy('source_file.txt', 'destination_directory/new_name.txt')

2. 拷贝文件及其权限

使用 shutil.copy2() 复制文件时,它不仅复制文件内容,还会复制文件的元数据(例如文件修改时间)。

1
2
3
4
import shutil

# 复制文件及其权限和元数据
shutil.copy2('source_file.txt', 'destination_directory/')

3. 拷贝整个目录

要复制整个目录(包括其中的所有子目录和文件),可以使用 shutil.copytree()

1
2
3
4
import shutil

# 复制整个目录及其内容
shutil.copytree('source_directory', 'destination_directory')

注意:目标目录不能已经存在,否则会报错。如果需要覆盖现有目录,可以通过 shutil.rmtree() 删除后再进行拷贝。

4. 移动文件或目录

可以使用 shutil.move() 来移动文件或目录。

1
2
3
4
import shutil

# 移动文件或目录
shutil.move('source_path', 'destination_path')

5. 删除文件或目录

如果需要删除文件或目录,可以使用 shutil.rmtree() 删除整个目录树。

1
2
3
4
import shutil

# 删除整个目录及其所有内容
shutil.rmtree('directory_to_delete')

使用这些函数可以方便地进行文件和目录的复制、移动、重命名等操作。

python3 字符串转二进制

要将字符串转换为二进制数据,你可以使用 Python 的 encode() 方法。这个方法允许你将字符串编码为不同的字符集,并返回一个包含二进制数据的字节对象。默认情况下,它使用 UTF-8 编码。下面是一个示例:

1
2
3
4
5
6
7
8
# 字符串
text = "Hello World"

# 将字符串编码为二进制数据
binary_data = text.encode()

# 打印二进制数据
print(binary_data)

在这个示例中,encode() 方法将字符串 “Hello World” 编码为二进制数据。如果你想要使用特定的编码方式,你可以将编码名称作为 encode() 方法的参数传入,例如 text.encode('utf-16')

python3第三方库检测文件的编码是否正常

你可以使用第三方库 chardet 来检测文件的编码是否正常。这个库可以帮助你识别文件的编码类型,从而确定是否符合你的预期。以下是一个简单的示例代码,展示如何使用 chardet 来检测文件的编码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import chardet

def detect_encoding(file_path):
with open(file_path, 'rb') as f:
raw_data = f.read()
result = chardet.detect(raw_data)
encoding = result['encoding']
confidence = result['confidence']
return encoding, confidence

file_path = 'your_file_path_here'
encoding, confidence = detect_encoding(file_path)

if confidence > 0.5: # 设置一个自定义的置信度阈值
print(f"The encoding of the file is {encoding} with confidence {confidence}.")
else:
print("The encoding could not be reliably determined.")

在这个示例中,detect_encoding 函数接收文件路径作为参数,读取文件的二进制数据,并使用 chardet.detect 函数来获取文件的编码类型和置信度。最后,根据置信度决定是否可靠地确定了文件的编码类型。

python3 判断列表为空

在Python中,你可以使用以下方法来判断一个列表是否为空:

  1. 使用逻辑判断:

    1
    2
    3
    4
    5
    6
    my_list = []

    if not my_list:
    print("列表为空")
    else:
    print("列表不为空")
  2. 使用内置函数 len()

    1
    2
    3
    4
    5
    6
    my_list = []

    if len(my_list) == 0:
    print("列表为空")
    else:
    print("列表不为空")

两种方法都可以有效地判断列表是否为空。通常来说,第一种方法更加 Pythonic,因为它利用了 Python 中的隐式布尔转换,更加简洁和易读。

python3 将utf-16编码的文件更改为utf-8编码

你可以使用 Python 来将 UTF-16 编码的文件转换为 UTF-8 编码的文件。下面是一个简单的示例代码:

1
2
3
4
5
6
7
8
9
10
def convert_encoding(input_file, output_file, input_encoding='utf-16', output_encoding='utf-8'):
with open(input_file, 'r', encoding=input_encoding) as f:
content = f.read()
with open(output_file, 'w', encoding=output_encoding) as f:
f.write(content)

input_file = 'input_utf16.txt'
output_file = 'output_utf8.txt'

convert_encoding(input_file, output_file)

在这个示例中,我们定义了一个 convert_encoding 函数,它接收输入文件路径、输出文件路径以及输入和输出的编码类型作为参数。函数首先读取 UTF-16 编码的文件内容,然后将其写入到 UTF-8 编码的输出文件中。你可以根据实际情况调整文件路径和编码类型。

python3 输出变量的类型

在Python中,您可以使用type()函数来输出变量的类型。以下是一个简单的示例:

1
2
3
4
5
6
7
8
x = 10
print(type(x)) # 输出: <class 'int'>

y = 'hello'
print(type(y)) # 输出: <class 'str'>

z = [1, 2, 3]
print(type(z)) # 输出: <class 'list'>

在这个示例中,我们定义了三个变量xyz,并使用type()函数输出它们的类型。对于整数x,输出的类型是int;对于字符串y,输出的类型是str;对于列表z,输出的类型是list

简介

  • python 常用的编程技巧笔记

python3 numpy 轴角的轴向量和旋转向量形成一维向量并且只包含三个数

如果你想将轴向量和旋转角度组合成一个只包含三个数的一维向量,可以将轴向量的三个坐标和旋转角度的值合并在一起。这样,你将得到一个长度为3的一维向量,其中包含了轴向量和旋转角度的信息。

以下是一个使用NumPy的示例代码:

1
2
3
4
5
6
7
8
9
10
11
import numpy as np

# 定义轴向量和旋转角度
axis = np.array([1.0, 0.0, 0.0]) # 以 x 轴为例
angle = np.radians(45) # 旋转角度,这里将角度转换为弧度

# 将轴向量和旋转角度合并成一个只包含三个数的一维向量
combined_vector = np.concatenate([axis * angle])

# 输出组合后的一维向量
print("轴角一维向量:", combined_vector)

在这个例子中,我们使用np.concatenate将轴向量的三个坐标和旋转角度的值合并成了一个只包含三个数的一维向量。这种表示方式仅在某些特定情况下有效,因此在使用时,请确保你的应用能够正确理解和处理这种组合方式。如果你的应用需要更详细的轴角信息,建议使用长度为4的一维向量,其中包含轴向量的坐标和旋转角度。

python3 numpy 只包含三个数的轴角取模转为的轴向量和旋转向量

在轴角表示法中,通常轴向量是一个单位向量,其模(长度)为1。如果你有一个只包含三个数的轴角表示,表示的轴向量的模可能不为1。为了将其转为单位向量,你可以使用NumPy进行归一化操作。

以下是一个示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import numpy as np

# 定义只包含三个数的轴角表示
axis_angle_vector = np.array([1.5, 0.0, 0.0])

# 取模,得到旋转角度
angle = np.linalg.norm(axis_angle_vector)

# 归一化轴向量
axis_vector = axis_angle_vector / angle

# 输出归一化后的轴向量和旋转角度
print("归一化后的轴向量:", axis_vector)
print("旋转角度:", angle)

在这个例子中,np.linalg.norm(axis_angle_vector)用于计算轴角向量的模(长度),然后通过除以模的方式将轴向量归一化。最终,你得到了一个单位轴向量和对应的旋转角度。

请注意,这里假设输入的轴角向量是有效的,即不为零向量。在实际应用中,你可能需要添加一些额外的检查和处理,以确保计算的正确性。

python3 写入文件数据 立刻更新到文件中

在Python 3中,您可以使用write方法将数据写入文件,并立即将更改更新到文件中。默认情况下,write方法会将数据写入文件缓冲区,但这些数据不会立即写入磁盘。要立即更新文件并将数据写入磁盘,您可以执行以下操作:

  1. 打开文件:使用open函数以写入模式打开文件。
1
file = open('文件名.txt', 'w')
  1. 写入数据并刷新缓冲区:使用write方法将数据写入文件,然后使用flush方法刷新文件缓冲区,以确保数据立即写入磁盘。
1
2
3
data_to_write = "要写入的数据\n"
file.write(data_to_write)
file.flush()
  1. 关闭文件:最后,不要忘记关闭文件,以释放资源并确保数据被保存。
1
file.close()

完整的示例:

1
2
3
4
5
file = open('文件名.txt', 'w')
data_to_write = "要写入的数据\n"
file.write(data_to_write)
file.flush()
file.close()

这将立即将数据写入文件,并在flush之后立即更新到文件中。请注意,使用flush会导致额外的磁盘I/O,所以在需要时才使用它,以避免不必要的性能开销。

python3 向文件追加一行数据 详解

在Python 3中,要向文件追加一行数据,您可以使用内置的open函数以追加模式打开文件,并使用write方法将数据写入文件。以下是详细的步骤:

  1. 打开文件以进行追加操作:您可以使用open函数来打开文件,将文件名作为第一个参数传递给它,以及一个字符串参数,指示以追加模式打开文件。追加模式的标志是 'a'
1
2
with open('文件名.txt', 'a') as file:
# 在这里执行追加操作
  1. 将数据写入文件:在打开文件后,您可以使用write方法将数据追加到文件中。数据通常是一个字符串,但您可以将其他数据类型转换为字符串以写入文件。
1
2
3
with open('文件名.txt', 'a') as file:
data_to_append = "要追加的数据\n"
file.write(data_to_append)

请注意,您需要在数据后面加上换行符\n,以便将数据添加为新行。如果不加入\n,所有追加的数据都会写在同一行。

  1. 关闭文件(可选):虽然使用with语句可以自动关闭文件,但如果您不使用with语句,确保在操作完成后手动关闭文件,以释放资源并保存更改。

完整的示例:

1
2
3
with open('文件名.txt', 'a') as file:
data_to_append = "要追加的数据\n"
file.write(data_to_append)

这将在名为’文件名.txt’的文件中追加一行数据。如果文件不存在,将创建一个新文件。如果您希望在写入后立即查看文件内容,可以在write操作之后执行读取操作。

python3 列表 常用技巧 详解

Python 中的列表是一种非常常用的数据结构,可以存储多个值,并提供了许多功能丰富的操作。以下是一些 Python 3 中常用的列表技巧和操作的详细解释:

1. 列表的创建:

创建一个列表可以使用方括号 []list() 构造函数。

1
2
3
my_list = [1, 2, 3]
my_empty_list = []
another_list = list(range(5))

2. 访问列表元素:

您可以通过索引访问列表中的元素,索引从 0 开始。

1
2
3
my_list = [10, 20, 30, 40, 50]
print(my_list[0]) # 输出 10
print(my_list[2]) # 输出 30

3. 修改列表元素:

列表中的元素是可变的,可以通过索引来修改它们。

1
2
3
my_list = [10, 20, 30]
my_list[1] = 25 # 修改第二个元素为 25
print(my_list) # 输出 [10, 25, 30]

4. 添加元素:

您可以使用 append() 方法向列表末尾添加元素。

1
2
3
my_list = [1, 2, 3]
my_list.append(4)
print(my_list) # 输出 [1, 2, 3, 4]

5. 删除元素:

使用 del 语句可以删除列表中的元素。

1
2
3
my_list = [1, 2, 3]
del my_list[1] # 删除第二个元素
print(my_list) # 输出 [1, 3]

6. 列表切片:

通过切片,您可以获取列表中的一部分。

1
2
3
my_list = [1, 2, 3, 4, 5]
sublist = my_list[1:4] # 获取索引 1 到 3 的元素
print(sublist) # 输出 [2, 3, 4]

7. 列表合并:

使用 + 运算符可以将两个列表合并成一个。

1
2
3
4
list1 = [1, 2, 3]
list2 = [4, 5, 6]
combined_list = list1 + list2
print(combined_list) # 输出 [1, 2, 3, 4, 5, 6]

8. 列表复制:

使用切片或 copy() 方法可以创建列表的副本。

1
2
original_list = [1, 2, 3]
copy_list = original_list[:] # 使用切片创建副本

9. 列表长度:

使用 len() 函数可以获取列表的长度。

1
2
3
my_list = [1, 2, 3, 4, 5]
length = len(my_list)
print(length) # 输出 5

10. 列表推导式:

列表推导式是一种快速创建列表的方式。

1
2
squared_numbers = [x ** 2 for x in range(5)]
print(squared_numbers) # 输出 [0, 1, 4, 9, 16]

11. 列表排序:

使用 sort() 方法可以对列表进行升序排序。

1
2
3
my_list = [3, 1, 2, 5, 4]
my_list.sort()
print(my_list) # 输出 [1, 2, 3, 4, 5]

12. 反转列表:

使用 reverse() 方法可以反转列表元素的顺序。

1
2
3
my_list = [1, 2, 3]
my_list.reverse()
print(my_list) # 输出 [3, 2, 1]

这些是 Python 3 中常用的列表技巧和操作。列表是一个非常灵活和强大的数据结构,可以用于各种任务,包括存储和处理数据。根据您的需求,您可以使用上述技巧来操作和处理列表。

“1.1 1.2 1.3” 正则表达式获取三个浮点数 python3

要从字符串中提取三个浮点数,您可以使用正则表达式匹配这些浮点数并提取它们。以下是如何在 Python 3 中使用 re 模块实现这个任务:

1
2
3
4
5
6
7
8
9
10
11
import re

text = "1.1 1.2 1.3 Some other text here."

# 定义匹配浮点数的正则表达式模式
pattern = r'\d+\.\d+'

# 使用 re.findall() 函数提取匹配的浮点数
matches = re.findall(pattern, text)

print("Matches:", matches)

上述代码首先定义了一个正则表达式模式 r'\d+\.\d+',该模式匹配一个或多个数字后跟一个小数点,然后是一个或多个数字。然后,使用 re.findall() 函数来查找并提取匹配的浮点数,并将结果存储在 matches 列表中。在这个示例中,matches 列表将包含提取的三个浮点数。

输出示例:

1
Matches: ['1.1', '1.2', '1.3']

python3 获取系统时间 秒数

要获取当前系统时间的秒数,你可以使用 time 模块的 time() 函数,它返回自 1970 年 1 月 1 日以来的秒数(称为时间戳)。以下是如何获取系统时间的秒数的示例:

1
2
3
4
5
6
7
import time

# 获取当前系统时间的秒数
current_time_seconds = time.time()

# 打印当前时间的秒数
print("当前系统时间的秒数:", current_time_seconds)

这段代码导入 time 模块,然后使用 time.time() 函数来获取当前系统时间的秒数,并将其存储在 current_time_seconds 变量中。最后,它打印出当前时间的秒数,这是一个浮点数,表示自 1970 年 1 月 1 日以来的秒数,通常被称为 Unix 时间戳。

python3 接收用户输入

在Python 3中,您可以使用input()函数来接收用户的输入。input()函数会等待用户输入文本,然后将用户输入的文本作为字符串返回。您可以将其存储在变量中以后使用或处理。

以下是一个简单的示例:

1
2
user_input = input("请输入一些文本: ")
print("您输入的文本是:", user_input)

运行这段代码时,程序会提示用户输入文本,然后将用户输入的文本打印出来。

请注意,input()函数接收的输入始终被视为字符串。如果您需要将输入解释为其他数据类型(例如整数或浮点数),则需要使用适当的类型转换函数,例如int()float()。例如:

1
2
3
4
5
6
user_input = input("请输入一个整数: ")
try:
user_input_as_int = int(user_input)
print("您输入的整数是:", user_input_as_int)
except ValueError:
print("无法将输入转换为整数。")

这段代码将尝试将用户输入转换为整数,如果用户输入的不是有效的整数,则会引发ValueError异常。

python3 main函数接收外部参数并解析解析

如果您想要编写一个Python脚本,使其接收外部参数并进行解析,通常的做法是使用sys.argv来访问命令行参数,然后使用argparse或其他方法来解析这些参数。以下是一个示例,演示如何在Python中完成这个任务:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import sys
import argparse

def main():
# 创建ArgumentParser对象
parser = argparse.ArgumentParser(description='一个命令行工具示例')

# 添加命令行参数
parser.add_argument('-f', '--file', required=True, help='指定文件名')
parser.add_argument('-n', '--number', type=int, default=1, help='指定一个整数(默认为1)')
parser.add_argument('--flag', action='store_true', help='设置此标志将为True,否则为False')

# 解析命令行参数
args = parser.parse_args()

# 访问解析后的参数
print('文件名:', args.file)
print('整数值:', args.number)
print('标志值:', args.flag)

if __name__ == '__main__':
main()

在这个示例中,我们定义了一个main()函数,它包含参数解析的代码。然后,我们使用if __name__ == '__main__':来确保只有在直接运行脚本时才会执行main()函数,而不是在作为模块导入时执行。

然后,您可以在命令行中运行脚本,并传递参数,就像之前的示例一样:

1
python my_script.py -f myfile.txt -n 5 --flag

这将调用main()函数,解析命令行参数并执行相关操作。

这是一个基本的示例,您可以根据自己的需求扩展main()函数和命令行参数。argparse可以帮助您更灵活地定义和解析参数。

python3 argparse 在python程序内部输出帮助信息

您可以在Python程序内部生成帮助信息,然后将其打印到控制台或保存到文件中,而不需要在命令行中使用-h--help选项。要在程序内部输出帮助信息,您可以使用argparseprint_help()方法。以下是一个示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import argparse

def main():
# 创建ArgumentParser对象
parser = argparse.ArgumentParser(description='一个命令行工具示例')

# 添加命令行参数
parser.add_argument('-f', '--file', required=True, help='指定文件名', default='default.txt')
parser.add_argument('-n', '--number', type=int, help='指定一个整数', default=1)
parser.add_argument('--flag', action='store_true', help='设置此标志将为True,否则为False', default=False)

# 解析命令行参数
args = parser.parse_args()

# 访问解析后的参数
print('文件名:', args.file)
print('整数值:', args.number)
print('标志值:', args.flag)

# 输出帮助信息
parser.print_help()

if __name__ == '__main__':
main()

在上述示例中,我们在main()函数中使用parser.print_help()来生成帮助信息并将其打印到控制台。当您运行脚本时,它将首先输出解析后的参数值,然后再打印帮助信息。

运行脚本:

1
python my_script.py

这将输出解析后的参数值,然后打印帮助信息,让用户了解如何正确使用脚本。

python3 OpenCV 矩形框的x,y,w,h 画在图像上

在 OpenCV 中,您可以使用 cv2.rectangle 函数来在图像上绘制一个矩形框,指定矩形的左上角坐标 (x, y) 和宽度 w 以及高度 h。以下是一个示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import cv2
import numpy as np

# 创建一个空白图像
image = np.zeros((400, 400, 3), dtype=np.uint8) # 创建一个 400x400 的黑色图像

# 定义矩形的左上角坐标 (x, y) 和宽度 (w)、高度 (h)
x, y, w, h = 100, 100, 200, 150

# 定义矩形的颜色 (BGR 格式)
color = (0, 255, 0) # 绿色

# 在图像上绘制矩形
cv2.rectangle(image, (x, y), (x + w, y + h), color, thickness=2)

# 显示图像
cv2.imshow('Rectangle', image)

# 等待按下任意键然后关闭窗口
cv2.waitKey(0)
cv2.destroyAllWindows()

在上述示例中,我们首先创建了一个空白的黑色图像,然后使用 cv2.rectangle 函数绘制一个绿色的矩形框,指定左上角坐标 (x, y) 和右下角坐标 (x + w, y + h),以及颜色和线条粗细。

您可以根据需要更改矩形的坐标、颜色和图像大小来适应您的需求。这只是一个基本示例,用于演示如何在 OpenCV 中绘制矩形。

python3 OpenCV 接收二进制数据 保存为图片

要使用 Python 3 和 OpenCV 接收二进制数据并将其保存为图像,您可以按照以下步骤进行操作:

  1. 导入必要的库:
1
2
import cv2
import numpy as np
  1. 接收二进制数据并将其转换为 NumPy 数组。假设您已经从某个地方(例如网络、文件等)接收到了二进制数据,您可以将其转换为 NumPy 数组:
1
2
3
4
5
6
# 假设 binary_data 是包含二进制图像数据的变量
# 请替换为您自己的方式来获取二进制数据
binary_data = b'\xff\xd8\xff\xe0\x00\x10\x4a\x46\x49...'

# 将二进制数据转换为 NumPy 数组
image_data = np.frombuffer(binary_data, np.uint8)
  1. 解码图像数据为 OpenCV 图像对象:
1
2
# 解码二进制数据为图像对象
image = cv2.imdecode(image_data, cv2.IMREAD_COLOR)

上述代码假设您接收的二进制数据是JPEG格式的图像。如果数据是其他图像格式,您可能需要调整 cv2.imdecode 的参数。

  1. 保存图像到文件:
1
2
# 保存图像到文件
cv2.imwrite('output_image.jpg', image)

现在,您已经成功将接收的二进制数据保存为图像文件。请确保提供正确的图像文件路径和名称。

整个代码示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import cv2
import numpy as np

# 假设 binary_data 是包含二进制图像数据的变量
# 请替换为您自己的方式来获取二进制数据
binary_data = b'\xff\xd8\xff\xe0\x00\x10\x4a\x46\x49...'

# 将二进制数据转换为 NumPy 数组
image_data = np.frombuffer(binary_data, np.uint8)

# 解码二进制数据为图像对象
image = cv2.imdecode(image_data, cv2.IMREAD_COLOR)

# 保存图像到文件
cv2.imwrite('output_image.jpg', image)

请注意,这只是一个简单的示例,假设您已经获取了包含二进制数据的变量。在实际应用中,您可能需要使用适当的方法来获取二进制数据,例如通过网络请求、文件读取等。

python3 将二进制数据写入文件 示例 详解

在Python 3中,将二进制数据写入文件是一种常见的操作,通常用于保存图像、音频、视频文件以及其他二进制数据。以下是一个示例,演示了如何将二进制数据写入文件以及相关的详细解释:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 要写入文件的二进制数据
binary_data = b'\x48\x65\x6c\x6c\x6f\x2c\x20\x57\x6f\x72\x6c\x64\x21'

# 打开文件以二进制写入模式('wb'表示二进制写入,如果文件不存在则创建,如果文件已存在则覆盖)
# 您可以指定文件路径和名称
file_path = "binary_data.bin"

# 使用with语句打开文件,以确保在完成写入后关闭文件
with open(file_path, 'wb') as file:
# 将二进制数据写入文件
file.write(binary_data)

# 文件现在已经写入,可以关闭

print(f"二进制数据已写入文件 {file_path}")

上述示例中的关键点包括:

  1. 定义要写入文件的二进制数据binary_data。这是一个包含十六进制值的字节序列,代表了字符串”Hello, World!”的ASCII编码。

  2. 使用open函数以二进制写入模式(’wb’)打开文件。在二进制写入模式下,文件以字节为单位进行写入,而不是以文本字符为单位。

  3. 使用with语句打开文件,以确保在完成写入后自动关闭文件。这有助于防止资源泄漏。

  4. 使用file.write()方法将二进制数据写入文件。

  5. 最后,关闭文件,以确保操作的安全性。

文件binary_data.bin现在包含了指定的二进制数据。您可以根据需要修改binary_data变量以及文件路径和名称来适应您的实际需求。这种方法适用于将任何二进制数据写入文件。

python3 base64 编解码 工具 详解

Base64 是一种二进制数据编码的方式,通常用于将二进制数据转换成可打印字符,以便在不损失数据的情况下进行传输和存储。Python 提供了内置的 base64 模块,可以用来进行 Base64 编码和解码操作。下面是关于 Python3 中 base64 模块的详细解释和示例:

Base64 编码

Base64 编码将二进制数据转换为可打印字符。可以使用 base64 模块的 b64encode 函数来执行编码操作。

1
2
3
4
5
6
7
8
9
10
11
12
import base64

# 要编码的二进制数据
binary_data = b'Hello, World!'

# 进行 Base64 编码
encoded_data = base64.b64encode(binary_data)

# 将编码后的数据转换为字符串
encoded_string = encoded_data.decode('utf-8')

print(encoded_string)

Base64 解码

Base64 解码将 Base64 编码的字符串重新转换回原始的二进制数据。可以使用 base64 模块的 b64decode 函数来执行解码操作。

1
2
3
4
5
6
7
8
9
10
import base64

# Base64 编码后的字符串
encoded_string = 'SGVsbG8sIFdvcmxkIQ=='

# 进行 Base64 解码
decoded_data = base64.b64decode(encoded_string)

# 打印解码后的二进制数据
print(decoded_data)

URL 安全的 Base64 编解码

有时候,Base64 编码后的字符串需要在 URL 中传输,但标准的 Base64 编码字符串中包含一些特殊字符(如+/)可能会引起问题。为了解决这个问题,可以使用 base64 模块的 urlsafe_b64encodeurlsafe_b64decode 函数,它们会将+/字符替换为-_

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import base64

# 要编码的二进制数据
binary_data = b'Hello, World!'

# 进行 URL 安全的 Base64 编码
urlsafe_encoded_data = base64.urlsafe_b64encode(binary_data)

# 将编码后的数据转换为字符串
urlsafe_encoded_string = urlsafe_encoded_data.decode('utf-8')

print(urlsafe_encoded_string)

# 进行 URL 安全的 Base64 解码
decoded_data = base64.urlsafe_b64decode(urlsafe_encoded_string)

# 打印解码后的二进制数据
print(decoded_data)

这就是使用 Python3 中的 base64 模块进行 Base64 编码和解码的基本操作。请注意,在进行编码和解码操作时,要确保输入的数据类型是字节序列(bytes)。

python3 将字符串写入文件

要将字符串写入文件,您可以使用Python的内置文件操作功能。以下是一个简单的示例,演示如何将字符串写入文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 要写入的字符串
my_string = "这是要写入文件的字符串。"

# 打开文件以写入模式('w'表示写入,如果文件不存在则创建,如果文件已存在则覆盖)
# 您可以指定文件路径和名称
file_path = "my_file.txt"

# 使用with语句打开文件,以确保在完成写入后关闭文件
with open(file_path, 'w') as file:
# 将字符串写入文件
file.write(my_string)

# 文件现在已经写入,可以关闭

print(f"字符串已写入文件 {file_path}")

在这个示例中,我们首先定义要写入文件的字符串my_string,然后使用open函数打开文件以供写入(使用'w'模式)。然后,我们使用with语句来确保在完成写入后关闭文件,以避免资源泄漏。最后,我们使用file.write()方法将字符串写入文件,然后关闭文件。

注意:如果指定的文件路径已经存在一个文件,使用'w'模式会覆盖文件的内容。如果不想覆盖文件,可以使用'a'模式以附加方式写入。

python 将数据写入到文件

在 Python 中,可以使用内置的文件操作方法将数据写入文件。以下是常见的方式和示例:


基本写入

使用 open() 函数以写模式 (w) 打开文件,并使用 write() 方法写入数据。

1
2
3
4
5
6
# 写入文本数据
with open("example.txt", "w") as file:
file.write("Hello, World!\n")
file.write("This is a new line of text.\n")

print("Data has been written to example.txt.")

注意

  • 模式 "w" 会覆盖文件内容。如果文件不存在,会创建新文件。
  • 如果需要追加数据,请使用模式 "a"

写入多行数据

可以使用 writelines() 方法将一个字符串列表写入文件,每个字符串表示一行。

1
2
3
4
5
6
# 写入多行数据
lines = ["Line 1\n", "Line 2\n", "Line 3\n"]
with open("example.txt", "w") as file:
file.writelines(lines)

print("Multiple lines have been written to example.txt.")

追加写入

如果需要在现有文件末尾追加数据,可以使用模式 "a"

1
2
3
4
5
# 追加数据
with open("example.txt", "a") as file:
file.write("This line is appended.\n")

print("Data has been appended to example.txt.")

写入二进制数据

对于二进制数据(如图片或音频),使用模式 "wb"

1
2
3
4
5
6
# 写入二进制数据
binary_data = b"Hello, binary world!"
with open("example.bin", "wb") as file:
file.write(binary_data)

print("Binary data has been written to example.bin.")

错误处理

使用 try...except 块可以更安全地处理文件操作异常。

1
2
3
4
5
6
7
try:
with open("example.txt", "w") as file:
file.write("Safe write operation.")
except IOError as e:
print(f"An error occurred: {e}")
else:
print("Data successfully written.")

总结

  • 使用模式 "w" 写入新文件或覆盖文件。
  • 使用模式 "a" 追加内容。
  • 对于多行数据,writelines() 是便利的方法。
  • 使用二进制模式处理非文本文件。

如果有特定的需求(例如写入 JSON、CSV 或其他格式的数据),可以告诉我,我会提供相应的示例!

python3 启动新的线程

在 Python 3 中,您可以使用 threading 模块来启动新的线程。以下是一个简单的示例,演示如何创建和启动一个新线程:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import threading

# 定义一个简单的函数,作为新线程的任务
def print_numbers():
for i in range(1, 6):
print(f"Number: {i}")

# 创建一个新线程并指定要运行的函数
new_thread = threading.Thread(target=print_numbers)

# 启动新线程
new_thread.start()

# 主线程继续执行其他任务
for letter in 'abcde':
print(f"Letter: {letter}")

在这个示例中,我们首先导入 threading 模块。然后,我们定义了一个名为 print_numbers 的函数,它将在新线程中运行,简单地打印数字 1 到 5。接下来,我们使用 threading.Thread 类创建一个新线程,将 print_numbers 函数作为目标(target)传递给新线程。最后,我们通过调用 start() 方法启动新线程,它将在后台运行。

主线程继续执行其他任务,因此您会看到数字和字母的输出交替出现,表明新线程和主线程在并发执行。

请注意,线程是轻量级的执行单元,可以同时运行多个线程,但需要谨慎处理线程之间的共享数据和同步问题,以避免竞争条件和其他线程相关的问题。在复杂的多线程应用程序中,确保线程安全性非常重要。如果需要更多的线程控制和同步,Python 3 还提供了 threading 模块中的各种工具。

python 解析JSON文件

在Python中解析JSON文件通常是一个非常常见的任务,你可以使用内置的json模块来完成这个任务。以下是一个基本的JSON文件解析示例:

假设你有一个名为data.json的JSON文件,内容如下:

1
2
3
4
5
{
"name": "John",
"age": 30,
"city": "New York"
}

你可以使用以下代码来解析这个JSON文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import json

# 打开JSON文件并读取数据
with open('data.json', 'r') as file:
data = json.load(file)

# 访问JSON中的数据
name = data['name']
age = data['age']
city = data['city']

# 打印解析后的数据
print(f"Name: {name}")
print(f"Age: {age}")
print(f"City: {city}")

运行这段代码将会读取data.json文件并将其解析为Python字典对象。然后你可以像访问字典一样访问其中的数据。

如果你要解析的JSON文件包含一个JSON数组,你可以使用json.load()来解析整个数组,然后在Python中进一步处理。例如:

假设你有一个名为data.json的JSON文件,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
[
{
"name": "John",
"age": 30,
"city": "New York"
},
{
"name": "Alice",
"age": 25,
"city": "Los Angeles"
}
]

你可以使用以下代码来解析包含多个对象的JSON数组:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import json

# 打开JSON文件并读取数据
with open('data.json', 'r') as file:
data = json.load(file)

# 遍历JSON数组中的对象
for person in data:
name = person['name']
age = person['age']
city = person['city']

print(f"Name: {name}")
print(f"Age: {age}")
print(f"City: {city}")

这将会遍历JSON数组中的每个对象,并分别访问它们的属性。

python3 发送网络请求

在Python 3中,你可以使用标准库中的requests模块来发送网络请求。以下是一些示例,展示如何发送不同类型的网络请求:

1. 发送HTTP GET请求:

1
2
3
4
5
6
7
8
9
10
11
import requests

# 发送GET请求
response = requests.get('https://www.example.com')

# 检查响应状态码
if response.status_code == 200:
print('请求成功')
print(response.text) # 打印响应内容
else:
print(f'请求失败,状态码:{response.status_code}')

上述代码发送一个HTTP GET请求到https://www.example.com,并打印响应内容。

2. 发送HTTP POST请求:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import requests

# POST请求的数据
data = {'key1': 'value1', 'key2': 'value2'}

# 发送POST请求
response = requests.post('https://www.example.com/api', data=data)

# 检查响应状态码
if response.status_code == 200:
print('请求成功')
print(response.text) # 打印响应内容
else:
print(f'请求失败,状态码:{response.status_code}')

上述代码发送一个HTTP POST请求到https://www.example.com/api,并附带数据作为表单数据发送。

3. 发送HTTP请求并处理JSON响应:

1
2
3
4
5
6
7
8
9
10
11
12
import requests

# 发送GET请求
response = requests.get('https://api.example.com/data')

# 检查响应状态码
if response.status_code == 200:
print('请求成功')
json_data = response.json() # 将JSON响应解析为Python字典或列表
print(json_data)
else:
print(f'请求失败,状态码:{response.status_code}')

上述代码发送一个HTTP GET请求,然后使用.json()方法将JSON响应解析为Python数据结构。

以上是使用requests库发送HTTP请求的基本示例。在实际应用中,你还可以添加请求头、处理异常、处理重定向、使用认证等高级功能,具体取决于你的需求。确保在使用requests模块时,你已经安装了它,你可以使用pip来安装它:

1
pip install requests

python3 通过POST请求发送JSON数据

你可以使用Python 3中的requests库发送POST请求并附加JSON数据。以下是一个示例,展示如何发送带有JSON数据的POST请求:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import requests
import json

# 定义要发送的JSON数据
data = {
"name": "John",
"age": 30,
"city": "New York"
}

# 将JSON数据转换为字符串
json_data = json.dumps(data)

# 设置请求头,指明发送的数据是JSON格式
headers = {'Content-Type': 'application/json'}

# 发送POST请求
response = requests.post('https://www.example.com/api', data=json_data, headers=headers)

# 检查响应状态码
if response.status_code == 200:
print('请求成功')
print(response.text) # 打印响应内容
else:
print(f'请求失败,状态码:{response.status_code}')

上述代码首先将Python字典转换为JSON格式的字符串,然后设置请求头以指明发送的数据是JSON格式。接下来,它使用requests.post方法发送POST请求到https://www.example.com/api,并附带JSON数据作为请求正文。

确保替换URL为你要发送请求的目标URL,以及替换data变量中的JSON数据为你要发送的实际数据。这样,你就可以通过POST请求发送JSON数据了。

python3 解析JSON 判断字段类型 遍历数组

要解析JSON并根据字段类型进行判断以及遍历JSON数组,你可以使用Python 3的json模块来解析JSON数据,然后根据需要进行类型检查和遍历。以下是一个示例:

假设你有一个JSON文件data.json,其中包含一个JSON数组,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[
{
"name": "John",
"age": 30,
"city": "New York"
},
{
"name": "Alice",
"age": null,
"city": "Los Angeles"
},
{
"name": "Bob",
"age": "25",
"city": "Chicago"
}
]

你可以使用以下Python 3代码来解析JSON,检查字段类型并遍历数组:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import json

# 打开JSON文件并读取数据
with open('data.json', 'r') as file:
data = json.load(file)

# 遍历JSON数组中的对象
for person in data:
name = person['name']
age = person['age']
city = person['city']

# 检查字段类型
if isinstance(age, int):
age_str = str(age) # 将年龄转换为字符串
age_type = 'int'
elif age is None:
age_str = 'N/A' # 如果年龄字段为null,则将其标记为N/A
age_type = 'null'
elif isinstance(age, str):
age_str = age
age_type = 'string'
else:
age_str = 'Unknown'
age_type = 'unknown'

# 打印信息
print(f"Name: {name}")
print(f"Age: {age_str} (Type: {age_type})")
print(f"City: {city}")
print()

上述代码会遍历JSON数组中的每个对象,并检查年龄字段的类型。根据字段类型,它会打印相应的信息。

这个示例中,我们假设年龄字段可能是整数、字符串、null或其他未知类型,然后根据实际类型执行相应的操作。你可以根据自己的JSON数据结构和字段类型进行适当的调整。

简介

  • list 列表 相关笔记

python3 list是什么

在Python中,list(列表)是一种有序、可变、可重复的数据结构,用于存储一组元素。列表是Python中最常用的数据结构之一,非常灵活和强大,它可以包含任意类型的元素,包括整数、浮点数、字符串、甚至其他列表等。

以下是关于Python列表的一些特点和用法:

  1. 有序性:列表中的元素是按照它们的插入顺序进行存储的,因此列表是有序的数据结构。

  2. 可变性:列表是可变的,这意味着您可以随时修改列表中的元素,例如添加、删除或更新元素。

  3. 可重复性:列表允许存储相同的元素,因此可以包含重复的值。

  4. 索引访问:您可以使用索引来访问列表中的元素。列表的索引是从0开始的,即第一个元素的索引是0,第二个元素的索引是1,依此类推。

  5. 列表推导式:列表推导式是一种简洁的方式来创建列表,它允许您使用一行代码生成一个新的列表,通常使用for循环和条件表达式来定义列表的内容。

  6. 多种方法和操作:Python提供了丰富的列表方法和操作,如添加元素、删除元素、查找元素、列表切片等,这使得对列表进行各种操作变得非常方便。

以下是一个简单的示例,演示了如何创建和操作列表:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 创建一个列表
my_list = [1, 2, 3, 4, 5]

# 添加元素
my_list.append(6)

# 删除元素
my_list.remove(3)

# 列表切片
subset = my_list[1:4]

# 使用列表推导式生成新列表
new_list = [x**2 for x in my_list]

# 打印列表内容
print(my_list) # 输出: [1, 2, 4, 5, 6]
print(subset) # 输出: [2, 4, 5]
print(new_list) # 输出: [1, 4, 16, 25, 36]

总之,Python中的列表是一种非常常用且功能丰富的数据结构,它提供了灵活的方法来存储和操作一组元素。

python3 list 常用操作

Python中的列表(list)是一种非常灵活和常用的数据结构,它提供了许多常用的操作,使得对列表进行处理变得非常方便。以下是一些常用的Python列表操作:

  1. 创建列表:使用方括号[]来创建一个列表,并在其中添加元素。
1
my_list = [1, 2, 3, 4, 5]
  1. 访问元素:使用索引来访问列表中的元素。列表的索引从0开始。
1
print(my_list[0])  # 输出: 1
  1. 切片:使用切片来获取列表的子列表。
1
2
subset = my_list[1:4]  # 获取索引1到索引3的元素
print(subset) # 输出: [2, 3, 4]
  1. 添加元素:使用append()方法向列表末尾添加一个元素。
1
2
my_list.append(6)
print(my_list) # 输出: [1, 2, 3, 4, 5, 6]
  1. 删除元素:使用remove()方法删除列表中的指定元素,使用del语句删除列表中指定索引处的元素。
1
2
3
4
5
my_list.remove(3)  # 删除元素3
print(my_list) # 输出: [1, 2, 4, 5, 6]

del my_list[0] # 删除索引为0的元素
print(my_list) # 输出: [2, 4, 5, 6]
  1. 列表长度:使用len()函数获取列表中元素的个数。
1
2
length = len(my_list)
print(length) # 输出: 4
  1. 查找元素:使用index()方法查找列表中某个元素的索引。
1
2
index = my_list.index(4)
print(index) # 输出: 1
  1. 反转列表:使用reverse()方法将列表中的元素反转。
1
2
my_list.reverse()
print(my_list) # 输出: [6, 5, 4, 2]
  1. 排序:使用sort()方法对列表中的元素进行排序。
1
2
my_list.sort()
print(my_list) # 输出: [2, 4, 5, 6]
  1. 复制列表:使用切片或copy()方法复制一个列表。
1
2
3
new_list = my_list[:]  # 使用切片复制列表
# 或者
new_list = my_list.copy() # 使用copy()方法复制列表

这些是Python中列表的一些常用操作。列表还有很多其他方法和功能,具体取决于您的需求和情况。

python3 list 常用技巧

在Python中,有许多技巧可以让您更有效地使用列表。以下是一些常用的Python列表技巧:

  1. 列表解析(List Comprehension):列表解析是一种简洁而强大的方式来创建新的列表,它允许您在单个表达式中对列表元素进行转换或过滤。
1
2
3
4
5
# 创建一个包含元素平方的新列表
squared_list = [x**2 for x in range(10)]

# 使用条件筛选元素
even_numbers = [x for x in range(10) if x % 2 == 0]
  1. 列表拼接:使用+运算符将两个列表拼接成一个新的列表。
1
2
3
list1 = [1, 2, 3]
list2 = [4, 5, 6]
combined_list = list1 + list2
  1. 列表切片赋值:使用切片来替换列表中的一部分元素。
1
2
my_list = [1, 2, 3, 4, 5]
my_list[1:3] = [6, 7]
  1. 使用zip()函数zip()函数可以将多个列表按照索引位置进行组合,生成一个元组列表。
1
2
3
names = ['Alice', 'Bob', 'Charlie']
ages = [25, 30, 35]
combined_data = list(zip(names, ages))
  1. 翻转索引和值:使用字典的zip()dict()函数可以快速创建一个索引-值对调的字典。
1
2
my_dict = {'a': 1, 'b': 2, 'c': 3}
inverted_dict = dict(zip(my_dict.values(), my_dict.keys()))
  1. 获取唯一值:使用集合(set)可以快速获取列表中的唯一值。
1
2
my_list = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4]
unique_values = list(set(my_list))
  1. 迭代时获取索引:使用enumerate()函数可以同时获取索引和值。
1
2
3
my_list = ['a', 'b', 'c']
for index, value in enumerate(my_list):
print(index, value)
  1. 将多维列表展平:使用列表解析可以快速将多维列表展平为一维列表。
1
2
nested_list = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
flattened_list = [item for sublist in nested_list for item in sublist]

这些是Python中常用的一些列表技巧。它们可以帮助您更加高效地处理和操作列表数据。

简介

  • python3中常见的问题

python3 列表中省略号后面跟逗号加数字是什么意思

在 Python 中,省略号(Ellipsis)后面跟着逗号和数字表示一个带有省略号的扩展切片。

这种形式的扩展切片通常在多维数组(如 NumPy 数组)中使用,用来指定对多个维度的切片操作。

例如,在一个二维列表中,省略号后面跟着逗号和数字表示对所有维度的切片,但是指定其中一个维度的索引值:

1
2
3
4
5
my_list = [[1, 2, 3],
[4, 5, 6],
[7, 8, 9]]

print(my_list[..., 1]) # 输出为 [2, 5, 8]

这个例子中,... 表示对所有维度的切片操作,后面的逗号和数字 1 指定了对第二维度(列)进行切片,并且取出了每个子列表的第二个元素。

简介

  • Python编程语言的理论基础

python3 基础数据类型

Python 3 提供了多种 基础数据类型,这些数据类型可以用于存储各种形式的数据。以下是 Python 3 中常见的基础数据类型及其详细介绍:


1. 数值类型(Numeric Types)

1.1 整数 (int)

表示没有小数点的数字,可以是正数、负数或者零。

1
2
3
x = 10
y = -3
z = 0

1.2 浮点数 (float)

表示带有小数点的数字,通常用于科学计算。

1
2
3
a = 3.14
b = -0.001
c = 2.0

1.3 复数 (complex)

表示复数,格式为 a + bj,其中 a 是实数部分,b 是虚数部分,j 是虚数单位。

1
2
c1 = 3 + 4j
c2 = 1 - 2j

2. 布尔类型 (bool)

布尔类型只有两个值:TrueFalse,通常用于条件判断和逻辑运算。

1
2
x = True
y = False
  • TrueFalse 也可以通过数字表示:True 等于 1False 等于 0
1
2
x = int(True)  # 1
y = int(False) # 0

3. 字符串类型 (str)

字符串是由字符组成的序列,可以用单引号 (') 或双引号 (") 括起来,支持多行字符串的表示。

1
2
3
4
s1 = "Hello, world!"
s2 = 'Python'
s3 = '''This is a
multi-line string.'''

字符串是 不可变的,一旦创建后无法修改。


4. 列表类型 (list)

列表是 有序的可变的允许重复的元素集合。列表的元素可以是任意类型,包括其他列表。

1
2
3
fruits = ["apple", "banana", "cherry"]
numbers = [1, 2, 3, 4, 5]
mixed = [1, "apple", 3.14, [1, 2]]
  • 列表是可变的,可以通过索引访问、修改或添加元素。
1
2
fruits[1] = "orange"  # 修改
fruits.append("pear") # 添加

5. 元组类型 (tuple)

元组是 有序的不可变的允许重复的元素集合。元组一旦创建,无法修改其内容。

1
2
coordinates = (1, 2, 3)
colors = ("red", "green", "blue")
  • 元组使用小括号 () 创建,支持索引和切片,但不能修改其元素。
1
print(coordinates[0])  # 输出: 1

6. 集合类型 (set)

集合是 无序的不重复的元素集合。集合自动去重,常用于数学运算,如交集、并集、差集等。

1
2
fruits = {"apple", "banana", "cherry"}
numbers = {1, 2, 3, 4, 5}
  • 集合是无序的,不能通过索引访问。
  • 集合支持集合运算,如交集(&)、并集(|)、差集(-)。
1
2
3
4
5
a = {1, 2, 3}
b = {3, 4, 5}
print(a & b) # 输出: {3} 交集
print(a | b) # 输出: {1, 2, 3, 4, 5} 并集
print(a - b) # 输出: {1, 2} 差集

7. 字典类型 (dict)

字典是 无序的键值对(key-value)的集合。每个元素由一个键和一个值组成,可以通过键来快速查找对应的值。

1
person = {"name": "Alice", "age": 30, "city": "New York"}
  • 字典的键必须是不可变的类型(如字符串、整数、元组),而值可以是任意类型。
  • 字典是可变的,可以添加、修改和删除键值对。
1
2
3
person["age"] = 31  # 修改
person["job"] = "Engineer" # 添加
del person["city"] # 删除

8. None 类型 (NoneType)

None 是 Python 的特殊常量,表示空值或不存在的值。它常用于函数没有返回值时,或者需要表示一个空的对象。

1
x = None
  • None 是一个对象,可以用于表示“无”或“空”。
  • 它通常用于初始化变量或作为默认参数。

9. 可变与不可变类型

9.1 不可变类型

  • intfloatcomplexstrtuplefrozenset 都是不可变的类型。一旦创建,它们的值就不能改变。

9.2 可变类型

  • listsetdict 是可变的类型,可以修改其内容。

10. 类型转换

Python 提供了几种函数,用于在不同类型之间进行转换。

10.1 **int()**:将其他类型转换为整数。

1
2
x = int("123")  # 字符串转整数
y = int(3.14) # 浮点数转整数

10.2 **float()**:将其他类型转换为浮点数。

1
2
x = float("3.14")  # 字符串转浮点数
y = float(10) # 整数转浮点数

10.3 **str()**:将其他类型转换为字符串。

1
2
x = str(123)      # 整数转字符串
y = str(3.14) # 浮点数转字符串

10.4 **list()**:将其他可迭代对象转换为列表。

1
x = list("hello")  # 转为列表: ['h', 'e', 'l', 'l', 'o']

10.5 **tuple()**:将其他可迭代对象转换为元组。

1
x = tuple([1, 2, 3])  # 转为元组: (1, 2, 3)

10.6 **set()**:将其他可迭代对象转换为集合。

1
x = set([1, 2, 3, 3])  # 转为集合: {1, 2, 3}

11. 总结

数据类型 描述 示例
int 整数 10, -5, 0
float 浮点数 3.14, -0.001
complex 复数 3 + 4j
bool 布尔值 True, False
str 字符串 "Hello", 'Python'
list 列表(有序、可变) [1, 2, 3]
tuple 元组(有序、不可变) (1, 2, 3)
set 集合(无序、不重复) {1, 2, 3}
dict 字典(无序、键值对) {"name": "Alice", "age": 30}
None 空值 None

总结: Python 提供了多种基础数据类型,适用于不同场景。数值类型(int, float)适用于数学计算,布尔类型适用于逻辑判断,字符串用于处理文本数据,集合用于处理不重复的元素,而字典用于存储键值对映射。在 Python 中,理解这些基础数据类型及其特点是编写高效程序的基础。

python3 pip -U参数是什么意思

pip 命令中,-U 参数用于升级已经安装的包到最新版本。具体来说,-U 参数表示 “upgrade”,它告诉 pip 将指定的包升级到最新可用版本。

例如:

1
pip install -U package_name

这将会升级 package_name 到最新版本。如果 package_name 没有被安装,它将被安装;如果已经安装,将会被升级到最新版本。

使用 -U 参数是为了确保你使用的是包的最新版本,而不是旧版本。这在确保你使用的软件包具有最新特性、修复了已知问题或者提供了性能改进等方面是很有用的。

python3 str object is not callable

如果你在Python中遇到 “str object is not callable” 错误,通常是因为你意外地使用了内置函数的名称作为变量名。在Python中,避免使用内置函数名作为变量名是一个良好的实践。

例如,以下是一个可能导致该错误的示例:

1
2
3
str = "Hello"
result = str(42) # 这里会引发 "str object is not callable" 错误
print(result)

在这个例子中,str被重新赋值为一个字符串,然后试图调用它就会引发错误。为了避免这种情况,应该使用不同的变量名:

1
2
3
my_str = "Hello"
result = str(42) # 这里不会引发错误,因为 str 是内置函数
print(result)

确保不要覆盖内置函数和关键字的名称,以避免这种类型的错误。如果已经发生了这种情况,重新启动Python解释器并尽量避免使用与内置函数和关键字相同的变量名。

python3 no module named requests

如果您在 Python 3 中遇到 “no module named requests” 错误,这意味着您的 Python 环境中缺少 requests 模块。requests 是一个用于发送 HTTP 请求的常用库,但它不是 Python 的标准库,因此您需要单独安装它。

要解决这个问题,您可以执行以下步骤来安装 requests 模块:

  1. 使用 pip 安装 requests

    打开终端(命令行界面)并运行以下命令来使用 pip 安装 requests 模块:

    1
    pip install requests

    请确保 pip 是与您的 Python 3 版本相关联的 pip,通常情况下,您可以使用 pip3 命令来确保安装到 Python 3:

    1
    pip3 install requests
  2. 验证安装

    安装完成后,您可以在 Python 中导入 requests 模块并验证是否成功。打开 Python 解释器或脚本,尝试运行以下代码:

    1
    2
    import requests
    print(requests.__version__)

    如果没有出现错误,并且成功打印出 requests 版本号,那么说明安装已经成功。

请注意,如果您在虚拟环境中工作,请确保您的虚拟环境处于活动状态,以便 requests 模块安装到虚拟环境而不是全局 Python 环境。如果您使用的是 Python 3,pip 通常会默认安装到 Python 3 的环境中。

如果仍然遇到问题,可以提供更多详细信息,以便我更好地帮助您解决问题。

python3 pip 常用命令 详解

pip 是 Python 的包管理工具,用于安装、卸载和管理 Python 包(也称为库或模块)。以下是一些常用的 pip 命令及其详细解释:

  1. 安装包

    1
    pip install package_name

    用于安装指定的 Python 包。package_name 是要安装的包的名称。可以使用这个命令来安装第三方库,例如 numpyrequestsmatplotlib 等。可以使用 -r 选项从一个文本文件中安装一组包。

  2. 卸载包

    1
    pip uninstall package_name

    用于卸载指定的 Python 包。package_name 是要卸载的包的名称。

  3. 查看已安装的包

    1
    pip list

    显示已经安装的所有 Python 包的列表。

  4. 查看包的详细信息

    1
    pip show package_name

    显示指定包的详细信息,包括版本号、作者、描述等。

  5. 升级包

    1
    pip install --upgrade package_name

    用于升级已安装的包到最新版本。

  6. 搜索包

    1
    pip search search_term

    用于搜索 PyPI(Python Package Index)上的包。search_term 是您要搜索的包的关键字。

  7. 创建 requirements 文件

    1
    pip freeze > requirements.txt

    将当前环境中已安装的所有包及其版本号保存到 requirements.txt 文件中,通常用于共享项目的依赖信息。

  8. 从 requirements 文件安装包

    1
    pip install -r requirements.txt

    requirements.txt 文件中安装指定版本的包,用于在新环境中还原项目的依赖关系。

  9. 查看包的依赖关系

    1
    pip show --files package_name

    显示指定包的依赖关系和文件路径。

  10. 安装包的特定版本

    1
    pip install package_name==version

    安装指定版本的包,其中 version 是要安装的版本号。

这些是一些常用的 pip 命令,用于管理 Python 包。根据您的需求,您可以使用这些命令来安装、升级、卸载、查看和管理 Python 包。使用 pip 可以方便地管理Python项目的依赖关系。

kwargs

在 Python 中,kwargs 是一个特殊的参数,用于接收传递给函数的关键字参数(Keyword Arguments)。kwargs 是一个字典(dictionary),其中包含了函数调用时传递的关键字参数及其对应的值。

使用 **kwargs 语法可以在函数定义中接收关键字参数,并将其作为字典传递给函数体内部。下面是一个示例:

1
2
3
4
5
6
def my_function(**kwargs):
for key, value in kwargs.items():
print(f"{key}: {value}")

# 使用关键字参数调用函数
my_function(name="John", age=30, city="New York")

在上面的示例中,my_function 函数定义中的 **kwargs 表示可以接收任意数量的关键字参数。在函数体内部,kwargs 是一个字典,可以使用 items() 方法迭代其中的键值对,并对其进行处理。在函数调用中,传递的关键字参数会被收集到 kwargs 字典中。

运行上述代码,输出将是:

1
2
3
name: John
age: 30
city: New York

通过使用 **kwargs,函数能够接收灵活的关键字参数,并在函数内部以字典的形式进行处理。这使得函数可以处理各种不同的关键字参数,而无需预先指定它们的名称和数量。

源码编安装

  • 源码路径:zjy-190/Software/Python-3.8.3.tgz

  • 安装依赖包

    • apt-get install -y libssl-dev openssl libffi-dev zlib1g-dev
  • 编译安装

    • cd Python-3.8.0
    • ./configure –prefix=/usr/local/python3
    • make && make install
  • pip up

zlib not available 是什么

“zlib not available” 是一个错误消息,通常在使用Python时出现,表示缺少 zlib 模块或库。zlib 是一个用于压缩和解压缩数据的库,通常用于处理压缩文件、网络传输中的数据压缩等。如果您遇到 “zlib not available” 错误,可能是因为您的Python环境没有正确安装或配置 zlib 库。

要解决这个问题,您可以采取以下步骤:

  1. 安装 zlib 开发库:首先,确保您的系统上已经安装了 zlib 开发库。在大多数Linux系统上,可以使用包管理器安装 zlib 开发库,例如:

    • 在Ubuntu上,可以运行以下命令安装 zlib 开发库:

      1
      sudo apt-get install zlib1g-dev
    • 在CentOS上,可以运行以下命令安装 zlib 开发库:

      1
      sudo yum install zlib-devel
    • 在其他Linux发行版上,请使用相应的包管理器安装 zlib 开发库。

  2. 重新编译Python:如果您已经安装了 zlib 开发库但仍然遇到问题,您可能需要重新编译Python,以便它可以正确地链接到 zlib 库。这可以通过以下步骤完成:

    • 下载Python源代码,如果尚未下载。

    • 进入Python源代码的目录。

    • 运行以下命令:

      1
      2
      3
      ./configure
      make
      sudo make install

    这将重新编译Python,并确保它正确链接到 zlib 库。

  3. 检查Python环境:如果您使用的是虚拟环境,请确保虚拟环境中的Python正确配置并链接到 zlib 库。您可以使用以下命令检查虚拟环境的Python版本和 zlib 链接:

    1
    2
    which python
    python -c "import zlib; print(zlib)"

    确保这些命令返回正确的Python解释器和 zlib 模块。

python3 日志处理 工具 推荐

在Python 3中,有许多优秀的日志处理工具可供选择,这些工具可以帮助你有效地记录和管理应用程序的日志信息。以下是一些常用的Python 3日志处理工具的推荐:

  1. Python内置的logging模块:
    Python的标准库中包含了一个内置的logging模块,它提供了强大的日志记录功能。你可以使用这个模块来配置日志级别、输出目标和格式。它是一个常见的选择,因为它是Python的标准库的一部分,无需额外安装。

    1
    2
    3
    import logging

    logging.basicConfig(filename='app.log', level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
  2. Loguru:
    Loguru是一个易于使用的第三方日志库,它提供了直观的API和强大的功能。它支持动态日志级别调整、日志旋转、多种输出格式等功能。

    1
    2
    3
    from loguru import logger

    logger.add("app.log", rotation="500 MB", level="INFO")
  3. structlog:
    structlog是一个用于结构化日志记录的库,它允许你轻松地记录自定义字段,并支持多种输出格式。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    import structlog

    structlog.configure(
    processors=[
    structlog.processors.JSONRenderer(),
    structlog.processors.TimeStamper(fmt="iso"),
    ],
    logger_factory=structlog.PrintLoggerFactory(),
    )
  4. Fluentd:
    Fluentd是一个开源的日志收集和传输工具,它可以集成到Python应用程序中,并将日志发送到不同的目标,如文件、数据库或日志分析工具中。

  5. Loggly、Papertrail等云日志服务:
    如果你的应用程序部署在云上,可以考虑使用云日志服务,如Loggly、Papertrail等。它们提供了强大的日志管理和分析功能,可以帮助你更轻松地处理日志。

选择哪个日志处理工具取决于你的具体需求和偏好。无论你选择哪一个,都应该根据项目的规模和要求来配置和管理日志,以确保你能够有效地监视和调试你的应用程序。

编码

  • 默认情况下,Python 3 源码文件以 UTF-8 编码,所有字符串都是 unicode 字符串。 当然你也可以为源码文件指定不同的编码
1
# -*- coding: cp-1252 -*-
  • 上述定义允许在源文件中使用 Windows-1252 字符集中的字符编码,对应适合语言为保加利亚语、白俄罗斯语、马其顿语、俄语、塞尔维亚语。

标识符

  • 第一个字符必须是字母表中字母或下划线 _ 。

  • 标识符的其他的部分由字母、数字和下划线组成。

  • 标识符对大小写敏感。

  • 在 Python 3 中,可以用中文作为变量名,非 ASCII 标识符也是允许的了。

python保留字

  • 保留字即关键字,我们不能把它们用作任何标识符名称。Python 的标准库提供了一个 keyword 模块,可以输出当前版本的所有关键字:
    1
    2
    3
    >>> import keyword
    >>> keyword.kwlist
    ['False', 'None', 'True', 'and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield']

注释

  • Python中单行注释以 # 开头,实例如下:

    1
    2
    3
    4
    #!/usr/bin/python3

    # 第一个注释
    print ("Hello, Python!") # 第二个注释
  • 多行注释可以用多个 # 号,还有 ‘’’ 和 “””:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    #!/usr/bin/python3

    # 第一个注释
    # 第二个注释

    '''
    第三注释
    第四注释
    '''

    """
    第五注释
    第六注释
    """
    print ("Hello, Python!")

行与缩进

  • python最具特色的就是使用缩进来表示代码块,不需要使用大括号 {}
  • 缩进的空格数是可变的,但是同一个代码块的语句必须包含相同的缩进空格数。实例如下
    1
    2
    3
    4
    if True:
    print ("True")
    else:
    print ("False")

多行语句

  • Python 通常是一行写完一条语句,但如果语句很长,我们可以使用反斜杠 \ 来实现多行语句,例如:

    1
    2
    3
    total = item_one + \
    item_two + \
    item_three
  • 在 [], {}, 或 () 中的多行语句,不需要使用反斜杠 \,例如:

    1
    2
    total = ['item_one', 'item_two', 'item_three',
    'item_four', 'item_five']

数字(Number)类型

  • python中数字有四种类型:整数、布尔型、浮点数和复数。
    • int (整数), 如 1, 只有一种整数类型 int,表示为长整型,没有 python2 中的 Long。
    • bool (布尔), 如 True。
    • float (浮点数), 如 1.23、3E-2
    • complex (复数), 如 1 + 2j、 1.1 + 2.2j

字符串(String)

  • Python 中单引号 ‘ 和双引号 “ 使用完全相同。
  • 使用三引号(‘’’ 或 “””)可以指定一个多行字符串。
  • 转义符 \。
  • 反斜杠可以用来转义,使用 r 可以让反斜杠不发生转义。 如 r”this is a line with \n” 则 \n 会显示,并不是换行。
  • 按字面意义级联字符串,如 “this “ “is “ “string” 会被自动转换为 this is string。
  • 字符串可以用 + 运算符连接在一起,用 * 运算符重复。
  • Python 中的字符串有两种索引方式,从左往右以 0 开始,从右往左以 -1 开始。
  • Python 中的字符串不能改变。
  • Python 没有单独的字符类型,一个字符就是长度为 1 的字符串。
  • 字符串的截取的语法格式如下:变量[头下标:尾下标:步长]
1
2
3
4
word = '字符串'
sentence = "这是一个句子。"
paragraph = """这是一个段落,
可以由多行组成"""
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/usr/bin/python3

str='123456789'

print(str) # 输出字符串
print(str[0:-1]) # 输出第一个到倒数第二个的所有字符
print(str[0]) # 输出字符串第一个字符
print(str[2:5]) # 输出从第三个开始到第六个的字符(不包含)
print(str[2:]) # 输出从第三个开始后的所有字符
print(str[1:5:2]) # 输出从第二个开始到第五个且每隔一个的字符(步长为2)
print(str * 2) # 输出字符串两次
print(str + '你好') # 连接字符串

print('------------------------------')

print('hello\nrunoob') # 使用反斜杠(\)+n转义特殊字符
print(r'hello\nrunoob') # 在字符串前面添加一个 r,表示原始字符串,不会发生转义

空行

  • 函数之间或类的方法之间用空行分隔,表示一段新的代码的开始。类和函数入口之间也用一行空行分隔,以突出函数入口的开始
  • 空行与代码缩进不同,空行并不是 Python 语法的一部分。书写时不插入空行,Python 解释器运行也不会出错。但是空行的作用在于分隔两段不同功能或含义的代码,便于日后代码的维护或重构。
    • 空行也是程序代码的一部分。

等待用户输入

  • 执行下面的程序在按回车键后就会等待用户输入:

    1
    2
    3
    #!/usr/bin/python3

    input("\n\n按下 enter 键后退出。")
  • 以上代码中 ,\n\n 在结果输出前会输出两个新的空行。一旦用户按下 enter 键时,程序将退出。

同一行显示多条语句

  • Python 可以在同一行中使用多条语句,语句之间使用分号 ; 分割,以下是一个简单的实例:
    1
    2
    3
    #!/usr/bin/python3

    import sys; x = 'runoob'; sys.stdout.write(x + '\n')

多个语句构成代码组

  • 缩进相同的一组语句构成一个代码块,我们称之代码组
  • 像if、while、def和class这样的复合语句,首行以关键字开始,以冒号( : )结束,该行之后的一行或多行代码构成代码组
  • 我们将首行及后面的代码组称为一个子句(clause)
    1
    2
    3
    4
    5
    6
    if expression : 
    suite
    elif expression :
    suite
    else :
    suite

print 输出

  • print 默认输出是换行的,如果要实现不换行需要在变量末尾加上 end=””
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #!/usr/bin/python3

    x="a"
    y="b"
    # 换行输出
    print( x )
    print( y )

    print('---------')
    # 不换行输出
    print( x, end=" " )
    print( y, end=" " )
    print()

import 与 from…import

  • 在 python 用 import 或者 from…import 来导入相应的模块。
  • 将整个模块(somemodule)导入,格式为: import somemodule
  • 从某个模块中导入某个函数,格式为: from somemodule import somefunction
  • 从某个模块中导入多个函数,格式为: from somemodule import firstfunc, secondfunc, thirdfunc
  • 将某个模块中的全部函数导入,格式为: from somemodule import *
1
2
3
4
5
6
import sys
print('================Python import mode==========================')
print ('命令行参数为:')
for i in sys.argv:
print (i)
print ('\n python 路径为',sys.path)
1
2
3
4
from sys import argv,path  #  导入特定的成员

print('================python from import===================================')
print('path:',path) # 因为已经导入path成员,所以此处引用时不需要加sys.path

基本数据类型

  • Python 中的变量不需要声明。每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。
  • 在 Python 中,变量就是变量,它没有类型,我们所说的”类型”是变量所指的内存中对象的类型。
  • 等号(=)用来给变量赋值。
  • 等号(=)运算符左边是一个变量名,等号(=)运算符右边是存储在变量中的值

标准数据类型

  • Python3 中常见的数据类型有:

    • Number(数字)
    • String(字符串)
    • bool(布尔类型)
    • List(列表)
    • Tuple(元组)
    • Set(集合)
    • Dictionary(字典)
  • Python3 的六个标准数据类型中:

    • 不可变数据(3 个):Number(数字)、String(字符串)、Tuple(元组)
    • 可变数据(3 个):List(列表)、Dictionary(字典)、Set(集合)。

数值运算

  • 注:
    1. Python可以同时为多个变量赋值,如a, b = 1, 2。
    2. 一个变量可以通过赋值指向不同类型的对象。
    3. 数值的除法包含两个运算符:/ 返回一个浮点数,// 返回一个整数。
    4. 在混合计算时,Python会把整型转换成为浮点数。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
>>> 5 + 4  # 加法
9
>>> 4.3 - 2 # 减法
2.3
>>> 3 * 7  # 乘法
21
>>> 2 / 4  # 除法,得到一个浮点数
0.5
>>> 2 // 4 # 除法,得到一个整数
0
>>> 17 % 3 # 取余
2
>>> 2 ** 5 # 乘方
32

List(列表)

  • List(列表) 是 Python 中使用最频繁的数据类型。

  • 列表可以完成大多数集合类的数据结构实现。列表中元素的类型可以不相同,它支持数字,字符串甚至可以包含列表(所谓嵌套)

  • 列表是写在方括号 [] 之间、用逗号分隔开的元素列表。

  • 和字符串一样,列表同样可以被索引和截取,列表被截取后返回一个包含所需元素的新列表

  • 列表截取的语法格式如下:

    • 变量[头下标:尾下标]
  • 注意:

    1. List写在方括号之间,元素用逗号隔开。
    2. 和字符串一样,list可以被索引和切片。
    3. List可以使用+操作符进行拼接。
    4. List中的元素是可以改变的。

Tuple(元组)

  • 元组(tuple)与列表类似,不同之处在于元组的元素不能修改。元组写在小括号 () 里,元素之间用逗号隔开

  • 元组中的元素类型也可以不相同:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #!/usr/bin/python3

    tuple = ( 'abcd', 786 , 2.23, 'runoob', 70.2  )
    tinytuple = (123, 'runoob')

    print (tuple)             # 输出完整元组
    print (tuple[0])          # 输出元组的第一个元素
    print (tuple[1:3])        # 输出从第二个元素开始到第三个元素
    print (tuple[2:])         # 输出从第三个元素开始的所有元素
    print (tinytuple * 2)     # 输出两次元组
    print (tuple + tinytuple) # 连接元组
  • 注意:

    1. 与字符串一样,元组的元素不能修改。
    2. 元组也可以被索引和切片,方法一样。
    3. 注意构造包含 0 或 1 个元素的元组的特殊语法规则。
    4. 元组也可以使用+操作符进行拼接。

Set(集合)

  • Python 中的集合(Set)是一种无序、可变的数据类型,用于存储唯一的元素。
  • 集合中的元素不会重复,并且可以进行交集、并集、差集等常见的集合操作
  • 在 Python 中,集合使用大括号 {} 表示,元素之间用逗号 , 分隔
  • 另外,也可以使用 set() 函数创建集合
  • 注意:创建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典。
  • 创建格式:
    1
    2
    3
    parame = {value01,value02,...}
    或者
    set(value)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#!/usr/bin/python3

sites = {'Google', 'Taobao', 'Runoob', 'Facebook', 'Zhihu', 'Baidu'}

print(sites)   # 输出集合,重复的元素被自动去掉

# 成员测试
if 'Runoob' in sites :
    print('Runoob 在集合中')
else :
    print('Runoob 不在集合中')


# set可以进行集合运算
a = set('abracadabra')
b = set('alacazam')

print(a)

print(a - b)     # a 和 b 的差集

print(a | b)     # a 和 b 的并集

print(a & b)     # a 和 b 的交集

print(a ^ b)     # a 和 b 中不同时存在的元素

Dictionary(字典)

  • 字典(dictionary)是Python中另一个非常有用的内置数据类型
  • 列表是有序的对象集合,字典是无序的对象集合。两者之间的区别在于:字典当中的元素是通过键来存取的,而不是通过偏移存取。
  • 字典是一种映射类型,字典用 { } 标识,它是一个无序的 键(key) : 值(value) 的集合
  • 键(key)必须使用不可变类型。
  • 在同一个字典中,键(key)必须是唯一的
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/usr/bin/python3

dict = {}
dict['one'] = "1 - 菜鸟教程"
dict[2]     = "2 - 菜鸟工具"

tinydict = {'name': 'runoob','code':1, 'site': 'www.runoob.com'}


print (dict['one'])       # 输出键为 'one' 的值
print (dict[2])           # 输出键为 2 的值
print (tinydict)          # 输出完整的字典
print (tinydict.keys())   # 输出所有键
print (tinydict.values()) # 输出所有值
  • 构造函数 dict() 可以直接从键值对序列中构建字典如下:

    1
    2
    3
    4
    5
    6
    >>> dict([('Runoob', 1), ('Google', 2), ('Taobao', 3)])
    {'Runoob': 1, 'Google': 2, 'Taobao': 3}
    >>> {x: x**2 for x in (2, 4, 6)}
    {2: 4, 4: 16, 6: 36}
    >>> dict(Runoob=1, Google=2, Taobao=3)
    {'Runoob': 1, 'Google': 2, 'Taobao': 3}
  • 字典类型也有一些内置的函数,例如 clear()、keys()、values() 等。

  • 注意:

    1. 字典是一种映射类型,它的元素是键值对。
    2. 字典的关键字必须为不可变类型,且不能重复。
    3. 创建空字典使用 { }

bytes类型

  • 在 Python3 中,bytes 类型表示的是不可变的二进制序列(byte sequence)。

  • 与字符串类型不同的是,bytes 类型中的元素是整数值(0 到 255 之间的整数),而不是 Unicode 字符。

  • bytes 类型通常用于处理二进制数据,比如图像文件、音频文件、视频文件等等。在网络编程中,也经常使用 bytes 类型来传输二进制数据。

  • 创建 bytes 对象的方式有多种,最常见的方式是使用 b 前缀:

  • 此外,也可以使用 bytes() 函数将其他类型的对象转换为 bytes 类型。bytes() 函数的第一个参数是要转换的对象,第二个参数是编码方式,如果省略第二个参数,则默认使用 UTF-8 编码:

    1
    x = bytes("hello", encoding="utf-8")
  • 与字符串类型类似,bytes 类型也支持许多操作和方法,如切片、拼接、查找、替换等等。同时,由于 bytes 类型是不可变的,因此在进行修改操作时需要创建一个新的 bytes 对象。例如:

    1
    2
    3
    x = b"hello"
    y = x[1:3]  # 切片操作,得到 b"el"
    z = x + b"world"  # 拼接操作,得到 b"helloworld"

逻辑运算符

  • Python语言支持逻辑运算符,以下假设变量 a 为 10, b为 20:

  • and : x and y

    • 布尔”与” - 如果 x 为 False,x and y 返回 x 的值,否则返回 y 的计算值。
    • (a and b) 返回 20。
  • or : x or y

    • 布尔”或” - 如果 x 是 True,它返回 x 的值,否则它返回 y 的计算值。
    • (a or b) 返回 10。
  • not : not x

    • 布尔”非” - 如果 x 为 True,返回 False 。如果 x 为 False,它返回 True。
    • not(a and b) 返回 False

成员运算符

  • 除了以上的一些运算符之外,Python还支持成员运算符,测试实例中包含了一系列的成员,包括字符串,列表或元组

  • in

    • 如果在指定的序列中找到值返回 True,否则返回 False。
    • x 在 y 序列中 , 如果 x 在 y 序列中返回 True。
  • not in

    • 如果在指定的序列中没有找到值返回 True,否则返回 False。
    • x 不在 y 序列中 , 如果 x 不在 y 序列中返回 True。

身份运算符

  • 身份运算符用于比较两个对象的存储单元

  • is

    • is 是判断两个标识符是不是引用自一个对象
    • x is y, 类似 id(x) == id(y) , 如果引用的是同一个对象则返回 True,否则返回 False
  • is not

    • is not 是判断两个标识符是不是引用自不同对象
    • x is not y , 类似 id(x) != id(y)。如果引用的不是同一个对象则返回结果 True,否则返回 False。

if语句

  • Python中if语句的一般形式如下所示:

    1
    2
    3
    4
    5
    6
    if condition_1:
    statement_block_1
    elif condition_2:
    statement_block_2
    else:
    statement_block_3
  • Python 中用 elif 代替了 else if,所以if语句的关键字为:if – elif – else。

  • 注意:

    1. 每个条件后面要使用冒号 :,表示接下来是满足条件后要执行的语句块。
    2. 使用缩进来划分语句块,相同缩进数的语句在一起组成一个语句块。
    3. 在 Python 中没有 switch…case 语句,但在 Python3.10 版本添加了 match…case,功能也类似

match…case

  • Python 3.10 增加了 match…case 的条件判断,不需要再使用一连串的 if-else 来判断了

  • match 后的对象会依次与 case 后的内容进行匹配,如果匹配成功,则执行匹配到的表达式,否则直接跳过,_ 可以匹配一切。

  • 语法格式如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    match subject:
    case <pattern_1>:
    <action_1>
    case <pattern_2>:
    <action_2>
    case <pattern_3>:
    <action_3>
    case _:
    <action_wildcard>
  • case _: 类似于 C 和 Java 中的 default:,当其他 case 都无法匹配时,匹配这条,保证永远会匹配成功。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    def http_error(status):
        match status:
            case 400:
                return "Bad request"
            case 404:
                return "Not found"
            case 418:
                return "I'm a teapot"
            case _:
                return "Something's wrong with the internet"

    mystatus=400
    print(http_error(400))

while循环

  • Python 中 while 语句的一般形式:

    1
    2
    while 判断条件(condition):
    执行语句(statements)……
  • 同样需要注意冒号和缩进。另外,在 Python 中没有 do..while 循环。

  • 以下实例使用了 while 来计算 1 到 100 的总和:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #!/usr/bin/env python3

    n = 100

    sum = 0
    counter = 1
    while counter <= n:
    sum = sum + counter
    counter += 1

    print("1 到 %d 之和为: %d" % (n,sum))
  • 无限循环

    • 我们可以通过设置条件表达式永远不为 false 来实现无限循环,实例如下:
      1
      2
      3
      4
      5
      6
      7
      8
      #!/usr/bin/python3

      var = 1
      while var == 1 : # 表达式永远为 true
      num = int(input("输入一个数字 :"))
      print ("你输入的数字是: ", num)

      print ("Good bye!")
  • while 循环使用 else 语句

    • 如果 while 后面的条件语句为 false 时,则执行 else 的语句块。
    • 语法格式如下:
      1
      2
      3
      4
      while <expr>:
      <statement(s)>
      else:
      <additional_statement(s)>
  • expr 条件语句为 true 则执行 statement(s) 语句块,如果为 false,则执行 additional_statement(s)。

for 语句

  • Python for 循环可以遍历任何可迭代对象,如一个列表或者一个字符串

  • for循环的一般格式如下:

    1
    2
    3
    4
    for <variable> in <sequence>:
    <statements>
    else:
    <statements>
  • 在 Python 中,for…else 语句用于在循环结束后执行一段代码。

    1
    2
    3
    4
    for item in iterable:
    # 循环主体
    else:
    # 循环结束后执行的代码
  • 当循环执行完毕(即遍历完 iterable 中的所有元素)后,会执行 else 子句中的代码,如果在循环过程中遇到了 break 语句,则会中断循环,此时不会执行 else 子句。

range()函数

  • 如果你需要遍历数字序列,可以使用内置 range() 函数。它会生成数列

break 和 continue 语句及循环中的 else 子句

  • break 语句可以跳出 for 和 while 的循环体。如果你从 for 或 while 循环中终止,任何对应的循环 else 块将不执行。
  • continue 语句被用来告诉 Python 跳过当前循环块中的剩余语句,然后继续进行下一轮循环。

pass 语句

  • Python pass是空语句,是为了保持程序结构的完整性。
  • pass 不做任何事情,一般用做占位语句,如下实例
    1
    2
    >>>while True:
    ... pass # 等待键盘中断 (Ctrl+C)

end 关键字

  • 关键字end可以用于将结果输出到同一行,或者在输出的末尾添加不同的字符,实例如下:
    1
    2
    3
    4
    5
    6
    7
    8
    #!/usr/bin/python3

    # Fibonacci series: 斐波纳契数列
    # 两个元素的总和确定了下一个数
    a, b = 0, 1
    while b < 1000:
    print(b, end=',')
    a, b = b, a+b

推导式

  • Python 推导式是一种独特的数据处理方式,可以从一个数据序列构建另一个新的数据序列的结构体。
  • Python 支持各种数据结构的推导式:
    • 列表(list)推导式
    • 字典(dict)推导式
    • 集合(set)推导式
    • 元组(tuple)推导式

列表推导式

  • 列表推导式格式为:

    1
    2
    3
    4
    5
    6
    7
    [表达式 for 变量 in 列表] 
    [out_exp_res for out_exp in input_list]

    或者

    [表达式 for 变量 in 列表 if 条件]
    [out_exp_res for out_exp in input_list if condition]
  • out_exp_res:列表生成元素表达式,可以是有返回值的函数。

  • for out_exp in input_list:迭代 input_list 将 out_exp 传入到 out_exp_res 表达式中。

  • if condition:条件语句,可以过滤列表中不符合条件的值。

字典推导式

  • 字典推导基本格式:
    1
    2
    3
    4
    5
    { key_expr: value_expr for value in collection }



    { key_expr: value_expr for value in collection if condition }

集合推导式

  • 集合推导式基本格式:
    1
    2
    3
    { expression for item in Sequence }

    { expression for item in Sequence if conditional }

元组推导式(生成器表达式)

  • 元组推导式可以利用 range 区间、元组、列表、字典和集合等数据类型,快速生成一个满足指定需求的元组

  • 元组推导式基本格式:

    1
    2
    3
    (expression for item in Sequence )

    (expression for item in Sequence if conditional )
  • 元组推导式和列表推导式的用法也完全相同,只是元组推导式是用 () 圆括号将各部分括起来,而列表推导式用的是中括号 [],另外元组推导式返回的结果是一个生成器对象

迭代器与生成器

迭代器

  • 迭代是 Python 最强大的功能之一,是访问集合元素的一种方式。
  • 迭代器是一个可以记住遍历的位置的对象。
  • 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
  • 迭代器有两个基本的方法:iter() 和 next()。

生成器

  • 在 Python 中,使用了 yield 的函数被称为生成器(generator)。
  • yield 是一个关键字,用于定义生成器函数,生成器函数是一种特殊的函数,可以在迭代过程中逐步产生值,而不是一次性返回所有结果。
  • 跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。
  • 当在生成器函数中使用 yield 语句时,函数的执行将会暂停,并将 yield 后面的表达式作为当前迭代的值返回。
  • 然后,每次调用生成器的 next() 方法或使用 for 循环进行迭代时,函数会从上次暂停的地方继续执行,直到再次遇到 yield 语句。这样,生成器函数可以逐步产生值,而不需要一次性计算并返回所有结果。
  • 调用一个生成器函数,返回的是一个迭代器对象

函数

  • 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。

  • 函数能提高应用的模块性,和代码的重复利用率。你已经知道Python提供了许多内建函数,比如print()。但你也可以自己创建函数,这被叫做用户自定义函数

  • 你可以定义一个由自己想要功能的函数,以下是简单的规则:

    • 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 ()。
    • 任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数。
    • 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
    • 函数内容以冒号 : 起始,并且缩进。
    • return [表达式] 结束函数,选择性地返回一个值给调用方,不带表达式的 return 相当于返回 None。
  • Python 定义函数使用 def 关键字,一般格式如下:

    1
    2
    def 函数名(参数列表):
    函数体
  • 定义一个函数:给了函数一个名称,指定了函数里包含的参数,和代码块结构。

  • 这个函数的基本结构完成以后,你可以通过另一个函数调用执行,也可以直接从 Python 命令提示符执行

参数传递

  • 在 python 中,类型属于对象,对象有不同类型的区分,变量是没有类型的:
    1
    2
    3
    a=[1,2,3]

    a="Runoob"
  • 以上代码中,[1,2,3] 是 List 类型,”Runoob” 是 String 类型,而变量 a 是没有类型,她仅仅是一个对象的引用(一个指针),可以是指向 List 类型对象,也可以是指向 String 类型对象

可更改(mutable)与不可更改(immutable)对象

  • 不可变类型:变量赋值 a=5 后再赋值 a=10,这里实际是新生成一个 int 值对象 10,再让 a 指向它,而 5 被丢弃,不是改变 a 的值,相当于新生成了 a。

  • 可变类型:变量赋值 la=[1,2,3,4] 后再赋值 la[2]=5 则是将 list la 的第三个元素值更改,本身la没有动,只是其内部的一部分值被修改了。

  • python 函数的参数传递:

    • 不可变类型:类似 C++ 的值传递,如整数、字符串、元组。如 fun(a),传递的只是 a 的值,没有影响 a 对象本身。如果在 fun(a) 内部修改 a 的值,则是新生成一个 a 的对象。
    • 可变类型:类似 C++ 的引用传递,如 列表,字典。如 fun(la),则是将 la 真正的传过去,修改后 fun 外部的 la 也会受影响
  • python 中一切都是对象,严格意义我们不能说值传递还是引用传递,我们应该说传不可变对象和传可变对象

参数

  • 以下是调用函数时可使用的正式参数类型:
    • 必需参数
    • 关键字参数
    • 默认参数
    • 不定长参数

必需参数

  • 必需参数须以正确的顺序传入函数。调用时的数量必须和声明时的一样。
  • 调用 printme() 函数,你必须传入一个参数,不然会出现语法错误:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #!/usr/bin/python3

    #可写函数说明
    def printme( str ):
    "打印任何传入的字符串"
    print (str)
    return

    # 调用 printme 函数,不加参数会报错
    printme()

关键字参数

  • 关键字参数和函数调用关系紧密,函数调用使用关键字参数来确定传入的参数值。
  • 使用关键字参数允许函数调用时参数的顺序与声明时不一致,因为 Python 解释器能够用参数名匹配参数值。
  • 以下实例在函数 printme() 调用时使用参数名:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #!/usr/bin/python3

    #可写函数说明
    def printme( str ):
    "打印任何传入的字符串"
    print (str)
    return

    #调用printme函数
    printme( str = "菜鸟教程")

默认参数

  • 调用函数时,如果没有传递参数,则会使用默认参数。以下实例中如果没有传入 age 参数,则使用默认值:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #!/usr/bin/python3

    #可写函数说明
    def printinfo( name, age = 35 ):
    "打印任何传入的字符串"
    print ("名字: ", name)
    print ("年龄: ", age)
    return

    #调用printinfo函数
    printinfo( age=50, name="runoob" )
    print ("------------------------")
    printinfo( name="runoob" )

不定长参数

  • 你可能需要一个函数能处理比当初声明时更多的参数。这些参数叫做不定长参数,和上述 2 种参数不同,声明时不会命名。基本语法如下:

    1
    2
    3
    4
    def functionname([formal_args,] *var_args_tuple ):
    "函数_文档字符串"
    function_suite
    return [expression]
  • 加了星号 * 的参数会以元组(tuple)的形式导入,存放所有未命名的变量参数。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #!/usr/bin/python3

    # 可写函数说明
    def printinfo( arg1, *vartuple ):
    "打印任何传入的参数"
    print ("输出: ")
    print (arg1)
    print (vartuple)

    # 调用printinfo 函数
    printinfo( 70, 60, 50 )

匿名函数

  • Python 使用 lambda 来创建匿名函数。
  • 所谓匿名,意即不再使用 def 语句这样标准的形式定义一个函数。
    • lambda 只是一个表达式,函数体比 def 简单很多。
    • lambda 的主体是一个表达式,而不是一个代码块。仅仅能在 lambda 表达式中封装有限的逻辑进去。
    • lambda 函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数。
    • 虽然 lambda 函数看起来只能写一行,却不等同于 C 或 C++ 的内联函数,内联函数的目的是调用小函数时不占用栈内存从而减少函数调用的开销,提高代码的执行速度。

语法

  • lambda 函数的语法只包含一个语句,如下:

    1
    lambda [arg1 [,arg2,.....argn]]:expression
  • 设置参数 a 加上 10:

    1
    2
    x = lambda a : a + 10
    print(x(5))
  • 我们可以将匿名函数封装在一个函数内,这样可以使用同样的代码来创建多个匿名函数。

  • 以下实例将匿名函数封装在 myfunc 函数中,通过传入不同的参数来创建不同的匿名函数:

    1
    2
    3
    4
    5
    6
    7
    8
    def myfunc(n):
    return lambda a : a * n

    mydoubler = myfunc(2)
    mytripler = myfunc(3)

    print(mydoubler(11))
    print(mytripler(11))

return 语句

  • return [表达式] 语句用于退出函数,选择性地向调用方返回一个表达式。不带参数值的 return 语句返回 None。之前的例子都没有示范如何返回数值,以下实例演示了 return 语句的用法:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #!/usr/bin/python3

    # 可写函数说明
    def sum( arg1, arg2 ):
    # 返回2个参数的和."
    total = arg1 + arg2
    print ("函数内 : ", total)
    return total

    # 调用sum函数
    total = sum( 10, 20 )
    print ("函数外 : ", total)

强制位置参数

  • Python3.8 新增了一个函数形参语法 / 用来指明函数形参必须使用指定位置参数,不能使用关键字参数的形式。

  • 在以下的例子中,形参 a 和 b 必须使用指定位置参数,c 或 d 可以是位置形参或关键字形参,而 e 和 f 要求为关键字形参:

    1
    2
    def f(a, b, /, c, d, *, e, f):
    print(a, b, c, d, e, f)
  • 以下使用方法是正确的:

    1
    f(10, 20, 30, d=40, e=50, f=60)
  • 以下使用方法会发生错误:

    1
    2
    f(10, b=20, c=30, d=40, e=50, f=60)   # b 不能使用关键字参数的形式
    f(10, 20, 30, 40, 50, f=60) # e 必须使用关键字参数的形式

模块

  • 在前面的几个章节中我们基本上是用 python 解释器来编程,如果你从 Python 解释器退出再进入,那么你定义的所有的方法和变量就都消失了。
  • 为此 Python 提供了一个办法,把这些定义存放在文件中,为一些脚本或者交互式的解释器实例使用,这个文件被称为模块。
  • 模块是一个包含所有你定义的函数和变量的文件,其后缀名是.py。模块可以被别的程序引入,以使用该模块中的函数等功能。这也是使用 python 标准库的方法。

import 语句

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

    1
    import module1[, module2[,... moduleN]
  • 当解释器遇到 import 语句,如果模块在当前的搜索路径就会被导入。

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

    1
    2
    3
    4
    5
    6
    #!/usr/bin/python3
    # Filename: support.py

    def print_func( par ):
    print ("Hello : ", par)
    return

from … import 语句

  • Python 的 from 语句让你从模块中导入一个指定的部分到当前命名空间中,语法如下:
    1
    from modname import name1[, name2[, ... nameN]]

from … import * 语句

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

name 属性

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

    1
    2
    3
    4
    5
    6
    7
    #!/usr/bin/python3
    # Filename: using_name.py

    if __name__ == '__main__':
    print('程序自身在运行')
    else:
    print('我来自另一模块')
  • 每个模块都有一个__name__属性,当其值是’main‘时,表明该模块自身在运行,否则是被引入。

  • namemain 底下是双下划线, _ _ 是这样去掉中间的那个空格。

dir() 函数

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    >>> 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() 函数会罗列出当前定义的所有名称:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    >>> 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 库参考文档中将会介绍到(就是后面的”库参考文档”)。
  • 有些模块直接被构建在解析器里,这些虽然不是一些语言内置的功能,但是他却能很高效的使用,甚至是系统级调用也没问题。
  • 这些组件会根据不同的操作系统进行不同形式的配置,比如 winreg 这个模块就只会提供给 Windows 系统。
  • 应该注意到这有一个特别的模块 sys ,它内置在每一个 Python 解析器中。变量 sys.ps1 和 sys.ps2 定义了主提示符和副提示符所对应的字符串:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    >>> 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,),所以你需要有一组不断增加的模块,用来在不同的格式之间转换。

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

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    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__变量赋值。

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

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

    1
    sound.effects.echo.echofilter(input, output, delay=0.7, atten=4)
  • 还有一种导入子模块的方法是:

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

    1
    echo.echofilter(input, output, delay=0.7, atten=4)
  • 还有一种变化就是直接导入一个函数或者变量:

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

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

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

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

输入输出

输出格式美化

  • Python两种输出值的方式: 表达式语句和 print() 函数。
  • 第三种方式是使用文件对象的 write() 方法,标准输出文件可以用 sys.stdout 引用。
  • 如果你希望输出的形式更加多样,可以使用 str.format() 函数来格式化输出值。
  • 如果你希望将输出的值转成字符串,可以使用 repr() 或 str() 函数来实现。
    • str(): 函数返回一个用户易读的表达形式。
    • repr(): 产生一个解释器易读的表达形式。

旧式字符串格式化

  • % 操作符也可以实现字符串格式化。 它将左边的参数作为类似 sprintf() 式的格式化字符串, 而将右边的代入, 然后返回格式化后的字符串. 例如:

    1
    2
    3
    >>> import math
    >>> print('常量 PI 的值近似为:%5.3f。' % math.pi)
    常量 PI 的值近似为:3.142
  • 因为 str.format() 是比较新的函数, 大多数的 Python 代码仍然使用 % 操作符。但是因为这种旧式的格式化最终会从该语言中移除, 应该更多的使用 str.format().

读取键盘输入

  • Python 提供了 input() 内置函数从标准输入读入一行文本,默认的标准输入是键盘。
    1
    2
    3
    4
    #!/usr/bin/python3

    str = input("请输入:")
    print ("你输入的内容是: ", str)

读和写文件

  • open() 将会返回一个 file 对象,基本语法格式如下:

    1
    open(filename, mode)
    • filename:包含了你要访问的文件名称的字符串值。
    • mode:决定了打开文件的模式:只读,写入,追加等。所有可取值见如下的完全列表。这个参数是非强制的,默认文件访问模式为只读(r)。
  • 以下实例将字符串写入到文件 foo.txt 中:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    #!/usr/bin/python3

    # 打开一个文件
    f = open("/tmp/foo.txt", "w")

    f.write( "Python 是一个非常好的语言。\n是的,的确非常好!!\n" )

    # 关闭打开的文件
    f.close()
    • 第一个参数为要打开的文件名。
    • 第二个参数描述文件如何使用的字符。 mode 可以是 ‘r’ 如果文件只读, ‘w’ 只用于写 (如果存在同名文件则将被删除), 和 ‘a’ 用于追加文件内容; 所写的任何数据都会被自动增加到末尾. ‘r+’ 同时用于读写。 mode 参数是可选的; ‘r’ 将是默认值。

文件对象的方法

  • 本节中剩下的例子假设已经创建了一个称为 f 的文件对象。

  • f.read()

  • 为了读取一个文件的内容,调用 f.read(size), 这将读取一定数目的数据, 然后作为字符串或字节对象返回。

  • size 是一个可选的数字类型的参数。 当 size 被忽略了或者为负, 那么该文件的所有内容都将被读取并且返回。

  • 以下实例假定文件 foo.txt 已存在(上面实例中已创建):

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #!/usr/bin/python3

    # 打开一个文件
    f = open("/tmp/foo.txt", "r")

    str = f.read()
    print(str)

    # 关闭打开的文件
    f.close()
  • f.readline()

  • f.readline() 会从文件中读取单独的一行。换行符为 ‘\n’。f.readline() 如果返回一个空字符串, 说明已经已经读取到最后一行。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #!/usr/bin/python3

    # 打开一个文件
    f = open("/tmp/foo.txt", "r")

    str = f.readline()
    print(str)

    # 关闭打开的文件
    f.close()
  • f.readlines()

  • f.readlines() 将返回该文件中包含的所有行。

  • 如果设置可选参数 sizehint, 则读取指定长度的字节, 并且将这些字节按行分割。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #!/usr/bin/python3

    # 打开一个文件
    f = open("/tmp/foo.txt", "r")

    str = f.readlines()
    print(str)

    # 关闭打开的文件
    f.close()
  • f.write()

  • f.write(string) 将 string 写入到文件中, 然后返回写入的字符数。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    #!/usr/bin/python3

    # 打开一个文件
    f = open("/tmp/foo.txt", "w")

    num = f.write( "Python 是一个非常好的语言。\n是的,的确非常好!!\n" )
    print(num)
    # 关闭打开的文件
    f.close()
  • f.tell()

  • f.tell() 返回文件对象当前所处的位置, 它是从文件开头开始算起的字节数。

  • f.seek()

  • 如果要改变文件指针当前的位置, 可以使用 f.seek(offset, from_what) 函数。

  • from_what 的值, 如果是 0 表示开头, 如果是 1 表示当前位置, 2 表示文件的结尾,例如:

    • seek(x,0) : 从起始位置即文件首行首字符开始移动 x 个字符
    • seek(x,1) : 表示从当前位置往后移动x个字符
    • seek(-x,2):表示从文件的结尾往前移动x个字符
  • from_what 值为默认为0,即文件开头。下面给出一个完整的例子:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    >>> f = open('/tmp/foo.txt', 'rb+')
    >>> f.write(b'0123456789abcdef')
    16
    >>> f.seek(5)     # 移动到文件的第六个字节
    5
    >>> f.read(1)
    b'5'
    >>> f.seek(-3, 2) # 移动到文件的倒数第三字节
    13
    >>> f.read(1)
    b'd'
  • f.close()

  • 在文本文件中 (那些打开文件的模式下没有 b 的), 只会相对于文件起始位置进行定位。

  • 当你处理完一个文件后, 调用 f.close() 来关闭文件并释放系统的资源,如果尝试再调用该文件,则会抛出异常。

    1
    2
    3
    4
    5
    >>> f.close()
    >>> f.read()
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
    ValueError: I/O operation on closed file
  • 当处理一个文件对象时, 使用 with 关键字是非常好的方式。在结束后, 它会帮你正确的关闭文件。 而且写起来也比 try - finally 语句块要简短:

    1
    2
    3
    4
    >>> with open('/tmp/foo.txt', 'r') as f:
    ...     read_data = f.read()
    >>> f.closed
    True

pickle 模块

  • python的pickle模块实现了基本的数据序列和反序列化。

  • 通过pickle模块的序列化操作我们能够将程序中运行的对象信息保存到文件中去,永久存储。

  • 通过pickle模块的反序列化操作,我们能够从文件中创建上一次程序保存的对象。

  • 基本接口:

    1
    pickle.dump(obj, file, [,protocol])

python3 OS 文件/目录 方法

  • os 模块提供了非常丰富的方法用来处理文件和目录。常用的方法如下表所示:
    序号 方法及描述
    1
    os.access(path, mode)

检验权限模式
2
os.chdir(path)

改变当前工作目录
3
os.chflags(path, flags)

设置路径的标记为数字标记。
4
os.chmod(path, mode)

更改权限
5
os.chown(path, uid, gid)

更改文件所有者
6
os.chroot(path)

改变当前进程的根目录
7
os.close(fd)

关闭文件描述符 fd
8
os.closerange(fd_low, fd_high)

关闭所有文件描述符,从 fd_low (包含) 到 fd_high (不包含), 错误会忽略
9
os.dup(fd)

复制文件描述符 fd
10
os.dup2(fd, fd2)

将一个文件描述符 fd 复制到另一个 fd2
11
os.fchdir(fd)

通过文件描述符改变当前工作目录
12
os.fchmod(fd, mode)

改变一个文件的访问权限,该文件由参数fd指定,参数mode是Unix下的文件访问权限。
13
os.fchown(fd, uid, gid)

修改一个文件的所有权,这个函数修改一个文件的用户ID和用户组ID,该文件由文件描述符fd指定。
14
os.fdatasync(fd)

强制将文件写入磁盘,该文件由文件描述符fd指定,但是不强制更新文件的状态信息。
15
os.fdopen(fd[, mode[, bufsize]])

通过文件描述符 fd 创建一个文件对象,并返回这个文件对象
16
os.fpathconf(fd, name)

返回一个打开的文件的系统配置信息。name为检索的系统配置的值,它也许是一个定义系统值的字符串,这些名字在很多标准中指定(POSIX.1, Unix 95, Unix 98, 和其它)。
17
os.fstat(fd)

返回文件描述符fd的状态,像stat()。
18
os.fstatvfs(fd)

返回包含文件描述符fd的文件的文件系统的信息,Python 3.3 相等于 statvfs()。
19
os.fsync(fd)

强制将文件描述符为fd的文件写入硬盘。
20
os.ftruncate(fd, length)

裁剪文件描述符fd对应的文件, 所以它最大不能超过文件大小。
21
os.getcwd()

返回当前工作目录
22
os.getcwdb()

返回一个当前工作目录的Unicode对象
23
os.isatty(fd)

如果文件描述符fd是打开的,同时与tty(-like)设备相连,则返回true, 否则False。
24
os.lchflags(path, flags)

设置路径的标记为数字标记,类似 chflags(),但是没有软链接
25
os.lchmod(path, mode)

修改连接文件权限
26
os.lchown(path, uid, gid)

更改文件所有者,类似 chown,但是不追踪链接。
27
os.link(src, dst)

创建硬链接,名为参数 dst,指向参数 src
28
os.listdir(path)

返回path指定的文件夹包含的文件或文件夹的名字的列表。
29
os.lseek(fd, pos, how)

设置文件描述符 fd当前位置为pos, how方式修改: SEEK_SET 或者 0 设置从文件开始的计算的pos; SEEK_CUR或者 1 则从当前位置计算; os.SEEK_END或者2则从文件尾部开始. 在unix,Windows中有效
30
os.lstat(path)

像stat(),但是没有软链接
31
os.major(device)

从原始的设备号中提取设备major号码 (使用stat中的st_dev或者st_rdev field)。
32
os.makedev(major, minor)

以major和minor设备号组成一个原始设备号
33
os.makedirs(path[, mode])

递归文件夹创建函数。像mkdir(), 但创建的所有intermediate-level文件夹需要包含子文件夹。
34
os.minor(device)

从原始的设备号中提取设备minor号码 (使用stat中的st_dev或者st_rdev field )。
35
os.mkdir(path[, mode])

以数字mode的mode创建一个名为path的文件夹.默认的 mode 是 0777 (八进制)。
36
os.mkfifo(path[, mode])

创建命名管道,mode 为数字,默认为 0666 (八进制)
37
os.mknod(filename[, mode=0600, device])
创建一个名为filename文件系统节点(文件,设备特别文件或者命名pipe)。

38
os.open(file, flags[, mode])

打开一个文件,并且设置需要的打开选项,mode参数是可选的
39
os.openpty()

打开一个新的伪终端对。返回 pty 和 tty的文件描述符。
40
os.pathconf(path, name)

返回相关文件的系统配置信息。
41
os.pipe()

创建一个管道. 返回一对文件描述符(r, w) 分别为读和写
42
os.popen(command[, mode[, bufsize]])

从一个 command 打开一个管道
43
os.read(fd, n)

从文件描述符 fd 中读取最多 n 个字节,返回包含读取字节的字符串,文件描述符 fd对应文件已达到结尾, 返回一个空字符串。
44
os.readlink(path)

返回软链接所指向的文件
45
os.remove(path)

删除路径为path的文件。如果path 是一个文件夹,将抛出OSError; 查看下面的rmdir()删除一个 directory。
46
os.removedirs(path)

递归删除目录。
47
os.rename(src, dst)

重命名文件或目录,从 src 到 dst
48
os.renames(old, new)

递归地对目录进行更名,也可以对文件进行更名。
49
os.rmdir(path)

删除path指定的空目录,如果目录非空,则抛出一个OSError异常。
50
os.stat(path)

获取path指定的路径的信息,功能等同于C API中的stat()系统调用。
51
os.stat_float_times([newvalue])
决定stat_result是否以float对象显示时间戳

52
os.statvfs(path)

获取指定路径的文件系统统计信息
53
os.symlink(src, dst)

创建一个软链接
54
os.tcgetpgrp(fd)

返回与终端fd(一个由os.open()返回的打开的文件描述符)关联的进程组
55
os.tcsetpgrp(fd, pg)

设置与终端fd(一个由os.open()返回的打开的文件描述符)关联的进程组为pg。
56
os.tempnam([dir[, prefix]])

Python3 中已删除。返回唯一的路径名用于创建临时文件。
57
os.tmpfile()

Python3 中已删除。返回一个打开的模式为(w+b)的文件对象 .这文件对象没有文件夹入口,没有文件描述符,将会自动删除。
58
os.tmpnam()

Python3 中已删除。为创建一个临时文件返回一个唯一的路径
59
os.ttyname(fd)

返回一个字符串,它表示与文件描述符fd 关联的终端设备。如果fd 没有与终端设备关联,则引发一个异常。
60
os.unlink(path)

删除文件路径
61
os.utime(path, times)

返回指定的path文件的访问和修改的时间。
62
os.walk(top[, topdown=True[, onerror=None[, followlinks=False]]])

输出在文件夹中的文件名通过在树中游走,向上或者向下。
63
os.write(fd, str)

写入字符串到文件描述符 fd中. 返回实际写入的字符串长度
64
os.path 模块

获取文件的属性信息。
65
os.pardir()

获取当前目录的父目录,以字符串形式显示目录名。
66
os.replace()

重命名文件或目录。

错误和异常

  • Python 有两种错误很容易辨认:语法错误和异常。
  • Python assert(断言)用于判断一个表达式,在表达式条件为 false 的时候触发异常。

异常

  • 即便 Python 程序的语法是正确的,在运行它的时候,也有可能发生错误。运行期检测到的错误被称为异常。
  • 错误信息的前面部分显示了异常发生的上下文,并以调用栈的形式显示具体信息

异常处理 try/except

  • try 语句按照如下方式工作;

    • 首先,执行 try 子句(在关键字 try 和关键字 except 之间的语句)。
    • 如果没有异常发生,忽略 except 子句,try 子句执行后结束。
    • 如果在执行 try 子句的过程中发生了异常,那么 try 子句余下的部分将被忽略。如果异常的类型和 except 之后的名称相符,那么对应的 except 子句将被执行。
    • 如果一个异常没有与任何的 except 匹配,那么这个异常将会传递给上层的 try 中。
  • 一个 try 语句可能包含多个except子句,分别来处理不同的特定的异常。最多只有一个分支会被执行

  • 处理程序将只针对对应的 try 子句中的异常进行处理,而不是其他的 try 的处理程序中的异常。

  • 一个except子句可以同时处理多个异常,这些异常将被放在一个括号里成为一个元组

try/except…else

  • try/except 语句还有一个可选的 else 子句,如果使用这个子句,那么必须放在所有的 except 子句之后

  • else 子句将在 try 子句没有发生任何异常的时候执行。

try-finally 语句

  • try-finally 语句无论是否发生异常都将执行最后的代码。

抛出异常

  • Python 使用 raise 语句抛出一个指定的异常。

  • raise语法格式如下:

    1
    raise [Exception [, args [, traceback]]]
  • raise 唯一的一个参数指定了要被抛出的异常。它必须是一个异常的实例或者是异常的类(也就是 Exception 的子类)。

  • 如果你只想知道这是否抛出了一个异常,并不想去处理它,那么一个简单的 raise 语句就可以再次把它抛出

用户自定义异常

  • 你可以通过创建一个新的异常类来拥有自己的异常。异常类继承自 Exception 类,可以直接继承,或者间接继承,例如:

定义清理行为

  • try 语句还有另外一个可选的子句,它定义了无论在任何情况下都会执行的清理行为。 例如:

预定义的清理行为

  • 一些对象定义了标准的清理行为,无论系统是否成功的使用了它,一旦不需要它了,那么这个标准的清理行为就会执行

简介

  • python中常用的技巧

python3 获取当前路径

在 Python3 中,可以使用标准库模块 ospathlib 来获取当前路径。以下是两种方式的详细用法:


方法一:使用 os 模块

1. 获取当前工作目录(运行脚本时所在的目录)

1
2
3
4
import os

current_path = os.getcwd()
print("当前工作目录是:", current_path)

2. 获取当前脚本文件所在的目录

1
2
3
4
import os

script_dir = os.path.dirname(os.path.abspath(__file__))
print("当前脚本所在目录是:", script_dir)

方法二:使用 pathlib 模块

pathlib 是从 Python 3.4 开始引入的模块,用于处理文件和路径,功能更强大且代码更简洁。

1. 获取当前工作目录

1
2
3
4
from pathlib import Path

current_path = Path.cwd()
print("当前工作目录是:", current_path)

2. 获取当前脚本文件所在的目录

1
2
3
4
from pathlib import Path

script_dir = Path(__file__).resolve().parent
print("当前脚本所在目录是:", script_dir)

两者的区别

  1. os.getcwd()Path.cwd() 获取的是工作目录(运行脚本时的目录),与脚本文件本身的存储路径无关。
  2. os.path.dirname(os.path.abspath(__file__))Path(__file__).resolve().parent 获取的是脚本文件的实际存储路径。

如果你运行脚本时,工作目录和脚本文件目录不一致,需要特别注意选择合适的方法。

python 执行scp命令

在 Python 中执行 SCP 命令可以使用 paramiko 库,这是一个用于SSH2的Python库,支持SSH会话和文件传输。以下是一个示例,演示如何使用 paramiko 实现在 Python 中执行 SCP 命令:

首先,确保你已经安装了 paramiko 库。如果没有安装,你可以使用 pip 来安装它:

1
pip install paramiko

接下来,以下是一个简单的 Python 示例代码,演示如何使用 paramiko 执行 SCP 命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import paramiko

# 连接 SSH 服务器
ssh = paramiko.SSHClient()
ssh.load_system_host_keys()
ssh.connect('your_server_ip', username='your_username', password='your_password')

# 执行 SCP 命令,将本地文件复制到远程服务器
local_path = '/path/to/local/file.txt'
remote_path = '/path/to/remote/file.txt'

# 使用 SCPClient 实现文件传输
scp = ssh.open_scp()
scp.put(local_path, remote_path) # 本地文件复制到远程服务器
scp.close()

# 关闭 SSH 连接
ssh.close()

上述代码中的 your_server_ip 是远程服务器的 IP 地址,your_username 是用于 SSH 登录的用户名,your_password 是对应的密码。local_path 是本地文件的路径,remote_path 是远程服务器上的目标路径。

这个示例展示了如何使用 paramiko 库创建一个 SSH 连接并使用 SCP 在本地和远程服务器之间传输文件。根据你的实际情况,你可能需要更改相应的路径和凭据信息。

简介

  • base64模块笔记

python3 base64模块 详解

base64 模块是Python标准库中的一个模块,用于处理Base64编码和解码。Base64是一种二进制数据编码方式,通常用于将二进制数据转换为可打印字符,以便在不损失数据的情况下进行传输和存储。以下是关于Python3中base64模块的详细解释:

导入base64模块

首先,您需要导入base64模块,以便在代码中使用它:

1
import base64

Base64编码

base64模块提供了多种方法来执行Base64编码。其中最常用的是b64encode()函数,它将二进制数据编码为Base64字符串。以下是一个示例:

1
2
3
4
5
6
7
8
9
10
# 要编码的二进制数据
binary_data = b'Hello, World!'

# 进行Base64编码
encoded_data = base64.b64encode(binary_data)

# 将编码后的数据转换为字符串
encoded_string = encoded_data.decode('utf-8')

print(encoded_string)

Base64解码

base64模块也提供了多种方法来执行Base64解码。最常用的是b64decode()函数,它将Base64编码的字符串解码为原始的二进制数据。以下是一个示例:

1
2
3
4
5
6
7
8
# Base64编码后的字符串
encoded_string = 'SGVsbG8sIFdvcmxkIQ=='

# 进行Base64解码
decoded_data = base64.b64decode(encoded_string)

# 打印解码后的二进制数据
print(decoded_data)

URL安全的Base64编解码

有时候,Base64编码的字符串需要在URL中传输,但标准的Base64编码字符串中包含一些特殊字符(如+/),这可能会引起问题。为了解决这个问题,base64模块提供了urlsafe_b64encode()urlsafe_b64decode()函数,它们会将+/字符替换为-_,以使编码的字符串在URL中更安全。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 要编码的二进制数据
binary_data = b'Hello, World!'

# 进行URL安全的Base64编码
urlsafe_encoded_data = base64.urlsafe_b64encode(binary_data)

# 将编码后的数据转换为字符串
urlsafe_encoded_string = urlsafe_encoded_data.decode('utf-8')

print(urlsafe_encoded_string)

# 进行URL安全的Base64解码
decoded_data = base64.urlsafe_b64decode(urlsafe_encoded_string)

# 打印解码后的二进制数据
print(decoded_data)

这些是Python3中base64模块的基本用法。请注意,在进行编码和解码操作时,要确保输入的数据类型是字节序列(bytes)。base64模块是处理二进制数据的常见工具之一,特别是在与文件、网络传输和加密相关的应用中。

简介

  • 简介:用于开发移动应用的框架

环境依赖

buildozer

  • pip3 install buildozer

  • apt install -y git zip unzip openjdk-8-jdk python3-pip autoconf libtool pkg-config zlib1g-dev libncurses5-dev libncursesw5-dev libtinfo5 cmake libffi-dev libssl-dev

buildozer init 错误

  • python3.8 -m pip install --upgrade pexpect

简介

  • argparse模块

python3 argparse模块 详解

argparse 是 Python 中的一个用于处理命令行参数的标准模块。它允许您定义命令行工具的参数、选项和子命令,并提供帮助文档生成以及错误处理功能。下面是一个详细的解释 argparse 的主要功能和用法。

创建 ArgumentParser 对象

首先,您需要导入 argparse 模块并创建一个 ArgumentParser 对象,这个对象用于定义和解析命令行参数。

1
2
3
import argparse

parser = argparse.ArgumentParser(description='一个命令行工具示例')

定义命令行参数

通过 add_argument() 方法,您可以定义要接受的命令行参数、选项和标志。

  • 位置参数:通常是必需的参数,它们没有前缀,只需列出参数名称即可。

    1
    parser.add_argument('filename', help='要处理的文件名')
  • 选项参数:选项参数通常以一个或多个前缀字符(通常是 ---)开头。

    1
    parser.add_argument('-f', '--file', help='指定文件名')
  • 标志参数:标志参数通常是布尔类型,表示是否启用某个功能,使用 action='store_true' 参数。

    1
    parser.add_argument('--verbose', action='store_true', help='启用详细日志')
  • 默认值:您可以使用 default 参数来设置参数的默认值。

    1
    parser.add_argument('-n', '--number', type=int, default=1, help='指定一个整数(默认为1)')

解析命令行参数

使用 parse_args() 方法来解析命令行参数,它返回一个包含参数值的命名空间对象。

1
args = parser.parse_args()

访问参数值

访问解析后的参数值,可以通过命名空间对象的属性来获取。例如:

1
2
3
print('文件名:', args.file)
print('整数值:', args.number)
print('详细日志:', args.verbose)

自动生成帮助信息

argparse 会自动生成帮助信息,包括参数的用法、描述和默认值。要输出帮助信息,用户可以在命令行中使用 -h--help 选项。

1
python my_script.py -h

或者在程序内部使用 parser.print_help()

1
parser.print_help()

处理错误

argparse 也能处理一些常见的错误,如无效参数值或参数缺失。如果用户提供了无效的参数值或未提供必需的参数,argparse 会显示错误信息并退出。

这是一个 argparse 的基本用法示例,您可以根据自己的需求定义更多参数、选项和标志,以及编写自定义的处理逻辑。argparse 还提供了其他功能,如子命令支持、互斥参数等,以满足更复杂的命令行解析需求。

简介

  • json模块笔记

python3 json 模块 详解

Python 3中的json模块是用于处理JSON(JavaScript Object Notation)数据的标准库。JSON是一种轻量级数据交换格式,通常用于数据序列化和跨语言数据传输。下面是对Python 3中的json模块的详细解释:

  1. 加载和解析JSON数据

    • json.loads(json_string):将JSON格式的字符串解析为Python数据结构,通常是字典或列表。
    • json.load(file):从文件中读取JSON数据并解析为Python数据结构。
  2. 将Python数据转换为JSON

    • json.dumps(python_data):将Python数据(字典、列表等)转换为JSON格式的字符串。
    • json.dump(python_data, file):将Python数据写入文件,以JSON格式进行序列化。
  3. 格式化输出

    • json.dumps(python_data, indent=4):以缩进格式输出JSON字符串,使其更易读。
    • json.dump(python_data, file, indent=4):以缩进格式将JSON数据写入文件。
  4. 自定义编码和解码

    • json.JSONEncoder:自定义JSON编码器,允许你扩展默认的JSON编码行为。
    • json.JSONDecoder:自定义JSON解码器,允许你处理JSON字符串中的特殊情况。
  5. 处理特殊数据类型

    • json.dumps(..., default=custom_function):允许你在将不支持的数据类型转换为JSON时使用自定义函数。
    • json.loads(..., object_hook=custom_function):允许你在从JSON解析数据时使用自定义函数来处理特殊情况。
  6. 异常处理

    • json.JSONDecodeError:用于捕获JSON解码期间可能发生的异常,如JSON格式不正确等。
  7. 其他选项

    • json.dumps(..., ensure_ascii=False):允许非ASCII字符在JSON字符串中保持原样,而不是进行转义。
    • json.dumps(..., separators=(',', ':')):指定分隔符以节省生成的JSON字符串的空间。

下面是一个示例,展示如何使用json模块加载、解析、生成和格式化JSON数据:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import json

# 创建一个Python字典
data = {
"name": "John",
"age": 30,
"city": "New York"
}

# 将Python字典转换为JSON字符串
json_string = json.dumps(data, indent=4)

# 打印JSON字符串
print(json_string)

# 将JSON字符串解析为Python字典
parsed_data = json.loads(json_string)

# 访问解析后的数据
print(parsed_data["name"]) # 输出 "John"

json模块提供了在Python中处理JSON数据的强大功能,允许你在不同系统之间轻松交换数据,并在Python应用程序中进行数据序列化和反序列化。

简介

  • PIL模块相关笔记

python3 PIL是什么

PIL代表Python Imaging Library,它是Python中用于处理图像的标准库之一。PIL提供了许多功能强大的图像处理工具和函数,使您能够打开、编辑、保存各种图像文件格式(如JPEG、PNG、GIF等),以及执行各种图像操作,如调整大小、裁剪、旋转、滤镜应用等。

虽然PIL在许多Python发行版中都是预安装的,但有时您可能需要手动安装它。在Python 3中,PIL的一个流行的替代品是Pillow库,它是对PIL的增强版本,提供了更多功能和改进。

总之,PIL(或Pillow)是Python中一个强大且灵活的图像处理库,适用于各种图像处理任务,从简单的图像格式转换到复杂的图像编辑操作。

python3 PIL详解

Python Imaging Library(PIL)是一个用于图像处理的Python库,它提供了许多功能强大的工具和函数,用于打开、编辑和保存各种图像文件格式。以下是关于PIL的一些详细解释:

  1. 功能:PIL库提供了许多图像处理功能,包括图像加载、裁剪、缩放、旋转、滤镜应用、颜色转换等。您可以使用PIL来执行各种常见的图像处理任务,以及一些高级的图像操作。

  2. 支持的文件格式:PIL支持各种常见的图像文件格式,如JPEG、PNG、GIF、BMP等,以及一些较少常见的格式。您可以使用PIL来打开这些文件格式的图像,进行处理,并将其保存为其他格式。

  3. 易于使用:PIL提供了简单易用的API,使得对图像进行处理变得容易。您可以通过几行代码来完成许多常见的图像处理任务,而不需要编写复杂的算法。

  4. Pillow库:在Python 3中,Pillow库是对PIL的增强版本,它包含了PIL的所有功能,并提供了一些额外的功能和改进。因此,如果您在Python 3中使用PIL,通常建议使用Pillow库。

  5. 社区支持:PIL/Pillow是一个受欢迎的Python库,拥有活跃的社区支持。您可以在网络上找到大量的文档、教程和示例代码,以帮助您学习和使用PIL进行图像处理。

总之,PIL/Pillow是Python中一个功能强大且易于使用的图像处理库,适用于各种图像处理任务,从简单的图像格式转换到复杂的图像编辑和处理操作。

简介

  • datetime模块笔记

python3 datetime模块 详解

datetime 模块是 Python 标准库中用于处理日期和时间的重要模块。它提供了各种类和函数,允许你在 Python 中执行日期和时间操作。以下是 datetime 模块的一些重要类和函数,以及它们的详细说明:

  1. datetime 类

    datetime 类是 datetime 模块的核心,用于表示日期和时间的对象。它包含年、月、日、时、分、秒和微秒等信息。你可以使用 datetime 类来执行日期和时间的各种操作,例如创建日期时间对象、格式化日期时间、执行算术运算等。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    from datetime import datetime

    # 获取当前日期时间
    now = datetime.now()

    # 创建自定义日期时间对象
    custom_date = datetime(2023, 5, 15, 10, 30)

    # 格式化日期时间为字符串
    formatted_date = now.strftime("%Y-%m-%d %H:%M:%S")

    # 执行日期时间算术操作
    delta = custom_date - now
  2. date 类

    date 类用于表示日期信息,不包括具体时间。它包含年、月和日信息。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    from datetime import date

    # 创建日期对象
    today = date.today()

    # 访问日期的年、月、日
    year = today.year
    month = today.month
    day = today.day
  3. time 类

    time 类用于表示时间信息,不包括日期。它包含时、分、秒和微秒信息。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    from datetime import time

    # 创建时间对象
    current_time = time(14, 30, 0)

    # 访问时间的时、分、秒
    hour = current_time.hour
    minute = current_time.minute
    second = current_time.second
  4. timedelta 类

    timedelta 类用于表示时间间隔,可以用于执行日期时间的算术运算,如加法和减法。

    1
    2
    3
    4
    5
    6
    7
    from datetime import timedelta

    # 创建时间间隔
    delta = timedelta(days=5, hours=2, minutes=30)

    # 执行日期时间的算术运算
    future_date = now + delta
  5. strftime 和 strptime 函数

    strftime 函数用于将日期时间对象格式化为字符串,而 strptime 函数用于将字符串解析为日期时间对象。

    1
    2
    3
    4
    from datetime import datetime

    formatted_date = now.strftime("%Y-%m-%d %H:%M:%S")
    parsed_date = datetime.strptime("2023-05-15 10:30:00", "%Y-%m-%d %H:%M:%S")

这只是 datetime 模块的一部分功能。你可以使用这些类和函数来执行日期和时间相关的各种操作,包括日期时间的比较、格式化、时区处理、日历计算等。这个模块非常强大,适用于各种日期时间处理需求。

简介

  • logging模块笔记

python3 logging模块 输出到文件并且输出到终端

在Python中,使用logging模块可以方便地进行日志记录。要将日志同时输出到文件和终端,你可以配置两个不同的Handler,一个用于文件输出,另一个用于控制台输出。以下是一个示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import logging

# 创建Logger对象
logger = logging.getLogger('my_logger')
logger.setLevel(logging.DEBUG)

# 创建文件处理器,并设置日志级别为DEBUG
file_handler = logging.FileHandler('my_log_file.log')
file_handler.setLevel(logging.DEBUG)

# 创建控制台处理器,并设置日志级别为DEBUG
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.DEBUG)

# 创建日志格式器
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')

# 将格式器添加到处理器
file_handler.setFormatter(formatter)
console_handler.setFormatter(formatter)

# 将处理器添加到Logger对象
logger.addHandler(file_handler)
logger.addHandler(console_handler)

# 记录一些日志信息
logger.debug('This is a debug message')
logger.info('This is an info message')
logger.warning('This is a warning message')
logger.error('This is an error message')
logger.critical('This is a critical message')

在上面的示例中,首先创建了一个Logger对象,然后创建了一个文件处理器(FileHandler)和一个控制台处理器(StreamHandler)。每个处理器都设置了日志级别,并将日志格式器添加到处理器中。最后,将处理器添加到Logger对象中。

在记录日志时,logger.debug(), logger.info(), logger.warning(), logger.error(), 和 logger.critical() 分别对应不同的日志级别。这些消息将根据其级别分别被发送到文件和终端。

请根据实际需求修改文件名、日志级别、日志格式等参数。

python3 logging模块 详解

Python的logging模块是一个用于记录日志信息的标准库工具,它提供了强大的日志记录功能,允许你在应用程序中添加日志记录,以便于调试、监视和故障排除。以下是Python 3中logging模块的详解:

基本日志记录示例

首先,让我们看一个基本的logging模块的使用示例:

1
2
3
4
5
6
7
8
9
10
11
import logging

# 配置日志记录器
logging.basicConfig(filename='app.log', level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')

# 记录日志信息
logging.debug('This is a debug message.')
logging.info('This is an info message.')
logging.warning('This is a warning message.')
logging.error('This is an error message.')
logging.critical('This is a critical message.')

上述代码中,我们首先通过basicConfig函数配置了一个日志记录器。配置中的参数包括:

  • filename:指定日志输出到的文件。
  • level:设置最低的日志级别,只有达到这个级别或更高级别的日志信息才会被记录。
  • format:指定日志记录的格式,可以包含时间、日志级别、消息等信息。

然后,我们使用logging模块的不同函数来记录不同级别的日志信息。日志级别从低到高依次为:DEBUG、INFO、WARNING、ERROR、CRITICAL。

日志处理器(Handlers)

logging模块允许你将日志信息发送到不同的目标,这些目标被称为“处理器(Handlers)”。常见的处理器包括:

  • StreamHandler: 将日志信息输出到控制台(标准输出流)。
  • FileHandler: 将日志信息写入文件。
  • RotatingFileHandler: 类似于FileHandler,但可以在日志文件达到一定大小时自动切分成多个文件。
  • SMTPHandler: 将日志信息通过邮件发送。
  • SocketHandler: 将日志信息发送到网络套接字。
  • SysLogHandler: 将日志信息发送到系统日志。

你可以根据需要选择一个或多个处理器,并将它们添加到日志记录器中,以便将日志信息发送到多个目标。例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import logging

# 创建日志记录器
logger = logging.getLogger('my_logger')

# 配置日志记录器
logger.setLevel(logging.DEBUG)

# 创建处理器并添加到日志记录器
console_handler = logging.StreamHandler()
file_handler = logging.FileHandler('app.log')

# 配置处理器的日志级别和格式
console_handler.setLevel(logging.INFO)
file_handler.setLevel(logging.DEBUG)

formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
console_handler.setFormatter(formatter)
file_handler.setFormatter(formatter)

logger.addHandler(console_handler)
logger.addHandler(file_handler)

# 记录日志信息
logger.debug('This is a debug message.')
logger.info('This is an info message.')

日志过滤器(Filters)

日志过滤器允许你更精细地控制哪些日志记录应该被处理器处理。你可以定义自己的过滤器函数,并将它们添加到处理器或日志记录器中。过滤器函数可以基于日志消息内容、日志级别等条件来决定是否处理某条日志记录。

自定义日志记录器

你可以创建多个不同的日志记录器,每个日志记录器可以有不同的配置、处理器和过滤器,以满足不同模块或组件的日志记录需求。这样可以更好地组织和管理日志信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import logging

# 创建两个不同的日志记录器
logger1 = logging.getLogger('module1_logger')
logger2 = logging.getLogger('module2_logger')

# 配置日志记录器
logger1.setLevel(logging.DEBUG)
logger2.setLevel(logging.INFO)

# 创建处理器并添加到日志记录器
file_handler1 = logging.FileHandler('module1.log')
file_handler2 = logging.FileHandler('module2.log')

logger1.addHandler(file_handler1)
logger2.addHandler(file_handler2)

# 记录日志信息
logger1.debug('This is a debug message from module 1.')
logger2.info('This is an info message from module 2.')

总之,logging模块是Python中强大而灵活的日志记录工具,可以帮助你有效地记录和管理日志信息,以便更好地监视和维护你的应用程序。通过适当地配置处理器、过滤器和日志记录器,你可以满足各种不同的日志记录需求。

简介

  • numpy库相关笔记

python3 numpy库 详解

NumPy(Numerical Python)是Python中用于数值计算的核心库之一。它提供了强大的多维数组对象(例如ndarray)、用于数组操作的基本函数、线性代数运算、傅立叶变换以及随机数生成等功能。以下是NumPy库的一些详解:

  1. 多维数组对象(ndarray):NumPy的核心是多维数组对象(ndarray),它是一个具有固定大小的同类数据项的数组。这意味着在ndarray中的所有元素必须是相同类型的,这使得NumPy非常高效。ndarray可以是一维、二维或更高维度的数组,它可以表示矩阵、张量等数据结构。

  2. 数组操作:NumPy提供了许多用于数组操作的函数,例如索引、切片、形状操作、数组拼接、数组分裂等。这些操作使得在NumPy中进行数组操作变得非常方便。

  3. 数学函数:NumPy包含了许多常用的数学函数,例如三角函数、指数函数、对数函数等。这些函数可以直接应用于ndarray对象,也可以用于逐元素操作。

  4. 线性代数运算:NumPy提供了一组用于执行线性代数运算的函数,例如矩阵乘法、求逆矩阵、求解线性方程组等。这些函数使得在NumPy中进行线性代数计算变得非常方便。

  5. 傅立叶变换:NumPy提供了用于执行傅立叶变换的函数,包括离散傅立叶变换(DFT)和傅立叶逆变换。这些函数对信号处理和频域分析非常有用。

  6. 随机数生成:NumPy包含了用于生成随机数的函数,例如生成服从特定分布的随机数、随机抽样等。这些函数可以用于模拟、蒙特卡罗方法等。

总之,NumPy是Python中用于数值计算的重要库,它提供了丰富的功能和高效的数组操作,使得在Python中进行科学计算变得非常方便和高效。

python3 numpy库 常用技巧

NumPy库提供了许多强大的功能和技巧,使得在处理数值数据时更加高效和便捷。以下是一些常用的NumPy技巧:

  1. 创建数组:使用np.array()函数可以从Python列表或元组创建NumPy数组。另外,NumPy还提供了一些便捷的函数来创建特定类型的数组,如np.zeros()np.ones()np.arange()np.linspace()等。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import numpy as np

# 从Python列表创建数组
arr = np.array([1, 2, 3, 4, 5])

# 创建全零数组
zeros_arr = np.zeros((3, 3))

# 创建全一数组
ones_arr = np.ones((2, 2))

# 创建等间隔数组
range_arr = np.arange(0, 10, 2)

# 创建线性空间数组
lin_space_arr = np.linspace(0, 1, 5)
  1. 数组操作:NumPy提供了许多用于数组操作的函数,如索引、切片、形状操作、数组拼接、数组分裂等。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import numpy as np

arr = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])

# 获取数组形状
shape = arr.shape

# 获取数组维度
dim = arr.ndim

# 获取数组元素类型
dtype = arr.dtype

# 获取数组元素数量
size = arr.size

# 数组切片
slice_arr = arr[0:2, 1:3]

# 数组拼接
concat_arr = np.concatenate((arr, arr), axis=0)

# 数组分裂
split_arr = np.split(arr, 3)
  1. 数学函数:NumPy提供了丰富的数学函数,如三角函数、指数函数、对数函数等。
1
2
3
4
5
6
7
8
9
10
11
12
import numpy as np

arr = np.array([0, np.pi/4, np.pi/2])

# 正弦函数
sin_arr = np.sin(arr)

# 指数函数
exp_arr = np.exp(arr)

# 自然对数函数
log_arr = np.log(arr)
  1. 线性代数运算:NumPy提供了一组用于执行线性代数运算的函数,如矩阵乘法、求逆矩阵、求解线性方程组等。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import numpy as np

A = np.array([[1, 2],
[3, 4]])

B = np.array([[5, 6],
[7, 8]])

# 矩阵乘法
mat_mul = np.dot(A, B)

# 求逆矩阵
inv_mat = np.linalg.inv(A)

# 求解线性方程组
x = np.linalg.solve(A, np.array([1, 2]))

这些只是NumPy库中一些常用的技巧和功能。NumPy还提供了许多其他功能,如统计函数、随机数生成、广播等,可以根据具体需求选择合适的函数和方法。

python3 numpy.transpose() 函数 详解

numpy.transpose() 函数是 NumPy 库中用于对数组进行转置操作的函数。转置操作是将数组的维度重新排列,即将数组的行和列互换位置。

语法

1
numpy.transpose(a, axes=None)
  • a: 输入的数组。
  • axes: 指定转置操作后的维度顺序。如果不指定,则默认将数组的维度逆序。

返回值

返回转置后的数组。

示例

1
2
3
4
5
6
7
import numpy as np

arr = np.array([[1, 2, 3],
[4, 5, 6]])

transposed_arr = np.transpose(arr)
print(transposed_arr)

输出:

1
2
3
[[1 4]
[2 5]
[3 6]]

在这个例子中,原始数组 arr 是一个 2x3 的数组。调用 np.transpose(arr) 后,得到一个 3x2 的数组,即将原数组的行和列互换了位置。

指定轴顺序

1
2
3
4
5
6
7
import numpy as np

arr = np.array([[1, 2, 3],
[4, 5, 6]])

transposed_arr = np.transpose(arr, axes=(1, 0))
print(transposed_arr)

输出:

1
2
3
[[1 4]
[2 5]
[3 6]]

在这个示例中,我们通过 axes=(1, 0) 指定了转置后的轴顺序,结果与未指定时相同。