2024-08-14



import tkinter as tk
from tkinter import messagebox
 
def quit_program():
    if messagebox.askyesno("表白成功!", "你想分享这个喜讯给你的朋友吗?"):
        messagebox.showinfo("分享成功!", "谢谢你的支持!")
        root.destroy()
    else:
        messagebox.showinfo("分享失败!", "谢谢你的支持!")
        root.destroy()
 
def love_button():
    messagebox.showinfo("表白成功!", "我喜欢你,我愿意爱你!")
    quit_program()
 
root = tk.Tk()
root.title("表白按钮")
root.geometry("250x150")+".centerx"+".centery"
 
love_button = tk.Button(root, text="点击表白", command=love_button)
love_button.pack(expand=True)
 
root.protocol("WM_DELETE_WINDOW", quit_program)
 
root.mainloop()

这段代码使用了tkinter库来创建一个简单的表白界面,当用户点击按钮时,会弹出一个消息框显示表白的内容,并且提供一个选项让用户决定是否要分享这个喜讯给他的朋友。如果用户选择不分享,程序也会关闭。如果用户选择分享,会有另一个消息框提示分享成功,然后程序关闭。这个简单的表白程序可以作为一个有趣的小项目来制作和分享给你的朋友们。

2024-08-14



import threading
import time
 
def worker(num, wait_time):
    """
    线程工作函数
    :param num: 线程编号
    :param wait_time: 线程运行时间
    """
    print(f"Thread {num} starting...")
    time.sleep(wait_time)  # 模拟耗时操作
    print(f"Thread {num} finished.")
 
def main():
    """
    主函数,创建并启动线程
    """
    threads = []  # 创建线程列表
    for i in range(3):
        # 创建线程对象,传入目标函数和参数
        t = threading.Thread(target=worker, args=(i, i))
        threads.append(t)  # 将线程添加到列表
        t.start()  # 启动线程
 
    for t in threads:
        t.join()  # 等待所有线程完成
 
if __name__ == "__main__":
    main()

这段代码定义了一个工作函数worker和一个主函数main。主函数创建了三个线程,每个线程调用worker函数并传入不同的参数,然后启动线程。主线程等待所有子线程完成后再退出。这个例子展示了如何使用Python的threading模块来执行并行任务。

2024-08-14

info()是pandas库中DataFrame对象的一个方法,它用于打印有关DataFrame的信息,包括行数、列数、列索引、列数据类型和内存使用情况等。

info()方法的基本语法如下:




DataFrame.info(self, memory_usage='default', null_counts='default', verbose=False, class_name=False, dtype=None, header=True, index=True, justify=None, max_cols=None, max_rows=None, memory_usage_loc=None, na_rep='<NA>', name=None, non_index_names=None, obs_name='observable', show_counts='default', width=None)

参数说明:

  • memory_usage:表示是否显示每列的内存使用情况,可以是TrueFalse'deep'
  • null_counts:表示是否显示每列的空值计数,可以是TrueFalse
  • verbose:表示是否显示更详细的信息。
  • class_name:表示是否显示对象类型信息。
  • dtype:表示是否只显示指定的数据类型。
  • header:表示是否显示列头信息。
  • index:表示是否显示索引信息。
  • justify:表示对齐方式。
  • max_cols:表示最大显示的列数,超过则不显示。
  • max_rows:表示最大显示的行数,超过则不显示。
  • memory_usage_loc:表示是否显示每行的内存使用情况。
  • na_rep:表示空值的表示方式。
  • name:表示是否显示DataFrame的名字。
  • non_index_names:表示是否显示非索引列的名字。
  • obs_name:表示可观测的名字。
  • show_counts:表示是否显示每列的值计数。
  • width:表示输出宽度。

示例代码:




import pandas as pd
 
# 创建一个DataFrame
df = pd.DataFrame({
    'A': [1, 2, 3],
    'B': [4, 5, 6],
    'C': [7, 8, 9]
})
 
# 打印DataFrame的信息
df.info()

这段代码将打印出DataFrame df的信息,包括每列的数据类型、非空值数量和每列的内存使用情况。

2024-08-14



import cv2
import numpy as np
 
# 读取图像
img1 = cv2.imread('image1.jpg', 0)  # 查找图像
img2 = cv2.imread('image2.jpg', 0)  # 模板图像
 
# 创建ORB检测器
orb = cv2.ORB_create()
 
# 寻找关键点和描述符
kp1, des1 = orb.detectAndCompute(img1, None)
kp2, des2 = orb.detectAndCompute(img2, None)
 
# 创建匹配器
bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)
 
# 进行匹配
matches = bf.match(des1, des2)
 
# 根据距离排序,距离小的是更好的匹配点
matches = sorted(matches, key=lambda x: x.distance)
 
