2024-08-16

面向对象编程(Object-Oriented Programming, OOP)是一种程序设计思想,它利用“类”和“对象”来创建软件系统。在Python中,类和对象是构建面向对象程序的基础。

以下是一些基本概念和示例:

  1. 类和对象

类是一种复杂的数据类型,它定义了对象的基本结构。对象是类的实例,拥有类所定义的属性和方法。




class MyClass:
    def __init__(self, value):  # 构造函数
        self.attribute = value  # 实例属性
 
    def my_method(self):  # 实例方法
        print(self.attribute)
 
# 创建一个对象
my_object = MyClass(10)
 
# 调用方法
my_object.my_method()  # 输出: 10
  1. 继承

继承允许我们定义一个新类,它继承了一个已存在的类的属性和方法。




class Parent:
    def my_method(self):
        print("Parent method")
 
class Child(Parent):
    pass
 
# 创建一个子类对象
child = Child()
 
# 调用继承的方法
child.my_method()  # 输出: Parent method
  1. 多态和多态性

多态是指同一个实体同时具有多种形式。在面向对象编程中,多态性是允许一个接口表现出多种形态,即同一个方法可以根据发送对象的不同而采用多种不同的行为方式。




class Animal:
    def speak(self):
        raise NotImplementedError("Subclass must implement abstract method")
 
class Dog(Animal):
    def speak(self):
        print("Woof")
 
class Cat(Animal):
    def speak(self):
        print("Meow")
 
# 多态性示例
def speak(animal):
    animal.speak()
 
dog = Dog()
cat = Cat()
 
speak(dog)  # 输出: Woof
speak(cat)  # 输出: Meow
  1. 封装

封装是一种信息隐藏技术,它可以帮助我们创建高内聚、低耦合的系统。封装意味着将对象的状态(属性)和行为(方法)打包在一个单独的单元(类)中。




class Encapsulation:
    def __init__(self, value):
        self.__private_attr = value  # 私有属性
 
    def get_private_attr(self):  # 公有方法
        return self.__private_attr
 
# 创建一个对象
encap = Encapsulation(10)
 
# 尝试直接访问私有属性会导致错误
# print(encap.__private_attr)  # 错误:'Encapsulation' object has no attribute '__private_attr'
 
# 通过公有方法访问私有属性
print(encap.get_private_attr())  # 输出: 10
  1. 属性

属性是类中的特殊方法,它们使得访问对象的属性就像访问普通的属性一样。




class MyClass:
    def __init__(self, value):
        self.value = value
 
    @property
    def value(self):
        return self._value
 
    @value.setter
    def value(self, new_value):
        self._value = new_value
 
# 创建一个对象
my_object = MyClass(10)
 
# 使用属性访问
print(my_object.value)  # 输出: 10
my_object.value = 20   
2024-08-16

scipy.signal.find_peaks 是一个在信号处理中常用的函数,用于找到信号中的峰值。

函数原型:




scipy.signal.find_peaks(x, height=None, threshold=None, distance=None, prominence=None, width=None, wlen=None, plateau_size=None)

参数说明:

  • x: 输入数据,通常是一个一维数组。
  • height: 只找到高于这个值的峰值。
  • threshold: 只找到高于 x 中值的 threshold 倍的峰值。
  • distance: 两个峰值之间的最小距离。
  • prominence: 峰值需要比其左右的局部最小值高至少 prominence 个单位。
  • width: 峰值需要有至少 width 个点的宽度。
  • wlen: 对于 width 的局部最小区域的长度。
  • plateau_size: 平顶峰值的大小,即有多少个点。

返回值:

  • peaks: 峰值的索引数组。
  • properties: 包含峰值的各种属性的字典,如高度、宽度、prominence等。

使用示例:




import numpy as np
from scipy.signal import find_peaks
 
# 创建一个包含峰值的信号
x = np.sin(np.arange(100))
x[30:40] = 1
 
# 找到峰值
peaks, properties = find_peaks(x, prominence=1)
 
# 输出峰值的位置和其他属性
print("峰值位置:", peaks)
print("峰值的其他属性:", properties)

