• [技术干货] Python3第三方模块之Pillow模块的使用详解【转】
    一、安装Pillow如果你安装了anaconda,pillow就可以直接用了,否则你需要通过这个命令安装使用。pip install pillow 如果遇到 Permission denied 安装失败,请加上 sudo 重试 二、操作图像来看看最常见的图像缩放操作,只需三四行代码:from PIL import Image #打开一个jpg文件,注意是当前路径: im = Image.open('test.jpg') #获得图像尺寸: w,h = im.size print('Original image size: %sx$s'%(w,h)) #缩放到50%: im.thumnail((w//2,h//2)) print('Resize image to: %sx%s'%(w//2,h//2)) #把缩放后的图像用jpeg格式保存 im.sava('thumbnall.lph')其他功能如切片、旋转、滤镜、输出文字、调色板等一应俱全。比如,模糊效果也只需几行代码from PIL import Image, ImageFilter #打开一个jpg图像文件,注意是当前路径: im= Image.open('test.jpg') #应用模糊滤镜: im2 =im.filter(ImageFilter.BLUR) im2.save('blur.jpg','jpeg')PIL的 ImageDraw 提供了一系列绘图方法,让我们可以直接绘图。比如要生成字母验证码图片:from PIL import Image, ImageDraw, ImageFont, ImageFilter import random #随机字母 def rndChar():     return chr(random.randint(65,90)) #随机颜色: def rndColor():     return (random.randint(64, 255), random.randint(32,127)) # 240 x 60: width = 60 * 4 height = 60 image = Image.new('RGB', (width, height), (255, 255, 255)) # 创建Font对象: font = ImageFont.truetype('Arial.ttf', 36) # 创建Draw对象: draw = ImageDraw.Draw(image) # 填充每个像素: for x in range(width):     for y in range(height):         draw.point((x, y), fill=rndColor()) # 输出文字: for t in range(4):     draw.text((60 * t + 10, 10), rndChar(), font=font, fill=rndColor2()) # 模糊: image = image.filter(ImageFilter.BLUR) image.save('code.jpg', 'jpeg')其他问题如果运行的时候报错:IOError: cannot open resource这是因为PIL无法定位到字体文件的位置,可以根据操作系统提供绝对路径,比如:'/Library/Fonts/Arial.ttf'
  • [技术干货] 使用python连接Linux服务器发送指定命令的示例代码【转】
    1.安装paramiko库pip install paramiko2.使用paramiko库连接linux#导入库 import paramiko #创建一个sshclient对象 ssh = paramiko.SSHClient() #允许连接不在know_host中的主机 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) #连接主机 ssh.connect(hostname="192.168.8.120",port=22,username="root",password="love-520") #执行命令 ssh_in,ssh_out,ssh_error = ssh.exec_command('cat /etc/passwd') """ 这里会返回三个结果 ssh_in 标准输入,也就是我们输入的命令 ssh_out 标准输出,命令执行的结果 ssh_error 命令执行过程中的错误 """ #读取结果 res,error = ssh_out.read(),ssh_error.read() result = res if res else error print(result.decode()) #关闭client对象 ssh.close()3.使用paramiko库上传下载文件import paramiko # 连接服务器 transport = paramiko.Transport(('hostname',22)) transport.connect(username='账号',password='密码') ftp = paramiko.SFTPClient.from_transport(transport)  # 定义一个ftp实例 ftp.get('服务器文件路径',' 本地文件路径')   # 下载文件 ftp.put('本地文件路径', '服务器文件路径')  # 上传文件 ftp.close() transport.close()
  • [技术干货] python curl2pyreqs 生成接口脚本实战教程【转】
    下载 curl2pyreqs 库pip install curl2pyreqs -i https://pypi.tuna.tsinghua.edu.cn/simple打开调试模式,在Network这里获取接口的cURL打开cmd窗口,输入curl2pyreqs,会自动生成接口代码curl2pyreqs执行接口脚本,返回响应内容~
  • [技术干货] python通过socket搭建极简web服务器的实现代码【转】
    python的web框架众多,常见的如django、flask、tornado等,其底层是什么还是有些许的疑问,所以查找相关资料,实现浏览器访问,并返回相关信息,本文将给大家介绍python通过socket搭建极简web服务器,需要的朋友可以参考下环境:win11、python 3.9.2背景:python的web框架众多,常见的如django、flask、tornado等,其底层是什么还是有些许的疑问,所以查找相关资料,实现浏览器访问,并返回相关信息#coding: utf-8 """ 搭建简单服务器 """ import socket HOST = '0.0.0.0'         #使用0.0.0.0,实现本机访问 PORT = 80               #设置端口号 ADDR = (HOST,PORT)        #放在一起就是套接字了 web = socket.socket()   #创建socket对象 web.bind(ADDR)            #绑定端口 web.listen(5)           #可同时连接5个客户端 print('sever is listening...') while True:     client_connection,client_address = web.accept()  #建立客户端连接     print('link addr:')     print(client_address)   #打印客户端发来的嵌套字     client_connection.send(str.encode("HELLO,WORLD"))   #向客户端发送信息,需要byte类型的参数,需要做一下转换     data = client_connection.recv(1024)     print(data)     client_connection.close()       #关闭连接socket称之为套接字,是网络编程的基础,分为客户端与服务端,本文中客户端为浏览器,服务端为启动的代码。 所有网络间的通信,均源自于此。例如:聊天软件、直播类、DNS等,本文中的属于BS架构的应用,同样也是基于此。
  • [技术干货] Boston数据集预测放假及应用优缺点评估【转】
    什么是Boston数据集?Boston数据集是一个经典的回归分析数据集,包含了美国波士顿地区的房价数据以及相关的属性信息。该数据集共有506个样本,13个属性,其中包括12个特征变量和1个目标变量(房价中位数)。数据集的属性信息Boston数据集的13个属性信息如下:CRIM:城镇人均犯罪率ZN:住宅用地所占比例INDUS:城镇中非住宅用地所占比例CHAS:是否靠近查尔斯河(1表示靠近,0表示不靠近)NOX:一氧化氮浓度RM:房屋平均房间数AGE:自住房屋中建于1940年前的房屋所占比例DIS:距离5个波士顿就业中心的加权距离RAD:距离绿色公园的辐射范围TAX:每10,000美元的全额物业税率PTRATIO:城镇中学生与教师的比例B:黑人占比MEDV:房价中位数(单位:千美元)数据集的应用Boston数据集是一个非常经典的数据集,在机器学习和数据科学领域中广泛应用。它可以用于回归分析、特征工程、数据可视化和模型评估等方面。 一些常见的应用包括:房价预测:使用机器学习模型训练Boston数据集,预测波士顿地区房价中位数。特征工程:对数据集进行特征工程,如特征选择、特征缩放、特征降维等,以提高模型的准确性和泛化能力。数据可视化:利用Boston数据集中的属性信息,进行数据可视化和探索性数据分析,以了解数据集的特征和关系。模型评估:使用Boston数据集进行机器学习模型评估和比较,以选择最佳的模型和参数配置。Boston数据集进行房价预测Boston数据集是一个非常有用的数据集,可以用于回归分析、特征工程、数据可视化和模型评估等方面。通过对Boston数据集的学习和应用,可以提高我们的数据分析和机器学习技能,为实际问题的解决提供帮助。以下是一个使用Boston数据集进行房价预测的示例代码:pythonCopy codeimport pandas as pd from sklearn.model_selection import train_test_split from sklearn.linear_model import LinearRegression from sklearn.metrics import mean_squared_error # 加载Boston数据集 boston_data = pd.read_csv('boston.csv') # 提取特征变量和目标变量 X = boston_data.drop('MEDV', axis=1) y = boston_data['MEDV'] # 将数据集划分为训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 创建线性回归模型 model = LinearRegression() # 在训练集上拟合模型 model.fit(X_train, y_train) # 在测试集上进行预测 y_pred = model.predict(X_test) # 计算均方根误差(RMSE) rmse = mean_squared_error(y_test, y_pred, squared=False) print("均方根误差(RMSE):", rmse)在这个示例中,我们首先使用pandas库加载Boston数据集,并将特征变量(X)和目标变量(y)分开。然后,我们使用train_test_split函数将数据集划分为训练集和测试集。接下来,我们创建一个线性回归模型,并在训练集上拟合模型。最后,我们使用训练好的模型在测试集上进行预测,并计算预测结果与真实值之间的均方根误差(RMSE)作为模型评估指标。 这个示例展示了如何利用Boston数据集进行房价预测的基本步骤,可以根据具体需求进行进一步的模型调优和特征工程。Boston数据集是一个非常经典的回归分析数据集,但它也存在一些缺点。以下是Boston数据集的缺点以及类似数据集的介绍:Boston数据集的缺点数据集比较小:Boston数据集只有506个样本,相对于实际问题而言,数据量比较小,可能无法覆盖所有情况。数据集较老:Boston数据集采集于1978年,房价和城市环境可能已经发生了较大的变化,无法反映当前的市场情况。数据集不够全面:Boston数据集只包含了13个属性,而且属性之间的相关性也比较强,可能无法满足某些更加复杂的问题。类似的数据集California Housing数据集:该数据集包含了1990年加利福尼亚州各地区的房价数据以及相关属性信息,共有20640个样本,8个属性,可以用于回归分析和特征工程。Ames Housing数据集:该数据集包含了房价数据以及相关属性信息,共有2930个样本,80个属性,相对于Boston数据集而言,数据量更大,属性更多,可以用于更加复杂的问题。Kaggle House Prices数据集:该数据集包含了房价数据以及相关属性信息,共有1460个样本,80个属性,是一个非常流行的房价预测数据集,在房价预测和特征工程领域有广泛应用。 这些数据集与Boston数据集类似,都包含了房价数据以及相关的属性信息,可以用于回归分析、特征工程、数据可视化和模型评估等方面。但是它们的数据量、属性数量和数据收集时间等方面都有所不同,可以根据具体需求进行选择和应用。
  • [技术干货] python + winrm 实现远程连接Windows服务器并执行指定命令的操作过程【转】
    Windows远程管理(WinRM)是Windows Server 2003 R2,Windows Vista和Windows Server 2008中一种新式的方便远程管理的服务,这篇文章主要介绍了python + winrm 实现远程连接Windows服务器并执行指定命令的操作过程,需要的朋友可以参考下查到windows服务器连接的一个强大的第三方库winrm,类似于paramiko模块(实现远程连接Linux虚拟机(服务器)并执行指定命令返回输出结果),只不过winrm是可以在Windows环境下执行命令。Windows远程管理(WinRM)是Windows Server 2003 R2,Windows Vista和Windows Server 2008中一种新式的方便远程管理的服务。windows上开启winrm服务winrm service 默认都是未启用的状态,先查看状态,如无返回信息,则是没有启动。打开powershell终端,输入下列命令进行配置:winrm enumerate winrm/config/listener针对winrm service 进行基础配置:winrm quickconfig如果出现“拒绝访问”错误解决方法:以管理员身份执行。 查看winrm service listener:winrm e winrm/config/listener为winrm service 配置auth:winrm set winrm/config/service/auth @{Basic="true"}为winrm service 配置加密方式为允许非加密:winrm set winrm/config/service @{AllowUnencrypted="true"}注意:如果以上两个命令执行会报错错误: Invalid use of command line. Type "winrm -?" for help.需要在@{Basic="true"}外部加单引号'才可以!启动/关闭winrm服务命令:net start/stop winrm至此,winrm service 已经启用,可以正常使用安装python库:winrm安装方法如下:pip install pywinrm这里进行了简单的实践,远程连接Windows服务器后查询服务器的IP信息:代码如下:import winrm def winCMD(hostip='hostip', username='username', password='password'):     """     在 windows 下执行命令     :param hostip: 远程Windows服务器IP     :param username: 远程Windows服务器用户名     :param password: 远程Windows服务器密码     :return:     """     wintest = winrm.Session('http://' + hostip + ':5985/wsman', auth=(username, password))     # ret = wintest.run_cmd("cmd命令") 多个命令使用 & 符号连接     ret = wintest.run_cmd("ipconfig")     print(ret)     # 正常输出信息     print(ret.std_out.decode())     # 错误信息     print(ret.std_err.decode())注:输出中文乱码问题解决方法,run_cmd()方法,修改self.protocol.open_shell(codepage=936)参数def run_cmd(self, command, args=()):     # TODO optimize perf. Do not call open/close shell every time     # 中文编码 codepage=936, 英文编码codepage=437     shell_id = self.protocol.open_shell(codepage=936)     command_id = self.protocol.run_command(shell_id, command, args)     rs = Response(self.protocol.get_command_output(shell_id, command_id))     self.protocol.cleanup_command(shell_id, command_id)     self.protocol.close_shell(shell_id)     return rs再记一些 winrm 比较常用的命令winrm 这个命令在服务器端为什么是client的呢?我发现如果按照正常的命令来输入的话应该是没有问题的,我相信这个问题不是一个很难的问题,因为powershell远程管理windows是系统管理员必备的功能,必须实现,我觉得这几种防范已经把问题解决了,我只要慢慢搞应该能搞出来执行以下命令能够以每组多达50个实例的速度获取实例。winrm set winrm/config @{MaxBatchItems="50"}此外,通过增大分配的最大封包大小和超时设置,也可以提高性能。winrm set winrm/config @{MaxEnvelopeSizekb="150"} winrm set winrm/config @{MaxTimeoutms ="60000"}下面列出了其他可选的WinRM配置命令,以便您参考。要获取当前的WinRM配置设置,请执行以下命令:winrm g winrm/config默认情况下,客户端计算机要求对网络流量加密。要允许客户端计算机请求未加密流量,请执行以下命令:winrm s winrm/config/Client @{AllowUnencrypted="true"}TrustedHosts 是一个数组,用于指定可信的远程计算机的列表。同一工作组中的其他计算机或不同域中的计算机均应添加到此列表中。注意:TrustedHosts 列表中的计算机未经过身份验证。执行以下命令可将所有计算机都纳入TrustedHosts。winrm s winrm/config/Client @{TrustedHosts="*"}基本身份验证是以明文形式将用户名和密码发送给服务器或代理的方案。这是最不安全的身份验证方法。默认值为True。执行以下命令可将客户端计算机设置为使用基本身份验证:winrm s winrm/config/Client/Auth @{Basic="true"}
  • [技术干货] pandas探索你的数据实现可视化示例详解【转】
    探索泰坦尼克灾难数据在数据分析的旅程中,可视化数据是一个不可或缺的步骤,它可以帮助我们更好地理解数据、发现趋势和关联。在本篇博客中,我们将使用 Python 中的 pandas、matplotlib 和 seaborn 库,来探索泰坦尼克灾难的数据集,以图表形式呈现数据的各种方面。步骤1 导入必要的库首先,我们导入了一些必要的库,包括 pandas 用于数据操作,matplotlib 和 seaborn 用于数据可视化,以及 numpy 用于数值计算。这些库将在整个分析过程中发挥关键作用。# 运行以下代码 import pandas as pd import matplotlib.pyplot as plt import seaborn as sns import numpy as np %matplotlib inline步骤2 从以下地址导入数据在这一步,我们准备导入泰坦尼克灾难的数据,这些数据存储在名为 "train.csv" 的文件中。数据导入是数据分析的第一步,让我们能够开始探索和分析数据。# 运行以下代码 path7 = 'exercise_data/train.csv'  # train.csv步骤3 将数据框命名为titanic我们成功导入数据后,将数据框命名为 "titanic" 并显示前几行数据,以便查看数据的结构和内容。# 运行以下代码 titanic = pd.read_csv(path7) titanic.head()步骤4 将PassengerId设置为索引在这一步,我们将 "PassengerId" 列设置为数据的索引。这可以帮助我们更容易地访问和操作数据。# 运行以下代码 titanic.set_index('PassengerId').head()步骤5 绘制一个展示男女乘客比例的扇形图通过创建扇形图,我们展示了乘客中男性和女性的比例。这是一个简单而有效的方式来可视化性别分布,并了解男女乘客的比例。# 运行以下代码 # sum the instances of males and females males = (titanic['Sex'] == 'male').sum() females = (titanic['Sex'] == 'female').sum() # put them into a list called proportions proportions = [males, females] # Create a pie chart plt.pie(     # using proportions     proportions,     # with the labels being officer names     labels = ['Males', 'Females'],     # with no shadows     shadow = False,     # with colors     colors = ['blue','red'],     # with one slide exploded out     explode = (0.15 , 0),     # with the start angle at 90%     startangle = 90,     # with the percent listed as a fraction     autopct = '%1.1f%%'     ) # View the plot drop above plt.axis('equal') # Set labels plt.title("Sex Proportion") # View the plot plt.tight_layout() plt.show()步骤6 绘制一个展示船票Fare, 与乘客年龄和性别的散点图在这一步,我们创建了一个散点图,将船票价格 (Fare) 与乘客的年龄和性别进行了比较。这种图表可以帮助我们观察票价与年龄和性别之间的关系。# 运行以下代码 # creates the plot using lm = sns.lmplot(x = 'Age', y = 'Fare', data = titanic, hue = 'Sex', fit_reg=False) # set title lm.set(title = 'Fare x Age') # get the axes object and tweak it axes = lm.axes axes[0,0].set_ylim(-5,) axes[0,0].set_xlim(-5,85)步骤7 有多少人生还?我们统计了生还乘客的数量,这是泰坦尼克灾难中一个重要的统计指标。在这个数据集中,有342人幸存下来。# 运行以下代码 titanic.Survived.sum()步骤8 绘制一个展示船票价格的直方图最后,我们创建了一个直方图,显示了不同船票价格的频率分布。这种图表可以帮助我们了解船票价格的分布情况。# 运行以下代码 # sort the values from the top to the least value and slice the first 5 items df = titanic.Fare.sort_values(ascending = False) df # create bins interval using numpy binsVal = np.arange(0,600,10) binsVal # create the plot plt.hist(df, bins = binsVal) # Set the title and labels plt.xlabel('Fare') plt.ylabel('Frequency') plt.title('Fare Payed Histrogram') # show the plot plt.show()总结我们介绍了数据可视化的基本步骤,并使用了 matplotlib 和 seaborn 库来创建不同类型的图表。具体来说,我们使用了扇形图展示比例、散点图展示关系、直方图展示分布情况等。这些图表有助于我们更好地理解泰坦尼克灾难数据,探索性别比例、票价分布以及生还人数等方面的信息。1、Seaborn简介和基本绘图函数Seaborn 是一个用于数据可视化的 Python 库,它建立在 Matplotlib 的基础之上,提供了更高级、更美观和更方便的绘图功能。以下是 Seaborn 中常用的一些创建图表的函数:sns.scatterplot(): 用于创建散点图,展示两个变量之间的关系。sns.lineplot(): 绘制线图,通常用于显示时间序列数据的趋势。sns.barplot(): 创建条形图,用于比较不同类别之间的数值关系。sns.countplot(): 绘制计数图,用于显示每个类别的频数或计数。sns.boxplot(): 绘制箱线图,展示数据的分布和异常值。sns.violinplot(): 创建小提琴图,结合了箱线图和核密度估计,用于展示数据分布。sns.heatmap(): 生成热力图,通常用于显示相关性矩阵或二维数据的值分布。sns.pairplot(): 创建成对关系图,展示数据集中多个变量之间的散点图和直方图。sns.distplot(): 绘制单变量的分布图,包括直方图和核密度估计。sns.jointplot(): 创建联合图,同时显示两个变量的单变量分布和二维关系。sns.lmplot(): 绘制线性回归模型的散点图和回归线。sns.catplot(): 用于创建分类图,可以包括多个子图,通常用于比较不同组或类别之间的关系。sns.relplot(): 绘制关系图,用于可视化两个或多个变量之间的关系。2、前文中所用的Seaborn以前文所使用的lmplot为例:sns.lmplot() 是 Seaborn 库中用于创建线性回归模型图的函数。它通常用于可视化两个变量之间的线性关系,同时可以添加回归线和置信区间。sns.lmplot(x, y, data, hue=None, col=None, row=None, palette=None, height=5, aspect=1, markers='o', scatter_kws=None, line_kws=None)参数说明:x 和 y:分别是数据框中的列名,用于表示 x 轴和 y 轴上的变量。data:要使用的数据框,包含 x 和 y 列。hue:可选参数,用于根据某一列的不同取值给数据点着色,通常用于表示分类变量。col 和 row:可选参数,用于在多个子图中绘制不同的图表,通常用于表示分类变量。palette:可选参数,用于指定颜色调色板,用于着色数据点或线条。height:图的高度。aspect:图的纵横比。markers:可选参数,用于指定数据点的标记样式。scatter_kws 和 line_kws:可选参数,用于传递给散点图和回归线的其他参数。sns.lmplot() 函数的作用是绘制散点图,并根据数据拟合一个线性回归模型。它通常用于研究两个连续变量之间的关系,以及回归模型的拟合情况。import seaborn as sns import matplotlib.pyplot as plt # 创建一个示例数据框 data = sns.load_dataset("tips") # 使用lmplot绘制散点图和回归线 sns.lmplot(x="total_bill", y="tip", data=data) # 添加回归线的置信区间 sns.lmplot(x="total_bill", y="tip", data=data, ci=None) # 使用hue参数根据分类变量着色 sns.lmplot(x="total_bill", y="tip", data=data, hue="sex") # 使用col和row参数创建多个子图 sns.lmplot(x="total_bill", y="tip", data=data, col="time", row="sex") # 自定义标记样式和颜色 sns.lmplot(x="total_bill", y="tip", data=data, markers=["o", "x"], palette="Set1") plt.show()3、Seaborn的样式控制Seaborn 允许你控制图形的样式和外观,以使你的数据可视化更加美观和易于理解。你可以使用 Seaborn 提供的各种样式设置和主题来自定义图形的外观。样式设置(Style Set): Seaborn 提供了不同的样式设置,通过 sns.set_style() 函数可以进行切换。常用的样式设置包括 "whitegrid"、"darkgrid"、"white"、"dark" 和 "ticks"。每种样式设置具有不同的背景和网格线样式,你可以根据需要选择合适的样式。import seaborn as sns # 使用不同的样式设置 sns.set_style("whitegrid") sns.set_style("darkgrid") sns.set_style("white") sns.set_style("dark") sns.set_style("ticks")图形主题(Themes): 通过 sns.set_theme() 函数,你可以选择不同的图形主题,包括 "darkgrid"、"whitegrid"、"dark"、"white" 和 "ticks",这与样式设置类似。不同的主题将影响整个图形的外观。import seaborn as sns # 使用不同的图形主题 sns.set_theme(style="darkgrid") sns.set_theme(style="whitegrid") sns.set_theme(style="dark") sns.set_theme(style="white") sns.set_theme(style="ticks")颜色调色板(Color Palettes): Seaborn 提供了各种颜色调色板,用于指定图形中的颜色。你可以使用 sns.color_palette() 函数来自定义颜色调色板,也可以使用已经定义好的颜色调色板,如 "deep"、"pastel"、"dark" 等。import seaborn as sns # 使用不同的颜色调色板 sns.color_palette("deep") sns.color_palette("pastel") sns.color_palette("dark")坐标轴刻度(Axis Ticks): 你可以通过 sns.set_context() 函数来控制坐标轴刻度的大小和字体。可选的上下文包括 "paper"、"notebook"、"talk" 和 "poster"。import seaborn as sns # 设置坐标轴刻度的上下文 sns.set_context("paper") sns.set_context("notebook") sns.set_context("talk") sns.set_context("poster")这些控制样式的方法可以根据你的需求来自定义 Seaborn 图形的外观,使其更符合你的数据可视化目标和审美标准。你可以根据具体情况组合使用这些设置来创建最适合你的图形样式。
  • [技术干货] Python pydotplus安装及可视化图形创建教程【转】
    Python的pydotplus介绍在Python中,有许多用于绘制和可视化图形的库,其中之一就是pydotplus。pydotplus是pydot的一个增强版本,它提供了一种简洁而强大的方式来创建、操作和可视化图形。安装pydotplus要使用pydotplus库,首先需要安装它。可以使用pip命令来安装pydotplus:plaintextCopy codepip install pydotplus安装完成后,就可以在Python代码中导入并使用pydotplus库。创建图形pydotplus库允许我们创建各种类型的图形,包括有向图、无向图、流程图等。下面是一个简单的示例,演示了如何使用pydotplus创建一个有向图:pythonCopy codeimport pydotplus # 创建一个有向图 graph = pydotplus.Dot(graph_type='digraph') # 添加节点 node_a = pydotplus.Node("A") node_b = pydotplus.Node("B") node_c = pydotplus.Node("C") # 添加边 edge_ab = pydotplus.Edge(node_a, node_b) edge_bc = pydotplus.Edge(node_b, node_c) # 将节点和边添加到图中 graph.add_node(node_a) graph.add_node(node_b) graph.add_node(node_c) graph.add_edge(edge_ab) graph.add_edge(edge_bc) # 保存图形到文件 graph.write_png("graph.png")在这个示例中,我们首先创建了一个有向图对象。然后,我们创建了三个节点A、B和C,并创建了两条边AB和BC。最后,我们将节点和边添加到图中,并将图形保存为PNG文件。可视化图形pydotplus库还提供了用于可视化图形的功能。我们可以使用Matplotlib等库来显示图形,或者将图形保存为文件。 下面是一个示例,演示了如何使用pydotplus可视化先前创建的有向图:pythonCopy codeimport pydotplus import matplotlib.pyplot as plt # 创建一个有向图 graph = pydotplus.Dot(graph_type='digraph') # 添加节点和边... # 显示图形 plt.imshow(plt.imread("graph.png")) plt.axis('off') plt.show()在这个示例中,我们使用Matplotlib来读取并显示先前保存的PNG图像。通过调用imshow()函数和show()函数,我们可以在Python脚本中显示图形。总结pydotplus是一个强大的库,它提供了一种简单而灵活的方式来创建、操作和可视化图形。通过使用pydotplus,我们可以轻松地创建各种类型的图形,并且可以将它们保存为文件或在Python代码中显示。无论是数据可视化、流程图还是其他类型的图形,pydotplus都是一个值得考虑的工具。 在使用pydotplus时,我们应该熟悉其API文档,并根据需求选择合适的函数和方法。通过探索和实践,我们可以更好地理解和应用pydotplus库,从而创建出令人满意的图形。好的,下面我们以一个简单的应用场景为例来演示如何使用pydotplus库创建和可视化图形。 假设我们有一个小型的社交网络,其中有5个用户,他们之间的关系如下:A和B是好友B和C是好友C和D是好友D和E是好友 我们可以使用pydotplus来创建和可视化这个社交网络的关系图。下面是示例代码:pythonCopy codeimport pydotplus # 创建一个有向图 graph = pydotplus.Dot(graph_type='digraph') # 添加节点 node_a = pydotplus.Node("A") node_b = pydotplus.Node("B") node_c = pydotplus.Node("C") node_d = pydotplus.Node("D") node_e = pydotplus.Node("E") # 添加边 edge_ab = pydotplus.Edge(node_a, node_b) edge_bc = pydotplus.Edge(node_b, node_c) edge_cd = pydotplus.Edge(node_c, node_d) edge_de = pydotplus.Edge(node_d, node_e) # 将节点和边添加到图中 graph.add_node(node_a) graph.add_node(node_b) graph.add_node(node_c) graph.add_node(node_d) graph.add_node(node_e) graph.add_edge(edge_ab) graph.add_edge(edge_bc) graph.add_edge(edge_cd) graph.add_edge(edge_de) # 保存图形到文件 graph.write_png("social_network.png")在这个示例中,我们首先创建了一个有向图对象。然后,我们创建了5个节点A、B、C、D和E,并创建了4条边来表示他们之间的关系。最后,我们将节点和边添加到图中,并将图形保存为PNG文件。 运行上面的代码后,我们可以得到一个名为social_network.png的PNG图像文件,其中包含了这个社交网络的关系图。我们可以使用Matplotlib等库来读取并显示这个PNG图像,如下所示:pythonCopy codeimport matplotlib.pyplot as plt plt.imshow(plt.imread("social_network.png")) plt.axis('off') plt.show()运行这段代码后,我们就可以在Python脚本中显示这个社交网络的关系图了。 通过这个示例,我们可以看到,pydotplus库是一个强大而灵活的工具,可以帮助我们创建和可视化各种类型的图形。在实际应用中,我们可以将pydotplus用于可视化数据、分析流程、展示系统架构等方面,从而提高我们的工作效率和效果。pydotplus是一个非常强大的Python库,可以帮助我们创建和可视化各种类型的图形,包括有向图、无向图、流程图、组织结构图等等。但是,pydotplus也有一些缺点,如下所示:安装和配置比较麻烦:pydotplus库依赖于Graphviz软件包,而Graphviz本身也需要安装和配置,这可能对一些新手来说比较困难。文档不够完善:尽管pydotplus库非常强大,但它的文档并不是很完善,有些函数和方法的用法并没有详细说明,这可能会给使用者带来一些困惑。性能问题:在处理大型图形时,pydotplus的性能可能不够理想,这可能会导致程序运行缓慢或者崩溃。 除了pydotplus之外,还有一些类似的Python库可以用来创建和可视化图形,如下所示:NetworkX:一个用于创建、操作和学习复杂网络的Python库,支持各种类型的图形,并提供了丰富的图形分析和可视化工具。Matplotlib:一个用于绘制各种类型图形的Python库,支持各种类型的图形,并提供了丰富的图形分析和可视化工具。Seaborn:一个基于Matplotlib的Python库,提供了更高级的统计图形和可视化工具,尤其适合于数据分析和科学研究。Bokeh:一个用于创建交互式可视化图形的Python库,支持各种类型的图形,并提供了丰富的交互式工具和组件。 总的来说,pydotplus是一个非常强大的Python库,可以帮助我们创建和可视化各种类型的图形。但是,它也存在一些缺点,如安装和配置比较麻烦、文档不够完善、性能问题等。在选择Python库时,我们需要根据实际需求和技术水平来选择适合自己的库。
  • [技术干货] Python数据分析与应用心得【转】
    python是一种广泛使用的高级编程语言,它具有简洁、优雅、易读的语法,以及强大的标准库和第三方库,使得它在数据分析和应用方面有着很多优势。在这篇博客中,我将分享一些我在使用Python进行数据分析和应用时的心得和经验,希望对大家有所帮助。数据分析数据分析是指从数据中提取有价值的信息,以支持决策或发现规律。Python在数据分析方面有着丰富的工具和资源,比如:    NumPy:一个提供高效的多维数组操作和计算的库,可以实现矩阵运算、随机数生成、傅里叶变换等功能。    Pandas:一个提供高性能的数据结构和分析工具的库,可以实现数据的读取、清洗、处理、统计、合并、分组、透视等功能。    Matplotlib:一个提供绘制各种图形和可视化的库,可以实现折线图、柱状图、饼图、散点图、箱线图等功能。    Seaborn:一个基于Matplotlib的高级可视化库,可以实现更美观和更丰富的图形效果,比如热力图、小提琴图、联合分布图等功能。    SciPy:一个提供科学计算和技术计算的库,可以实现线性代数、优化、插值、积分、信号处理等功能。    Scikit-learn:一个提供机器学习算法和模型的库,可以实现回归、分类、聚类、降维、特征选择等功能。    Statsmodels:一个提供统计模型和测试的库,可以实现线性模型、时间序列分析、假设检验等功能。使用这些库,我们可以对各种类型和规模的数据进行有效的分析和处理。下面我将以一个简单的例子来展示一些常用的操作。例子:对泰坦尼克号乘客数据进行分析泰坦尼克号是一艘著名的豪华邮轮,于1912年4月15日在首次航行中撞上冰山沉没,造成了约1500人死亡的惨剧。我们可以从网上下载一份包含了891名乘客信息的数据集(https://raw.githubusercontent.com/mwaskom/seaborn-data/master/titanic.csv),来对这次事件进行一些探索性的分析。首先,我们需要导入一些必要的库,并读取数据:    import numpy as np    import pandas as pd    import matplotlib.pyplot as plt    import seaborn as sns         # 读取数据    df = pd.read_csv("https://raw.githubusercontent.com/mwaskom/seaborn-data/master/titanic.csv")    # 查看数据前五行    df.head()输出:我们可以看到,数据集中有以下几个变量:    survived:是否幸存,0表示否,1表示是    pclass:船票等级,1表示一等舱,2表示二等舱,3表示三等舱    sex:性别,male表示男性,female表示女性    age:年龄    sibsp:同乘的兄弟姐妹或配偶的数量    parch:同乘的父母或子女的数量    fare:船票价格    embarked:登船港口,C表示瑟堡,Q表示皇后镇,S表示南安普敦    class:船票等级的类别,与pclass相同    who:乘客的身份,man表示男性,woman表示女性,child表示儿童    adult_male:是否为成年男性,True表示是,False表示否    deck:所在的甲板层,A到G表示不同的层级,nan表示缺失值    embark_town:登船港口的城市名称,与embarked相同    alive:是否幸存,与survived相同    alone:是否独自一人,True表示是,False表示否接下来,我们可以对数据进行一些基本的统计和描述:    # 查看数据的形状(行数和列数)    df.shape输出:(891, 15)    # 查看数据的基本信息(列名、非空值数量、数据类型)    df.info()输出:<class ‘pandas.core.frame.DataFrame’> RangeIndex: 891 entries, 0 to 890 Data columns (total 15 columns):Column Non-Null Count Dtype0 survived 891 non-null int641 pclass 891 non-null int642 sex 891 non-null object 3 age 714 non-null float64 4 sibsp 891 non-null int645 parch6 parch 891 non-null int647 fare 891 non-null float64 8 embarked 889 non-null object 9 class 891 non-null object 10 who 891 non-null object 11 adult_male 891 non-null bool12 deck 203 non-null object 13 embark_town 889 non-null object 14 alive 891 non-null object 15 alone 891 non-null booldtypes: bool(2), float64(2), int64(4), object(7) memory usage: 90.6+ KB    # 查看数据的描述性统计(均值、标准差、最小值、最大值等)    df.describe()输出:    survived    pclass    age    sibsp    parch    farecount    891    891    714    891    891    891mean    0.384    2.31    29.7    0.523    0.382    32.2std    0.487    0.836    14.5    1.1    0.806    49.7min    0    1    0.42    0    0    0max                        | max | 1 | 3 | 80 | 8 | 6 | 512.329 |从上面的结果,我们可以看到一些基本的信息,比如:    数据集中有891名乘客,其中有714名有年龄信息,203名有甲板层信息,889名有登船港口信息,其余变量都没有缺失值。    数据集中有约38.4%的乘客幸存,平均船票等级为2.31,平均年龄为29.7岁,平均船票价格为32.2美元。    数据集中最年轻的乘客只有0.42岁,最年长的乘客有80岁,最便宜的船票为0美元(可能是免费或赠送),最贵的船票为512.329美元。接下来,我们可以对数据进行一些可视化分析,来探索一些可能的关系和规律。比如:    幸存率与性别、船票等级、登船港口等变量的关系    年龄、船票价格等数值变量的分布情况    年龄、船票价格等数值变量与幸存率的关系    其他可能的交叉分析为了方便起见,我们可以先定义一个函数来绘制柱状图,并显示每个类别的幸存率:    # 定义一个函数来绘制柱状图,并显示每个类别的幸存率    def plot_bar(data, x, y, hue=None, ax=None):        # 计算每个类别的幸存率        survival_rate = data.groupby([x, hue])[y].mean().reset_index()        # 绘制柱状图        sns.barplot(x=x, y=y, hue=hue, data=data, ax=ax)        # 在柱子上方显示幸存率        for i, p in enumerate(ax.patches):            height = p.get_height()            ax.text(p.get_x() + p.get_width() /2., height +0.01,                    '{:1.2f}'.format(survival_rate[y].iloc[i]), ha="center")然后,我们可以使用这个函数来绘制一些图形,比如:    # 创建一个画布和四个子图    fig, axes = plt.subplots(2, 2, figsize=(12, 10))    # 绘制幸存率与性别的关系    plot_bar(data=df, x="sex", y="survived", ax=axes[0, 0])    axes[0, 0].set_title("Survival Rate by Sex")    axes[0, 0].set_ylabel("Survival Rate")    # 绘制幸存率与船票等级的关系    plot_bar(data=df, x="pclass", y="survived", ax=axes[0, 1])    axes[0, 1].set_title("Survival Rate by Pclass")    axes[0, 1].set_ylabel("Survival Rate")    # 绘制幸存率与登船港口的关系    plot_bar(data=df, x="embarked", y="survived", ax=axes[1, 0])    axes[1, 0].set_title("Survival Rate by Embarked")    axes[1, 0].set_ylabel("Survival Rate")    # 绘制幸存率与是否独自一人的关系    plot_bar(data=df, x="alone", y="survived", ax=axes[1, 1])    axes[1, 1].set_title("Survival Rate by Alone")    axes[1, 1].set_ylabel("Survival Rate")    # 调整子图间距    plt.tight_layout()    # 显示图形    plt.show()输出:        #####从上面的图形,我们可以看到一些有趣的发现,比如:    女性的幸存率远高于男性,可能是因为女性和儿童优先上救生艇的原因。    一等舱的幸存率最高,三等舱的幸存率最低,可能是因为一等舱的乘客更靠近甲板,更容易逃生,或者有更多的救生设备。    登船于瑟堡的乘客的幸存率最高,登船于南安普敦的乘客的幸存率最低,可能是因为不同港口的乘客有不同的社会经济背景和船票等级。    独自一人的乘客的幸存率低于有亲友同行的乘客,可能是因为有亲友同行的乘客有更多的支持和帮助。当然,这些发现都是基于描述性统计和可视化,没有进行严格的假设检验和因果推断,所以只能作为初步的探索性分析,不能作为确定性的结论。接下来,我们可以绘制一些直方图和箱线图,来查看年龄、船票价格等数值变量的分布情况:    # 创建一个画布和两个子图    fig, axes = plt.subplots(1, 2, figsize=(12, 5))    # 绘制年龄的直方图    sns.histplot(x="age", data=df, ax=axes[0])    axes[0].set_title("Histogram of Age")    axes[0].set_xlabel("Age")    # 绘制船票价格的直方图    sns.histplot(x="fare", data=df, ax=axes[1])    axes[1].set_title("Histogram of Fare")    axes[1].set_xlabel("Fare")    # 调整子图间距    plt.tight_layout()    # 显示图形    plt.show()输出:        #####从上面的图形,我们可以看到:    年龄的分布大致呈正态分布,但有一些峰值,比如在0-10岁之间有较多的儿童乘客。    船票价格的分布呈右偏分布,大部分乘客的船票价格在100美元以下,少数乘客的船票价格超过200美元,甚至有几个乘客的船票价格超过500美元。接下来,我们可以绘制一些小提琴图和散点图,来查看年龄、船票价格等数值变量与幸存率的关系    # 创建一个画布和四个子图    fig, axes = plt.subplots(2, 2, figsize=(12, 10))    # 绘制年龄与幸存率的小提琴图    sns.violinplot(x="survived", y="age", data=df, ax=axes[0, 0])    axes[0, 0].set_title("Violin Plot of Age and Survived")    axes[0, 0].set_xlabel("Survived")    axes[0, 0].set_ylabel("Age")    # 绘制船票价格与幸存率的小提琴图    sns.violinplot(x="survived", y="fare", data=df, ax=axes[0, 1])    axes[0, 1].set_title("Violin Plot of Fare and Survived")    axes[0, 1].set_xlabel("Survived")    axes[0, 1].set_ylabel("Fare")    # 绘制年龄与船票价格的散点图,用颜色表示幸存与否    sns.scatterplot(x="age", y="fare", hue="survived", data=df, ax=axes[1, 0])    axes[1, 0].set_title("Scatter Plot of Age and Fare by Survived")    axes[1, 0].set_xlabel("Age")    axes[1, 0].set_ylabel("Fare")    # 绘制年龄与船票等级的散点图,用颜色表示幸存与否    sns.scatterplot(x="age", y="pclass", hue="survived", data=df, ax=axes[1, 1])    axes[1, 1].set_title("Scatter Plot of Age and Pclass by Survived")    axes[1, 1].set_xlabel("Age")    axes[1, 1].set_ylabel("Pclass")    # 调整子图间距    plt.tight_layout()    # 显示图形    plt.show()输出:        #####从上面的图形,我们可以看到:    年龄与幸存率的关系并不明显,但可以看出儿童和老人的幸存率相对较高,可能是因为他们被优先照顾的原因。    船票价格与幸存率的关系比较明显,可以看出船票价格越高的乘客,幸存率越高,可能是因为他们有更好的条件和资源来逃生。    年龄与船票价格的散点图显示,大部分乘客的年龄在20-40岁之间,船票价格在100美元以下,而且这些乘客中有更多的死亡者。另外,可以看出有几个异常值,即年龄在20-40岁之间,但船票价格超过500美元的乘客,而且这些乘客都幸存了。    年龄与船票等级的散点图显示,大部分乘客都是三等舱,而且这些乘客中有更多的死亡者。另外,可以看出一等舱的乘客年龄普遍较大,而三等舱的乘客年龄普遍较小。以上就是我对泰坦尼克号乘客数据进行的一些简单的分析和可视化,当然还有很多其他的可能性和角度可以探索。通过这个例子,我们可以看到Python在数据分析方面有着很强大和灵活的功能,可以帮助我们从数据中发现一些有意义的信息和规律。    注:最后三项输出图形结果,由于图像一直上传不成功,所以索性取消了( 。ớ ₃ờ)————————————————版权声明:本文为CSDN博主「m0_73814977」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/m0_73814977/article/details/131149194
  • [基础组件] Python 读hdfs写hudi
    Python 读写入hdfs代码import sys sys.path.insert(0, '/opt/140client/Spark2x/spark/python') sys.path.insert(0, '/opt/140client/Spark2x/spark/python/lib/py4j-0.10.9-src.zip') import os os.environ["PYSPARK_PYTHON"]="/usr/anaconda3/bin/python3" import pyspark from pyspark.sql import SparkSession from pyspark import SparkConf from pyspark import SparkContext os.system('source /opt/140client/bigdata_env') from pyspark.sql.types import StructType, StructField, StringType, IntegerType spark = SparkSession.builder \ .appName("Generate Parquet File") \ .getOrCreate() data = [("Alice", 25, "2023-08-29"), ("Bob", 30, "2023-08-30")] schema = StructType([ StructField("Name", StringType(), nullable=False), StructField("Age", IntegerType(), nullable=False), StructField("ts", StringType(), nullable=True) ]) df = spark.createDataFrame(data, schema) output_path = "/tmp/sandbox/output.parquet" df.write.parquet(output_path)操作步骤执行命令source /opt/140client/bigdata_env spark-submit --master yarn /opt/sandbox/parquet.py --keytab /opt/sandbox/user.keytab --principal username查看生成文件 python读hdfs写hudi创建hudi表代码create table if not exists hudi0829( Name string, Age int, ts string ) using hudi location '/tmp/sandbox/hudi0829' options ( type = 'mor', primaryKey = 'Name', preCombineField = 'ts' );查看表 读hdfs写入hudi代码import sys sys.path.insert(0, '/opt/140client/Spark2x/spark/python') sys.path.insert(0, '/opt/140client/Spark2x/spark/python/lib/py4j-0.10.9-src.zip') import os os.environ["PYSPARK_PYTHON"]="/usr/anaconda3/bin/python3" sys.path.append('/opt/140client/Hudi/hudi/lib/') import pyspark from pyspark.sql import SparkSession from pyspark import SparkConf from pyspark import SparkContext #from hudi.config import HoodieConfig #from hudi.dataframe import create_hudi_dataset os.system('source /opt/140client/bigdata_env') spark = SparkSession.builder \ .appName("Write Parquet to Hudi") \ .config("spark.serializer", "org.apache.spark.serializer.KryoSerializer") \ .getOrCreate() parquet_df = spark.read.parquet("hdfs://hacluster/tmp/sandbox/output.parquet") hudi_table_path = "hdfs://hacluster/tmp/sandbox/hudi0829" parquet_df.write \ .format("org.apache.hudi") \ .option("hoodie.datasource.write.recordkey.field", "Name") \ .option("hoodie.datasource.write.partitionpath.field", "ts") \ .option("hoodie.table.name", "hudi0829") \ .option("hoodie.datasource.write.operation", "upsert") \ .mode("append") \ .save(hudi_table_path)执行命令spark-submit --master yarn /opt/sandbox/parquet_hudi.py --keytab /opt/sandbox/user.keytab --principal username
  • [互动交流] 什么时候上python版呀
    什么时候上python版呀
  • [技术干货] Python编程 动态爱心-转载
     前言 本章将会使用Python实现动态的爱心效果 一.所用库 1.random简介 random库是用于产生并运用随机数的标准库。Python中的主要使用是让其掌握在程序中运用随机数的能力。 random常见随机函数有9个:seed()、random()、randint()、getrandbits()、randrange()uniform()、choice()、shuffle()、sample(). 2.math 简介 math 库是 Python 提供的内置数学类函数库,因为复数类型常用于科学计算,一般计算并不常用,因此 math 库不支持复数类型,仅支持整数和浮点数运算。math 库一共提供了 4 个数学常数和 44 个函数。44 个函数分为 4 类,包括 16 个数值表示函数、8 个幂对数函数、16 个三角对数函数和 4 个高等特殊函数。 3.tkinter库的简介 Tkinter 是 Python 自带的图形界面库,库中包含众多图形界面控件,包括 Lable 标签、Button按钮、Radiobutton单选框、Checkbutton复选框、Entry文本框等。借助 Tkinter 库中的各种图形界面控件,我们就可以设计出实用的图形界面程序。 二.实际图  三.代码部分 1.调用库 import random from math import sin, cos, pi, log from tkinter import * 2.调整画布 CANVAS_WIDTH = 640#画布的宽 CANVAS_HEIGHT = 480#画布的宽 CANVAS_CENTER_X = CANVAS_WIDTH / 2 CANVAS_CENTER_Y = CANVAS_HEIGHT / 2 IMAGE_ENLARGE = 11 HEART_COLOR = "#FFC0CB" #ff2121 #引号内修改颜色 3.爱心生成 def heart_function(t, shrink_ratio: float = IMAGE_ENLARGE):       x = 16 * (sin(t) ** 3)     y = -(13 * cos(t) - 5 * cos(2 * t) - 2 * cos(3 * t) - cos(4 * t))       x *= shrink_ratio     y *= shrink_ratio       x += CANVAS_CENTER_X     y += CANVAS_CENTER_Y       return int(x), int(y) 4.随机内部扩散 def scatter_inside(x, y, beta=0.15):       ratio_x = - beta * log(random.random())     ratio_y = - beta * log(random.random())       dx = ratio_x * (x - CANVAS_CENTER_X)     dy = ratio_y * (y - CANVAS_CENTER_Y)       return x - dx, y - dy 5.抖动 def shrink(x, y, ratio):       force = -1 / (((x - CANVAS_CENTER_X) ** 2 + (y - CANVAS_CENTER_Y) ** 2) ** 0.6)  # 这个参数...     dx = ratio * force * (x - CANVAS_CENTER_X)     dy = ratio * force * (y - CANVAS_CENTER_Y)     return x - dx, y - dy 6.自定义曲线函数,调整跳动周期 def curve(p):       return 2 * (2 * sin(4 * p)) / (2 * pi) 7.爱心类 class Heart:       def __init__(self, generate_frame=20):         self._points = set()  # 原始爱心坐标集合         self._edge_diffusion_points = set()  # 边缘扩散效果点坐标集合         self._center_diffusion_points = set()  # 中心扩散效果点坐标集合         self.all_points = {}  # 每帧动态点坐标         self.build(2000)           self.random_halo = 1000           self.generate_frame = generate_frame         for frame in range(generate_frame):             self.calc(frame)       def build(self, number):           for _ in range(number):             t = random.uniform(0, 2 * pi)             x, y = heart_function(t)             self._points.add((x, y))             for _x, _y in list(self._points):             for _ in range(3):                 x, y = scatter_inside(_x, _y, 0.05)                 self._edge_diffusion_points.add((x, y))             point_list = list(self._points)         for _ in range(4000):             x, y = random.choice(point_list)             x, y = scatter_inside(x, y, 0.17)             self._center_diffusion_points.add((x, y)) 8.@classmethod 装饰的类方法  @staticmethod     def calc_position(x, y, ratio):           force = 1 / (((x - CANVAS_CENTER_X) ** 2 + (y - CANVAS_CENTER_Y) ** 2) ** 0.520)  # 魔法参数           dx = ratio * force * (x - CANVAS_CENTER_X) + random.randint(-1, 1)         dy = ratio * force * (y - CANVAS_CENTER_Y) + random.randint(-1, 1)           return x - dx, y - dy       def calc(self, generate_frame):         ratio = 10 * curve(generate_frame / 10 * pi)  # 圆滑的周期的缩放比例           halo_radius = int(4 + 6 * (1 + curve(generate_frame / 10 * pi)))         halo_number = int(3000 + 4000 * abs(curve(generate_frame / 10 * pi) ** 2))           all_points = []           heart_halo_point = set()         for _ in range(halo_number):             t = random.uniform(0, 2 * pi)             x, y = heart_function(t, shrink_ratio=11.6)             x, y = shrink(x, y, halo_radius)             if (x, y) not in heart_halo_point:                 heart_halo_point.add((x, y))                 x += random.randint(-14, 14)                 y += random.randint(-14, 14)                 size = random.choice((1, 2, 2))                 all_points.append((x, y, size))           for x, y in self._points:             x, y = self.calc_position(x, y, ratio)             size = random.randint(1, 3)             all_points.append((x, y, size))           for x, y in self._edge_diffusion_points:             x, y = self.calc_position(x, y, ratio)             size = random.randint(1, 2)             all_points.append((x, y, size))           for x, y in self._center_diffusion_points:             x, y = self.calc_position(x, y, ratio)             size = random.randint(1, 2)             all_points.append((x, y, size))           self.all_points[generate_frame] = all_points       def render(self, render_canvas, render_frame):         for x, y, size in self.all_points[render_frame % self.generate_frame]:             render_canvas.create_rectangle(x, y, x + size, y + size, width=0, fill=HEART_COLOR)     def draw(main: Tk, render_canvas: Canvas, render_heart: Heart, render_frame=0):     render_canvas.delete('all')     render_heart.render(render_canvas, render_frame)     main.after(160, draw, main, render_canvas, render_heart, render_frame + 1)     if __name__ == '__main__':     root = Tk()  # 一个Tk     canvas = Canvas(root, bg='black', height=CANVAS_HEIGHT, width=CANVAS_WIDTH)     canvas.pack()     heart = Heart()     draw(root, canvas, heart)     root.mainloop() 四.全部源代码 import random from math import sin, cos, pi, log from tkinter import *   CANVAS_WIDTH = 640 CANVAS_HEIGHT = 480 CANVAS_CENTER_X = CANVAS_WIDTH / 2 CANVAS_CENTER_Y = CANVAS_HEIGHT / 2 IMAGE_ENLARGE = 11 HEART_COLOR = "#FFC0CB" #ff2121     def heart_function(t, shrink_ratio: float = IMAGE_ENLARGE):       x = 16 * (sin(t) ** 3)     y = -(13 * cos(t) - 5 * cos(2 * t) - 2 * cos(3 * t) - cos(4 * t))       x *= shrink_ratio     y *= shrink_ratio       x += CANVAS_CENTER_X     y += CANVAS_CENTER_Y       return int(x), int(y)     def scatter_inside(x, y, beta=0.15):       ratio_x = - beta * log(random.random())     ratio_y = - beta * log(random.random())       dx = ratio_x * (x - CANVAS_CENTER_X)     dy = ratio_y * (y - CANVAS_CENTER_Y)       return x - dx, y - dy     def shrink(x, y, ratio):       force = -1 / (((x - CANVAS_CENTER_X) ** 2 + (y - CANVAS_CENTER_Y) ** 2) ** 0.6)  # 这个参数...     dx = ratio * force * (x - CANVAS_CENTER_X)     dy = ratio * force * (y - CANVAS_CENTER_Y)     return x - dx, y - dy     def curve(p):       return 2 * (2 * sin(4 * p)) / (2 * pi)     class Heart:       def __init__(self, generate_frame=20):         self._points = set()  # 原始爱心坐标集合         self._edge_diffusion_points = set()  # 边缘扩散效果点坐标集合         self._center_diffusion_points = set()  # 中心扩散效果点坐标集合         self.all_points = {}  # 每帧动态点坐标         self.build(2000)           self.random_halo = 1000           self.generate_frame = generate_frame         for frame in range(generate_frame):             self.calc(frame)       def build(self, number):           for _ in range(number):             t = random.uniform(0, 2 * pi)             x, y = heart_function(t)             self._points.add((x, y))             for _x, _y in list(self._points):             for _ in range(3):                 x, y = scatter_inside(_x, _y, 0.05)                 self._edge_diffusion_points.add((x, y))             point_list = list(self._points)         for _ in range(4000):             x, y = random.choice(point_list)             x, y = scatter_inside(x, y, 0.17)             self._center_diffusion_points.add((x, y))       @staticmethod     def calc_position(x, y, ratio):           force = 1 / (((x - CANVAS_CENTER_X) ** 2 + (y - CANVAS_CENTER_Y) ** 2) ** 0.520)  # 魔法参数           dx = ratio * force * (x - CANVAS_CENTER_X) + random.randint(-1, 1)         dy = ratio * force * (y - CANVAS_CENTER_Y) + random.randint(-1, 1)           return x - dx, y - dy       def calc(self, generate_frame):         ratio = 10 * curve(generate_frame / 10 * pi)  # 圆滑的周期的缩放比例           halo_radius = int(4 + 6 * (1 + curve(generate_frame / 10 * pi)))         halo_number = int(3000 + 4000 * abs(curve(generate_frame / 10 * pi) ** 2))           all_points = []           heart_halo_point = set()         for _ in range(halo_number):             t = random.uniform(0, 2 * pi)             x, y = heart_function(t, shrink_ratio=11.6)             x, y = shrink(x, y, halo_radius)             if (x, y) not in heart_halo_point:                 heart_halo_point.add((x, y))                 x += random.randint(-14, 14)                 y += random.randint(-14, 14)                 size = random.choice((1, 2, 2))                 all_points.append((x, y, size))           for x, y in self._points:             x, y = self.calc_position(x, y, ratio)             size = random.randint(1, 3)             all_points.append((x, y, size))           for x, y in self._edge_diffusion_points:             x, y = self.calc_position(x, y, ratio)             size = random.randint(1, 2)             all_points.append((x, y, size))           for x, y in self._center_diffusion_points:             x, y = self.calc_position(x, y, ratio)             size = random.randint(1, 2)             all_points.append((x, y, size))           self.all_points[generate_frame] = all_points       def render(self, render_canvas, render_frame):         for x, y, size in self.all_points[render_frame % self.generate_frame]:             render_canvas.create_rectangle(x, y, x + size, y + size, width=0, fill=HEART_COLOR)     def draw(main: Tk, render_canvas: Canvas, render_heart: Heart, render_frame=0):     render_canvas.delete('all')     render_heart.render(render_canvas, render_frame)     main.after(160, draw, main, render_canvas, render_heart, render_frame + 1)     if __name__ == '__main__':     root = Tk()  # 一个Tk     canvas = Canvas(root, bg='black', height=CANVAS_HEIGHT, width=CANVAS_WIDTH)     canvas.pack()     heart = Heart()     draw(root, canvas, heart) root.mainloop()———————————————— 版权声明:本文为CSDN博主「网络豆」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/yj11290301/article/details/129049746 
  • [技术干货] 一文学会队列入门:Python数据结构与算法【转】
    一文学会队列入门:Python数据结构与算法队列是计算机科学中的一个核心概念,有广泛的应用,如任务调度、数据同步等。了解其基本操作和特性,能够帮助我们更好地解决实际问题。队列(Queue)是一种特殊的线性数据结构,其操作遵循先进先出(FIFO)的原则,即最先添加到队列中的元素最先被移除。队列的基本概念队列的基本操作包括:入队(Enqueue)将元素添加到队列的尾部,和出队(Dequeue)从队列的头部移除元素。 在Python中,我们可以使用列表来简单地模拟队列,但为了效率更高,我们经常使用 collections 模块中的 deque 类来实现队列。from collections import deque# 创建一个队列queue = deque()# 入队操作queue.append(10)queue.append(20)queue.append(30)# 此时队列的状态为 [10, 20, 30]出队操作从队列的头部移除元素。# 出队操作first_element = queue.popleft() # 移除并返回头部元素,结果是 10# 此时队列的状态为 [20, 30]队列的辅助操作(1) 查看队首和队尾元素# 查看队首元素front_element = queue[0] # 结果是 20# 查看队尾元素rear_element = queue[-1] # 结果是 30(2) 检查队列是否为空is_empty = not bool(queue) # 如果队列为空,结果为 True(3) 获取队列的大小size = len(queue) # 结果是 2,因为队列中有两个元素优先队列优先队列是一种特殊的队列,其中每个元素都有一个与之相关的优先级。Python的heapq模块提供了实现优先队列的工具。import heapq# 创建一个空的优先队列priority_queue = []# 入队操作heapq.heappush(priority_queue, (1, "Task 1")) # 数字1表示优先级heapq.heappush(priority_queue, (3, "Task 3"))heapq.heappush(priority_queue, (2, "Task 2"))# 出队操作(按优先级)task = heapq.heappop(priority_queue) # 结果是 (1, "Task 1")双端队列deque 不仅可以作为一个队列使用,还可以支持从两端添加和删除元素,因此被称为双端队列。dq = deque()# 从头部和尾部添加元素dq.appendleft(10)dq.append(20)# 从头部和尾部移除元素dq.popleft() # 结果是 10dq.pop() # 结果是 20实战案例:任务调度假设我们有一个打印机,需要处理一系列的打印任务。任务有不同的优先级,并且需要在有限的时间内完成。我们可以使用队列来模拟这个过程。from random import randintclass PrintTask: def __init__(self, priority): self.priority = priority self.time_needed = randint(1, 5) # 随机生成所需时间 def tick(self): """减少任务所需的时间""" self.time_needed -= 1 def is_done(self): """检查任务是否完成""" return self.time_needed <= 0# 创建任务队列tasks = deque()# 生成10个随机任务for _ in range(10): p = randint(1, 5) tasks.append(PrintTask(p))# 处理任务while tasks: current_task = tasks.popleft() current_task.tick() print(f"Processing task with priority {current_task.priority}... Time left: {current_task.time_needed}") if not current_task.is_done(): tasks.append(current_task) else: print(f"Task with priority {current_task.priority} is done!")小结队列是计算机科学中的一个核心概念,有广泛的应用,如任务调度、数据同步等。了解其基本操作和特性,能够帮助我们更好地解决实际问题。原文链接:https://www.51cto.com/article/768052.html
  • [问题求助] 昇腾AI 200I DK A2 :安装pyqt5失败
    在昇腾AI 200I DK A2上安装pyqt5,失败,报错信息如下:
  • [专题汇总] 它来了,它来了,8月份技术干货它来了。
     大家好,8月份给大家整理带来的是codeArts版本最新的技术干货合集,涉及java,golang,python希望可以帮助到大家。  1.shell检查硬盘状态 https://bbs.huaweicloud.com/forum/thread-149840-1-1.html  2.Golang之sync.Pool对象池对象重用机制总结【转】 https://bbs.huaweicloud.com/forum/thread-0265128851946454378-1-1.html  3.Go defer 去掉闭包函数及用法分析【转】 https://bbs.huaweicloud.com/forum/thread-0236128851600101424-1-1.html  4.Golang中的闭包(Closures)详解【转】 https://bbs.huaweicloud.com/forum/thread-0297128851484457502-1-1.html  5.Go语言之io.ReadAtLeast函数的基本使用和原理解析【转】 https://bbs.huaweicloud.com/forum/thread-0299128851274052618-1-1.html  6.Go语言应用闭包之返回函数【转】 https://bbs.huaweicloud.com/forum/thread-0224128850654756516-1-1.html  7.一文详解Go语言io包中的discard类型【转】 https://bbs.huaweicloud.com/forum/thread-0265128850459435377-1-1.html  8.golang的tunny的用法示例教程【转】 https://bbs.huaweicloud.com/forum/thread-0263128850335015408-1-1.html  9.Go语言tunny的workerWrapper使用教程示例【转】 https://bbs.huaweicloud.com/forum/thread-0265128850197454376-1-1.html  10.GO语言实现日志切割的示例详解【转】 https://bbs.huaweicloud.com/forum/thread-0236128849958046421-1-1.html  11.一文带你了解Golang中的泛型【转】 https://bbs.huaweicloud.com/forum/thread-0263128849797446407-1-1.html  12.Go整合ElasticSearch的示例代码【转】 https://bbs.huaweicloud.com/forum/thread-0299128848232195616-1-1.html  13.Golang仿ps实现获取Linux进程信息【转】 https://bbs.huaweicloud.com/forum/thread-0286128848118160409-1-1.html  14.Go数据结构之HeapMap实现指定Key删除堆【转】 https://bbs.huaweicloud.com/forum/thread-0224128829750512487-1-1.html  15.基于Golang编写贪吃蛇游戏【转】 https://bbs.huaweicloud.com/forum/thread-0275128829535850518-1-1.html  16.用Go获取短信验证码的示例代码【转】 https://bbs.huaweicloud.com/forum/thread-0275128829460656517-1-1.html  17.golang使用sync.singleflight解决热点缓存穿透问题【转】 https://bbs.huaweicloud.com/forum/thread-0275128829216193516-1-1.html  18.vue 实现 pdf 预览功能 https://bbs.huaweicloud.com/forum/thread-0224128574304525257-1-1.html  19.Nacos部署中的一些常见问题 https://bbs.huaweicloud.com/forum/thread-0286128573822017203-1-1.html  20.用ngrok实现内网穿透,一行命令就搞定! https://bbs.huaweicloud.com/forum/thread-0224128573537080255-1-1.html  21.过滤器+slf4j(MDC)实现日志记录请求ID https://bbs.huaweicloud.com/forum/thread-0263128573250127242-1-1.html  22.阿里EasyExcel快速导出demo https://bbs.huaweicloud.com/forum/thread-0265128573093017187-1-1.html  23.业务开发时,接口不能对外暴露怎么办? https://bbs.huaweicloud.com/forum/thread-0224128572747042254-1-1.html  24.centos同步windows时间 https://bbs.huaweicloud.com/forum/thread-0286128572497851201-1-1.html  25.切面实现下单请求防重提交功能(自定义注释@repeatSubmit) https://bbs.huaweicloud.com/forum/thread-0263128572383761239-1-1.html 
总条数:2474 到第 页
上滑加载中