2024-08-08

在Python中,常规滤波器可以使用scipy.signal模块来实现。以下是实现带通、低通、高通和带阻滤波器的示例代码:




import numpy as np
from scipy.signal import butter, lfilter, bpf, lfilter, hpf, bpfdb
 
# 设计低通滤波器
def lowpass_filter(data, fs, cutoff, order=5):
    b, a = butter(order, cutoff/(fs/2), btype='low')
    return lfilter(b, a, data)
 
# 设计高通滤波器
def highpass_filter(data, fs, cutoff, order=5):
    b, a = butter(order, cutoff/(fs/2), btype='high')
    return hpf(data, cutoff, fs, order=order)
 
# 设计带通滤波器
def bandpass_filter(data, fs, cutoff_low, cutoff_high, order=5):
    b, a = butter(order, [cutoff_low/(fs/2), cutoff_high/(fs/2)], btype='band')
    return bpf(data, b, a)
 
# 设计带阻滤波器
def bandstop_filter(data, fs, cutoff_low, cutoff_high, order=5, width=1):
    b, a = butter(order, [cutoff_low/(fs/2), cutoff_high/(fs/2)], btype='bandstop')
    return bpfdb(data, b, a, width=width)
 
# 示例使用
data = np.random.randn(1000)  # 示例数据
fs = 1000  # 采样频率
cutoff_low = 100  # 低频截止频率
cutoff_high = 2000  # 高频截止频率
order = 6  # 滤波器阶数
width = 1.5  # 带阻宽度
 
# 应用滤波器
low_data = lowpass_filter(data, fs, cutoff_low, order)
high_data = highpass_filter(data, fs, cutoff_high, order)
band_data = bandpass_filter(data, fs, cutoff_low, cutoff_high, order)
bandstop_data = bandstop_filter(data, fs, cutoff_low, cutoff_high, order, width)

在这个例子中,我们定义了设计低通、高通、带通和带阻滤波器的函数,并使用scipy.signal模块中的butter函数来设计滤波器的系数,然后使用lfilterhpfbpfbpfdb来应用滤波器。

注意:bpfdb函数在scipy的较新版本中已被弃用,在代码中仅为示例。在实际应用中,请根据你的scipy版本选择正确的函数。

2024-08-08



# 导入pytest插件allure的装饰器
import allure
import pytest
 
# 定义测试用例,使用@allure.feature标记用例的功能
@allure.feature("功能测试")
class TestExample:
 
    # 定义测试用例,使用@allure.story标记用例的场景
    @allure.story("正常场景")
    def test_normal(self):
        # 使用allure.description添加详细描述
        allure.description("这是一个正常执行的测试用例")
        assert 1 == 1
 
    # 定义测试用例,使用@allure.story标记用例的场景
    @allure.story("异常场景")
    def test_error(self):
        allure.description("这是一个预期抛出错误的测试用例")
        with pytest.raises(ZeroDivisionError):
            1 / 0
 
# 如果这是主程序入口,执行测试用例
if __name__ == '__main__':
    # 使用--alluredir选项指定Allure报告生成的目录
    pytest.main(['-s', '--alluredir=./allure-results'])

在命令行中执行上述代码,会生成Allure报告。执行后的命令如下:




pytest --alluredir=./allure-results

然后使用Allure命令生成报告网页:




allure generate ./allure-results -o ./allure-report --clean

最后,打开生成的报告文件夹 ./allure-report/index.html 查看详细的测试报告。

2024-08-08

以下是一个简化的豆瓣电影数据爬虫和可视化分析的代码示例。请注意,实际的爬虫应该遵守豆瓣的robots协议,并使用适当的头信息,这里为了简洁起见,省略了相关的反爬措施。




import requests
from bs4 import BeautifulSoup
import pandas as pd
import matplotlib.pyplot as plt
 
# 获取豆瓣电影TOP250页面的HTML
def get_page_html(url):
    headers = {
        'User-Agent': 'your_user_agent'
    }
    response = requests.get(url, headers=headers)
    if response.status_code == 200:
        return response.text
    return None
 
# 解析HTML,提取电影信息
def parse_movie_info(html):
    soup = BeautifulSoup(html, 'lxml')
    movie_list = soup.find_all('div', class_='info')
    movies = []
    for movie in movie_list:
        rank = movie.find_all('em')[0].text
        name = movie.find('a')['title']
        score = float(movie.find('div', class_='rating_num').text)
        num = int(movie.find('div', class='star').text.replace('人评分', '').strip())
        movies.append((rank, name, score, num))
    return movies
 
