• [技术干货] Python Geopy库地理编码和地理距离计算案例展示【转】
    在处理地理数据时,地理编码(将地址转换为地理坐标)和地理距离计算是两个常见的任务。Python的Geopy库提供了简单易用的接口,支持多种地理编码服务和地理计算,使得这些任务变得更加轻松和高效。本文将详细介绍Geopy库的功能、安装与配置、基本和高级用法,以及如何在实际项目中应用它。Geopy库简介Geopy是一个用于Python的开源库,提供了对多个地理编码服务(如Google Geocoding API、OpenStreetMap Nominatim、Bing Maps等)的支持。Geopy不仅可以进行地理编码和反向地理编码,还能计算两个地理坐标之间的距离,广泛应用于地图服务、位置分析等领域。安装与配置安装Geopy使用pip可以轻松安装Geopy库:1pip install geopy配置Geopy库无需额外配置,安装完成后即可直接使用。不过,根据你选择的地理编码服务,可能需要配置API密钥。例如,使用Google Geocoding API时,需要提供API密钥。Geopy库的核心功能地理编码:将地址转换为地理坐标(经纬度)。反向地理编码:将地理坐标转换为地址。地理距离计算:计算两个地理坐标之间的距离。多种地理编码服务支持:支持多个流行的地理编码服务。基本使用示例地理编码使用Nominatim进行地理编码:123456from geopy.geocoders import Nominatim# 初始化地理编码器geolocator = Nominatim(user_agent="geoapiExercises")# 地理编码location = geolocator.geocode("1600 Amphitheatre Parkway, Mountain View, CA")print((location.latitude, location.longitude))反向地理编码使用Nominatim进行反向地理编码:123456from geopy.geocoders import Nominatim# 初始化地理编码器geolocator = Nominatim(user_agent="geoapiExercises")# 反向地理编码location = geolocator.reverse("37.4219999, -122.0840575")print(location.address)计算地理距离使用Geopy计算两个地理坐标之间的距离:1234567from geopy.distance import geodesic# 定义两个地理坐标coords_1 = (37.4219999, -122.0840575)coords_2 = (40.712776, -74.005974)# 计算距离distance = geodesic(coords_1, coords_2).milesprint(f"Distance: {distance} miles")高级功能与技巧使用Google Geocoding API使用Google Geocoding API进行地理编码和反向地理编码:123456789from geopy.geocoders import GoogleV3# 初始化地理编码器,提供API密钥geolocator = GoogleV3(api_key='YOUR_API_KEY')# 地理编码location = geolocator.geocode("1600 Amphitheatre Parkway, Mountain View, CA")print((location.latitude, location.longitude))# 反向地理编码location = geolocator.reverse("37.4219999, -122.0840575")print(location.address)批量地理编码批量处理多个地址进行地理编码:1234567891011121314from geopy.geocoders import Nominatimimport pandas as pd# 初始化地理编码器geolocator = Nominatim(user_agent="geoapiExercises")# 创建示例地址列表addresses = ["1600 Amphitheatre Parkway, Mountain View, CA",             "1 Infinite Loop, Cupertino, CA",             "500 Terry A Francois Blvd, San Francisco, CA"]# 批量地理编码locations = [geolocator.geocode(address) for address in addresses]coords = [(location.latitude, location.longitude) for location in locations]# 创建DataFramedf = pd.DataFrame(coords, columns=["Latitude", "Longitude"], index=addresses)print(df)处理地理编码失败处理地理编码失败的情况,避免程序崩溃:123456789101112131415from geopy.geocoders import Nominatim# 初始化地理编码器geolocator = Nominatim(user_agent="geoapiExercises")# 定义地理编码函数def geocode_address(address):    try:        location = geolocator.geocode(address)        return (location.latitude, location.longitude)    except Exception as e:        print(f"Error geocoding {address}: {e}")        return (None, None)# 测试地理编码函数address = "1600 Amphitheatre Parkway, Mountain View, CA"coords = geocode_address(address)print(coords)使用不同的距离计算方法Geopy提供了多种距离计算方法,满足不同精度需求:123456789from geopy.distance import geodesic, great_circle# 定义两个地理坐标coords_1 = (37.4219999, -122.0840575)coords_2 = (40.712776, -74.005974)# 使用不同的距离计算方法geodesic_distance = geodesic(coords_1, coords_2).milesgreat_circle_distance = great_circle(coords_1, coords_2).milesprint(f"Geodesic Distance: {geodesic_distance} miles")print(f"Great Circle Distance: {great_circle_distance} miles")实际应用案例地理编码和数据可视化将地理编码与数据可视化相结合,展示多个地点的分布:123456789101112131415161718192021import pandas as pdimport foliumfrom geopy.geocoders import Nominatim# 初始化地理编码器geolocator = Nominatim(user_agent="geoapiExercises")# 创建示例地址列表addresses = ["1600 Amphitheatre Parkway, Mountain View, CA",             "1 Infinite Loop, Cupertino, CA",             "500 Terry A Francois Blvd, San Francisco, CA"]# 批量地理编码locations = [geolocator.geocode(address) for address in addresses]coords = [(location.latitude, location.longitude) for location in locations]# 创建DataFramedf = pd.DataFrame(coords, columns=["Latitude", "Longitude"], index=addresses)# 创建地图m = folium.Map(location=[37.7749, -122.4194], zoom_start=10)# 添加标记for idx, row in df.iterrows():    folium.Marker([row["Latitude"], row["Longitude"]], popup=idx).add_to(m)# 保存地图m.save("map.html")距离计算和最优路径计算多个地点之间的距离并找出最优路径:1234567891011121314151617from geopy.distance import geodesicimport itertools# 定义多个地理坐标locations = {    "Location1": (37.4219999, -122.0840575),    "Location2": (40.712776, -74.005974),    "Location3": (34.052235, -118.243683),    "Location4": (51.507351, -0.127758)}# 计算所有地点对之间的距离distances = {}for (loc1, coord1), (loc2, coord2) in itertools.combinations(locations.items(), 2):    distance = geodesic(coord1, coord2).miles    distances[f"{loc1} to {loc2}"] = distance# 输出距离for route, distance in distances.items():    print(f"{route}: {distance} miles")创建一个基于位置的推荐系统基于用户当前位置推荐最近的餐馆:1234567891011121314151617181920212223from geopy.distance import geodesicfrom geopy.geocoders import Nominatim# 初始化地理编码器geolocator = Nominatim(user_agent="geoapiExercises")# 定义餐馆列表restaurants = {    "Restaurant1": "1600 Amphitheatre Parkway, Mountain View, CA",    "Restaurant2": "1 Infinite Loop, Cupertino, CA",    "Restaurant3": "500 Terry A Francois Blvd, San Francisco, CA"}# 用户当前位置user_location = "37.7749, -122.4194"# 获取用户坐标user_coords = tuple(map(float, user_location.split(", ")))# 计算用户与每个餐馆的距离distances = {}for name, address in restaurants.items():    restaurant_coords = geolocator.geocode(address)    distance = geodesic(user_coords, (restaurant_coords.latitude, restaurant_coords.longitude)).miles    distances[name] = distance# 推荐最近的餐馆closest_restaurant = min(distances, key=distances.get)print(f"The closest restaurant is {closest_restaurant}, {distances[closest_restaurant]:.2f} miles away.")总结Geopy库是Python处理地理数据的一个强大工具,能够简洁高效地实现地理编码、反向地理编码和地理距离计算。通过使用Geopy,开发者可以轻松集成多种地理编码服务,并在各种应用场景中实现地理数据的处理和分析。本文详细介绍了Geopy的安装与配置、核心功能、基本和高级用法,并通过实际应用案例展示了其在地理编码与数据可视化、距离计算和位置推荐系统中的应用。希望本文能帮助大家更好地理解和使用Geopy库,在地理数据处理和分析项目中提高效率和精度。
  • [技术干货] Python GUI框架中的PyQt详解【转】
    PyQt是Python语言中最强大且广泛应用的GUI框架之一,基于Qt库的Python绑定实现。其模块化架构和跨平台特性(Windows、macOS、Linux)使其成为开发桌面应用的理想选择。本文将深入解析PyQt的核心模块,并通过代码示例展示其应用场景一、PyQt核心模块概览PyQt将Qt功能划分为多个子模块,每个模块专注于特定领域的功能实现。以下是主要模块及其作用:模块名功能描述典型应用场景QtCore核心非GUI功能信号槽、文件处理、多线程QtGui图形组件基础绘图、字体、图像处理QtWidgetsUI控件库窗口、按钮、输入框等控件QtNetwork网络通信HTTP请求、TCP/UDP通信QtSql数据库交互SQL查询、事务管理QtMultimedia多媒体处理音频播放、视频流处理QtWebEngine网页渲染内嵌浏览器、Web内容显示QtCharts数据可视化折线图、柱状图、饼图二、核心模块详解与示例1. QtCore - 核心基础模块提供基础功能如对象通信机制(信号与槽)、事件循环和文件处理。关键类:QObject:所有Qt对象的基类QTimer:定时器QFile:文件操作QThread:多线程支持示例:定时更新界面123456789101112from PyQt5.QtCore import QTimer, QObject, pyqtSignalclass Worker(QObject):    update_signal = pyqtSignal(str)    def __init__(self):        super().__init__()        self.timer = QTimer()        self.timer.timeout.connect(self.update_time)    def update_time(self):        from datetime import datetime        self.update_signal.emit(datetime.now().strftime("%H:%M:%S"))    def start(self):        self.timer.start(1000)  # 每秒触发 2. QtWidgets - UI控件库构建用户界面的核心模块,包含40+种预制控件。关键组件:QApplication:应用主循环QMainWindow:主窗口框架QPushButton:按钮QLabel:文本标签QLineEdit:单行输入框示例:创建基础窗口12345678910111213141516from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButtonclass MainWindow(QMainWindow):    def __init__(self):        super().__init__()        self.setWindowTitle("PyQt Demo")        self.setGeometry(100, 100, 400, 300)        btn = QPushButton("点击我", self)        btn.move(150, 150)        btn.clicked.connect(self.on_click)    def on_click(self):        print("按钮被点击!")if __name__ == "__main__":    app = QApplication([])    window = MainWindow()    window.show()    app.exec_() 3. QtGui - 图形处理处理绘图、字体管理和图像操作的基础模块。核心功能:QPainter:2D绘图QFont:字体管理QPixmap:图像处理示例:自定义绘图1234567from PyQt5.QtWidgets import QWidgetfrom PyQt5.QtGui import QPainter, QColorclass Canvas(QWidget):    def paintEvent(self, event):        painter = QPainter(self)        painter.setBrush(QColor(255, 0, 0))        painter.drawEllipse(50, 50, 100, 100)  # 绘制红色圆形 4. QtNetwork - 网络通信实现HTTP请求、TCP/UDP通信等网络功能。示例:HTTP GET请求123456789101112from PyQt5.QtNetwork import QNetworkAccessManager, QNetworkRequestfrom PyQt5.QtCore import QUrlclass Downloader:    def __init__(self):        self.manager = QNetworkAccessManager()        self.manager.finished.connect(self.handle_response)    def fetch(self, url):        request = QNetworkRequest(QUrl(url))        self.manager.get(request)    def handle_response(self, reply):        data = reply.readAll()        print(f"收到 {len(data)} 字节数据") 5. QtSql - 数据库交互支持多种数据库(SQLite、MySQL、PostgreSQL等)的统一接口。示例:SQLite操作123456789from PyQt5.QtSql import QSqlDatabase, QSqlQuery# 创建数据库连接db = QSqlDatabase.addDatabase("QSQLITE")db.setDatabaseName("mydatabase.db")if db.open():    query = QSqlQuery()    query.exec_("CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT)")    query.exec_("INSERT INTO users (name) VALUES ('Alice')")    db.close() 6. QtWebEngine - 网页渲染基于Chromium的现代网页渲染引擎。示例:内嵌浏览器12345678from PyQt5.QtWebEngineWidgets import QWebEngineViewfrom PyQt5.QtWidgets import QMainWindowclass BrowserWindow(QMainWindow):    def __init__(self):        super().__init__()        self.browser = QWebEngineView()        self.setCentralWidget(self.browser)        self.browser.load(QUrl("https://www.example.com")) 
  • [技术干货] Python Dash框架在数据可视化仪表板中的应用与实践记录【转】
    1. 什么是Plotly Dash?Plotly Dash是一个基于Python的框架,用于创建交互式的Web应用程序,特别适用于数据科学家和分析师。它不需要使用JavaScript即可创建高度互动和可定制的仪表板。Dash允许用户通过简单的Python代码,结合Plotly图表和HTML组件,构建丰富的用户界面。1.1 Dash的优势无缝集成:Dash可以与Plotly的图表以及Pandas等数据处理库无缝集成。无需前端技能:用户无需掌握HTML、CSS和JavaScript就能构建复杂的Web应用。丰富的交互功能:Dash支持回调函数(Callbacks)来更新图表,允许用户与数据进行互动。2. 环境配置在开始编写Dash应用之前,首先需要确保安装了相关的库。你可以通过以下命令安装Plotly和Dash:1pip install plotly dash安装完成后,即可开始编写Dash应用。3. 创建第一个互动仪表板3.1 创建一个简单的Dash应用首先,创建一个简单的应用,它展示了一个带有交互功能的Plotly图表。我们将使用Dash的dash_core_components和dash_html_components库来构建应用的布局。123456789101112131415161718import dashfrom dash import dcc, htmlimport plotly.express as pximport pandas as pd# 创建Dash应用app = dash.Dash(__name__)# 加载数据集df = px.data.gapminder()# 创建Plotly图表fig = px.scatter(df, x="gdpPercap", y="lifeExp", color="continent", size="pop", hover_name="country")# 创建布局app.layout = html.Div([    html.H1("互动数据仪表板示例"),    dcc.Graph(id="scatter-plot", figure=fig),])# 运行应用if __name__ == "__main__":    app.run_server(debug=True) 3.2 代码解析Dash应用创建:使用dash.Dash()初始化一个Dash应用。数据加载:使用Plotly的px.data.gapminder()函数加载Gapminder数据集,这个数据集包含各国的GDP、生命期望、人口等信息。创建图表:使用plotly.express.scatter创建一个散点图,其中x轴表示GDP,y轴表示生命期望,点的颜色代表洲,点的大小代表人口。布局设计:使用dash_html_components中的html.Div创建网页布局,html.H1用于显示标题,dcc.Graph用于显示图表。运行应用:调用app.run_server()启动Dash应用,浏览器会自动打开本地服务器并显示仪表板。3.3 结果展示运行上面的代码后,浏览器会显示一个散点图,其中每个点代表一个国家。用户可以通过交互(如鼠标悬停)查看详细信息,图表的颜色和大小表示不同的变量(如洲和人口)。4. 添加互动功能为了让仪表板更加互动,我们可以通过Dash的回调(callback)功能,使用户能够与图表进行互动,实时更新数据。4.1 添加滑动条和图表更新我们将在仪表板中添加一个滑动条,允许用户选择显示特定年份的数据,图表根据用户选择的年份进行更新。12345678910111213141516171819202122232425from dash import Input, Output# 创建布局app.layout = html.Div([    html.H1("互动数据仪表板示例"),    dcc.Graph(id="scatter-plot"),    dcc.Slider(        id="year-slider",        min=df["year"].min(),        max=df["year"].max(),        value=df["year"].min(),        marks={year: str(year) for year in df["year"].unique()},    ),])# 定义回调函数@app.callback(    Output("scatter-plot", "figure"),    [Input("year-slider", "value")])def update_graph(selected_year):    filtered_df = df[df["year"] == selected_year]    fig = px.scatter(filtered_df, x="gdpPercap", y="lifeExp", color="continent", size="pop", hover_name="country")    return fig# 运行应用if __name__ == "__main__":    app.run_server(debug=True) 4.2 代码解析添加滑动条:使用dcc.Slider组件添加一个滑动条,允许用户选择年份。min和max设置滑动条的最小值和最大值,value设置默认值。回调函数:使用@app.callback装饰器定义一个回调函数,回调函数的输入是滑动条的值(选择的年份),输出是更新后的图表。在回调函数update_graph中,我们根据选定的年份过滤数据,然后使用Plotly生成新的散点图。动态更新图表:每当用户调整滑动条时,回调函数会触发,图表会自动更新,显示选定年份的数据。4.3 结果展示运行上述代码后,你将看到一个交互式图表和一个滑动条。用户可以通过滑动条选择不同的年份,图表会实时更新,展示该年份的数据。5. 深入分析:回调机制和布局设计5.1 Dash回调机制Dash的核心功能之一就是回调机制。回调函数允许应用程序在用户交互时动态更新内容。在本示例中,滑动条的值作为输入,图表的更新作为输出。这种机制确保了界面和数据的一致性,所有的互动都通过回调函数来处理。回调函数的结构通常包括:Input:用户交互的触发源,如按钮、滑动条等。Output:根据输入更新的组件,如图表、文本等。State:附加的上下文信息(可选)。5.2 布局设计Dash提供了多种布局组件,如html.Div、dcc.Graph、dcc.Dropdown等,可以灵活组合用于创建复杂的仪表板。布局是Dash应用的基础,它决定了用户界面的组织结构。在设计仪表板时,除了图表之外,还可以添加更多交互组件,如下拉菜单、日期选择器、按钮等。这些组件可以与回调函数结合,提供更丰富的用户体验。6. 高级功能:布局与多图表交互Dash不仅可以创建简单的图表,还支持更复杂的布局和交互功能。让我们来探讨如何在Dash中实现多个图表之间的互动,用户选择某一数据点后,其他图表根据选定的数据更新。6.1 多图表联动我们将构建一个仪表板,包含两个图表:一个展示GDP与生命期望的散点图,另一个展示生命期望的分布图。用户点击散点图中的某个数据点时,分布图将根据选中的国家更新。1234567891011121314151617181920212223242526272829303132333435363738import dashfrom dash import dcc, html, Input, Outputimport plotly.express as pximport pandas as pd# 创建Dash应用app = dash.Dash(__name__)# 加载数据集df = px.data.gapminder()# 创建GDP与生命期望的散点图scatter_fig = px.scatter(df, x="gdpPercap", y="lifeExp", color="continent", size="pop", hover_name="country")# 创建生命期望的分布图histogram_fig = px.histogram(df, x="lifeExp", color="continent", marginal="box")# 创建布局app.layout = html.Div([    html.H1("多图表联动示例"),    # 散点图    dcc.Graph(id="scatter-plot", figure=scatter_fig),    # 生命期望分布图    dcc.Graph(id="histogram-plot", figure=histogram_fig),])# 回调函数:通过点击散点图更新分布图@app.callback(    Output("histogram-plot", "figure"),    Input("scatter-plot", "clickData"))def update_histogram(click_data):    if click_data is None:        # 如果没有点击数据,显示完整的分布图        return histogram_fig    # 获取点击的国家    country = click_data["points"][0]["hovertext"]    filtered_df = df[df["country"] == country]    # 创建更新后的分布图    updated_histogram = px.histogram(filtered_df, x="lifeExp", color="continent", marginal="box")    return updated_histogram# 运行应用if __name__ == "__main__":    app.run_server(debug=True) 6.2 代码解析两个图表:第一个图表是一个散点图,展示了GDP与生命期望的关系。第二个图表是一个分布图,展示生命期望的分布情况,并用颜色区分不同的洲。回调函数:当用户点击散点图中的某个点时,回调函数会触发,更新分布图。点击事件通过clickData获取,回调函数根据所选国家更新分布图的内容。交互更新:如果用户点击某个国家,分布图会只展示该国的数据;如果没有点击任何点,则分布图展示所有数据。6.3 结果展示运行应用后,你将看到两个图表:一个是GDP与生命期望的散点图,另一个是生命期望的分布图。当你点击散点图中的某个点时,分布图会更新,只显示选定国家的生命期望数据。这种互动性大大增强了仪表板的可用性和用户体验。
  • [大赛资讯] general_error 这个针对python的报错主要是什么情况
    本地交互成功且具有一定分数,但是一到线上提交就成了general_error  的 报错,这个应该怎么看代码出现的问题呢
  • [技术干货] Python 中的异步与同步深度解析(实践记录)【转】
    Python中的异步与同步:深度解析与实践在Python编程世界里,异步和同步的概念是理解程序执行流程和性能优化的关键。这篇文章将带你深入了解它们的差异,以及阻塞和非阻塞的特性,同时通过实际代码示例来加深理解。异步与同步的定义异步异步意味着多任务处理,任务之间的执行没有严格的先后顺序,甚至可以同时运行。这就好比你一边听音乐,一边浏览网页,听音乐和浏览网页这两个任务之间互不干扰,多条任务的执行路径同时存在,程序有多个“主线”并行处理任务。同步同步同样是处理多任务,但任务之间有严格的先后顺序。只有前一个任务执行完成,下一个任务才能开始。这类似于你排队买东西,必须一个人买完,下一个人才能接着买,整个过程只有一条“主线”。阻塞与非阻塞的概念阻塞从调用者的角度来看,如果在调用某个操作时,程序被卡住,无法继续向下执行,必须等待该操作完成,这种情况就是阻塞。比如你打电话叫外卖,在等待外卖送达的这段时间里,你什么其他事都做不了,只能干等着,这就是“阻塞”状态。非阻塞当调用某个操作时,程序不会被卡住,能够继续向下执行,无需等待该操作完成,这就是非阻塞。还是以叫外卖为例,你下单后可以继续做自己的事情,不用一直等着外卖,这就是“非阻塞”状态。同步阻塞与异步非阻塞示例下面通过Python代码来具体展示异步和同步的工作方式。这里我们使用multiprocessing模块中的Pool来创建进程池,实现多任务处理。12345678910111213141516171819202122232425from multiprocessing import Poolimport timeimport osdef water():    """烧水"""    print(f"子进程 pid={os.getpid()}")    for i in range(5):        print("正在烧水中")        time.sleep(0.5)    return "水烧开了"def handle_water(message):    """接收烧开水的信息"""    print(f"进程pid={os.getpid()} 收到了异步任务的结束信息: {message}")pool = Pool(3)print(f"主进程 pid={os.getpid()}")for i in range(3):    print("打游戏")    time.sleep(0.5)# 回调pool.apply_async(water, callback=handle_water)  # 异步添加任务for i in range(20):    print("打游戏")    time.sleep(0.5)pool.close()pool.join()在这段代码中:首先创建了一个进程池Pool,最大进程数为3。主进程先执行一段“打游戏”的操作,循环3次,每次间隔0.5秒。然后使用pool.apply_async方法异步地添加water任务到进程池,并设置了回调函数handle_water。water任务模拟烧水过程,会打印当前子进程ID并每隔0.5秒输出“正在烧水中”,完成后返回“水烧开了”。handle_water函数用于接收water任务完成后的信息并打印。接着主进程继续执行“打游戏”操作,循环20次,每次间隔0.5秒。这期间,water任务在后台异步执行。最后,调用pool.close()关闭进程池,不再接受新任务,pool.join()让主进程等待所有子进程完成任务后再结束。通过这个示例,可以清晰地看到异步任务在后台执行,不会阻塞主进程的其他操作,体现了异步非阻塞的特性。如果将pool.apply_async换成pool.apply,那么就是同步阻塞的效果,water任务执行时会阻塞主进程,直到任务完成才会继续执行后续代码。理解异步、同步、阻塞和非阻塞的概念,能帮助开发者根据实际需求优化程序性能,合理利用系统资源,让程序运行得更加高效和灵活。无论是处理I/O密集型任务,还是CPU密集型任务,选择合适的执行方式都是关键。
  • [大赛资讯] python提交代码后报错unexpected_elon
    本来是本地修改后的代码放到云端跑就会报unexpected_elon然后定位到错误问题后尝试在demo程序中添加req_phase = [[False for _ in range(5+1)] for _ in range(MAX_REQUEST_NUM)]  # 请求完成度 然后放到云端跑就会报这个错,不知道是不是爆内存了,但是在CPP的demo上开这个数组就不会报错
  • [大赛资讯] 希望允许使用共享对象文件(.so文件)
    诉求希望在zip包支持的后缀格式中增加.so理由作为Python开发者,比赛 “将不同语言的评测时长设置为相等的值” 这件事本身对于Python语言就是不公平的。加之不允许使用第三方库,导致了Python代码的速度提升空间变得非常有限,稍微复杂的算法就会导致TimeOut。但是在日常开发的过程中,我们经常通过将Python代码编译成.so(.pyd)的方式加速Python的运行,以消除语言本身的速度劣势,达到接近但略逊于C/C++同等算法的速度水平。我认为这是正常且合理的Python优化方式。至于源码可见性的问题,赛事组委会可以要求我们在提交编译的压缩包中同时包含源码,我亦没有理由拒绝。不同语言之间各有所长,优化方式也不尽相同。既然比赛组委会给出了使用Python语言的可能,我也希望能做到不同语言之间的相对公平。希望组委会能回应我的建议,祝愿比赛能够顺利进行。
  • [大赛资讯] 为什么本地只需要100多s,上传后却超时
    为什么本地只需要100多s,上传后却超时?之前都是上传后更快呢 
  • [大赛资讯] 第一次参加该怎么办
    新手第一次参加这个比赛不知道要先干什么,请问该怎么办
  • [大赛资讯] python本地执行没有问题,上传后general_error
    本地测试过了,上传显示general_error是什么原因呀?感觉不像是运行内存的问题
  • [技术干货] python想学好你一定要掌握已下知识(新手)-转载
    引言:我们今天学习语法基础Python 是一种简单易学、功能强大的编程语言,广泛应用于数据分析、人工智能、Web 开发、自动化脚本等领域。以下是 Python 的基础知识总结,适合初学者快速上手。有关if的语法:if判断:if 判断是 Python 中用于条件控制的基本结构,它允许程序根据条件的真假执行不同的代码块。以下是 if 判断的详细用法和示例:条件:一个布尔表达式(结果为 True 或 False)。代码块:条件为真时执行的代码,必须缩进(通常为 4 个空格或 1 个 Tab)基本语法:示例:age = 18if age >= 18:    print("你已经成年了!")if-else结构:if-else 结构是 Python 中用于条件控制的基本语法之一,它允许程序根据条件的真假执行不同的代码块。if-else 结构是编程中最常用的逻辑控制工具之一,适用于各种场景,如数据验证、流程控制、状态判断等。条件:一个布尔表达式(结果为 True 或 False)。if 代码块:条件为真时执行的代码。else 代码块:条件为假时执行的代码。基本语法: 示例:age = 16if age >= 18:    print("你已经成年了!")else:    print("你还未成年!")if else使用的场景: 1.数据验证:检查用户输入是否符合要求password = "123456" if len(password) >= 6:    print("密码有效!")else:    print("密码太短,至少需要 6 个字符!")2.状态判断:根据变量的值执行不同的操作is_raining = True if is_raining:    print("记得带伞!")else:    print("今天天气不错!")3.数值比较:比较两个数的大小a = 10b = 20 if a > b:    print("a 大于 b")else:    print("a 小于或等于 b")if else的嵌套:if-else 的嵌套是指在 if 或 else 代码块中再嵌套另一个 if-else 结构。这种嵌套结构可以用于处理更复杂的条件逻辑,允许多层次的条件判断。以下是关于 if-else 嵌套的详细介绍,包括语法、使用场景、注意事项以及实际示例。基本语法: 外层 if-else:首先判断 条件1。内层 if-else:在 条件1 为真时,进一步判断 条件2。示例: username = "admin"password = "123456" if username == "admin":    if password == "123456":        print("登录成功!")    else:        print("密码错误!")else:    print("用户名错误!")运算符运算符是编程语言中用于执行各种操作的符号或关键字。Python 提供了丰富的运算符,包括算术运算符、比较运算符、逻辑运算符、赋值运算符、位运算符、成员运算符和身份运算符等。以下是 Python 中常用运算符的详细介绍:算术运算符a = 10b = 3print(a + b)  # 输出:13print(a // b) # 输出:3print(a ** b) # 输出:1000 比较运算符用于比较两个值,返回布尔值(True 或 False)。x = 5y = 3print(x > y)  # 输出:Trueprint(x == y) # 输出:False逻辑运算符a = Trueb = Falseprint(a and b)  # 输出:Falseprint(a or b)   # 输出:Trueprint(not a)    # 输出:False赋值运算符x = 10x += 5  # x = x + 5print(x)  # 输出:15 位运算符示例:a = 5  # 二进制:0101b = 3  # 二进制:0011print(a & b)  # 输出:1 (二进制:0001)print(a << 1) # 输出:10 (二进制:1010)Python 提供了丰富的运算符,可以满足各种编程需求。掌握这些运算符的用法和优先级,是编写高效、简洁代码的基础。————————————————                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。                        原文链接:https://blog.csdn.net/2401_88862650/article/details/145816542
  • [技术干货] python安卓自动化pyaibote实践------学习通自动刷课-转载
     环境描述aibote,雷电模拟器,学习通,python3.12,pyaibote框架。环境不会搭建可以看我这篇博客:pyaibote--安卓自动化环境配置与基础的使用方法_aibote链接手机-CSDN博客近期可能出现的问题截止2024.12.13,雷电模拟器可能会出现学校通使用的一点问题。如果遇到问题可以从里面找找。https://blog.csdn.net/2302_79590880/article/details/144453648?sharetype=blogdetail&sharerId=144453648&sharerefer=PC&sharesource=2302_79590880&spm=1011.2480.3001.8118成品代码from PyAibote import AndroidBotMainimport time # 2. 自定义一个脚本类,继承 AndroidBotMainclass CustomAndroidScript(AndroidBotMain):    #初始化配置    Log_Level = "DEBUG"    Log_Storage = True    def start_xuexitong(self):        #打开学习通,进入看课区域        result = self.start_app("学习通", 5, 0.5)        print("app运行状态:{}".format(result))        place=self.get_element_rect("com.chaoxing.mobile/com.chaoxing.mobile:id=tabButton[3]", 15, 0.5)        self.click((place))        print("点击任务状态:{}".format(place))        place=self.get_element_rect("com.chaoxing.mobile/com.chaoxing.mobile:id=myCourse", 15, 0.5)        self.click((place))        print("点击任务状态:{}".format(place))     def select_class(self):        #选择目标课程,并且判断是否有课程        self.my_class=input("输入想要刷课的名称:")        result = self.init_ocr_server("127.0.0.1", False, False, False)        print("初始化状态:{}".format(result))        result = self.get_text()        print(result)        if self.my_class in result:            print("发现目标课程")            result = self.find_text(self.my_class)            print(result)            self.click(result)            time.sleep(1)     def look_class(self):        #观看课程        self.current_class=float(input("(示例:2.3)\n输入你当前刷课进度:")) #当前的课程        self.show_first_class()        while True:            self.cut_class()            print("start look class")            time.sleep(2)            result = self.find_text("视频")            print(result)            self.click(result)            time.sleep(3)            self.ago_now()     def ago_now(self):        #判断课程是否看过        result=self.find_text("任务点已完成")        if result==():            result = self.get_element_rect("com.chaoxing.mobile/android.widget.Button@text=播放", 5, 0.5)            self.click(result)            time.sleep(3)            #判断是否看完            i=1            while i==1:                time.sleep(5)                outline=self.element_exists("com.chaoxing.mobile/android.widget.Button@text=重试", 1, 0.5)                if outline: #判断是否断网                    self.click_element("com.chaoxing.mobile/android.widget.Button@text=重试", 1, 0.5)                result = self.element_exists("com.chaoxing.mobile/com.chaoxing.mobile:id=start", 1, 0.5)                if result: #判断是否看完                    self.back()                    time.sleep(2)                    result=self.find_text("任务点已完成")                    if result!=():                        break                    else:                        self.click_element("com.chaoxing.mobile/android.widget.Button@text=播放", 1, 0.5)        self.back()     def cut_class(self):        #看完课程更替视频        self.infor_dispose()        while True:            #匹配课程            print(self.current_class)            result = self.element_exists("com.chaoxing.mobile/android.widget.TextView@text={}".format(self.current_class), 5, 0.5)            print("当前课程的状态:{}".format(result))            if result==True: #如果存在课程,就点击进入课程                result=self.click_element("com.chaoxing.mobile/android.widget.TextView@text={}".format(self.current_class), 5, 0.5)                self.current_class += 0.1  # 转换到下一门课                break            else: #如果不存在,下滑一下屏幕再匹配。                print("屏幕未找到对应元素,正在执行下滑操作")                self.swipe((306, 1116), (306, 750), 1)                result = self.element_exists(                    "com.chaoxing.mobile/android.widget.TextView@text={:.1f}".format(self.current_class), 5, 0.5)                print("下滑后匹配元素状态:{}".format(result))                if result: #如果匹配到了进入                    self.click_element(                        "com.chaoxing.mobile/android.widget.TextView@text={:.1f}".format(self.current_class), 5, 0.5)                    self.current_class += 0.1  # 转换到下一门课                    break                else: #匹配不到可能是转换章节                    self.current_class+=1                    self.current_class-=(self.current_class%1)                    self.current_class+=0.1                    result = self.element_exists(                        "com.chaoxing.mobile/android.widget.TextView@text={}".format(self.current_class), 5, 0.5)                    if result: #转换章节后匹配到                        self.click_element(                            "com.chaoxing.mobile/android.widget.TextView@text={}".format(self.current_class), 5,                            0.5)                        self.current_class += 0.1  # 转换到下一门课                        break                    else: #匹配不到的话                        print("该课程已经刷完,或者程序出错。")                        break     def show_first_class(self):        #防止第一个课程不在屏幕内        result = self.element_exists(            "com.chaoxing.mobile/android.widget.TextView@text={}".format(self.current_class), 5, 0.5)        if result:            print("初始化目标课程在屏幕内")        else:            for i in range(15):                self.swipe((402, 1404), (402, 564), 2)                result = self.element_exists(                    "com.chaoxing.mobile/android.widget.TextView@text={}".format(self.current_class), 3, 0.5)                if result:                    break     def infor_dispose(self):        #解决python浮点不精准问题        self.current_class=round(self.current_class,2)        self.current_class_1=self.current_class%0.1        if self.current_class_1==0:            self.current_class=round(self.current_class,1)     def script_main(self):        #执行函数        self.start_xuexitong()        self.select_class()        self.look_class()  if __name__ == '__main__':    CustomAndroidScript.execute("0.0.0.0", 16678)效果演示因为我已经刷完了,所以他点进去后,发现任务已完成就退出来进行下一节了。他支持选择课程,定义开始课程节数,自动处理网络重连问题。安卓自动化演示需求操作分析我们先来分析一下学习通刷课的操作流程。开启APP 点击我,点击课程,然后从里面选取要刷的课。   选好课程后,我们需要选择我们要从哪节开始刷。 点进去后要点击视频切换到视频的页面 之后我们要判断这节有没有刷,刷完返回下一节,没刷就进去看。 如果看的话,还要判断好是否结束了。还要应对中途可能发生的网络异常情况。 识别到看完后,我们就要返回进入下一节以此类推代码解刨基本框架首先是pyaibote的基本运行框架。我们把要执行的代码放到script_main中。  # 1. 导入 AndroidBotMain 类  from PyAibote import AndroidBotMain  import time        # 2. 自定义一个脚本类,继承 AndroidBotMain  class CustomAndroidScript(AndroidBotMain):        # 2.1. 设置是否终端打印输出 DEBUG:输出, INFO:不输出, 默认打印输出      Log_Level = "DEBUG"         # 2.2. 终端打印信息是否存储LOG文件 True: 储存, False:不存储      Log_Storage = True            # 2.3. 注意:script_main 此方法是脚本执行入口必须存在此方法      def script_main(self):          # 显示手机最近任务列表          result = self.recent_tasks()          print(result)                  if __name__ == '__main__':      # 3. 注意:此处监听的端口号,必须和手机端的脚本端口号一致      # 3.1 监听 16678 号端口      CustomAndroidScript.execute("0.0.0.0", 16678)定义进入APP的方法我们需要通过找元素,点击进入这个区域。     def start_xuexitong(self):        #打开学习通,进入看课区域        result = self.start_app("学习通", 5, 0.5)        print("app运行状态:{}".format(result))        place=self.get_element_rect("com.chaoxing.mobile/com.chaoxing.mobile:id=tabButton[3]", 15, 0.5)        self.click((place))        print("点击任务状态:{}".format(place))        place=self.get_element_rect("com.chaoxing.mobile/com.chaoxing.mobile:id=myCourse", 15, 0.5)        self.click((place))        print("点击任务状态:{}".format(place))通过这个方法来点进这个课程页面。定义选课方法我们需要找到我们想要的课程,于是我们定义这个方法来找课程。    def select_class(self):        #选择目标课程,并且判断是否有课程        self.my_class=input("输入想要刷课的名称:")        #初始化文字识别服务        result = self.init_ocr_server("127.0.0.1", False, False, False)        print("初始化状态:{}".format(result))        #查找文本        result = self.get_text()        print(result)        if self.my_class in result:#如果目标课程在里面就点击进入            print("发现目标课程")            result = self.find_text(self.my_class)            print(result)            self.click(result)            time.sleep(1)定义看课方法选好课程后我们总要开始刷课吧。这个方法是用来看课相关的操作的。    def look_class(self):        #观看课程        self.current_class=float(input("(示例:2.3)\n输入你当前刷课进度:")) #当前的课程        self.show_first_class() #自定义的滑动函数(防止开始刷课的节数不在屏幕中)        while True: #循环执行            self.cut_class() #自定义切换方法,用来判断当前应该看哪节课,并点进去            print("start look class")            time.sleep(2) #防止未加载出页面就文字识别导致错误            result = self.find_text("视频")#识别文字            print(result)            self.click(result) #点击视频进去视频页面            time.sleep(3)            self.ago_now() #自定义函数,判断这节课是否刷完定义滑动方法因为我们有可以自定义开始刷课节数的功能,那么我们可能会遇到这个节数不在屏幕中会下滑的情况,这个方法就是判断并且识别这种情况的。    def show_first_class(self):        #防止第一个课程不在屏幕内        result = self.element_exists(            "com.chaoxing.mobile/android.widget.TextView@text={}".format(self.current_class), 5, 0.5)        if result: #判断屏幕中是否有这个课程的元素            print("初始化目标课程在屏幕内")        else: #如果没有            for i in range(15): #下拉寻找                self.swipe((402, 1404), (402, 564), 2)                result = self.element_exists(                    "com.chaoxing.mobile/android.widget.TextView@text={}".format(self.current_class), 3, 0.5)                if result: #如果该目标进入了屏幕就退出循环                    break定义切换,判断当前课程是否刷完的方法第一我们要点进去这节课,第二我们还要根据他的元素text1.1这类的章节数,来找下一节课,最后我们计算机会有浮点计算偏差,但是课程就是1.1,2.2。最后的结果不能出现偏差,所以我们要把结果转化为正确无偏差的。    def cut_class(self):        #看完课程更替视频        self.infor_dispose() #自定义方法解决计算机浮点计算偏差问题        while True:            #匹配课程            print(self.current_class)            result = self.element_exists("com.chaoxing.mobile/android.widget.TextView@text={}".format(self.current_class), 5, 0.5)            print("当前课程的状态:{}".format(result))            if result==True: #如果存在课程,就点击进入课程                result=self.click_element("com.chaoxing.mobile/android.widget.TextView@text={}".format(self.current_class), 5, 0.5)                self.current_class += 0.1  # 转换到下一门课                break            else: #如果不存在,下滑一下屏幕再匹配。                print("屏幕未找到对应元素,正在执行下滑操作")                self.swipe((306, 1116), (306, 750), 1)                result = self.element_exists(                    "com.chaoxing.mobile/android.widget.TextView@text={:.1f}".format(self.current_class), 5, 0.5)                print("下滑后匹配元素状态:{}".format(result))                if result: #如果匹配到了进入                    self.click_element(                        "com.chaoxing.mobile/android.widget.TextView@text={:.1f}".format(self.current_class), 5, 0.5)                    self.current_class += 0.1  # 转换到下一门课                    break                else: #匹配不到可能是转换章节                    self.current_class+=1                    self.current_class-=(self.current_class%1)                    self.current_class+=0.1                    result = self.element_exists(                        "com.chaoxing.mobile/android.widget.TextView@text={}".format(self.current_class), 5, 0.5)                    if result: #转换章节后匹配到                        self.click_element(                            "com.chaoxing.mobile/android.widget.TextView@text={}".format(self.current_class), 5,                            0.5)                        self.current_class += 0.1  # 转换到下一门课                        break                    else: #匹配不到的话                        print("该课程已经刷完,或者程序出错。")                        break定义去除偏差方法python浮点数加减其实会有一个很小偏差。比如1.1+0.1=1.2000000002。但是我们下一节就是1.2这样会出错。于是我们用下面方法来四舍五入到我们规定的格式。保留两位小数,如果利用取余判断小数第二位是否为0。为0保留一位,不为0保留两位。    def infor_dispose(self):        #解决python浮点不精准问题        self.current_class=round(self.current_class,2)        self.current_class_1=self.current_class%0.1        if self.current_class_1==0:            self.current_class=round(self.current_class,1)定义判断这节该不该刷,以及刷完退出的方法我们肯定不能刷刷过的课浪费大量时间,这就需要我们加一个判定。循环前是进行判断,有没有那个任务点已完成。后面是刷课结束以及判断是否断网。    def ago_now(self):        #判断课程是否看过        result=self.find_text("任务点已完成")        if result==():            result = self.get_element_rect("com.chaoxing.mobile/android.widget.Button@text=播放", 5, 0.5)            self.click(result)            time.sleep(3)            #判断是否看完            i=1            while i==1:                time.sleep(5)                outline=self.element_exists("com.chaoxing.mobile/android.widget.Button@text=重试", 1, 0.5)                if outline: #判断是否断网                    self.click_element("com.chaoxing.mobile/android.widget.Button@text=重试", 1, 0.5)                result = self.element_exists("com.chaoxing.mobile/com.chaoxing.mobile:id=start", 1, 0.5)                if result: #判断是否看完                    self.back()                    time.sleep(2)                    result=self.find_text("任务点已完成")                    if result!=():                        break                    else:                        self.click_element("com.chaoxing.mobile/android.widget.Button@text=播放", 1, 0.5)        self.back()最后组装方法在执行方法中拼凑方法。主要的方法是三大步骤。进入,选课,以及刷课    def script_main(self):        #执行函数        self.start_xuexitong()        self.select_class()        self.look_class()————————————————                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。                        原文链接:https://blog.csdn.net/2302_79590880/article/details/138360025
  • [技术干货] 常见Python简单算法易错题总结-转载
    试题1: Python抓取远程图片到本地,你会用什么函数?答案:requests库中的requests.get()函数结合open()函数。解析:使用requests.get(url)来获取网络上的图片资源,然后使用open('filename', 'wb')以二进制写模式打开一个本地文件,并使用write()方法将获取到的内容写入文件。例如:import requestsurl = 'http://example.com/image.jpg'response = requests.get(url)with open('local_image.jpg', 'wb') as file:    file.write(response.content)试题2: 如何在Python中实现字符串的反转?答案:使用切片操作。解析:在Python中,可以通过字符串的切片功能轻松地反转字符串。使用步长为-1的切片即可实现。示例代码如下:s = "Hello, World!"reversed_s = s[::-1]print(reversed_s)输出将会是!dlroW ,olleH。试题3: 如何检查一个列表中是否所有元素都是相同的?答案:使用集合(set)。解析:可以将列表转换为集合,如果转换后的集合长度为1,则说明列表中所有元素都相同。示例代码如下:lst = [1, 1, 1, 1]if len(set(lst)) == 1:    print("All elements are the same.")else:    print("Elements are not the same.")试题4: 怎样在Python中生成一个随机密码?答案:使用random模块和string模块。解析:可以结合使用这两个模块来生成包含大写字母、小写字母、数字和特殊字符的随机密码。示例代码如下:import randomimport stringdef generate_password(length=12):    characters = string.ascii_letters + string.digits + string.punctuation    password = ''.join(random.choice(characters) for i in range(length))    return passwordprint(generate_password())试题5: 如何在Python中读取CSV文件?答案:使用csv模块。解析:csv模块提供了一个非常简单的方法来读取CSV文件。可以使用csv.reader对象来逐行读取CSV文件。示例代码如下:import csvwith open('file.csv', newline='') as csvfile:    reader = csv.reader(csvfile)    for row in reader:试题6: Python中如何实现单例模式?答案:使用类变量和私有构造函数。解析:通过将类的构造函数设为私有,并在类内部使用一个类变量来存储类的唯一实例,可以实现单例模式。示例代码如下:class Singleton:    _instance = None    def __new__(cls):        if cls._instance is None:            cls._instance = super(Singleton, cls).__new__(cls)        return cls._instance# 测试单例模式obj1 = Singleton()obj2 = Singleton()print(obj1 is obj2)  # 输出: True试题7: 如何在Python中查找列表中的重复元素?答案:使用集合(set)的特性。解析:可以将列表转换为集合,然后比较原列表和集合的元素,找出不在集合中的元素,即为重复元素。示例代码如下:lst = [1, 2, 2, 3, 4, 4, 5]seen = set()duplicates = []for item in lst:    if item in seen:        duplicates.append(item)    else:        seen.add(item)print(duplicates)  # 输出: [2, 4]试题8: 如何在Python中实现冒泡排序算法?答案:使用嵌套循环比较相邻元素并交换它们的位置。解析:外层循环遍历列表的所有元素,内层循环负责比较当前元素与下一个元素的大小,并在需要时交换它们。示例代码如下:def bubble_sort(arr):    n = len(arr)    for i in range(n):        for j in range(0, n-i-1):            if arr[j] > arr[j+1]:                arr[j], arr[j+1] = arr[j+1], arr[j]    return arrprint(bubble_sort([64, 34, 25, 12, 22, 11, 90]))输出将会是[11, 12, 22, 25, 34, 64, 90]。试题9: 如何在Python中计算两个日期之间的天数差?答案:使用datetime模块。解析:可以将日期字符串转换为datetime对象,然后使用减法运算符来计算两个日期之间的差值。示例代码如下:from datetime import datetimedate_format = "%Y-%m-%d"date1 = datetime.strptime('2022-01-01', date_format)date2 = datetime.strptime('2022-01-15', date_format)delta = date2 - date1print(delta.days)  # 输出: 14试题10: Python中如何将JSON字符串转换为字典?答案:使用json模块的loads()函数。解析:json.loads()函数可以将JSON格式的字符串解析为Python字典。示例代码如下:import jsonjson_str = '{"name": "John", "age": 30, "city": "New York"}'data = json.loads(json_str)print(data)  # 输出: {'name': 'John', 'age': 30, 'city': 'New York'}试题11: Python中如何实现字典的遍历?答案:使用items方法或直接迭代键。解析:你可以通过字典的items方法遍历所有的键值对,或者直接迭代字典的键。以下是两种方法的示例代码:my_dict = {'a': 1, 'b': 2, 'c': 3}# 使用items方法for key, value in my_dict.items():    print(key, value)# 直接迭代键for key in my_dict:    print(key, my_dict[key])试题12: Python中如何判断一个数字是否为偶数?答案:使用模运算符%。解析:在Python中,你可以使用模运算符%来判断一个数字是否能被2整除,从而判断它是否为偶数。以下是示例代码:number = 4if number % 2 == 0:    print(f"{number}是偶数")else:    print(f"{number}不是偶数")试题13: Python中如何实现字符串的拼接?答案:使用加法运算符或者格式化字符串。解析:你可以直接使用加法运算符合并字符串,或者使用格式化字符串的方法来拼接字符串。以下是两种方法的示例代码:str1 = "Hello"str2 = "World"# 使用加法运算符combined_str = str1 + " " + str2print(combined_str)  # 输出:Hello World# 使用格式化字符串combined_str = f"{str1} {str2}"print(combined_str)  # 输出:Hello World试题14: 如何从列表中删除元素?答案:使用remove方法或del语句或列表推导式。解析:你可以使用列表的remove方法删除指定元素,或者使用del语句通过索引删除元素,或者使用列表推导式创建不包含某元素的新列表。以下是三种方法的示例代码:numbers = [1, 2, 3, 4, 5]# 使用remove方法numbers.remove(3)print(numbers)  # 输出:[1, 2, 4, 5]# 使用del语句numbers = [1, 2, 3, 4, 5]del numbers[2]print(numbers)  # 输出:[1, 2, 4, 5]# 使用列表推导式numbers = [1, 2, 3, 4, 5]numbers = [x for x in numbers if x != 3]print(numbers)  # 输出:[1, 2, 4, 5]试题15: Python中如何将两个列表合并?答案:使用加法运算符或者extend方法。解析:你可以通过简单的加法运算符合并两个列表,或者使用列表的extend方法。以下是两种方法的示例代码:list1 = [1, 2, 3]list2 = [4, 5, 6]# 使用加法运算符merged_list = list1 + list2print(merged_list)  # 输出:[1, 2, 3, 4, 5, 6]# 使用extend方法list1 = [1, 2, 3]list1.extend(list2)print(list1)  # 输出:[1, 2, 3, 4, 5, 6]试题15: 如何找出列表中的最小值和最大值?答案:使用内置的min和max函数。解析:Python提供了方便的内置函数来找出列表中的最小值和最大值。以下是示例代码:numbers = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]min_value = min(numbers)max_value = max(numbers)print("最小值:", min_value)  # 输出:最小值: 1print("最大值:", max_value)  # 输出:最大值: 9试题16: Python中如何检查一个字符串是否包含子字符串?答案:使用in关键字。解析:在Python中,你可以简单地使用in关键字来检查一个字符串是否包含另一个子字符串。以下是示例代码:main_string = "Hello, world!"sub_string = "world"if sub_string in main_string:    print("子字符串存在于主字符串中")else:    print("子字符串不存在于主字符串中")试题17: 如何在Python中实现字典的键值对交换?答案: 使用字典推导式。解析: 可以通过遍历字典的项,并在字典推导式中交换键和值来实现键值对的交换。需要注意的是,如果字典中有重复的值,则在交换后会有数据丢失。示例代码如下:original_dict = {'a': 1, 'b': 2, 'c': 3}swapped_dict = {value: key for key, value in original_dict.items()}print("Original dictionary:", original_dict)print("Swapped dictionary:", swapped_dict)输出:Original dictionary: {'a': 1, 'b': 2, 'c': 3}Swapped dictionary: {1: 'a', 2: 'b', 3: 'c'}试题18: 如何在Python中计算两个数的最大公约数?答案: 使用辗转相除法(欧几里得算法)。解析: 辗转相除法是一种古老而高效的方法来计算两个正整数的最大公约数(GCD)。示例代码如下:def gcd(a, b):    while b != 0:        a, b = b, a % b    return anum1 = 48num2 = 18print(f"The GCD of {num1} and {num2} is {gcd(num1, num2)}")试题19: 怎样在Python中实现列表的排序?答案: 使用列表的sort()方法或内置函数sorted()。解析: 列表对象有一个sort()方法,它会就地对列表进行排序,并且可以指定升序或降序。另外,也可以使用内置函数sorted(),它返回一个新的已排序列表,而不会改变原列表。示例代码如下:# 使用列表的sort()方法升序排序my_list = [3, 1, 4, 1, 5]my_list.sort()print("Sorted list (in place):", my_list)# 使用sorted()函数降序排序sorted_list = sorted(my_list, reverse=True)print("Sorted list (new list):", sorted_list)# 输出# Sorted list (in place): [1, 1, 3, 4, 5]# Sorted list (new list): [5, 4, 3, 1, 1]试题20: 如何在Python中获取当前日期和时间?答案: 使用datetime模块。解析: Python的datetime模块提供了丰富的日期和时间处理功能。要获取当前的日期和时间,可以使用datetime.now()函数。示例代码如下:from datetime import datetimenow = datetime.now()print("Current date and time:", now)试题21: 怎样用Python读取一个文本文件的内容?答案: 使用内置函数open()。解析: 在Python中,可以通过调用内置函数open()并传入文件路径和模式(例如’r’代表只读模式)来打开文件,然后使用文件对象的read()或readlines()方法来读取内容。示例代码如下:# 以只读模式打开文件with open('example.txt', 'r') as file:    content = file.read()    print(content)试题22: 怎样用Python 求最长公共子串?def longest_common_substring(str1, str2):    m = len(str1)    n = len(str2)    # 创建一个二维数组来存储子问题的解    dp = [[0] * (n + 1) for _ in range(m + 1)]    max_length = 0    end_index = 0        # 填充dp数组    for i in range(1, m + 1):        for j in range(1, n + 1):            if str1[i - 1] == str2[j - 1]:                dp[i][j] = dp[i - 1][j - 1] + 1                if dp[i][j] > max_length:                    max_length = dp[i][j]                    end_index = i            else:                dp[i][j] = 0        # 从原字符串中提取最长公共子串    longest_common_substr = str1[end_index - max_length: end_index]    return longest_common_substr# 测试代码str1 = "abcde"str2 = "bcd"print("Longest Common Substring:", longest_common_substring(str1, str2))试题23:在Python中 选择排序实现的算法如何实现?def selection_sort(arr):    n = len(arr)    for i in range(n):        # 假设当前位置i是最小的        min_index = i        # 检查后面的元素是否有比当前位置更小的        for j in range(i + 1, n):            if arr[j] < arr[min_index]:                min_index = j        # 如果找到更小的元素,则交换        if min_index != i:            arr[i], arr[min_index] = arr[min_index], arr[i]    return arr# 测试代码arr = [64, 25, 12, 22, 11]sorted_arr = selection_sort(arr)print("Sorted array:", sorted_arr)试题24:如何在Python中实现 插入排序的算法?def insertion_sort(arr):    # 遍历从第二个元素开始的所有元素    for i in range(1, len(arr)):        key = arr[i]        j = i - 1        # 将当前元素与它前面的元素进行比较,如果前面的元素比当前元素大,则将前面的元素向后移动一位        while j >= 0 and key < arr[j]:            arr[j + 1] = arr[j]            j -= 1        # 将当前元素放到正确的位置        arr[j + 1] = key    return arr# 测试代码arr = [12, 11, 13, 5, 6]sorted_arr = insertion_sort(arr)print("Sorted array:", sorted_arr)试题25:如何用Python输出九九乘法表for i in range(1, 10):    for j in range(1, i + 1):        print(f"{j} * {i} = {j * i}", end="\t")    print()# 1 * 1 = 1    # 1 * 2 = 2    2 * 2 = 4    # 1 * 3 = 3    2 * 3 = 6    3 * 3 = 9    # 1 * 4 = 4    2 * 4 = 8    3 * 4 = 12    4 * 4 = 16    # 1 * 5 = 5    2 * 5 = 10    3 * 5 = 15    4 * 5 = 20    5 * 5 = 25    # 1 * 6 = 6    2 * 6 = 12    3 * 6 = 18    4 * 6 = 24    5 * 6 = 30    6 * 6 = 36    # 1 * 7 = 7    2 * 7 = 14    3 * 7 = 21    4 * 7 = 28    5 * 7 = 35    6 * 7 = 42    7 * 7 = 49    # 1 * 8 = 8    2 * 8 = 16    3 * 8 = 24    4 * 8 = 32    5 * 8 = 40    6 * 8 = 48    7 * 8 = 56    8 * 8 = 64    # 1 * 9 = 9    2 * 9 = 18    3 * 9 = 27    4 * 9 = 36    5 * 9 = 45    6 * 9 = 54    7 * 9 = 63    8 * 9 = 72    9 * 9 = 81    ————————————————                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。                        原文链接:https://blog.csdn.net/HappyAcmen/article/details/145780793
  • [技术干货] Python Selenium全栈指南:从自动化入门到企业级实战 -转载
    一、自动化测试的革命性工具1.1 浏览器自动化的价值效率提升:批量操作网页节省90%人工时间精准验证:确保网页功能符合预期数据采集:突破反爬限制获取动态数据兼容测试:跨浏览器/设备验证显示效果1.2 Selenium生态全景图graph TD    A[Selenium WebDriver] --> B[浏览器驱动]    A --> C[编程语言绑定]    A --> D[Grid分布式]    C --> E[Python]    C --> F[Java]    B --> G[ChromeDriver]    B --> H[GeckoDriver]    D --> I[多节点并发]二、环境搭建与基础配置2.1 全平台安装指南2.1.1 基础组件安装# 安装Python库pip install selenium # 浏览器驱动管理工具pip install webdriver-manager2.1.2 浏览器驱动自动化配置 from selenium import webdriverfrom webdriver_manager.chrome import ChromeDriverManager # 自动下载并配置Chrome驱动service = webdriver.ChromeService(ChromeDriverManager().install())driver = webdriver.Chrome(service=service)2.2 跨浏览器配置矩阵浏览器    驱动获取方式    典型应用场景Chrome    官方Chromedriver    主流测试环境Firefox    Geckodriver    兼容性验证Edge    MSEdgeDriver    Windows生态测试Safari    系统内置    Mac设备专属三、核心操作全解析3.1 元素定位的八种武器3.1.1 基础定位器# ID定位driver.find_element(By.ID, "username") # CSS选择器driver.find_element(By.CSS_SELECTOR, ".login-form input[type='password']")3.1.2 XPath高级技巧# 文本内容定位//button[contains(text(),'提交')] # 层级关系定位//div[@id='header']/ul/li[position()>2]3.2 页面交互完全手册3.2.1 表单操作四部曲element = driver.find_element(By.NAME, "email")element.clear()          # 清空原有内容element.send_keys("test@example.com")  # 输入文本element.submit()         # 提交表单3.2.2 文件上传解决方案# 传统input标签file_input = driver.find_element(By.XPATH, "//input[@type='file']")file_input.send_keys("/path/to/file.pdf") # 复杂控件处理(需AutoIT或PyWin32)四、高级应用场景实战4.1 等待策略深度优化4.1.1 显式等待最佳实践from selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as EC wait = WebDriverWait(driver, 10)element = wait.until(    EC.element_to_be_clickable((By.ID, "dynamicButton")))4.1.2 自定义等待条件class element_has_css_class(object):    def __init__(self, locator, css_class):        self.locator = locator        self.css_class = css_class     def __call__(self, driver):        element = driver.find_element(*self.locator)        if self.css_class in element.get_attribute("class"):            return element        return False # 使用自定义等待wait.until(element_has_css_class((By.ID, "status"), "active"))4.2 框架设计模式4.2.1 Page Object模式实现class LoginPage:    def __init__(self, driver):        self.driver = driver        self.username_field = (By.ID, "username")        self.password_field = (By.ID, "password")        self.submit_btn = (By.XPATH, "//button[@type='submit']")     def login(self, username, password):        self.driver.find_element(*self.username_field).send_keys(username)        self.driver.find_element(*self.password_field).send_keys(password)        self.driver.find_element(*self.submit_btn).click() 4.2.2 数据驱动测试import pytest @pytest.mark.parametrize("username,password,expected", [    ("admin", "123456", "Dashboard"),    ("test", "wrongpass", "Invalid Credentials")])def test_login(driver, username, password, expected):    login_page = LoginPage(driver)    login_page.login(username, password)    assert expected in driver.title五、企业级解决方案5.1 分布式测试集群搭建5.1.1 Selenium Grid配置# 启动Hubjava -jar selenium-server.jar hub # 注册Nodejava -jar selenium-server.jar node --hub http://hub-host:44445.1.2 云测试平台集成 from selenium.webdriver import Remote caps = {    "browserName": "chrome",    "version": "latest",    "platform": "WINDOWS",    "cloud:options": {        "screenResolution": "1920x1080"    }} driver = Remote(    command_executor="CLOUD_PROVIDER_URL",    desired_capabilities=caps)5.2 安全防护策略5.2.1 验证码处理方案# 人工介入模式input("请在浏览器完成验证码后按回车继续...") # 第三方服务集成from anticaptchaofficial.recaptchav2proxyless import * solver = recaptchaV2Proxyless()solver.set_verbose(1)solver.set_key("API_KEY")result = solver.solve_and_return_solution("SITE_KEY", "PAGE_URL")六、性能优化与调试技巧6.1 浏览器性能调优chrome_options = webdriver.ChromeOptions()chrome_options.add_argument("--headless")  # 无头模式chrome_options.add_argument("--disable-gpu")  # 禁用GPU加速chrome_options.add_argument("--no-sandbox")  # 容器环境必备 6.2 网络请求监控from selenium.webdriver import Chromefrom selenium.webdriver.common.proxy import Proxy dev_tools = driver.get_devtools()dev_tools.send("Network.enable")dev_tools.send("Network.setRequestInterception", {"patterns": [{"urlPattern": "*"}]}) def intercept_request(request):    if "ad.jpg" in request.url:        dev_tools.send("Network.continueInterceptedRequest", {            "interceptionId": request.interception_id,            "errorReason": "BlockedByClient"        }) dev_tools.add_listener("Network.requestIntercepted", intercept_request)七、扩展生态与未来趋势7.1 移动端自动化测试from appium import webdriver desired_caps = {    "platformName": "Android",    "deviceName": "emulator-5554",    "appPackage": "com.example.app",    "appActivity": ".MainActivity"} driver = webdriver.Remote("http://localhost:4723/wd/hub", desired_caps)7.2 人工智能增强 # 使用CV识别元素from selenium_ai import SmartDriver smart_driver = SmartDriver(driver)element = smart_driver.find_element_by_image("submit_button.png")八、最佳实践与避坑指南8.1 十大黄金准则始终使用显式等待采用Page Object设计模式定期更新浏览器驱动隔离测试环境与数据实现失败自动重试机制添加详尽的日志记录保持测试用例独立性优化选择器可维护性控制单个用例执行时间建立持续集成流水线8.2 常见问题解决方案问题:元素定位失效检查DOM结构是否变化验证是否在正确iframe中添加合理的等待时间问题:浏览器崩溃增加隐式等待时间禁用浏览器扩展调整内存分配参数九、学习资源与进阶路线9.1 推荐学习路径graph LRA[基础语法] --> B[元素定位]B --> C[框架设计]C --> D[分布式测试]D --> E[移动端扩展]E --> F[AI整合]9.2 权威参考资料官方文档:https://www.selenium.devW3C WebDriver标准《Selenium Testing Tools Cookbook》GitHub优秀开源项目:SeleniumBaseRobot FrameworkPyTest-Selenium配套资源:如需获取完整示例代码包、浏览器配置手册、性能优化白皮书,可通过以下方式获取: # 自动下载学习资源import requests url = "https://selenium-resources.com/download"params = {    "type": "fullpack",    "license": "education"}response = requests.get(url, params=params)with open("selenium_master.zip", "wb") as f:    f.write(response.content)十、总结这篇文章全面解析了Python Selenium库的核心技术与应用实践,从环境配置、元素定位(涵盖ID、CSS、XPath等八种方法)、表单操作及文件上传等基础操作入手,逐步深入至显式等待策略、Page Object设计模式、数据驱动测试等高级应用,并探讨了企业级场景下的分布式测试集群搭建、云平台集成及验证码处理方案。通过性能优化技巧(如无头模式、网络监控)和移动端与AI结合的扩展生态,展示了Selenium的多样化潜力,同时总结了十大最佳实践与常见问题解决方案,为读者提供了从入门到精通的系统化学习路径和进阶资源,助力实现高效、稳定的Web自动化测试与开发。 ————————————————                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。                        原文链接:https://blog.csdn.net/2301_76341691/article/details/145814890
  • [技术干货] 初学者如何用 Python 写第一个爬虫?-转载
    网页爬虫是一种通过程序自动抓取网页数据的技术。对于初学者来说,使用 Python 写一个简单的爬虫是一个很好的入门项目。Python 提供了许多强大的工具和库,如 requests 和 BeautifulSoup,可以帮助快速实现网页数据的爬取。在本文中,我们将从爬虫的基本概念开始,逐步实现一个可以抓取网页内容的简单爬虫,并探讨如何改进爬虫以应对复杂场景。我们将从以下几个方面展开:一、爬虫的基本概念1. 爬虫的定义爬虫(Web Crawler)是一种自动化脚本或程序,它会模拟用户访问网页的行为,从而提取网页中的特定内容。2. 爬虫的主要工作流程一个典型的爬虫任务通常包括以下步骤:发送请求:通过 HTTP 协议访问目标网页,获取其 HTML 内容。解析数据:对获取到的 HTML 进行解析,提取我们需要的数据。存储数据:将提取到的数据保存到文件或数据库中,便于后续处理。3. 常用 Python 工具**requests**:发送 HTTP 请求,获取网页内容。**BeautifulSoup**:解析 HTML 或 XML 数据,提取特定内容。**re**(正则表达式):对复杂文本模式进行匹配和提取。**pandas**:对数据进行清洗和分析。二、环境准备1. 安装 Python确保你的计算机上已经安装了 Python(推荐使用 3.7 及以上版本)。如果尚未安装,可以从 Python 官方网站 下载并安装。2. 安装必要库打开命令行或终端,运行以下命令安装我们需要的 Python 库:pip install requests beautifulsoup41**requests**:用于发送 HTTP 请求。**beautifulsoup4**:用于解析 HTML 数据。三、写第一个简单的爬虫我们来实现一个简单的爬虫,它将抓取某个网页的标题和正文内容。1. 完整代码示例以下代码实现了一个基本的爬虫:import requestsfrom bs4 import BeautifulSoupdef simple_crawler(url):    try:        # 1. 发送请求        response = requests.get(url)        response.raise_for_status()  # 检查请求是否成功        # 2. 解析网页内容        soup = BeautifulSoup(response.text, 'html.parser')        # 3. 提取标题和段落内容        title = soup.find('title').text  # 获取网页标题        paragraphs = soup.find_all('p')  # 获取所有段落内容        print(f"网页标题: {title}")        print("网页内容:")        for p in paragraphs:            print(p.text)    except requests.exceptions.RequestException as e:        print(f"请求失败: {e}")# 示例网址url = "https://example.com"  # 替换为你想爬取的网页地址simple_crawler(url)2. 代码逐步解析1)发送 HTTP 请求response = requests.get(url)1使用 requests.get() 方法向目标网址发送 GET 请求。返回的 response 对象包含网页的所有内容,包括 HTML 源代码。2)检查请求状态response.raise_for_status()1通过 raise_for_status() 检查请求是否成功。如果返回的 HTTP 状态码表示错误(如 404 或 500),会抛出异常。3)解析 HTML 数据soup = BeautifulSoup(response.text, 'html.parser')1BeautifulSoup 用于解析 HTML 内容,并将其转化为 Python 对象,方便后续操作。第二个参数 'html.parser' 指定使用 Python 内置的 HTML 解析器。4)提取网页内容title = soup.find('title').textparagraphs = soup.find_all('p')12find('title') 方法返回 <title> 标签的内容。find_all('p') 方法返回所有段落标签 <p>,并以列表形式存储。5)打印结果for p in paragraphs:    print(p.text)12遍历提取到的段落内容,并打印每个段落的文本。四、改进爬虫功能1. 添加请求头一些网站会检测爬虫程序并阻止访问。可以通过添加请求头来模拟浏览器访问。headers = {    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"}response = requests.get(url, headers=headers)2. 控制爬取频率为了避免对目标网站造成过高的负载,可以在每次请求后添加延时。import timedef delay_request(url):    response = requests.get(url)    time.sleep(2)  # 等待 2 秒    return response3. 保存数据将爬取的数据保存为文件或数据库。保存到文件:with open("output.txt", "w", encoding="utf-8") as f:    f.write(f"标题: {title}")    for p in paragraphs:        f.write(p.text + "")保存到 CSV 文件:import csvwith open("output.csv", "w", newline="", encoding="utf-8") as csvfile:    writer = csv.writer(csvfile)    writer.writerow(["段落内容"])    for p in paragraphs:        writer.writerow([p.text])五、应对复杂网页1. 动态加载网页对于 JavaScript 渲染的网页,requests 无法获取完整内容,可以使用 selenium 或 playwright。示例(使用 selenium):from selenium import webdriverurl = "https://example.com"# 配置 WebDriverdriver = webdriver.Chrome()driver.get(url)# 获取动态加载的内容html = driver.page_sourceprint(html)# 关闭浏览器driver.quit()2. 爬取图片或文件import os# 下载图片img_url = "https://example.com/image.jpg"response = requests.get(img_url)# 保存图片with open("image.jpg", "wb") as f:    f.write(response.content)六、爬虫的注意事项1. 遵守法律和道德避免违反法律:确保爬取行为符合目标网站的使用条款。尊重 robots.txt 文件:通过 robots.txt 查看目标网站的爬取限制。2. 处理异常对于网络请求失败、数据缺失等情况,添加异常处理逻辑:try:    response = requests.get(url)    response.raise_for_status()except requests.exceptions.RequestException as e:    print(f"请求失败: {e}")3. 避免过于频繁的请求可以设置延时或使用代理 IP:proxies = {    "http": "http://123.45.67.89:8080",    "https": "http://123.45.67.89:8080"}response = requests.get(url, proxies=proxies)————————————————                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。                        原文链接:https://blog.csdn.net/ADFVBM/article/details/145968297
总条数:2474 到第 页
上滑加载中