2024-08-19



from datetime import datetime
 
# 获取当前日期和时间
now = datetime.now()
print(f"当前日期和时间: {now}")
 
# 创建指定日期和时间
specified_time = datetime(2023, 3, 1, 12, 45, 30)
print(f"指定日期和时间: {specified_time}")
 
# 计算两个datetime对象的时间差
time_difference = now - specified_time
print(f"时间差: {time_difference}")
 
# 获取datetime对象的年、月、日、小时、分钟和秒
print(f"年: {now.year}, 月: {now.month}, 日: {now.day}, 小时: {now.hour}, 分钟: {now.minute}, 秒: {now.second}")
 
# 字符串转datetime对象
str_time = "2023-03-01 12:45:30"
formatted_time = datetime.strptime(str_time, "%Y-%m-%d %H:%M:%S")
print(f"字符串转datetime对象: {formatted_time}")
 
# datetime对象转字符串
str_from_time = formatted_time.strftime("%d/%m/%Y %H:%M:%S")
print(f"datetime对象转字符串: {str_from_time}")

这段代码展示了如何使用Python的datetime模块来进行基本的日期和时间操作,包括获取当前时间、创建指定时间、计算时间差、获取时间的特定部分、字符串与datetime对象的转换等。

2024-08-19

json.dumps() 是 Python 中的一个方法,它用于将 Python 对象转换为 JSON 字符串。这个函数接收一个 Python 对象并返回一个 JSON 字符串。

函数的基本使用方法如下:




import json
 
data = {
    'name': 'John',
    'age': 30,
    'is_employee': True
}
 
json_string = json.dumps(data)
print(json_string)

这将输出:




{"name": "John", "age": 30, "is_employee": true}

json.dumps() 还有一些可选参数,可以用来自定义输出的格式:

  • sort_keys: 是否要排序字典的键。默认为 False
  • indent: 缩进的空格数,如果是负数,则表示使用制表符进行缩进。
  • separators: 在没有缩进的情况下,分隔键和值的逗号后面和字典值后面的分隔符。默认为 (', ', ': ')

例如:




import json
 
data = {
    'name': 'John',
    'age': 30,
    'is_employee': True
}
 
json_string = json.dumps(data, sort_keys=True, indent=4, separators=(',', ':'))
print(json_string)

这将输出:




{
    "age": 30,
    "is_employee": true,
    "name": "John"
}

json.dumps() 还可以用来转换一些特殊的数据类型,如日期、时间等。例如:




import json
from datetime import datetime, date
 
data = {
    'name': 'John',
    'birthday': date.today(),
    'now': datetime.now()
}
 
json_string = json.dumps(data, default=str)
print(json_string)

这将输出:




{"name": "John", "birthday": "2023-04-07", "now": "2023-04-07 12:34:56"}

在这个例子中,default=str 告诉 json.dumps() 如果它遇到了一个它不知道如何转换的数据类型,那么就调用 Python 的 str() 方法来转换这个数据类型。

2024-08-19

《用Python进行数据分析》是一本由Wes McKinney编写的书,主要介绍Python的Pandas库,这是一个强大的数据分析和操作工具。书中包含了大量的实例和代码,旨在帮助读者使用Python进行高效的数据处理和分析。

以下是书中一个简单的DataFrame创建和基本操作的代码示例:




import pandas as pd
 
# 创建一个简单的DataFrame
data = {
    'Name': ['John', 'Anna', 'Peter', 'Linda'],
    'Age': [28, 23, 34, 29],
    'City': ['New York', 'Paris', 'Berlin', 'London']
}
 
df = pd.DataFrame(data)
 
# 显示DataFrame
print(df)
 
# 查看DataFrame的基本统计信息
print(df.describe())
 
# 按照年龄进行升序排序
print(df.sort_values(by='Age'))

这段代码展示了如何创建一个简单的DataFrame,如何打印它,如何查看数据的统计信息,以及如何对数据进行排序。这是数据分析的基本操作,对于学习者来说,这是一个很好的开始。

2024-08-19

在Python中,staticmethod是一个装饰器函数,用于把一个类中的函数定义为静态方法。这意味着这个方法不接收特殊的self或者cls参数(通常用于指向类的实例或类本身),它只是一个普通的函数,可以由类直接调用,也可以由类的实例调用。

下面是一个简单的例子,演示了如何使用staticmethod




class MyClass:
    @staticmethod
    def my_static_method(arg1, arg2):
        return arg1 + arg2
 