在这个例子中,我们创建了一个包含一些峰值的信号,并使用 find_peaks 函数找到这些峰值。我们设置 prominence 参数来找到具有足够凸显的峰值。输出将包含峰值的索引和它们的一些属性。

2024-08-16

CentOS 7 默认提供 Python 2.7,但不包括 Python 3。要安装 Python 3.12,你需要使用第三方源,或者从源代码编译。

由于 Python 3.12 尚未正式发布,以下步骤以 Python 3.10 为例:

  1. 安装依赖项:



sudo yum groupinstall -y "Development Tools"
sudo yum install -y openssl-devel bzip2-devel libffi-devel
  1. 下载 Python 3.10 的源代码:



cd /usr/src
sudo wget https://www.python.org/ftp/python/3.10.0/Python-3.10.0.tgz
  1. 解压源码并编译:



sudo tar xzf Python-3.10.0.tgz
cd Python-3.10.0
sudo ./configure --enable-optimizations
sudo make altinstall

使用 altinstall 是为了避免覆盖系统默认的 Python 2。

  1. 验证安装:



python3.10 --version

请注意,上述步骤中的 Python 3.10 应替换为 Python 3.12 一旦该版本正式发布。同时,考虑到系统稳定性和兼容性,不建议在生产环境中提前使用未发布的 Python 版本。

2024-08-16



from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
 
# 打开浏览器
driver = webdriver.Chrome()
 
# 输入问卷星表单链接
form_link = "https://www.wenjuan.com/s/XXXXX"  # 替换为实际的问卷星表单链接
driver.get(form_link)
 
# 等待页面加载完成
time.sleep(5)
 
# 获取当前窗口的句柄
current_window = driver.current_window_handle
 
# 根据窗口句柄切换到问卷星登录窗口
for handle in driver.window_handles:
    if handle != current_window:
        driver.switch_to.window(handle)
 
# 输入用户名和密码
driver.find_element_by_id("username").send_keys("your_username")  # 替换为实际的用户名
driver.find_element_by_id("password").send_keys("your_password")  # 替换为实际的密码
 
# 提交登录信息
driver.find_element_by_xpath("//button[@type='submit']").click()
 
# 等待登录后的页面加载完成
time.sleep(10)
 
# 获取当前窗口的句柄
current_window = driver.current_window_handle
 
# 根据窗口句柄切换到问卷星表单窗口
for handle in driver.window_handles:
    if handle != current_window:
        driver.switch_to.window(handle)
 
# 自动填写表单
# 假设表单中的第一个问题是单选题,第一个选项的name是"Q1-A"
driver.find_element_by_name("Q1-A").click()
 
# 等待表单提交完成
time.sleep(5)
 
# 关闭浏览器
driver.quit()

这段代码提供了一个简单的框架来自动填写问卷星表单。需要替换的部分有问卷星表单链接、用户名和密码,以及表单中第一个问题的答案的name。这个例子使用了Selenium库来控制浏览器,并假设表单中的第一个问题是单选题。在实际应用中,你可能需要根据表单的具体结构来定位和填写其他类型的问题。

2024-08-16



import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;
 
import javax.mail.internet.MimeMessage;
import java.util.concurrent.TimeUnit;
 
@Service
public class EmailService {
 
    @Autowired
    private JavaMailSender mailSender;
 
    @Autowired
    private TemplateEngine templateEngine;
 
    @Autowired
    private StringRedisTemplate redisTemplate;
 