# 保存数据到CSV
def save_to_csv(movies, filename):
    data = pd.DataFrame(movies, columns=['排名', '电影名', '评分', '评分人数'])
    data.to_csv(filename, index=False, encoding='utf-8')
 
# 绘制评分分布直方图
def plot_histogram(data):
    plt.hist(data['评分'], bins=25)
    plt.xlabel('评分')
    plt.ylabel('电影数')
    plt.title('评分分布')
    plt.show()
 
# 主函数
def main():
    base_url = 'https://movie.douban.com/top250?start='
    html = get_page_html(base_url + '0')
    movies = parse_movie_info(html)
    save_to_csv(movies, 'douban_movies.csv')
    data = pd.read_csv('douban_movies.csv')
    plot_histogram(data)
 
if __name__ == '__main__':
    main()

这段代码首先定义了获取页面HTML、解析电影信息、保存数据到CSV文件以及绘制评分分布直方图的函数。主函数main()串联了这些步骤,完成了整个数据爬取和分析的流程。

请注意,这个代码示例省略了请求头部信息中的'User-Agent'字段,并且没有处理网络请求中可能出现的异常。在实际应用中,你需要替换'your\_user\_agent'为你自己的请求头信息,并且添加异常处理逻辑。

2024-08-08

报错解释:

这个错误表明Python解释器试图打开一个文件但失败了。这通常发生在使用python命令直接运行一个脚本时,而该脚本不存在于指定的路径,或者文件名拼写错误。

解决方法:

  1. 确认文件名和路径是否正确。检查你提供给python命令的文件名是否正确拼写,包括大小写。
  2. 确认文件确实存在于你尝试运行它的目录中,或者提供文件的完整路径。
  3. 如果你在一个命令行环境中,确保你的当前工作目录是正确的。你可以使用cd命令来更改工作目录,或者在文件名前指定完整的路径。
  4. 如果你在Windows系统上,并且在使用了路径分隔符(比如\),确保你使用的是正确的路径分隔符。在Windows中,通常应该使用反斜杠\,但在Python字符串中,你需要使用双反斜杠\\或者原始字符串前缀r

示例:

如果你尝试运行名为script.py的脚本,你应该确保你在命令行中使用以下命令之一:




python script.py

或者如果你在Windows上:




python .\script.py

或者如果路径包含空格,确保你用引号括起来:




python "C:\path with spaces\script.py"

如果以上步骤都不能解决问题,请检查你的环境变量是否正确配置,确保Python的安装目录已经添加到了PATH环境变量中,这样你就可以从任何目录运行Python解释器了。

2024-08-08

Flask是一个使用Python编写的轻量级Web应用框架。下面是一个简单的Flask应用示例:

首先,需要安装Flask库:




pip install Flask

然后,创建一个名为app.py的文件,并编写以下代码:




from flask import Flask
 
app = Flask(__name__)
 
@app.route('/')
def hello_world():
    return 'Hello, World!'
 
if __name__ == '__main__':
    app.run()

运行这个Flask应用:




python app.py

默认情况下,应用将运行在本地的5000端口。打开浏览器,访问http://127.0.0.1:5000/,你将看到页面上显示Hello, World!

2024-08-08

报错问题解释:

在使用PyCharm 2023.1版本配置Python解释器时,发现不能找到Conda环境,可能是因为PyCharm没有自动检测到Conda环境,或者Conda环境的路径没有正确配置。

解决方法:

  1. 确认Conda已经安装且环境已创建。
  2. 在PyCharm中手动添加Conda环境:

    • 打开PyCharm,选择要配置的项目。
    • 进入File > Settings (或 PyCharm > Preferences 在Mac上) > Project: YourProjectName > Python Interpreter
    • 点击右上角的齿轮图标,然后选择 Add...
    • 在弹出的窗口中,选择 Conda Environment
    • 如果PyCharm没有自动检测到Conda的路径,你需要手动指定Conda的位置。点击 ... 按钮,然后浏览到Conda的安装目录。
    • 接下来,选择特定的Conda环境,通常在Conda安装目录下的 envs 文件夹中。
    • 应用更改并等待PyCharm重新加载环境。

如果PyCharm仍然无法找到Conda环境,可以尝试以下步骤:

  • 确保Conda已经激活,可以在终端中运行 conda activate your_env_name
  • 重启PyCharm,并再次尝试添加Conda环境。
  • 检查环境变量是否正确设置,确保PyCharm可以访问Conda的路径。
  • 如果以上都不行,可以考虑重新安装Conda或PyCharm,并确保它们都是最新版本。
2024-08-08



from urllib.request import urlopen
from bs4 import BeautifulSoup
 