# 通过类直接调用静态方法
result = MyClass.my_static_method(5, 3)
print(result)  # 输出: 8
 
# 通过类的实例调用静态方法(这在实际中不常见,但技术上是可行的)
instance = MyClass()
result = instance.my_static_method(5, 3)
print(result)  # 输出: 8

在这个例子中,my_static_method是一个静态方法,它接收两个参数并返回它们的和。我们可以通过类名或类的实例来调用这个静态方法。

总结:staticmethod是一个将函数转换为静态方法的装饰器,使其可以不用实例化类即可调用。

2024-08-19



// 假设我们有一个简单的动物列表和一个处理动物的接口
List<Animal> animals = Arrays.asList(new Dog("Rex"), new Cat("Whiskers"));
 
// 使用Java 8 Lambda表达式来遍历列表
animals.forEach(animal -> {
    System.out.println(animal.getName());
    // 可以在这里添加更多的操作
});

这个例子展示了如何使用Java Lambda表达式简化代码。通过使用forEach方法和Lambda表达式,我们可以避免为了处理每个动物而编写一个新的方法。这是一个简化代码和增强代码可读性的很好的例子。

2024-08-19



# 算术运算符示例
a = 5
b = 3
c = a + b  # 加法
d = a - b  # 减法
e = a * b  # 乘法
f = a / b  # 除法
g = a % b  # 取余
h = a ** b # 幂运算
 
# 赋值运算符示例
i = 10
i += 1  # 相当于 i = i + 1
i -= 2  # 相当于 i = i - 2
i *= 3  # 相当于 i = i * 3
i /= 4  # 相当于 i = i / 4
i %= 5  # 相当于 i = i % 5
i **= 6  # 相当于 i = i ** 6
 
# 比较运算符示例
x = 5
y = 3
result1 = x == y  # 等于
result2 = x != y  # 不等于
result3 = x > y   # 大于
result4 = x < y   # 小于
result5 = x >= y  # 大于等于
result6 = x <= y  # 小于等于
 
# 逻辑运算符示例
result7 = True and False  # 逻辑与
result8 = True or False   # 逻辑或
result9 = not True        # 逻辑非
 
# 位运算符示例
a_bit = 2  # 二进制为 10
b_bit = 6  # 二进制为 110
c_bit = a_bit & b_bit  # 按位与
d_bit = a_bit | b_bit  # 按位或
e_bit = a_bit ^ b_bit  # 按位异或
f_bit = ~a_bit         # 按位取反
g_bit = a_bit << 2    # 左移
h_bit = a_bit >> 2    # 右移
 
# 成员运算符示例
list1 = [1, 2, 3]
result10 = 1 in list1  # 元素是否存在于列表中
result11 = 1 not in list1  # 元素是否不存在于列表中
 
# 身份运算符示例
tuple1 = (1, 2, 3)
tuple2 = (1, 2, 3)
result12 = tuple1 is tuple2  # 判断两个变量是否引用同一个对象
result13 = tuple1 is not tuple2  # 判断两个变量是否引用不同的对象
 
# 打印结果
print(c, d, e, f, g, h)
print(i)
print(result1, result2, result3, result4, result5, result6)
print(result7, result8, result9)
print(c_bit, d_bit, e_bit, f_bit, g_bit, h_bit)
print(result10, result11)
print(result12, result13)

这段代码展示了Python中各类运算符的基本使用,包括算术运算符、赋值运算符、比较运算符、逻辑运算符、位运算符、成员运算符和身份运算符。每个运算符都被用于执行特定的操作,并且结果被打印输出,以便理解各个表达式的值。

2024-08-19

Python的queue模块提供了几种线程安全的队列,以支持多线程编程。这里是一些常用的队列类型和相关操作的示例代码:

  1. queue.Queue:FIFO(先进先出)队列。



import queue
 
q = queue.Queue()  # 创建一个Queue对象
q.put('item1')     # 添加元素
q.put('item2')
print(q.get())     # 移除并获取元素,打印 'item1'
print(q.get())     # 打印 'item2'
  1. queue.LifoQueue:LIFO(后进先出)队列。



import queue
 
q = queue.LifoQueue()  # 创建一个LifoQueue对象
q.put('item1')         # 添加元素
q.put('item2')
print(q.get())         # 移除并获取元素,打印 'item2'
print(q.get())         # 打印 'item1'
  1. queue.PriorityQueue:优先级队列,元素按照优先级排序。



import queue
 