    public void sendEmail(String to, String subject, String templateName, Context context) {
        MimeMessage mimeMessage = mailSender.createMimeMessage();
        try {
            MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
            helper.setTo(to);
            helper.setSubject(subject);
            String htmlContent = templateEngine.process(templateName, context);
            helper.setText(htmlContent, true);
            mailSender.send(mimeMessage);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
 
    public void sendEmailWithCode(String to, String code) {
        Context context = new Context();
        context.setVariable("code", code);
        sendEmail(to, "Your Verification Code", "email/emailTemplate", context);
    }
 
    public void saveCodeToRedis(String key, String code, long timeout, TimeUnit unit) {
        ValueOperations<String, String> opsForValue = redisTemplate.opsForValue();
        opsForValue.set(key, code, timeout, unit);
    }
 
    public String getCodeFromRedis(String key) {
        ValueOperations<String, String> opsForValue = redisTemplate.opsForValue();
        return opsForValue.get(key);
    }
}

这段代码示例展示了如何在SpringBoot应用中使用JavaMailSender发送邮件,TemplateEngine处理HTML模板,以及StringRedisTemplate进行缓存操作。sendEmailWithCode方法接收接收者邮箱地址和验证码,并使用Thymeleaf模板引擎发送带有验证码的邮件。同时,提供了saveCodeToRedisgetCodeFromRedis方法来操作Redis缓存。

2024-08-16

报错信息“python此应用无法在您的电脑上运行”通常是由以下几个原因导致的:

  1. 不兼容的操作系统:您的系统可能不支持该应用程序。
  2. 损坏的安装程序:Python安装程序可能已损坏或不完整。
  3. 缺少系统组件:可能缺少必要的系统组件或库。
  4. 安全软件阻止:防病毒软件或防火墙可能错误地阻止了Python安装。

解决方法:

  1. 检查系统兼容性:确保您的操作系统支持Python。如果不支持,请更新到兼容的操作系统。
  2. 重新下载安装程序:从Python官方网站下载最新的安装程序,并尝试再次安装。
  3. 安装必要组件:确保安装所有必要的系统组件和库。
  4. 禁用安全软件:暂时禁用防病毒软件或防火墙,然后尝试再次安装Python。

在执行以上步骤时,请确保遵循操作系统的安全指南,并在执行任何操作前备份重要数据。

2024-08-16

在Flask中使用SQLAlchemy进行各种数据查询操作的示例代码如下:




from flask import Flask
from flask_sqlalchemy import SQLAlchemy
 
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///yourdatabase.db'
db = SQLAlchemy(app)
 
class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True, nullable=False)
    email = db.Column(db.String(120), unique=True, nullable=False)
 