# 打开网页
url = 'http://example.com/'
resp = urlopen(url)
html = resp.read()
 
# 解析网页
soup = BeautifulSoup(html, 'html.parser')
 
# 提取标题
title = soup.title.string
print(title)
 
# 提取所有的段落
paragraphs = soup.find_all('p')
for p in paragraphs:
    print(p.text)
 
# 提取特定类名的div
divs = soup.find_all('div', class_='my-class')
for div in divs:
    print(div.text)

这段代码演示了如何使用Python的urllib.request库来打开一个网页,并使用BeautifulSoup库来解析网页。然后,它提取了网页的标题、所有段落文字、以及特定类名的div中的文字内容。这是学习网页爬虫时的基本技能,对于理解和应用BeautifulSoup非常有帮助。

2024-08-08

在Python中,类可以从一个或多个父类继承属性和方法。继承的基本语法是在子类后面跟上冒号和父类的名称。如果子类继承多个父类,可以用逗号分隔它们。

下面是一个简单的类继承的例子:




class Parent:
    def my_method(self):
        print("Hello from the Parent class!")
 
class Child(Parent):
    pass
 
# 使用子类
c = Child()
c.my_method()  # 输出: Hello from the Parent class!

在这个例子中,Child 类没有定义 my_method 方法,但是它从 Parent 类继承了这个方法。当你创建 Child 类的实例并调用 my_method,方法的定义会被找到并执行在 Parent 类中。

如果子类和父类都有同名的方法或属性,子类的版本会被优先使用,这称为方法重写(method overriding)。




class Parent:
    def my_method(self):
        print("Hello from the Parent class!")
 
class Child(Parent):
    def my_method(self):
        print("Hello from the Child class!")
        super().my_method()  # 调用父类的方法
 
c = Child()
c.my_method()  # 输出: Hello from the Child class! Hello from the Parent class!

在这个例子中,Child 类重写了 my_method 方法,并在其实现中调用了 super().my_method(),这会调用 Parent 类的 my_method 方法。

2024-08-08

Python 新手常犯的错误包括但不限于:

  1. 使用=\`\`而不是==进行比较。
  2. 忘记使用冒号:结尾的语句,如if语句或for循环。
  3. 将变量名写错,例如使用错误的大小写。
  4. for循环中忘记更新计数器。
  5. 使用=而不是+=来累加值。
  6. 在列表或字典中使用不正确的索引或键。
  7. try块中抛出异常而没有相应的except处理。
  8. with语句中忘记关闭文件。
  9. 使用from ... import *导入模块,可能会导致名称冲突。
  10. 在函数中返回None而没有指定返回值。

解决这些问题通常需要查看代码、运行测试和使用调试工具。对于常见的问题,可以通过编写单元测试来避免。始终确保使用代码编辑器或IDE的lint工具来帮助识别潜在的问题。

2024-08-08



import pyglet
 
# 汉诺塔游戏的主要类
class Tower(object):
    def __init__(self, x, tower_height):
        self.x = x
        self.tower_height = tower_height
        self.disks = []
 
    def add_disk(self, disk):
        self.disks.append(disk)
 
    def move_disk(self, x):
        if self.disks:
            self.disks[-1].x = x
 
    def draw(self):
        for disk in self.disks:
            disk.draw()
 
# 汉诺塔游戏中的盘子类
class Disk(object):
    def __init__(self, image, x, y, batch=None):
        self.image = image
        self.x = x
        self.y = y
        self.batch = batch
 
    def draw(self):
        self.image.blit(self.x, self.y)
 
# 主函数
def main():
    # 初始化窗口
    window = pyglet.window.Window(width=600, height=600)
    batch = pyglet.graphics.Batch()
 
    # 加载图片
    disk_image = pyglet.image.load('disk.png')
 
    # 创建三个塔和它们的盘子
    tower_a = Tower(150, 10)
    tower_b = Tower(300, 10)
    tower_c = Tower(450, 10)
 
    for i in range(5):
        disk = Disk(disk_image, 150, 500 - i * 50, batch)
        tower_a.add_disk(disk)
 
    @window.event
    def on_draw():
        window.clear()
        batch.draw()
        tower_a.draw()
        tower_b.draw()
        tower_c.draw()
 
    pyglet.app.run()
 
if __name__ == '__main__':
    main()

这段代码提供了一个简化版本的汉诺塔游戏的实现。它使用pyglet库来创建一个窗口,并加载一个盘子图片。游戏中有三个塔,每个塔都可以有多个盘子。游戏的主要逻辑被封装在TowerDisk类中。main函数设置窗口和加载资源,最后通过pyglet.app.run()启动应用。