q = queue.PriorityQueue()  # 创建一个PriorityQueue对象
q.put((10, 'item1'))       # 元素是一个元组,格式为 (优先级数值, 数据)
q.put((5, 'item2'))
print(q.get())             # 打印 (5, 'item2'),因为它有最低的优先级
print(q.get())             # 打印 (10, 'item1')
  1. 队列的基本操作:
  • put(item[, block[, timeout]]):添加元素到队列。
  • get([block[, timeout]]):从队列中移除并返回元素。
  • empty():如果队列为空,返回True;否则返回False
  • full():如果队列满,返回True;否则返回False
  • qsize():返回队列中元素的数量。
  1. 使用queue模块的task_done()join()方法来同步队列。



import queue
import threading
 
q = queue.Queue()
 
# 线程的工作函数
def worker():
    while True:
        item = q.get()
        print(item)
        q.task_done()  # 通知task_done()方法,一个任务已经处理完毕
        if item is None:
            break
 
# 创建并启动线程
threads = []
for i in range(2):
    t = threading.Thread(target=worker)
    t.daemon = True
    t.start()
    threads.append(t)
 
# 向队列中添加任务
for i in range(5):
    q.put(i)
 
# 通知所有线程退出
for _ in range(2):
    q.put(None)
 
# 等待所有的线程完成所有的任务
q.join()

以上代码展示了如何使用queue模块创建不同类型的队列,以及如何在多线程环境中同步使用队列。

2024-08-19



import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.stereotype.Component;
 
@Component
public class NettyServer implements ApplicationListener<ContextRefreshedEvent> {
 
    private static final int PORT = 8080;
 
    @Autowired
    private WebSocketServerInitializer webSocketServerInitializer;
 
    @Override
    public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
        start();
    }
 
    public void start() {
        EventLoopGroup bossGroup = new NioEventLoopGroup();
        EventLoopGroup workerGroup = new NioEventLoopGroup();
        try {
            ServerBootstrap b = new ServerBootstrap();
            b.group(bossGroup, workerGroup)
             .channel(NioServerSocketChannel.class)
             .childHandler(webSocketServerInitializer);
 
            ChannelFuture f = b.bind(PORT).sync();
            System.out.println("Web socket server started at port " + PORT);
            f.channel().closeFuture().sync();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            workerGroup.shutdownGracefully();
            bossGroup.shutdownGracefully();
        }
    }
}

这段代码实现了Netty服务器的启动,并在Spring容器完全刷新之后绑定到指定端口。它使用了NioEventLoopGroupNioServerSocketChannel来实现非阻塞I/O。在实际部署时,你可能需要根据实际需求对代码进行相应的调整,例如启动参数配置、安全性配置等。

2024-08-19



from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton
from PyQt5.QtCore import QTimer, Qt
 
class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("PyQt5 定时器示例")
        self.setGeometry(100, 100, 400, 300)
        self.button = QPushButton("点击我", self)
        self.button.clicked.connect(self.on_button_clicked)
        self.button.move(100, 100)
        self.timer = QTimer(self)
        self.timer.timeout.connect(self.on_timer_timeout)
 
    def on_button_clicked(self):
        self.timer.start(1000)  # 定时器开始,1000毫秒后触发timeout信号
 
    def on_timer_timeout(self):
        print("定时器超时事件发生")
        self.button.setText("停止")
        self.timer.stop()  # 停止定时器
 
if __name__ == "__main__":
    app = QApplication([])
    mainWindow = MainWindow()
    mainWindow.show()
    app.exec_()

这段代码创建了一个PyQt5应用程序,其中包含一个主窗口、一个按钮和一个定时器。当用户点击按钮时,定时器开始计时,并且在定时器超时时,会在控制台打印一条消息,并停止定时器。这是PyQt5中事件机制和定时器使用的一个简单示例。

2024-08-19



import pandas as pd
 
# 读取Excel文件
excel_data = pd.read_excel('data.xlsx', sheet_name='Sheet1')
print(excel_data.head())
 
# 写入Excel文件
excel_data.to_excel('output.xlsx', index=False)
 
# 读取Text文件
text_data = pd.read_csv('data.txt', sep='\t', header=None)
print(text_data.head())
 
# 写入Text文件
text_data.to_csv('output.txt', sep='\t', index=False, header=None)

这段代码展示了如何使用pandas库来进行Excel和Text文件的读写操作。读取Excel时,指定了文件名和需要读取的sheet名;写入Excel时,将数据写入到新的文件中,并移除了默认的索引。读取Text文件时,指定了分隔符和是否有表头,写入Text文件时,同样指定了分隔符、是否需要索引以及是否需要表头。