    def __repr__(self):
        return '<User %r>' % self.username
 
@app.route('/')
def index():
    # 查询所有用户
    users = User.query.all()
    return str(users)
 
@app.route('/filter/<username>')
def filter_user(username):
    # 根据用户名过滤用户
    user = User.query.filter_by(username=username).first()
    return str(user)
 
@app.route('/filter_like/<username>')
def filter_user_like(username):
    # 模糊查询用户名包含某字符串的用户
    users = User.query.filter(User.username.contains(username)).all()
    return str(users)
 
@app.route('/order_by/')
def order_by_user():
    # 根据用户名排序用户
    users = User.query.order_by(User.username).all()
    return str(users)
 
if __name__ == '__main__':
    app.run(debug=True)

这段代码首先定义了一个Flask应用和SQLAlchemy实例。然后定义了一个User模型,并设置了数据库关系和表结构。在路由中,我们展示了如何使用不同的查询操作来获取和过滤User模型的实例。这包括查询所有用户,根据用户名过滤用户,模糊查询用户名,以及根据用户名排序用户。这些操作是使用SQLAlchemy提供的查询API完成的。

2024-08-16

Jionlp是一个Python库,它提供了一系列自然语言处理的功能。如果你想使用Jionlp来提取地址中的省、市、县等信息,可以使用Jionlp中的地址解析功能。

以下是使用Jionlp提取地址中省、市、县的示例代码:




from jionlp import address_parser
 
# 地址示例
address_str = '广东省广州市天河区福田路102号'
 
# 使用Jionlp的地址解析功能
province, city, county, town, village, road, house_number = address_parser(address_str)
 
# 输出结果
print('省份:', province)
print('城市:', city)
print('区县:', county)
print('镇信息:', town)
print('村信息:', village)
print('路信息:', road)
print('门牌号:', house_number)

在这个例子中,我们首先从jionlp导入了address_parser模块,然后定义了一个地址字符串address_str。接着,我们调用address_parser函数来解析这个地址,并将解析结果分别打印出来。

需要注意的是,Jionlp库需要先安装才能使用。如果你还没有安装,可以通过pip进行安装:




pip install jionlp

Jionlp提供的地址解析功能非常强大,它能够处理各种复杂的地址情况,并准确提取出省、市、区、镇、村、路、号等信息。

2024-08-16

解决使用 plt.savefig() 保存图片出现空白的问题,通常是由于没有正确调用 plt.show() 显示图形之后再保存导致的。plt.show() 会实例化图形,之后才能正确保存。

解决方法:

确保在调用 plt.savefig() 之前调用了 plt.show() 或者有一个当前的图形上下文。

示例代码:




import matplotlib.pyplot as plt
 
# 创建图形
plt.plot([1, 2, 3], [4, 5, 6])
 
# 显示图形
plt.show()
 
# 保存图形
plt.savefig('figure.png')
 
# 关闭图形
plt.close()

如果你不希望显示图形但仍然需要保存,可以使用 plt.gcf() 获取当前图形对象,然后直接保存:




import matplotlib.pyplot as plt
 
# 创建图形
plt.plot([1, 2, 3], [4, 5, 6])
 
# 获取当前图形对象并保存
fig = plt.gcf()
fig.savefig('figure.png', bbox_inches='tight')
 
# 关闭图形
plt.close()

在这个例子中,bbox_inches='tight' 参数可以去除保存图像周围的空白边框。

2024-08-16



import sys
import pygame
import random
 
# 定义颜色变量
BLUE = (0, 0, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
DARK_GREY = (100, 100, 100)
LIGHT_GREY = (230, 230, 230)
YELLOW = (255, 255, 0)
 
# 初始化pygame
pygame.init()
 
# 设置窗口大小
size = (400, 400)
screen = pygame.display.set_mode(size)
pygame.display.set_caption("2048 Game")
 
# 定义方向常量
UP = 1
DOWN = 2
LEFT = 3
RIGHT = 4
 
# 定义格子类
class Grid(object):
    def __init__(self, x, y, width, height, num=0):
        self.x = x
        self.y = y
        self.width = width
        self.height = height
        self.num = num
 
    def draw(self):
        # 绘制格子边框
        pygame.draw.rect(screen, LIGHT_GREY, (self.x, self.y, self.width, self.height))
        pygame.draw.rect(screen, DARK_GREY, (self.x + 4, self.y + 4, self.width - 8, self.height - 8))
 
        # 如果有数字,则显示
        if self.num > 0:
            font = pygame.font.SysFont("Arial", 20)
            text = font.render(str(self.num), True, BLACK)
            textRect = text.get_rect()
            textRect.center = ((self.x + self.width / 2), (self.y + self.height / 2))
            screen.blit(text, textRect)
 
    def get_position(self, x, y):
        return (self.x + 4 <= x <= self.x + self.width - 4 and self.y + 4 <= y <= self.y + self.height - 4)
 
# 初始化格子数组
grids = [
    [Grid(i * 100, j * 100, 100, 100) for i in range(4)]
    for j in range(4)
]
 
# 随机添加2或4
def add_random_number():
    if random.random() > 0.5:
        num = 2
    else:
        num = 4
 
    empty_cells = []
    for i in range(4):
        for j in range(4):
            if grids[i][j].num == 0:
                empty_cells.append((i, j))
 
    if len(empty_cells) > 0:
        i, j = empty_cells[random.randint(0, len(empty_cells) - 1)]
        grids[i][j].num = num
 
# 添加数字
add_random_number()
add_random_number()
 
# 移动处理
def move(direction):
    if direction == UP:
        for j in range(4):
            is_changed = False
            temp = [grid for grid in grids if grid.num != 0]
            temp.sort(key=lambda grid: grid.y)
 
            for i in range(len(temp) - 1):
                if temp[i].num == 0:
                    temp.pop(i)
                elif temp[i].num == temp[i + 1].num:
                    temp[i].num *= 2
                    temp[i + 1].num = 0
                    is_changed = True
 
            for i in range(len(temp)):
                gri