# 绘制前N个匹配
N = 10  # 可以调整这个值来增加或减少显示的匹配点数量
matched_img = cv2.drawMatches(img1, kp1, img2, kp2, matches[:N], None, flags=2)
 
# 显示图像
cv2.imshow('Matches', matched_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

这段代码使用了OpenCV库中的ORB特征检测器来寻找关键点,并使用BRIEF描述符。然后使用BFMatcher进行了两幅图像之间的匹配。最终,代码将显示出前N个最佳的匹配点,帮助识别两幅图像之间的配准情况。

2024-08-14

zip函数在Python中主要用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。如果各个迭代器的元素个数不一致,则返回列表长度以最短的可迭代对象为准。

  1. 基本用法



list1 = [1, 2, 3]
list2 = ['a', 'b', 'c']
list3 = [True, False, True]
 
zipped = zip(list1, list2, list3)
print(list(zipped))
# 输出:[(1, 'a', True), (2, 'b', False), (3, 'c', True)]
  1. 解压zip对象



list1 = [1, 2, 3]
list2 = ['a', 'b', 'c']
 
zipped = zip(list1, list2)
 
# 解压zip对象
unzipped = zip(*zipped)
print(list(unzipped))
# 输出:[[1, 2, 3], ['a', 'b', 'c']]
  1. 应用场景



# 假设我们有一个字典和一个列表
info = {'name': 'John', 'age': 30, 'gender': 'Male'}
items = ['apple', 'banana', 'cherry']
 
# 使用zip函数将字典的键和值以及列表的元素打包在一起
packed = zip(info.keys(), info.values(), items)
 
# 打印结果
for k, v, i in packed:
    print(f'Key: {k}, Value: {v}, Item: {i}')
 
# 输出:
# Key: name, Value: John, Item: apple
# Key: age, Value: 30, Item: banana
# Key: gender, Value: Male, Item: cherry
  1. 与函数配合使用



# 定义一个函数,接收两个参数
def my_function(a, b):
    return a * b
 
# 创建两个列表
list1 = [1, 2, 3]
list2 = [4, 5, 6]
 
# 使用map函数结合zip函数
result = list(map(my_function, list1, list2))
print(result)
# 输出:[4, 10, 18]
  1. 与Python 3.x中的星号表达式结合使用



# 创建一个字典
info = {'name': 'John', 'age': 30, 'gender': 'Male'}
 
# 使用zip函数和*操作符来解包字典的键和值
keys, values = zip(*info.items())
 
print(list(keys))
print(list(values))
 
# 输出:
# ['name', 'age', 'gender']
# ['John', 30, 'Male']

以上就是zip函数的基本用法和一些应用场景,它在处理多个可迭代对象时非常方便,可以提高代码的简洁性和可读性。

2024-08-14

在Linux系统中,安装和删除Python可以通过包管理器来完成。以下是一些常见的Linux发行版以及如何通过它们的包管理器安装和删除Python的方法。

对于Ubuntu和Debian系统,可以使用apt包管理器:

安装Python 3:




sudo apt update
sudo apt install python3

删除Python 3:




sudo apt remove python3

对于CentOS,可以使用yumdnf(CentOS 8及以后版本):

安装Python 3:




sudo yum install python3
# 或者在CentOS 8及以后版本
# sudo dnf install python3

删除Python 3:




sudo yum remove python3
# 或者在CentOS 8及以后版本
# sudo dnf remove python3

对于Fedora,可以使用dnf

安装Python 3:




sudo dnf install python3

删除Python 3:




sudo dnf remove python3

请注意,直接删除系统自带的Python可能会导致系统工具出现问题。如果你需要管理多个版本的Python,可以考虑使用pyenv等版本管理工具。

2024-08-14



import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.GlobalConfiguration;
import com.alibaba.excel.metadata.data.WriteCellData;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
 
public class CustomConverter implements Converter<MyDataClass> {
 
    @Override
    public Class<MyDataClass> supportJavaTypeKey() {
        return MyDataClass.class;
    }
 
    @Override
    public CellDataTypeEnum supportExcelTypeKey() {
        return CellDataTypeEnum.STRING;
    }
 
    @Override
    public WriteCellData<?> convertToExcelData(MyDataClass value, WriteSheetHolder writeSheetHolder) {
        if (value == null) {
            return new WriteCellData("");
        }
        // 这里可以根据需要转换 MyDataClass 的不同字段到 Excel 的字符串
        return new WriteCellData(value.toString());
    }
 
    @Override
    public MyDataClass convertToJavaData(ReadCellData<?> cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) {
        // 这里可以将读取的 Excel 字符串转换回 MyDataClass 对象
        // 请根据实际情况实现转换逻辑
        return new MyDataClass(cellData.getStringValue());
    }
}

在这个示例中,我们定义了一个自定义转换器CustomConverter,它实现了Converter接口,并指定了它支持的Java类型MyDataClass以及Excel类型STRING。在转换到Excel时,它将MyDataClass实例转换为字符串表示;在转换回Java时,它将字符串解析回MyDataClass对象。这个转换器可以用于EasyExcel的写入和读取操作,以实现自定义的数据转换。

2024-08-14

在Python中,None是一个特殊的值,表示空(或无)。它不能被重新定义,并且只有一个实例,即NoneNone常用于表示不存在的值或作为占位符。

示例代码




# 检查一个变量是否为None
value = None
if value is None:
    print("变量为None")
 
# 作为默认值
def my_function(arg=None):
    if arg is None:
        print("使用默认值")
    else:
        print("使用提供的值:", arg)
 
my_function()  # 输出 "使用默认值"
my_function("Hello")  # 输出 "使用提供的值: Hello"
 
# 作为一个函数没有返回值的占位符
def my_function_without_return():
    pass  # 空语句,不执行任何操作
 
result = my_function_without_return()
print(result)  # 输出 "None"

最佳实践

  • 使用is None来检查一个变量是否为None,避免使用== None,因为后者可能会导致错误,例如0 is None返回False,但0 == None返回True
  • 经常使用None作为函数的默认参数或作为不返回任何值的函数的占位符。
  • 不要对None进行操作或重新定义它。
2024-08-14

在本地存储中使用jQuery可以通过几种方法来实现。以下是一个简单的例子,展示了如何使用jQuery来设置和获取本地存储数据。




<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>LocalStorage jQuery Example</title>
    <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
    <script>
        $(document).ready(function(){
            // 设置本地存储数据
            $('#set-storage').click(function(){
                var key = 'myKey';
                var value = 'myValue';
                localStorage.setItem(key, value);
            });
 
            // 获取本地存储数据
            $('#get-storage').click(function(){
                var key = 'myKey';
                var value = localStorage.getItem(key);
                alert('The value of ' + key + ' is ' + value);
            });
 
            // 清除本地存储数据
            $('#clear-storage').click(function(){
                localStorage.clear();
                alert('Local storage is cleared.');
            });
        });
    </script>
</head>
<body>
 
    <button id="set-storage">Set Item in LocalStorage</button>
    <button id="get-storage">Get Item from LocalStorage</button>
    <button id="clear-storage">Clear LocalStorage</button>
 
</body>
</html>

在这个例子中,我们使用jQuery的$(document).ready()函数来确保在DOM完全加载后才绑定事件处理器。当用户点击相应的按钮时,会执行相应的操作:

  • 点击“Set Item in LocalStorage”按钮会触发一个事件,该事件使用jQuery设置一个键值对到本地存储。
  • 点击“Get Item from LocalStorage”按钮会触发一个事件,该事件使用jQuery从本地存储中获取一个值并通过弹窗显示出来。
  • 点击“Clear LocalStorage”按钮会触发一个事件,该事件使用jQuery清除本地存储中的所有数据。
2024-08-14



// 创建一个Ajax函数,用于发送HTTP请求
function ajax(url, method = 'GET', data = null) {
  // 返回一个Promise
  return new Promise((resolve, reject) => {
    // 创建一个新的XHR对象
    const xhr = new XMLHttpRequest();
 
    // 配置XHR对象
    xhr.open(method, url);
 
    // 如果发送的是POST请求,设置请求头
    if (method === 'POST') {
      xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    }
 
    // 发送请求
    xhr.send(data);
 
    // 监听请求完成
    xhr.onload = function() {
      if (this.status >= 200 && this.status < 300) {
        // 请求成功
        try {
          // 解析返回的数据,可能是JSON格式
          const response = JSON.parse(xhr.responseText);
          resolve(response);
        } catch (e) {
          // 如果不是JSON格式,直接返回文本
          resolve(xhr.responseText);
        }
      } else {
        // 请求失败
        reject(new Error(xhr.statusText));
      }
    };
 
    // 监听请求错误
    xhr.onerror = function() {
      reject(new Error("Network Error"));
    };
  });
}
 
// 使用示例
ajax('https://api.example.com/data', 'GET').then(response => {
  console.log(response); // 处理响应数据
}).catch(error => {
  console.error(error); // 处理错误
});

这段代码定义了一个ajax函数,它接受一个URL、HTTP方法和数据作为参数,并返回一个Promise。通过监听XHR对象的onloadonerror事件,我们可以在请求成功或失败时分别调用resolvereject。这是一个简单的Ajax请求封装,适用于学习和小型项目。