关于python:聊聊-Jmeter-如何并发执行-Python-脚本

1. 前言 用Django 写了一个大文件上传的 Api 接口,当初想本地测验一下接口并发的稳定性,有没有好的计划,本篇文章以文件上传为例,聊聊 Jmeter 并发执行 Python 脚本的残缺流程 2. Python 实现文件上传大文件上传蕴含 4 个步骤,别离是: 获取文件信息及切片数目分段切片,并上传 - API文件合并 - API文件门路参数化2-1 获取文件信息及切片数目 首先,获取文件的大小 而后,利用预设的切片大小获取分段总数 最初,获取文件名及 md5 值 import osimport mathimport hashlibdef get_file_md5(self, file_path): """获取文件的md5值""" with open(file_path, 'rb') as f: data = f.read() return hashlib.md5(data).hexdigest()def get_filename(self, filepath): """获取文件原始名称""" # 文件名带后缀 filename_with_suffix = os.path.basename(filepath) # 文件名 filename = filename_with_suffix.split('.')[0] # 后缀名 suffix = filename_with_suffix.split('.')[-1] return filename_with_suffix, filename, suffixdef get_chunk_info(self, file_path): """获取分段信息""" # 获取文件总大小(字节) file_total_size = os.path.getsize(file_path) print(file_total_size) # 分段总数 total_chunks_num = math.ceil(file_total_size / self.chunk_size) # 文件名(带后缀) filename = self.get_filename(file_path)[0] # 文件的md5值 file_md5 = self.get_file_md5(file_path) return file_total_size, total_chunks_num, filename, file_md52-2 切片及分段上传 ...

July 26, 2022 · 2 min · jiezi

关于python:如何快速把你的-Python-代码变为-API

提到 API 开发,你可能会想到 Django REST Framework,Flask,FastAPI,没错,它们齐全能够用来编写 API,不过,明天分享的这个框架能够让你更快把现有的函数转化为 API,它就是 Sanic。 Sanic 简介 Sanic[1],是 Python3.7+ Web 服务器和 Web 框架,旨在进步性能。它容许应用 Python3.5 中增加的 async/await 语法,这能够无效防止阻塞从而达到晋升响应速度的目标。Sanic致力于提供一种简略且疾速,集创立和启动于一体的办法,来实现一个易于批改和拓展的 HTTP 服务,Sanic 具备开箱即用的性能,它能够用于编写,部署和扩大生产级 Web 应用程序。目前 Github 有 16.3k 的星,有宽泛的社区反对。 有以下个性: 内置极速 web server生产准备就绪极高的拓展性反对 ASGI简略直观的 API 设计社区保障如何将现有代码疾速转化为 API 当初让咱们看,如何将代码转为 API,如果有曾经在 functions.py 写好的两个函数: import datetimedef get_datetime(): return datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")def sum_x_y(x, y): return x + y转化为 API 只需再编写一个 sanic_app.py from sanic import Sanic, jsonfrom functions import get_datetime, sum_x_yapp = Sanic("CodeToAPI")HOST = "localhost"PORT = 8000@app.route("/getdatetime")async def getdatetime(request): return json({"now": get_datetime()})@app.get('/sumxy')async def sumxy(request): parameters = request.args result = sum_x_y(int(parameters['x'][0]), int(parameters['y'][0])) return json({'result': result})if __name__ == "__main__": app.run(host=HOST, port=PORT, debug=False)而后,只须要执行 python sanic_app.py 就能够启动 API 服务: ...

July 26, 2022 · 1 min · jiezi

关于python:不用再争论了这才是最适合Python初学者的IDE

Python频繁霸屏,让越来越多的同学开始尝试自学Python。 学习一门编程语言,首先要筹备的就是开发环境,解释器/编译器、IDE/编辑器等。 对于Python也是这样,尽管它绝对简略,然而,对于在行来说,抉择一款开发工具就成了黑盒一样,手足无措。 如果问一位Python开发者,应该抉择哪款开发工具? 99%的会在PyCharm、VS Code、Sublime、Eclipse、Jupyter这些出名的工具中进行抉择。 诚然,这些名气很大的开发工具确实很好用。 然而,如果把指标手中限定在初学者这个角色时,我认为这些都不是最佳的抉择。 以PyCharm为例,它确实很好用,能够说是一款“傻瓜式”的开发工具,开箱即用,加上弱小的智能补全、辅助性能,可能让开发效率倍增。 要留神,PyCharm、VS Code这些出名的开发工具指标次要集中在效率,怎么通过各种欠缺的设计进一步晋升开发效率。 甚至输出3个字母,就能够补全5-10的代码库。 这样效率确实晋升了,然而,长此以往当产生依赖之后会发现,脱离这些开发工具就不晓得该如何写了。 对于很多有肯定教训的Python开发者,如果给你一款纯文本编辑器,还能够自若的实现一项性能的开发吗? 我感觉这样可能过滤掉很大一部开发者,至多效率可能骤降。 我认为,对于对一门编程语言有肯定根底的开发者,确实应该解脱工具的限度,着重晋升开发效率,这无可非议。然而,对于初学者,我跟认为,还是应该好高鹜远,把根底打牢。 话说回来,之前确实很少有专门针对初学者专门设计的开发工具。 然而,近期我无心中发现了一款十分不错针对初学者的开发工具,能够说是十分良心了。 上面,就来把这款名为Thonny的开发工具介绍给大家。 介绍 Thonny是一款跨平台、针对初学者而生的Python开发工具,它能够在Windows、mac、Linux这些支流的操作系统上进行工作。 概括这款开发工具,它次要有如下几点个性: 易于上手无障碍变量面板简洁的调试器代码评估易于了解的函数调用语法高亮主动补全对初学者敌对的命令行简略洁净的pip界面反对简体中文这款工具的个性有很多,上面就筛选几个比拟吸引我的进行介绍一下。 易于上手 Thonny内置了Python 3.7,因而,你不须要去纠结解释器与开发工具之间的关系,只须要一个简略的安装程序,就能够学习编程了。 当然,如果须要,也能够应用本人独自装置的Python解释器。 另外,Thonny界面能够称得上“极简”,它去掉了那些容易让用户分心或费解的按钮、性能,只保留了一些必要的性能。 装置之后,就能够立马应用,初学者用到的编辑、交互式命令行、变量面板、调试,这些必要的都有。 代码评估 这款工具绝对于其余Python开发工具比拟吸引我的就是这一点。 每次执行代码之后,它会对代码进行剖析,你的语法,乃至文件命名,它都会给出剖析后果。 这样可能防止初学者犯一些标准方面的谬误,养成一些良好的开发习惯。 简略洁净的pip界面 Python是一门对第三方工具包有很强依赖的编程语言,对于初学者而言,如何装置这些工具包始终都是一个令人困扰的问题。 罕用的通过pip命令进行装置的形式,对于没有根底的初学者来说有很大挑战。 尽管PyCharm能够在设置后进行装置,然而PyCharm的设置界面能够称得上十分臃肿,对于初学者可能把这款工具的UI界面弄明确都是一件简单的事件。 Thonny中抉择工具→治理软件包,以更轻松地装置第三方软件包。 易于了解的函数调用 进入函数调用会关上一个带有独自的局部变量表和代码指针的新窗口,可能帮忙学习者充沛理解函数调用的原理,尤其对于了解递归这种绝对简单的逻辑,十分无效。 反对简体中文 因为目前绝大多数开发工具均来自国外,因而,很多都是默认只反对英语。 这对于英语水平无限的同学,很难了解。再加上这些词汇偏差于业余,从英语翻译成汉语让人难以了解。 Thonny默认反对多语种,当然也蕴含简体中文。 我认为,这从语言层面解决了很多同学的困扰,绝对于很多开发工具能够说十分值得举荐! 除此之外,主动补全、语法高亮、无障碍变量面板等性能也十分实用,感兴趣的同学能够具体理解。 以上就是本次分享的所有内容,如果你感觉文章还不错,欢送关注公众号:Python编程学习圈,每日干货分享,发送“J”还可支付大量学习材料,内容笼罩Python电子书、教程、数据库编程、Django,爬虫,云计算等等。或是返回编程学习网,理解更多编程技术常识。

July 26, 2022 · 1 min · jiezi

关于python:相见恨晚Python那些不为人知的大坑

”Python容易“仿佛曾经成了很多开发者的共识,确实,它的表达方式曾经十分靠近自然语言。不必像C++那样去思考指针、内存,也不必像Java那样深刻了解JVM。 缓缓的,开发者开始确切的认为”咱们写的代码是完全正确的“。 然而,在漠视Python的细节的过程中,会发现,会呈现奇奇怪怪的谬误。回头定位时,迟迟定位不出问题,在网络上搜寻也找不到对应的解决方案,回头看代码,感觉代码无懈可击。殊不知,在开发过程中曾经犯了很多谬误。 本文,就总结5个Python初学者常常会遇到的谬误。不瞒各位,其中有些谬误我当初也踩过坑,并且迟迟无奈逃脱,心愿把这些问题总结进去,防止大家再次踩坑! 1. 字典拷贝有些场景下,须要对字典拷贝一个正本。这个正本用于保留原始数据,而后原来的字典去参加其余运算,或者作为参数传递给一些函数。 例如, >>> dict_a = {"name": "John", "address":"221B Baker street"}>>> dict_b = dict_a利用赋值运算法把dict_a赋值给dict_b之后,这2个变量的值是雷同的。 你或者会拿着dict_b去参加其余的运算,例如,更新/增加键值对。 但事实却不是你认为的那样,如果你更新或者编辑dict_b,dict_a也会随之扭转,具体内容能够理解一下Python可变对象与不可变对象。 上面来看一下成果: >>> dict_b["age"] = 26>>> dict_b{'address': '221B Baker street', 'name': 'John', 'age': 26}>>> dict_a{'address': '221B Baker street', 'name': 'John', 'age': 26}你会发现,给dict_b增加了一个age:26键值对,dict_a也更新了,这样,咱们留一个正本就没有任何意义了。 针对这个问题,能够用Python中的浅拷贝copy、深拷贝deepcopy来解决,上面来看一下, >>> dict_c = dict_b.copy()>>> dict_c["location"] = "somewhere">>> dict_c{'address': '221B Baker street', 'name': 'John', 'age': 26, 'location': 'somewhere'}>>> dict_b{'address': '221B Baker street', 'name': 'John', 'age': 26}2. 字典键值首先,来看一个示例, >>> dict_a = dict()>>> dict_a{}>>> dict_a[1] = "apple">>> dict_a[True] = "mango">>> dict_a[2] = "melon">>> dict_a{1: 'mango', 2: 'melon'}你留神到产生了什么吗? ...

July 26, 2022 · 1 min · jiezi

关于python:Python进程管理神器Supervisor

这是我的集体博客地址。一、简介Supervisor 是一款 Python 开发的过程管理系统,容许用户监督和管制 Linux 上的过程,能将一个一般命令行过程变为后盾守护过程,异样退出时能主动重启具体介绍查阅:Supervisor Introduction 二、装置Supervisor 反对 Linux 和 Mac,不反对 Windows本文零碎为: centos,supervisor==4.2.4 pip3 install supervisor装置实现后,在Python bin目录上面会有这样几个文件。 ls /usr/local/Python38/binecho_supervisord_confsupervisorctlsupervisord注:因为python bin目录是退出了环境变量,所以能够间接执行这几个文件。 三、创立配置文件首先建个目录,寄存配置文件:mkdir supervisord。 echo_supervisord_conf > supervisord/supervisord.conf若报错 -bash: /etc/supervisord.conf: Permission denied,须要切换到 root用户。 创立子过程配置文件门路 mkdir -p supervisor/conf.d前面咱们的工作,咱们想把它作为守护过程,都须要一个配置文件,咱们把这些配置文件放在conf.d目录上面。 批改配置文件 vim supervisord/supervisord.conf将最初一部分改为 [include]# 因为我这里是放在root用户目录下,也能够放其它目录files=/root/supervisord/conf.d/*.conf四、初试启动 supervisord supervisord -c supervisord/supervisord.conf这样就把supervisord启动了,咱们接下来能够把咱们的工作交给他去守护了,进行了会帮咱们主动重启。 查看版本 supervisord -v编写简略的 Shell 脚本 vim supervisord/test.sh内容如下 #!/bin/bashwhile : do echo `date '+%Y-%m-%d %H:%m:%S'` sleep 1done简略运行,Ctrl + C 退出 创立子过程配置文件 vim supervisor/conf.d/test.conftest.conf内容如下: [program:test]command=sh /root/supervisord/test.shpriority=999 ; 绝对启动优先级,数值越小越优先,默认为999autostart=true ; 在supervisor启动时主动启动,默认为trueautorestart=true ; 在意外退出时重新启动,默认为truestartsecs=10 ; 子过程启动多少秒后状态为running则认为启动胜利,默认为1startretries=3 ; 尝试启动的最大次数,默认为3exitcodes=0,2 ; 过程的预期退出代码列表,默认为0stopsignal=QUIT ; 终止过程的信号,默认为TERMstopwaitsecs=10 ; 在SIGKILL之前期待的最大秒数,默认为10user=root ; 在某用户下设置uid来启动程序,默认不切换用户redirect_stderr=true ; 是否重定向stdout和stderr,默认为falsestdout_logfile=/tmp/supervisor.stdout.log ; stdout的输入文件,默认为AUTOstdout_logfile_maxbytes=50MB ; stdout最大文件大小,默认为50MBstdout_logfile_backups=10 ; stdout文件备份数,设为0则不备份,默认为10其实只须要配置3个参数,其它不必管: ...

July 25, 2022 · 1 min · jiezi

关于python:轻松实现-Python-动态配置管理-Dynaconf

Dynaconf 是一个 Python 的第三方模块,旨在成为在 Python 中治理配置的最佳抉择。它能够从各种起源读取设置,包含环境变量、文件、服务器配置等它实用于任何类型的 Python 程序,包含 Flask 和 Django 扩大 1.筹备 开始之前,你要确保 Python 和 pip 曾经胜利装置在电脑上 而后,请抉择以下任一种形式输出命令装置依赖: Windows 环境 关上 Cmd ( 开始-运行-CMD )MacOS 环境 关上 Terminal ( command + 空格输出 Terminal )如果你用的是 VSCode 编辑器 或 Pycharm,能够间接应用界面下方的 Terminalpip install dynaconf 2.初步应用DynaConf 在你的我的项目的根目录中运行 dynaconf init 命令。 cd path/to/your/project/dynaconf init -f toml会有相似如下的输入,阐明初始化实现: ⚙️ Configuring your Dynaconf environment------------------------------------------ The file `config.py` was generated.️ settings.toml created to hold your settings. .secrets.toml created to hold your secrets. the .secrets.* is also included in `.gitignore`beware to not push your secrets to a public repo. Dynaconf is configured! read more on https://dynaconf.com刚刚初始化的时候咱们抉择了 toml 格局。实际上你还能够抉择 toml|yaml|json|ini|py ,不过 toml 是默认的,也是最举荐的配置格局。 ...

July 25, 2022 · 2 min · jiezi

关于python:如何用-Python-统计-Jira-数据并可视化

目前公司应用 Jira 作为项目管理工具,在每一次迭代实现后的复盘会上,咱们都须要针对本次迭代的 Bug 进行数据统计,以帮忙管理层能更直观的理解研发的代码品质 本篇文章将介绍如何利用统计 Jira 数据,并进行可视化 1. 筹备首先,装置 Python 依赖库 # 装置依赖库pip3 install jirapip3 install html-tablepip3 install pyechartspip3 install snapshot_selenium其中 jira 应用 jsql 语法从在我的项目中获取须要的数据html-table 用于生成一个 HTML 格局的表格数据pyecharts 和 snapshot_selenium 用于数据可视化2. 实战一下上面咱们通过 7 个步骤来实现下面的性能 2-1 登录获取客户端连贯对象 from jira import JIRAclass JiraObj(object): def __init__(self, bug_style, project_type): """ :param project_name :param sprint: 迭代号码 :param bug_style: BUG状态 """ # Jira首页地址 self.server = 'https://jira.**.team' # Jira登录账号信息 self.basic_auth = ('用户名', '明码') # 创立一个客户端连贯信息 self.jiraClinet = JIRA(server=self.server, basic_auth=self.basic_auth)2-2 依据我的项目类型获取看板 id ...

July 25, 2022 · 3 min · jiezi

关于python:某课Python全能工程师2022版完结

download:某课Python全能工程师2022版完结Golang | 模块引入与疾速实现表格的读写业务介绍在很多管理系统下都有不少让后端进行表格进行操作的业务需要,本期就带大家了解一下Golang中如何使用模块引入的,以及讲解怎么疾速的使用excelize库,对表格进行读写创建的。注释配置模块引入环境咱们在期望在vscode终端中也可能使用模块引入,它是 Go 1.11后新版模块治理形式。go env -w GO111MODULE=auto复制代码其 GO111MODULE 可能传送: auto:在其外层且根目录里有 go.mod 文件时,则开启模块反对,否者无模块反对。 on:开启模块反对。 off:无模块反对。 而后,初始化这个我的项目,就会生成一个 go.mod 文件。go mod init excel-demo复制代码 go.mod 是Go 1.11版本引入的官网的包管理工具(之前为 gopath 来治理),它可能理解为前端开发中的 npm 的作用,次要是为理解决没有记录依赖包具体版本查阅艰巨的问题,也极大程度上便利了依赖包的治理。 引入excelize库excelize 是一个用于读写 Microsoft Excel™2007 及更高版本生成的电子表格文档(XLAM / XLSM / XLSX / XLTM / XLTX)的 Go 语言库,而且更新保护频繁且非常好用。引入excelizego get github.com/xuri/excelize/v2复制代码这里因为站点是国外的所以常常会因无法访问而超时。此时,不要慌,咱们换一个国内的代理就好了。go env -w GOPROXY=https://goproxy.cn复制代码创建表格package main import ( "fmt""github.com/xuri/excelize/v2") func createExcel(){ // 创建表格文件f := excelize.NewFile()// 在Sheet1设置A1项的值f.SetCellValue("Sheet1", "A1", "这是Sheet1的A1项")// 创建新的Sheet,命名为Sheet2selectIndex := f.NewSheet("Sheet2")// 在Sheet2设置B2项的值f.SetCellValue("Sheet2", "B2", "这是Sheet2的B2项")// 切换到Sheet2f.SetActiveSheet(selectIndex)// 保存文件if err := f.SaveAs("test.xlsx"); err != nil { fmt.Println(err)}} ...

July 25, 2022 · 2 min · jiezi

关于python:666Python竟然还可以计算农历

最近解决工作工作的时候遇到了转换农历的问题。一开始我打算搜寻在线解决的网站或者转换的接口,后果找到了一个Python库能够间接解决,明天正好同大家分享一下。 农历,是我国现行的传统历法。它是依据月相的变动周期,每一次月相朔望变动为一个月,参考太阳回归年为一年的长度,并退出二十四节气与设置闰月以使均匀历年与回归年相适应。 对于咱们解决数据来说,并不需要去具体钻研农历与公历之间的转换关系。在Python中,ZhDate库反对农历-公历相互转换、日期加减以及全中文日期生成,内置了1900-2100年的农历数据,仅依赖Python内置模块。 因为ZhDate属于Python的第三⽅开源模块,因而须要额定装置、导⼊后,能力使⽤。间接在命令⾏窗⼝中输⼊如下命令: pip install zhdate具体应用办法zhdate库,不必网络接口间接本地计算中国农历,反对农历阳历互转[2]。 阳历与农历日期的互相转换在交互式环境中输出如下命令: from zhdate import ZhDatedate1 = ZhDate(2022, 2, 2)  # 新建农历 2022年二月初二(龙抬头)的日期对象print(date1)  # 间接返回农历日期字符串d输入: 农历2022年2月2日在交互式环境中输出如下命令: t_date1 = date1.to_datetime()t_date1输入: datetime.datetime(2022, 3, 4, 0, 0)在交互式环境中输出如下命令: from datetime import datetimedt_date2 = datetime(2022, 2, 6)date2 = ZhDate.from_datetime(dt_date2)  # 从阳历日期转换成农历日期对象date2输入: 农历2022年1月6日闰月在交互式环境中输出如下命令: date3 = ZhDate(2020, 4, 15)  # 新建农历 2020年4月15日print(date3.to_datetime())输入: 2020-05-07 00:00:00 在交互式环境中输出如下命令: date3 = ZhDate(2020, 4, 15)  # 新建农历 2020年闰4月15日print(date3.to_datetime())输入: 2020-06-06 00:00:00这一年农历4月15日的同学,能够别离在5月7日和6月6日别离过两次农历生日。 其余中文输入,在交互式环境中输出如下命令: dt_date4 = datetime(2022, 3, 4)date4 = ZhDate.from_datetime(dt_date4)print(date4.chinese())输入: 二零二二年二月初二 壬寅年 (虎年)当天的农历日期,在交互式环境中输出如下命令: ZhDate.today()输入: 农历2022年2月7日此外,zhdate模块也反对加减法。两个zhdate对象相减能够失去两个农历日期的差额,同时加整数也能够返回相隔天数当前的新农历对象。 实战:计算节日间隔天数上面通过一个实战我的项目练习一下这个zhdate模块。 如果咱们想疾速地理解明天间隔某个节日还有多少天?能够应用zhdate和datetime库搭配解决这个问题。 在交互式环境中输出如下命令: today = datetime.now()data_str = today.strftime('%Y-%m-%d')data_str输入: '2022-03-09'计算间隔劳动节的天数,在交互式环境中输出如下命令: oneDay = datetime(2022, 5, 1)difference = oneDay.toordinal()-today.toordinal()print(f'明天 {data_str} 间隔五一劳动节还有 {difference} 天')输入: 明天 2022-03-09 间隔五一劳动节还有 53 天 计算间隔中秋节的天数,在交互式环境中输出如下命令: oneDay = ZhDate(2022, 8, 15).to_datetime()difference = oneDay.toordinal()-today.toordinal()print(f'明天 {data_str} 间隔中秋节还有 {difference} 天')输入: 明天 2022-03-09 间隔中秋节还有 185 天大家有工夫也能够入手试一试,测试一下还间隔其余节日多少天?实战时要留神该节日是依照公历统计还是农历设置的。 以上就是本次分享的所有内容,如果你感觉文章还不错,欢送关注公众号:Python编程学习圈,每日干货分享,发送“J”还可支付大量学习材料,内容笼罩Python电子书、教程、数据库编程、Django,爬虫,云计算等等。或是返回编程学习网,理解更多编程技术常识。

July 25, 2022 · 1 min · jiezi

关于python:Python中最强大的错误重试库

1 简介咱们在编写程序尤其是与网络申请相干的程序,如调用web接口、运行网络爬虫等工作时,常常会遇到一些偶尔产生的申请失败的情况,这种时候如果咱们仅仅简略的捕获谬误而后跳过对应工作,必定是不谨严的,尤其是在网络爬虫中,会存在损失有价值数据的危险。 这类状况下咱们就很有必要为咱们的程序逻辑增加一些「谬误重试」的策略,费老师我在几年前写过文章介绍过Python中的retry库,但它性能较为繁多,只能应答根本的需要。 而明天我要给大家介绍的tenacity库,可能是目前Python生态中最好用的谬误重试库,上面就让咱们一睹其次要性能吧~ 2 tenacity中的罕用性能作为一个第三方Python库,咱们能够应用pip install tenacity对其进行装置,装置实现后,上面咱们来学习一下tenacity的次要应用办法和个性: 2.1 tenacity的根底应用tenacity的谬误重试外围性能由其retry装璜器来实现,默认不给retry装璜器传参数时,它会在其所装璜的函数运行过程抛出谬误时不停地重试上来,譬如上面这个简略的例子: import randomfrom tenacity import retry@retrydef demo_func1():    a = random.random()    print(a)        if a >= 0.1:        raise Exceptiondemo_func1() 能够看到,咱们的函数体内每次生成0到1之间的随机数,当这个随机数不超过0.1时才会进行抛出谬误,否则则会被tenacity捕捉到每次的谬误抛出行为并立刻重试。 2.2 设置最大重试次数有些时候咱们对某段函数逻辑谬误重试的忍受是有限度的,譬如当咱们调用某个网络接口时,如果间断n次都执行失败,咱们可能就会认为这个工作自身就存在缺点,不是通过重试就能有朝一日失常的。 这种时候咱们能够利用tenacity中的stop_after_attempt函数,作为retry()中的stop参数传入,从而为咱们“无尽”的谬误重试过程增加一个起点,其中stop_after_attempt()承受一个整数输出作为「最大重试」的次数: from tenacity import retry, stop_after_attempt@retry(stop=stop_after_attempt(3))def demo_func2():        print('函数执行')        raise Exception    demo_func2() 能够看到,咱们的函数在限度了最大重试次数后,通过3次重试,在第4次继续执行仍然抛出谬误后,正式地抛出了函数中对应的Exception谬误完结了重试过程。 2.3 设置重试最大超时时长咱们除了像上一大节中那样设置最大谬误重试的次数之外,tenacity还为咱们提供了stop_after_delay()函数来设置整个重试过程的最大耗时,超出这个时长也会完结重试过程: import timefrom tenacity import retry, stop_after_delay# 设置重试最大超时时长为5秒@retry(stop=stop_after_delay(5))def demo_func3():        time.sleep(1)    print(f'已过来 {time.time() - start_time} 秒')        raise Exception# 记录开始工夫start_time = time.time()demo_func3() 2.4 组合重试进行条件如果咱们的工作同时须要增加最大重试次数以及最大超时时长限度,在tenacity中仅须要用|运算符组合不同的限度条件再传入retry()的stop参数即可,譬如上面的例子,当咱们的函数执行重试超过3秒或次数大于5次时均能够完结重试: import timeimport randomfrom tenacity import retry, stop_after_delay, stop_after_attempt@retry(stop=(stop_after_delay(3) | stop_after_attempt(5)))def demo_func4():        time.sleep(random.random())    print(f'已过来 {time.time() - start_time} 秒')        raise Exception# 记录开始工夫start_time = time.time()demo_func4() 能够看到,在下面的演示中,先达到了“最大重试5次”的限度从而完结了重试过程。 2.5 设置相邻重试之间的工夫距离有些状况下咱们并不心愿每一次重试抛出谬误后,立刻开始下一次的重试,譬如爬虫工作中为了更好地假装咱们的程序,tenacity中提供了一系列十分实用的函数,配合retry()的wait参数,帮忙咱们妥善处理相邻重试之间的工夫距离,其中较为实用的次要有以下两种形式: 2.5.1 设置固定工夫距离咱们通过应用tenacity中的wait_fixed()能够为相邻重试之间设置固定的期待距离秒数,就像上面的简略示例那样: import timefrom tenacity import retry, wait_fixed, stop_after_attempt# 设置重试期待距离为1秒@retry(wait=wait_fixed(1), stop=stop_after_attempt(3))def demo_func5():        print(f'已过来 {time.time() - start_time} 秒')        raise Exception    # 记录开始工夫start_time = time.time()demo_func5() 2.5.2 设置随机工夫距离除了设置固定的工夫距离外,tenacity还能够通过wait_random()帮忙咱们为相邻重试设置均匀分布随机数,只须要设置好均匀分布的范畴即可: import timefrom tenacity import retry, wait_random, stop_after_attempt# 设置重试期待距离为1到3之间的随机数@retry(wait=wait_random(min=1, max=3), stop=stop_after_attempt(5))def demo_func6():        print(f'已过来 {time.time() - start_time} 秒')        raise Exception# 记录开始工夫start_time = time.time()demo_func6() 能够察看到,每一次重试后的期待时长都是随机的~ 2.6 自定义是否触发重试tenacity中retry()的默认策略是当其所装璜的函数执行过程“抛出任何谬误”时即进行重试,但有些状况下咱们须要的可能是对特定谬误类型的捕获/疏忽,亦或是对异样计算结果的捕获。 tenacity中同样内置了相干的实用功能: 2.6.1 捕获或疏忽特定的谬误类型应用tenacity中的retry_if_exception_type()和retry_if_not_exception_type(),配合retry()的retry参数,咱们能够对特定的谬误类型进行捕获或疏忽: from tenacity import retry, retry_if_exception_type, retry_if_not_exception_type@retry(retry=retry_if_exception_type(FileExistsError))def demo_func7():        raise TimeoutError    @retry(retry=retry_if_not_exception_type(FileNotFoundError))def demo_func8():    raise FileNotFoundError 2.6.2 自定义函数后果条件判断函数咱们能够编写额定的条件判断函数,配合tenacity中的retry_if_result(),实现对函数的返回后果进行自定义条件判断,返回True时才会触发重试操作: import randomfrom tenacity import retry, retry_if_result@retry(retry=retry_if_result(lambda x: x >= 0.1))def demo_func9():    a = random.random()    print(a)    return a# 记录开始工夫demo_func9() 2.7 对函数的谬误重试状况进行统计被tenacity的retry()装璜的函数,咱们能够打印其retry.statistics属性查看其历经的谬误重试统计记录后果,譬如这里咱们对后面执行过的示例函数demo_func9()的统计后果进行打印: demo_func9.retry.statistics 除了上述的性能之外,tenacity还具备很多非凡的个性,能够联合logging模块、异步函数、协程等其余Python性能实现更高级的性能,感兴趣的敌人能够返回https://github.com/jd/tenacity理解更多。 以上就是本次分享的所有内容,如果你感觉文章还不错,欢送关注公众号:Python编程学习圈,每日干货分享,发送“J”还可支付大量学习材料,内容笼罩Python电子书、教程、数据库编程、Django,爬虫,云计算等等。或是返回编程学习网,理解更多编程技术常识。

July 25, 2022 · 1 min · jiezi

关于python:教你用-Python-快速批量转换-HEIC-文件

1. 前言最近打算做一批日历给亲朋好友,然而从 iPhone 上导出的照片格局是 HEIC 格局,而商家的在线制作网站不反对这种图片格式 PS:HEIC 是苹果采纳的新的默认图片格式,它能在不损失图片画质的状况下,缩小图片大小 有很多在线网站反对图片批量转换,然而平安隐衷又没法失去保障;如果应用 PS 等软件去一张张转换,浪费时间的同时效率太低 本篇文章将应用 Python 批量实现 HEIC 图片文件的格局转换 2. 筹备首先,咱们装置 pyheif 依赖包 Linux 和 Mac OS 能够通过上面链接抉择适合的形式进行装置 https://pypi.org/project/pyheif/ 如果是 Windows,咱们只能下载 whl 依赖文件,应用 pip 命令进行装置 下载地址: https://www.lfd.uci.edu/~gohl... 留神:咱们须要依据零碎及 Python 版本抉择对应的文件进行装置 # 比方,本机是win10+64位 + Python3.7# 通过上面链接下载文件:pyheif‑0.6.1‑cp37‑cp37m‑win_amd64.whlhttps://www.lfd.uci.edu/~gohlke/pythonlibs/#pyheif# 而后进行虚拟环境# 应用pip3命令装置whl文件pip3 install pyheif‑0.6.1‑cp37‑cp37m‑win_amd64.whl而后,装置 PIL 依赖,用于图片解决 # 装置依赖pip3 install Pillow3. 实战首先,遍历源文件夹及子文件夹,获取所有 HEIC 格局(不辨别大小写)的图片 import pathlibimport osdef get_all_heic_imgs(): """ 获取所有heic格局的图片 :return: """ # heif_image_paths = glob.glob(r"{}/*.heic".format(source_path)) # 满足条件的文件列表 filelist = [] for root, dirnames, filenames in os.walk(source_path): for filename in filenames: # filename:文件名、root:文件对应的目录 # 获取文件后缀名 file_end = pathlib.Path(filename).suffix # 文件名(不带后缀) file_name = pathlib.Path(filename).name.split(".")[-2] if file_end in ['.heic', '.HEIC']: # 文件的残缺目录 # file_path = os.path.join(root, filename) filelist.append({ "filename": file_name, "filepath": os.path.join(root, filename) }) return filelist而后,遍历文件列表,应用 pyheif 读取文件,应用PIL 转为二进制图片,以 JPG 格局保留到指标文件夹下 ...

July 23, 2022 · 1 min · jiezi

关于python:5-分钟教你用-Docker-部署一个-Python-应用

在应用传统物理机或云服务器上部署我的项目都会存在一些痛点 比方:我的项目部署速度慢、资源节约、迁徙难且扩大低 而应用 Docker 部署我的项目的劣势蕴含: 高效利用系统资源服务启动更快环境统一,迁徙更加不便本篇文章将介绍 Docker 部署一个 Python 我的项目的惯例流程 1. Dockerfile 形容文件Dockerfile 是一个搁置在我的项目根目录下的形容文件,能够利用 Docker 命令基于该文件构建一个镜像 罕用的指令蕴含: FROM用于定义根底镜像MAINTAINER指定维护者信息,能够省略不写RUN和「 装置命令 」连贯在一起,可用于装置工具依赖包ADD将宿主机的文件,并进行解压COPY和 ADD 指令性能一样,然而不会进行解压操作WORKDIR用于切换工作目录VOLUME配置宿主机与容器的目录映射EXPOSE配置容器内我的项目对外裸露的端口号CMD指定容器启动后,运行的命令比方,能够运行某个命令启动我的项目 2. 实战一下应用 Docker 部署利用的惯例流程是: 开发我的项目并本地测试通过编写 Dockerfile 搁置到我的项目根目录打包镜像文件运行镜像容器测试为了演示不便,这里以一个简略的 Flask 我的项目为例进行解说 2-1 我的项目开发 from flask import Flask# 装置依赖# pip3 install -U flaskapp = Flask(__name__)@app.route('/')def index(): return "测试容器部署!"if __name__ == '__main__': app.run(host='0.0.0.0', port=8888)# 浏览器拜访测试# http://127.0.0.1:8888/我的项目开发实现,并在本地测试通过后就能够编写 Dockerfile 文件了 2-2 编写 Dockerfile 在我的项目根目录下,创立一个 Dockerfile 文件,应用下面的指令编写形容脚本 须要留神的是,这里应用「 EXPOSE 」指令裸露的端口号与入口文件定义的端口号保持一致 # DockerfileFROM centos:7.9.2009RUN yum makecache fast;RUN yum install python3-devel python3-pip -yRUN pip3 install -i https://pypi.douban.com/simple flaskCOPY main.py /optWORKDIR /optEXPOSE 8888CMD ["python3","main.py"]2-3 构建镜像 ...

July 23, 2022 · 1 min · jiezi

关于python:盘点Python爬虫中的常见加密算法

置信大家在数据抓取的时候,会碰到很多加密的参数,例如像是“token”、“sign”等等,明天小编就带着大家来盘点一下数据抓取过程中这些支流的加密算法,它们有什么特色、加密的形式有哪些等等,晓得了这些之后对于咱们逆向破解这些加密的参数会起到不少的帮忙! 根底常识首先咱们须要明确的是,什么是加密和解密?顾名思义 加密(Encryption): 将明文数据变换为密文的过程解密(Decryption): 加密的逆过程,即由密文复原出原明文的过程。加密和解密算法的操作通常都是在一组密钥的管制下进行的,别离成为是加密密钥(Encryption Key)和解密密钥(Decryption Key),如下图所示 而加密算法当中又分为是对称加密和非对称加密以及散列算法,其中 对称加密:即加密与解密时应用的是雷同的密钥,例如RC4、AES、DES等加密算法非对称加密:即加密与解密时应用不雷同的密钥,例如RSA加密算法等散列算法:又称为是哈希函数。对不同长度的输出音讯产生固定的输入,该输入值就是散列值Base64伪加密Base64严格意义上来说不算做事加密的算法,只是一种编码的形式,它是一种用64个字符,别离是A-Z、a-z、0-9、+、/这64个字符,实现对数据的编码,可用于在HTTP环境下传递较长的标识信息。采纳Base64编码具备不可读性,须要解码后能力浏览。咱们应用Python来对任意网址进行Base64的编码操作,代码如下 import base64# 想将字符串转编码成base64,要先将字符串转换成二进制数据url = "www.baidu.com"bytes_url = url.encode("utf-8")str_url = base64.b64encode(bytes_url)  # 被编码的参数必须是二进制数据print(str_url)output b'd3d3LmJhaWR1LmNvbQ=='那么同样地,咱们也能够对其进行解码的操作,代码如下 url = "d3d3LmJhaWR1LmNvbQ=="str_url = base64.b64decode(url).decode("utf-8")print(str_url)output www.baidu.comMD5加密MD5是一种被宽泛应用的线性散列算法,且加密之后产生的是一个固定长度(32位或者是16位)的数据,由字母和数字组成,大小写对立。其最初加密生成的数据是不可逆的,也就是说不可能轻易地通过加密后的数据还原到原始的字符串,除非是通过暴力破解的形式。 咱们在Python当中来实现一下MD5加密 import hashlibstr = 'this is a md5 demo.'hl = hashlib.md5()hl.update(str.encode(encoding='utf-8'))print('MD5加密前为 :' + str)print('MD5加密后为 :' + hl.hexdigest())output MD5加密前为 :this is a md5 demo.MD5加密后为 :b2caf2a298a9254b38a2e33b75cfbe75就像上文提到的,针对MD5加密能够通过暴力破解的形式来升高其安全性,因而在实操过程当中,咱们会增加盐值(Salt)或者是双重MD5加密等形式来减少其可靠性,代码如下 # post传入的参数params = "123456"  # 加密后需拼接的盐值(Salt) salt = "asdfkjalksdncxvm"def md5_encrypt(): m = md5() m.update(params.encode('utf8')) sign1 = m.hexdigest() return sign1def md5_encrypt_with_salt(): m = md5() m.update((md5_encrypt() + salt).encode('utf8')) sign2 = m.hexdigest() return sign2AES/DES对称加密首先咱们来讲DES加密,全称是Data Encryption Standard,即数据加密规范,在对称性加密当中比拟常见的一种,也就是加密和解密过程当中应用的密钥是雷同的,因而想要破解的话,通过暴力枚举的形式,只有计算的能力足够强还是能够被破解的。AES的全称是Advanced Encryption Standard,是DES算法的替代者,也是当今最风行的对称加密算法之一。想要弄清楚AES算法,首先就得弄明确三个根本的概念:密钥、填充和模式。 密钥密钥咱们之前曾经说了很多了,大家能够将其设想成是一把钥匙,既能够用其来进行上锁,能够用其来进行解锁。AES反对三种长度的密钥:128位、192位以及256位。 填充而至于填充这一概念,AES的分组加密的个性咱们须要理解,具体如下图所示 简略来说,AES算法在对明文加密的时候,并不是把整个明文一股脑儿地加密成一整段密文,而是把明文拆分成一个个独立的明文块,每一个明文块的长度为128比特。这些明文块通过AES加密器的简单解决之后,生成一个个独立的密文块,将这些密文块拼接到一起就是最终的AES加密的后果了。那么这里就有一个问题了,要是有一段明文的长度是196比特,如果依照每128比特一个明文块来拆分的话,第二个明文块只有64比特了,有余128比特该怎么办呢?这个时候就轮到填充来发挥作用了,默认的填充形式是PKCS5Padding以及ISO10126Padding。不过在AES加密的时候应用了某一种填充形式,解密的时候也必须采纳同样的填充形式。 模式AES的工作模式,体现在了把明文块加密成密文块的处理过程中,次要有五种不同的工作模式,别离是CBC、ECB、CTR、CFB以及OFB模式,同样地,如果在AES加密过程当中应用了某一种工作模式,解密的时候也必须采纳同样地工作模式。最初咱们用Python来实现一下AES加密 import base64from Crypto.Cipher import AESdef AES_encrypt(text, key):    pad = 16 - len(text) % 16    text = text + pad * chr(pad)    text = text.encode("utf-8")    encryptor = AES.new(key.encode('utf-8'), AES.MODE_ECB)    encrypt_text = encryptor.encrypt(text)    encrypt_text = base64.b64encode(encrypt_text)    return encrypt_text.decode('utf-8')或者大家也能够看一下网上其余的AES加密算法的实现过程,基本上也都是大同小异的,因为篇幅无限,明天临时就先介绍到这里,前面要是大家感兴趣的话,会去分享一下其余加密算法的实现原理与特色。 以上就是本次分享的所有内容,如果你感觉文章还不错,欢送关注公众号:Python编程学习圈,每日干货分享,发送“J”还可支付大量学习材料,内容笼罩Python电子书、教程、数据库编程、Django,爬虫,云计算等等。或是返回编程学习网,理解更多编程技术常识。

July 23, 2022 · 1 min · jiezi

关于python:裸机使用-filebeat-采集裸机上的日志文件并发到-elasticsearch

部署 elasticsearch 和 kibana因为是 demo 性质的应用,所以就用 docker-compose 简略跑一下 version: "3"services: elk-elasticsearch: container_name: elk-elasticsearch image: elasticsearch:7.17.1 ports: - "9200:9200" - "9300:9300" environment: - discovery.type=single-node - "ES_JAVA_OPTS=-Xms1g -Xmx1g" # 限度 es 的内存大小,不然会吃掉 10GB+ 的 RAM elk-kibana: container_name: elk-kibana image: kibana:7.17.1 ports: - "5601:5601" environment: - ELASTICSEARCH_HOSTS=http://192.168.31.245:9200 volumes: - ./kibana.yml:/usr/share/kibana/config/kibana.yml # kibana 其实是反对中文的,只有在 /usr/share/kibana/config/kibana.yml 加一行 i18n.locale: "zh-CN"elasticsearch 和 kibana 的版本要统一。同样的,前面的 filebeat 也要版本统一! 这次咱们都用 7.17.1 如果须要用 dbeaver 之类的工具连贯 elasticsearch 遇到 current license is non-compliant for [jdbc],能够参考:current license is non-compliant for jdbc 解决!创立索引一开始,我参考了这个教程:EFK 搭建简略的日志剖析零碎 ...

July 23, 2022 · 2 min · jiezi

关于python:在Python中应用枚举类只需要这1个理由就够了

枚举类在Java中并不生疏,本文就来解说一下为什么要在Python中利用枚举类。 试想一个问题,如果你在我的项目中解决通过Rest API申请回来的JSON数据,其中有一个数据格式如下: { metrics: 'speed', value: 20, weekday: 'Mon'}你须要解决数据,把字符串型的周几转化成数值类型的1、2、3、4、5、6、7,你该怎么做? Mon = 1Tue = 2Wed = 3Thu = 4Fri = 5Sat = 6Sun = 7以定义常量的形式去事后定义一个一一对应的映射关系。 如果略微有肯定的Python开发教训的,大多数会抉择字典的模式进行解决: weekday = { 'Mon': 1 'Tue': 2 'Wed': 3 'Thu': 4 'Fri': 5 'Sat': 6 'Sun': 7}通过键值的形式去取对应的数值型值。 然而,我在另外一篇文章中(从青铜到王者,一文教你节俭90%内存占用)介绍过,Python中字典是一种十分占用内存的数据存储形式。 如果读过我的那篇文章,可能会产生很多新的想法,例如,用类的形式去实现枚举关系, class Weekday: Mon = 1 Tue = 2 Wed = 3 Thu = 4 Fri = 5 Sat = 6 Sun = 7然而,上述这些形式在数据长久化和扩展性方面并不是最现实的解决方案。 如果有肯定的Java开发教训,面对这样的问题,必定会马上想起一个概念--枚举类。 ...

July 22, 2022 · 1 min · jiezi

关于python:PythonJavaScript-真牛

谁才是最好的编程语言? Java、PHP、Python、Go、JavaScript.... 每个人都有本人的答案,然而,当范畴限定在Web开发,没有什么能胜过JavaScript。 但有时咱们必须做一些要求更高的工作,例如,剖析大量的数据。 在这种状况下,Python可能是一个更好的抉择。 但这只是咱们网站的一个性能,天然不会因为这一点需要而用Python开发整个工程。 明天,就来给大家介绍一种可能将JavaScript和Python完满联合在一起,高效解决工程问题的办法。 JavaScript+Python这对于很多开发同学来说,相对算得上一个很吸引人的音讯。 咱们能够在Node.JS中应用子过程,在须要时运行一个Python脚本。 const spawn = require('child_process').spawnapp.get("process_data", (req, res) => { spawn('python3', ['script.py'])})再来写一个Python脚本: # script.pydoSometing()除了这种形式,咱们也能够将数据传递给咱们的Python脚本。 const spawn = require('child_process').spawnapp.get("process_data", (req, res) => { const msg = "Hello" spawn('python3', ['script.py', msg])})在Python中,为了可能读取数据,你必须导入sys模块。 import sys, jsondef main(): msg = sys.argv[1] doSometing(msg)if __name__ == '__main__': main()当初,咱们不须要在生成Python过程时传递数据,而是在工作工作流中发送数据。 const spawn = require('child_process').spawn,const py = spawn('python3', ['script.py'])const data = { msg: "Hello"}py.stdin.write(JSON.stringify(data)) //we have to send data as a string, so we are using JSON.stringifypy.stdin.end()批改一下Python脚本: ...

July 22, 2022 · 1 min · jiezi

关于python:总算把集合玩明白了

汇合(set)是一种无序的不反复元素序列,能够应用大括号  { }  或者 set()  函数创立汇合。 它是Python中一个十分重要,且频繁用到的概念。无论是在日常开发过程中,还是在面试过程中都会常常遇到,明天就来11「鲜为人知」的汇合用法。 difference(set)set_1.difference(set_2) :这个办法帮忙你取得两个汇合之间的差别,换句话说,它让你取得存在于set_1中而不存在于给定汇合(set_2)中的元素。 # example 1recepie_requirements = {'orange', 'chocolate', 'salt', 'pepper'}what_I_have = {'apple', 'banana','salt'}# I have to buy orange chocolate pepperprint('I have to buy', *recepie_requirements.difference(what_I_have))# example2all_subscribers = {"aya", "john", "smith", "sparf", "kyle"}admins = {"aya", "sparf"}users = all_subscribers.difference(admins)# {'kyle', 'smith', 'john'}print(users)union(set)set_1.union(set_2) :(set_1 U set_2) 这个set办法返回一个蕴含set_1的元素和set_2的元素的汇合,此外,返回的汇合只蕴含惟一的元素。 admins = {'aya', 'sparf'}users = {'aya','kyle', 'smith', 'john'}all_subscribers = admins.union(users)# {'smith', 'aya', 'sparf', 'kyle', 'john'}print(all_subscribers)intersection(set)set_1.intersection(set_2) :取两个汇合的交加,只返回同时存在于set_1和set_2中的元素。 shop = {'orange', 'pepper', 'banana', 'sugar'}what_I_have = {'orange', 'sugar'}# I should not buy {'orange', 'sugar'} because I have them!print(f'I should not buy {shop.intersection(what_I_have)} because I have them!')issubset()set_1.issubset(set_2) :查看set_1的所有元素是否存在于set_2中。 ...

July 22, 2022 · 2 min · jiezi

关于python:matplotlib库简单的代码举例

matplotlib库简略的代码举例,python库函数的调用有很多办法,但大部分常常让我找不到逻辑性。 fig.add_subplot我认为是比拟好记的。plt定义好画布赋值给fig,fig接着建设子图区域传递给ax,之后所有操作都是对ax进行。 %matplotlib inlineimport numpy as npimport matplotlib.pyplot as plt#二维图fig=plt.figure(figsize=(8,6))ax=fig.add_subplot()x=np.linspace(100*1e-6,1200*1e-6,1000)ax.plot(x,cap_plate(epr0,x*8,d0)/2,'b')plt.show()%matplotlib inlineimport numpy as npimport matplotlib.pyplot as plt#三维图fig=plt.figure(figsize=(10,10)) # 定义画布及尺寸ax=fig.add_subplot(111,projection='3d') #建设子图坐标轴,pro投影类型3D#或选下方语句,可具体定义子图地位[左,下,宽,高](0-1)之间#ax=fig.add_axes([0,0,0.8,0.8],projection='3d') x=np.linspace(-50*1e-6,50*1e-6,100) # 撒点y=np.linspace(-50*1e-6,50*1e-6,100)x,y=np.meshgrid(x,y) # 三维图需建设坐标矩阵z=ind_zsq_suqid(x,y)ax.plot_surface(x,y,z,cmap='Greys',edgecolor='none') #cmap参数可选如viridisax.set_zlim3d(zlim1,zlim2) #z轴限调整ax.title.set_text('fig') #图题ax.view_init(elev=10,azim=10) #角度、远近调节plt.show()

July 21, 2022 · 1 min · jiezi

关于python:Python常用基础语法知识点大全

记得我是数学系的,大二时候因为加入数学建模,学习Python爬虫,去图书馆借了一本Python根底书,不厚,因为有matlab和C语言根底,这本书一个星期看完了,学完后感觉Python入门很快,而后要开始学爬虫和矩阵计算,学习一下对应的包就行了,感觉很不便,爱上了这门语言,尽管毕业后做了Java,然而平时工作中也会用一些Python。不过初学者有很多根底知识点记不住,因为用得少,这里总结记录一下。更多Python常识,能够返回我的集体博客网站 期待下一个秋-Python介绍Python 是一门独特的语言,疾速浏览一下他的要点: 面向对象:每一个变量都是一个类,有其本人的属性(attribute)与办法(method)。语法块:用缩进(四个空格)而不是分号、花括号等符号来标记。因而,行首的空格不能随便书写。正文:行内用“#”号,行间正文写在两组间断三单引号之间:’’’续行:行尾输出一个反斜杠加一个空格(’\ ‘),再换行。如果行尾语法显著未实现(比方以逗号结尾),能够间接续行。打印与输出: 函数 print() 与 input(),留神 print() 的 sep 与 end 参数。变量:无需指定变量类型,也不须要提前申明变量。 删除变量:del()复制变量:间接将变量a赋值给b,有时仅仅复制了一个“援用”。尔后 b 与 a 的改变仍会相互影响。必要时应用 a is b 来判断是否同址。模块:通过 import pandas 的形式加载模块(或者 import pandas as pd),并用形如 pandas.DataFrame(或 pd.DataFrame)的形式调用模块内的办法。也能够应用 from pandas import DataFrame 的形式,这样在下文能够间接应用 DataFrame 作为调用名。帮忙:配合应用 dir() 与 help() 命令;其中前者是输入变量所有的成员。以及查阅 官网页面。变量复制的一个例子。 a = [1, 2]b = aprint(id(a) - id(b)) # 地址差为 0,示意本质是同址的0b.append(3)print(a) # 只改变了 b,但 a 也跟着变动了[1, 2, 3]a is bTrue应用切片来重新分配空间: a is a[:]False数据结构Python 原生的数据结构包含: ...

July 21, 2022 · 11 min · jiezi

关于python:统计千行代码Bug率有没有意义

我的论断是:统计Bug率有意义。然而统计千行代码Bug率没有意义。 为什么千行代码Bug率是没有意义的?某公司最近出了一个计划,用来量化程序员的工作绩效。叫做千行代码Bug率。在一个统计周期内,程序员每减少或者批改的代码行数与QA发现的Bug数,依据如下规定计算Bug率: 1000行代码,1个bug,那么Bug率是100%;2000行代码,4个bug,那么Bug率是200%;5000行代码,3个Bug,那么Bug率是60%n行代码,m个Bug,那么Bug率是m / n * 1000先不思考这个规定自身是否有问题。我感觉,所有和代码行数挂钩的绩效统计,都是没什么意义的。因为代码行数是能够刷的。如果某个绩效须要代码行数越少越好,那么能够应用行数少的写法;某个绩效须要代码行数越多越好,那么能够应用行数多的写法。 例如,对于字符串赋值:a = '今天天气居然有40度,我要被烤化了。',能够把它扩写成: a = ('今天天气' '居然有40' '度,我要' '被烤化了。' )甚至再进一步,扩写成: a = '今天天气'b = '居然有40'c = '度,我要'd = '被烤化了。'e = (a + b + c + d )a = e这三种写法的成果齐全一样。 还有些性能,本来就一行原生代码搞定。然而为了减少行数,成心应用第三方库。这样第三方库的代码行数也就统计进去了。代码总行数减少,相当于分母增大,千行代码Bug率就降下来了。 要缩写也简略,在Python外面,如果应用lambda表达式,通过十分炫技反人类的写法,你能够把惯例要40行的代码缩成1行。然而这样的一行代码基本没法保护。 为什么Bug率是有意义的?对于一个有理论用途的我的项目代码来说,Bug数是一个系统误差,只能设法缩小,然而没有方法变成0。 同样实现一个性能,好的程序员能提前预判到他人会怎么应用,提前解决好非法逻辑和不合理的数据流程,从而升高Bug数。而差的程序员,写进去的代码,他人一用就出问题。因而,用Bug率来评判程序员程度,我感觉是正当的。然而从Bug数到Bug率,这个计算方法应该要精心设计。 开发阶段如果公司有QA的话,在软件开发阶段,个别产品经理会先提出需要,而后拉上开发和QA一起评测需要。QA会在需要评审会后,设计测试案例。这些测试案例是公开的,每个开发都会看到。 这些公开的测试案例,我感觉能够用来作为分母。程序员写好了代码,却无奈通过其中的局部测试案例。那就是程序员的程度不行。失败的测试案例数/所有公开的测试案例数。能够作为掂量程序员程度的参考指标之一。好的程序员应该尽量让这个比值为0. 但有时候,在测试的过程中,QA可能会长期减少测试案例,这些案例是程序员提前不晓得的。那么这些案例如果测试失败了,也能够作为一个评判指标,用来评判程序员是否有提前预防的能力。但偏心起见,能够给他乘以一个小于1的系数,升高它的权重: 开发阶段Bug率 = (曾经公开的测试案例数 + 系数 × 长期减少的测试案例数) / 总测试案例数说个题外话,明天咱们不思考单元测试数、单元测试覆盖率这种问题。因为据我所知,国内互联网公司会被动写单元测试的程序员太少了。有时候,一个本来要写单元测试的优良程序员,进了某些大厂当前,迫于业务和工期压力,也逐步放弃了。所以咱们明天只思考QA的测试案例。 线上阶段如果只看QA的测试案例,可能会呈现面向QA编程的问题。因为人是很聪慧的,上有政策,下有对策。QA的一个测试API接口的案例,输出5,输入10.程序员间接在代码外面判断,如果输出是5,间接返回10,跳过两头的所有逻辑。这样就能100%通过QA的所有测试案例。然而这样做对产品自身是没有价值的。 市场是测验代码品质的重要规范。程序品质好不好,上线当前,让用户来评测。 你永远不晓得你的用户有多蠢,你永远猜不透用户会怎么应用你的产品。用户反馈的Bug,也能够用来评估代码的好坏,进而反映出程序员的能力高下。但须要思考上面两个状况: 同一个性能,两个程序员实现: A程序员写出的性能一上线,用户一用就报BugB程序员写出的性能上线很久了。几十万个用户都失常应用,有个沙雕用户乱操作,偶尔暴露出了一个Bug。大家凭主观判断都晓得,B程序员应该比A程序员好。 咱们再来思考第二种状况,A程序员实现X性能,B程序员实现Y性能: X性能每天会被应用几百万次,一周就发现了二十多个BugY性能一个月总共就被用了3次。没有发现Bug这种状况下,咱们没有方法依据Bug数来判断AB两个程序员谁更好。兴许B程序员去写X性能,一天就会被发现上百个Bug也说不定。 因而,依据这两种状况,我拍脑袋总结了一个教训公式: 某性能线上Bug率 = Bug数 / (log(性能应用次数 + 1) + 1) ...

July 21, 2022 · 1 min · jiezi

关于python:爬虫基本原理介绍实现以及问题解决

文章目录一、爬虫的意义1.前言2.爬虫能做什么3.爬虫有什么意义二、爬虫的实现1.爬虫的根底原理2.api的获取3.爬虫实现三、反爬解决方案1.反爬的实现形式2.反爬的解决办法3.反爬的实现代码4.IPIDEA还能做什么四、总结一、爬虫的意义1.前言最近拉开了毕业季的尾声,提前批开启了大厂抢人模式,所以很多人都开始在力扣刷题, 心愿可能在大厂抢人的期间怀才不遇。为了能实现群内力扣刷题排名就须要对力扣网站进行数据爬取,最近就对爬虫的机制和爬虫的意义进行了理解。 2.爬虫能做什么其实爬虫的次要指标就是通过大量自动化进行指标网站的拜访,获取公开的数据,不便咱们进行数据 统计或者数据整合。其中公开shuju肯定要留神,就是肯定是网页能够公开拜访的数据进行拜访,否则是守法的哦,容易面向监狱编程。另外就是肯定要留神拜访的频次,不能对原始网站造成危害(个别都会做限度了)。不然会变成一只有毒的爬虫。 3.爬虫有什么意义其实爬虫次要做的事件就是数据的收集,接下来就能够做数据的解决,企业能够用这些数据来进行市场剖析,把握商机,就行买股票一样,有大量的历史数据咱们就能够尝试去预测市场走势,押中了就是一次机会。另外当初人工智能这么火爆,然而人工智能的根底就是大数据,咱们据说过训练集其实就是大数据,咱们有时候拿不到现成的数据集的时候就须要进行爬虫拿到咱们的数据根底。 二、爬虫的实现1.爬虫的根底原理爬虫其实就是主动拜访相应的网站,拿到咱们想要的数据。比方咱们想要查快递,就会一直的拜访一个网页,去看最新的进度,爬虫就是去模仿这个过程,同时为了提高效率可能会省略一些步骤。咱们这次就以力扣的刷题总数做例子。 2.api的获取咱们关上力扣的主页的时候肯定会进行数据的拜访拿到一些信息,咱们关上开发者模式,就能够看到每一条申请。例如下图: 右侧就是我的主页其中的一条数据库申请内容,他用的语法是graphql,赶趣味咱们下次再讲,咱们只有用就行了。咱们其实能够对申请头进行精简,失去上面的graphql语法: payload = {"operation_name": "userPublicProfile", #查询数据库申请内容 "query": '''query userPublicProfile($userSlug: String!) {userProfilePublicProfile(userSlug: $userSlug) { username submissionProgress { acTotal }}}''', "variables": '{"userSlug":"查问对象"}'}3.爬虫实现咱们间接对下面结构的拜访形式进行拜访,看看失去了什么: import requests as rqfrom urllib.parse import urlencodeheaders={ #申请头信息 "Referer":"https://leetcode.cn",}payload = {"operation_name": "userPublicProfile", #查询数据库申请内容 "query": '''query userPublicProfile($userSlug: String!) {userProfilePublicProfile(userSlug: $userSlug) { username submissionProgress { acTotal }}}''', "variables": '{"userSlug":"romantic-haibty42"}'}res = rq.post("https://leetcode.cn/graphql/"+"?"+ urlencode(payload),headers = headers)print(res.text) 能够从下面的发现咱们拿到了acTotal字段,也就是咱们想要总的刷题数。然而咱们尝试对大量数据进行拜访的时候咱们就会看到拜访频次的限度。 三、反爬解决方案1.反爬的实现形式很多网站罕用的一种反爬的形式是对单ip进行限度,如果一个ip在肯定的工夫内大量拜访,那么就会不再返回信息,而是返回谬误。次要是数据库的日志零碎会对拜访进行记录。 2.反爬的解决办法 Ipidea是一个IP代理平台,为寰球用户提供优质大数据代理服务,目前领有千万级实在住宅IP资源,蕴含超过220个国家和地区,日更新超过4000万,汇聚成代理服务池并提供API接入,反对http、https、socks5等多种协定类型,并且领有API模式和账号密码多种应用形式,十分易于上手。官网地址 3.反爬的实现代码其实咱们有了下面的代码之后再退出到ipidea就会很简略,只有咱们去官网下示例代码,而后插入咱们的代码就行了:只有咱们将代码中的tiqu换成咱们的提取链接,而后将咱们的代码放到外围业务的try外面就能够实现了。不过我为了应用socks5代理形式进行了批改,完整版代码如下: # coding=utf-8# !/usr/bin/env pythonimport jsonimport threadingimport timeimport requests as rqfrom urllib.parse import urlencodeheaders={ "Referer":"https://leetcode.cn",}payload = {"operation_name": "userPublicProfile", "query": '''query userPublicProfile($userSlug: String!) {userProfilePublicProfile(userSlug: $userSlug) { username submissionProgress { acTotal }}}''', "variables": '{"userSlug":"kingley"}'}username = "romantic-haibty42"def int_csrf(proxies,header): sess= rq.session() sess.proxies = proxies sess.head("https://leetcode.cn/graphql/") header['x-csrftoken'] = sess.cookies["csrftoken"]testUrl = 'https://api.myip.la/en?json'# 外围业务def testPost(host, port): proxies = { 'http': 'socks5://{}:{}'.format(host, port), 'https': 'socks5://{}:{}'.format(host, port), } res = "" while True: try: header = headers # print(res.status_code) chaxun = payload chaxun['variables'] = json.dumps({"userSlug" : f"{username}"}) res = rq.post("https://leetcode.cn/graphql/"+"?"+ urlencode(chaxun),headers = header,proxies=proxies) print(host,res.text) except Exception as e: print(e) breakclass ThreadFactory(threading.Thread): def __init__(self, host, port): threading.Thread.__init__(self) self.host = host self.port = port def run(self): testPost(self.host, self.port)# 提取代理的链接 json类型的返回值 socks5形式tiqu = ''while 1 == 1: # 每次提取10个,放入线程中 resp = rq.get(url=tiqu, timeout=5) try: if resp.status_code == 200: dataBean = json.loads(resp.text) else: print("获取失败") time.sleep(1) continue except ValueError: print("获取失败") time.sleep(1) continue else: # 解析json数组 print("code=", dataBean) code = dataBean["code"] if code == 0: threads = [] for proxy in dataBean["data"]: threads.append(ThreadFactory(proxy["ip"], proxy["port"])) for t in threads: # 开启线程 t.start() time.sleep(0.01) for t in threads: # 阻塞线程 t.join() # break break实现后果如下:短时间大量拜访也不会进行限度啦。 ...

July 21, 2022 · 2 min · jiezi

关于python:Python笔记

Listl.pop(i)弹出第i个元素for index, num in enumerate(nums)l[::-1]l.count(x)min(l, key = lambda x: abs(target - x))Sort Array by Increasing Frequency: def frequencySort(self, A): count = collections.Counter(A) return sorted(A, key=lambda x: (count[x], -x))Dictionarydefaultdict(int)counts = collections.Counter(nums)dictionary.get(keyname, optional_value_if_key_not_exist_default_None)Setset1 & set2Linked Listhead.nextTreeif nodenode.val, node.left, node.rightStackMin StackHeap堆是一种根本的数据结构,堆的构造是一棵齐全二叉树,并且满足沉积的性质:每个节点(叶节点除外)的值都大于等于(或都小于等于)它的子节点。import heapq其余float('inf')mod(value,2)ord('A')yield罕用解题技巧遍历过程中用hashmap存储,防止反复遍历2 pointers二分法,3 pointers(left,pivot,right)Dynamic Programming, 存储上一轮的后果,遍历过程中不断更新变量DFS Depth First SearchBFS Breadth First Searchbucket sort / counting sortGreedy: 贪婪算法(greedy algorithm),又称贪心算法,是一种在每一步抉择中都采取在以后状态下最好或最优(即最无利)的抉择,从而心愿导致后果是最好或最优的算法。贪婪算法与动静布局的不同在于它对每个子问题的解决方案都做出抉择,不能回退。动静布局则会保留以前的运算后果,并依据以前的后果对以后进行抉择,有回退性能。

July 21, 2022 · 1 min · jiezi

关于python:超强-Python-数据可视化库一文全解析

明天给大家分享一篇可视化干货,介绍的是功能强大的开源 Python 绘图库 Plotly,教你如何用超简略的(甚至只有一行!)代码,绘制出更棒的图表。 我之前始终守着 matplotlib 用的起因,就是为了我学会它简单的语法,曾经“沉没"在外面的几百个小时的工夫老本。这也导致我破费了不知多少个深夜,在 StackOverflow 上搜寻如何“格式化日期”或“减少第二个Y轴”。 但咱们当初有一个更好的抉择了 —— 比方易于应用、文档健全、功能强大的开源 Python 绘图库 Plotly。明天就带你深刻体验下,理解它如何用超简略的(甚至只有一行!)代码,绘制出更棒的图表。 本文中所有代码都曾经在 Github 上开源,所有的图表都是可交互的,请应用Jupyter notebook查看 。 (plotly 绘制的范例图表。 图片起源: plot.ly) Plotly 概述plotly 的 Python 软件包是一个开源的代码库,它基于 plot.js,而后者基于 d3.js。咱们理论应用的则是一个对 plotly 进行封装的库,名叫 cufflinks,它能让你更不便地应用 plotly 和 Pandas 数据表协同工作。 *注: Plotly 自身是一个领有多个不同产品和开源工具集的可视化技术公司。 Plotly 的 Python 库是能够收费应用的,在离线模式能够创立数量不限的图表,在线模式因为用到了 Plotly 的共享服务,只能生成并分享 25 张图表。 本文中的所有可视化图表都是在 Jupyter Notebook 中应用离线模式的 plotly + cufflinks 库实现的。在应用 pip install cufflinks plotly 实现装置后,你能够用上面这样的代码在 Jupyter 里实现导入: 单变量散布:柱状图和箱形图 单变量剖析图往往是开始数据分析时的规范做法,而柱状图基本上算是单变量散布剖析时必备的图表之一(尽管它还有一些有余)。 就拿博客文章点赞总数为例,做一个简略的交互式柱状图: (代码中的 df 是规范的 Pandas dataframe 对象) (应用 plotly+cufflinks 创立的交互式柱状图) ...

July 21, 2022 · 1 min · jiezi

关于python:深度讲解Python四大常用绘图库的绘图原理

最近有不少读者同学来问我,Python绘图库太多,我知不知道学哪一个?即便我抉择了某一个绘图库后,我也不晓得怎么学,我不晓得第一步做什么,也不晓得接下来该怎么做,四个字一学就忘。 其实这也是我过后很困扰的一个问题,我过后在学习完numpy和pandas后,就开始了matplotlib的学习。我反正是十分解体的,每次就感觉绘图代码怎么这么多,绘图逻辑齐全一团糟,不晓得如何入手。 前面随着本人重复的学习,我找到了学习Python绘图库的办法,那就是学习它的绘图原理。正所谓:“知己知彼,百战不殆”,学会了原理,剩下的就是纯熟的问题了。 明天咱们就用一篇文章,带大家梳理matplotlib、seaborn、plotly、pyecharts的绘图原理,让大家学起来不再那么吃力! 1. matplotlib绘图原理对于matplotlib更具体的绘图阐明,大家能够参考上面这篇文章,置信你看了当前肯定学得会。 matplotlib绘图原理: http://suo.im/678FCo 1)绘图原理阐明通过我本人的学习和了解,我将matplotlib绘图原理高度总结为如下几步: ① 导库;② 创立figure画布对象;③ 获取对应地位的axes坐标系对象;④ 调用axes对象,进行对应地位的图形绘制;⑤ 显示图形;2)案例阐明# 1.导入相干库import matplotlib as mplimport matplotlib.pyplot as plt# 2.创立figure画布对象figure = plt.figure()# 3.获取对应地位的axes坐标系对象axes1 = figure.add_subplot(2,1,1)axes2 = figure.add_subplot(2,1,2)# 4.调用axes对象,进行对应地位的图形绘制axes1.plot([1,3,5,7],[4,9,6,8])axes2.plot([1,2,4,5],[8,4,6,2])# 5.显示图形figure.show()后果如下: 2. seaborn绘图原理在这四个绘图库外面,只有matplotlib和seaborn存在肯定的分割,其余绘图库之间都没有任何分割,就连绘图原理也都是不一样的。 seaborn是matplotlib的更高级的封装。因而学习seaborn之前,首先要晓得matplotlib的绘图原理。因为seaborn是matplotlib的更高级的封装,对于matplotlib的那些调优参数设置,也都能够在应用seaborn绘制图形之后应用。 咱们晓得,应用matplotlib绘图,须要调节大量的绘图参数,须要记忆的货色很多。而seaborn基于matplotlib做了更高级的封装,使得绘图更加容易,它不须要理解大量的底层参数,就能够绘制出很多比拟粗劣的图形。不仅如此,seaborn还兼容numpy、pandas数据结构,在组织数据上起了很大作用,从而更大程度上的帮忙咱们实现数据可视化。 因为seaborn的绘图原理,和matplotlib的绘图原理统一,这里也就不具体介绍了,大家能够参考下面matplotlib的绘图原理,来学习seaborn到底如何绘图,这里还是提供一个网址给大家。 seaborn绘图原理: http://suo.im/5D3VPX 1)案例阐明# 1.导入相干库import seaborn as snsimport matplotlib.pyplot as pltdf = pd.read_excel("data.xlsx",sheet_name="数据源")sns.set_style("dark")plt.rcParams["font.sans-serif"] = ["SimHei"]plt.rcParams["axes.unicode_minus"] = False# 留神:estimator示意对分组后的销售数量求和。默认是求均值。sns.barplot(x="品牌",y="销售数量",data=df,color="steelblue",orient="v",estimator=sum)plt.show()后果如下: 留神:能够看到在上述的绘图代码中,你应该有这样一个感触,图中既有matplotlib的绘图代码,也有seaborn的绘图代码。其实就是这样的,咱们就是依照matplobt的绘图原理进行图形绘制,只是有些中央改成seaborn特有的代码即可,剩下的调整格局,都能够应用matplotlib中的办法进行调整。 3. plotly绘图原理首先在介绍这个图的绘图原理之前,咱们先简略介绍一下plotly这个绘图库。 plotly是一个基于javascript的绘图库,plotly绘图品种丰盛,成果好看;易于保留与分享plotly的绘图后果,并且能够与Web无缝集成;ploty默认的绘图后果,是一个HTML网页文件,通过浏览器能够间接查看;它的绘图原理和matplotlib、seaborn没有任何关系,你须要独自去学习它。同样我还是提供了一个网址给你,让你更具体的学习plotly。 plotly绘图原理: http://suo.im/5vxNTu 1)绘图原理阐明通过我本人的学习和了解,我将plotly绘图原理高度总结为如下几步: ① 绘制图形轨迹,在ployly外面叫做trace,每一个轨迹是一个trace。② 将轨迹包裹成一个列表,造成一个“轨迹列表”。一个轨迹放在一个列表中,多个轨迹也是放在一个列表中。③ 创立画布的同时,并将上述的轨迹列表,传入到Figure()中。④ 应用Layout()增加其余的绘图参数,欠缺图形。⑤ 展现图形。2)案例阐明import numpy as npimport pandas as pdimport plotly as pyimport plotly.graph_objs as goimport plotly.expression as pxfrom plotly import toolsdf = pd.read_excel("plot.xlsx")# 1.绘制图形轨迹,在ployly外面叫做`trace`,每一个轨迹是一个trace。trace0 = go.Scatter(x=df["年份"],y=df["城镇居民"],name="城镇居民")trace1 = go.Scatter(x=df["年份"],y=df["农村居民"],name="农村居民")# 2.将轨迹包裹成一个列表,造成一个“轨迹列表”。一个轨迹放在一个列表中,多个轨迹也是放在一个列表中。data = [trace0,trace1]# 3.创立画布的同时,并将上述的`轨迹列表`,传入到`Figure()`中。fig = go.Figure(data)# 4.应用`Layout()`增加其余的绘图参数,欠缺图形。fig.update_layout(    title="城乡居民家庭人均收入",    xaxis_title="年份",    yaxis_title="人均收入(元)")# 5.展现图形。fig.show()后果如下: 4. pyecharts绘图原理Echarts是一个由百度开源的数据可视化工具,凭借着良好的交互性,精美的图表设计,失去了泛滥开发者的认可。而python是一门富裕表达力的语言,很适宜用于数据处理。当数据分析遇上了数据可视化时,pyecharts诞生了。 pyecharts分为v0.5和v1两个大版本,v0.5和v1两个版本不兼容,v1是一个全新的版本,因而咱们的学习尽量都是基于v1版本进行操作。 和plotly一样,pyecharts的绘图原理也是齐全不同于matplotlib和seaborn,咱们须要额定的去学习它们的绘图原理,基于此,同样提供一个网址给你,让你更具体的学习pyecharts。 pyecharts的绘图原理: http://suo.im/5S1PF1 1)绘图原理阐明通过我本人的学习和了解,我将plotly绘图原理高度总结为如下几步: ① 抉择图表类型;② 申明图形类并增加数据;③ 抉择全局变量;④ 显示及保留图表;2)案例阐明# 1.抉择图表类型:咱们应用的是线图,就间接从charts模块中导入Line这个模块;from pyecharts.charts import Lineimport pyecharts.options as optsimport numpy as npx = np.linspace(0,2 * np.pi,100)y = np.sin(x)( # 2.咱们绘制的是Line线图,就须要实例化这个图形类,间接Line()即可; Line() # 3.增加数据,别离给x,y轴增加数据; .add_xaxis(xaxis_data=x) .add_yaxis(series_name="绘制线图",y_axis=y,label_opts=opts.LabelOpts(is_show=False)) .set_global_opts(title_opts=opts.TitleOpts(title="我是题目",subtitle="我是副标题",title_link="https://www.baidu.com/"),                  tooltip_opts=opts.TooltipOpts())).render_notebook() # 4.render_notebook()用于显示及保留图表;后果如下: 小结通过下面的学习,我置信必定会让大家对于这些库的绘图原理,肯定会有一个新的意识。 其实其实不论是任何编程软件的绘图库,都有它的绘图原理。咱们与其自觉的去绘制各种各样的图形,不如先搞清楚它们的套路后,再去进行绘图库的图形练习,这样上来,我感觉大家会有一个很大的进步。 以上就是本次分享的所有内容,如果你感觉文章还不错,欢送关注公众号:Python编程学习圈,每日干货分享,发送“J”还可支付大量学习材料,内容笼罩Python电子书、教程、数据库编程、Django,爬虫,云计算等等。或是返回编程学习网,理解更多编程技术常识。

July 21, 2022 · 1 min · jiezi

关于python:JS-逆向百例某公共资源交易网公告-URL-参数逆向分析

申明本文章中所有内容仅供学习交换,抓包内容、敏感网址、数据接口均已做脱敏解决,严禁用于商业用途和非法用处,否则由此产生的所有结果均与作者无关,若有侵权,请分割我立刻删除! 逆向指标指标:某地公共资源交易网主页:aHR0cDovL2dnenkuamNzLmdvdi5jbi93ZWJzaXRlL3RyYW5zYWN0aW9uL2luZGV4接口:aHR0cDovL2dnenkuamNzLmdvdi5jbi9wcm8tYXBpLWNvbnN0cnVjdGlvbi9jb25zdHJ1Y3Rpb24vYmlkZGVyL2JpZFNlY3Rpb24vbGlzdA==逆向参数:URL 链接中的 projectId、projectInfo 参数逆向过程抓包剖析通过链接进入到网站,会发现先转会圈才进入到网页,这里可能就有个渲染加载的过程,关上开发者人员工具,刷新网页,往下滑会看到抓包到了数据返回的接口:aHR0cDovL2dnenkuamNzLmdvdi5jbi9wcm8tYXBpLWNvbnN0cnVjdGlvbi9jb25zdHJ1Y3Rpb24vYmlkZGVyL2JpZFNlY3Rpb24vbGlzdA==,GET 申请,从 preview 响应预览中能够看到以后页面所有布告的信息: Query String Parameters 中有些参数信息,各类型什么含意后文会具体解说: pageNum: 以后为第几页pageSize: 页面大小informationType: 布告类型projectType: 我的项目类型informationName: 信息类型接下来轻易点击一条布告,跳转到一个新页面,会发现网页链接变成了这种格局:XXX/index?projectId=XXX&projectInfo=XXX,生成了 projectId 和 projectInfo 两个加密参数,并且通过测试,同一个布告页面这两个加密参数的值是固定的,接下来咱们须要尝试找到这两个参数的加密地位。 调试剖析定位从主页地位 CTRL + SHIFT + F 全局搜寻 projectId 参数,顺次比照能够发现,projectId 和 projectInfo 两个加密参数在 chunk-63628500.eb5f8d30.js 中定义,这里是个三目运算,若我的项目类型雷同则执行其后的办法,若不同则往后执行: 上文代码行判断中呈现的 ZFCG、GTGC 是什么意思呢,CTRL + SHIFT + F 全局搜寻 ZBGG 参数,在 chunk-043c03b8.34f6abab.js 文件中咱们能够找到相应的定义,以下即各自的含意: 在第 267 行,return t.stop() 处打下断点进行调试剖析,轻易点击一条布告,会发现断点断住,即胜利定位,鼠标悬停在 projectId 和 projectInfo 对应的值上,能够晓得以下信息: projectId :项目编号projectInfo :信息类型 晓得了两个加密参数的具体含意,接下来咱们就须要找到其加密地位了,projectId 和 projectInfo 参数由 a.parameterTool.encryptJumpPage 办法执行,encryptJumpPage 跳转页面加密?这不几乎就是明示: ...

July 21, 2022 · 3 min · jiezi

关于python:如何用-Python-自动化监控文件夹完成服务部署

最近在部署前端我的项目的时候,须要先将前端我的项目压缩包通过堡垒机上传到应用服务器的 /tmp 目录下,而后进入应用服务器中,应用 mv 命令将压缩文件挪动到 Nginx 我的项目设定目录,最初应用 unzip 命令解压文件,以此实现我的项目的部署 仔细分析,大部分操作都是重复性的动作,人工去实现这些操作会大大降低工作效率 本篇文章将介绍如何利用 Python 监控文件夹,以此辅助实现服务的部署动作 1. 筹备这里要介绍一个 Python 依赖库「 watchdog 」 它可用于监控某个文件目录下的文件变动,蕴含:删除、批改、新增等操,每一个操作都会回调一个事件函数,咱们能够在外部编写自定义的逻辑,以此满足咱们的需要 # 装置依赖包pip3 install watchdog2. 实战一下首先,咱们须要创立一个监听器,用于监听文件夹目录 from watchdog.observers import Observer...# 创立一个监听器,用来监听文件夹目录observer = Observer()...而后,创立 2 个事件处理对象 PS:该对象继承于「 FileSystemEventHandler 」类 它们别离用于监听「 /tmp 」目录、「 /home/project/frontend 」目录,假如事件对象被命名为 obj1、obj2 obj1 负责监听 /tmp 目录,重写「 新建或批改 」事件办法,实现压缩文件的挪动操作 from watchdog.events import *import ntpathimport shutilimport zipfiledef get_filename(filepath): """ 依据文件夹目录,获取文件名称(待后缀) :param filepath: :return: """ return ntpath.basename(filepath)class FileMoveHandler(FileSystemEventHandler): def __init__(self): FileSystemEventHandler.__init__(self) ... # 文件新建 def on_created(self, event): # 新建文件夹 if event.is_directory: # print("directory created:{0}".format(event.src_path)) pass # 新建文件 else: # print("file created:{0}".format(event.src_path)) filename = get_filename(event.src_path) # 如果属于前端的4个我的项目压缩包,开始文件夹的操作 if filename in watch_tags: self.start(filename) ... def on_modified(self, event): if event.is_directory: # print("directory modified:{0}".format(event.src_path)) pass else: # print("file modified:{0}".format(event.src_path)) filename = get_filename(event.src_path) if filename in watch_tags: self.start(filename) ... def start(self, filename): """ 文件解决逻辑 :param filename: :return: """ try: # 文件名不带后缀 filename_without_suffix = filename.split(".")[0] # 源文件门路(压缩包文件) source_file_path = watch_folder + filename # 指标文件门路(压缩包文件) target_file_path = target_folder + filename # 指标我的项目文件夹(指标我的项目) target_project_path = target_folder + filename_without_suffix # 1、复制文件到指标文件夹 print(f"拷贝源目录{source_file_path},指标文件夹:{target_folder}") # 删除指标文件夹下的压缩文件 if os.path.exists(target_file_path): os.remove(target_file_path) # 挪动文件到指标文件夹中 shutil.move(source_file_path, target_folder) # 2、清空指标文件夹中内的所有文件夹(如果存在) # 如果不存在,新建一个文件夹 if os.path.exists(target_project_path): shutil.rmtree(target_project_path, ignore_errors=True) print(f"我的项目{filename_without_suffix}挪动胜利!") except Exception as e: print("部署失败,谬误起因:", str(e.args))obj2 负责监听 /home/project/frontend 目录,同样重写「 新建或批改 」事件办法,实现压缩文件的解压动作 ...

July 20, 2022 · 2 min · jiezi

关于python:说说-Python-的元编程

提到元这个字,你兴许会想到元数据,元数据就是形容数据自身的数据,元类就是类的类,相应的元编程就是形容代码自身的代码,元编程就是对于创立操作源代码(比方批改、生成或包装原来的代码)的函数和类。次要技术是应用装璜器、元类、描述符类。 本文的次要目标是向大家介绍这些元编程技术,并且给出实例来演示它们是怎么定制化源代码的行为。 装璜器装璜器就是函数的函数,它承受一个函数作为参数并返回一个新的函数,在不扭转原来函数代码的状况下为其减少新的性能,比方最罕用的计时装璜器: from functools import wrapsdef timeit(logger=None): """ 耗时统计装璜器,单位是秒,保留 4 位小数 """ def decorator(func): @wraps(func) def wrapper(*args, **kwargs): start = time.time() result = func(*args, **kwargs) end = time.time() if logger: logger.info(f"{func.__name__} cost {end - start :.4f} seconds") else: print(f"{func.__name__} cost {end - start :.4f} seconds") return result return wrapper return decorator(注:比方下面应用 @wraps(func) 注解是很重要的, 它能保留原始函数的元数据) 只须要在原来的函数下面加上 @timeit() 即可为其减少新的性能: @timeit()def test_timeit(): time.sleep(1)test_timeit()#test_timeit cost 1.0026 seconds下面的代码跟上面这样写的成果是一样的: test_timeit = timeit(test_timeit)test_timeit()装璜器的执行程序当有多个装璜器的时候,他们的调用程序是怎么样的? 如果有这样的代码,请问是先打印 Decorator1 还是 Decorator2 ? ...

July 20, 2022 · 3 min · jiezi

关于python:13-个-Python-必备的知识建议收藏

Python在编程语言风行指数PYPL中已屡次排名第一。 因为其代码可读性和更简略的语法,它被认为是有史以来最简略的语言。 NumPy、Pandas、TensorFlow等各种AI和机器学习库的丰富性,是Python外围需要之一。 如果你是数据科学家或 AI/机器学习的初学者,那么Python是开始你的旅程的正确抉择。 本次,小F会带着大家摸索一些Python编程的基础知识,尽管简略但都很有用。 目录 数据类型变量列表汇合字典正文基本功能条件语句循环语句函数异样解决字符串操作正则表达式▍1、数据类型数据类型是能够存储在变量中的数据标准。解释器依据变量的类型为变量分配内存。 上面是Python中的各种数据类型。 ▍2、变量变量是存放数据值的容器。 变量能够应用短名称(如x和y)或更具描述性的名称(age、carname、total_volume)。  Python 变量命名规定: 变量名必须以字母或下划线字符结尾变量名称不能以数字结尾变量名只能蕴含字母数字字符和下划线(A-z、0-9和_)变量名称辨别大小写(age、Age和AGE是三个不同的变量)var1 = 'Hello World'var2 = 16_unuseful = 'Single use variables'输入后果如下。 ▍3、列表列表(List)是一种有序和可更改的汇合,容许反复的成员。 它可能不是同质的,咱们能够创立一个蕴含不同数据类型(如整数、字符串和对象)的列表。 >>> companies = ["apple","google","tcs","accenture"]>>> print(companies)['apple', 'google', 'tcs', 'accenture']>>> companies.append("infosys")>>> print(companies)['apple', 'google', 'tcs', 'accenture', 'infosys']>>> print(len(companies))5>>> print(companies[2])tcs>>> print(companies[-2])accenture>>> print(companies[1:])['google', 'tcs', 'accenture', 'infosys']>>> print(companies[:1])['apple']>>> print(companies[1:3])  ['google', 'tcs']>>> companies.remove("infosys")>>> print(companies)["apple","google","tcs","accenture"]>>> companies.pop()>>> print(companies)["apple","google","tcs"]▍4、汇合汇合(Set)是一个无序和无索引的汇合,没有反复的成员。 对于从列表中删除反复条目十分有用。它还反对各种数学运算,例如并集、交加和差分。 >>> set1 = {1,2,3,7,8,9,3,8,1}>>> print(set1){1, 2, 3, 7, 8, 9}>>> set1.add(5)>>> set1.remove(9)>>> print(set1){1, 2, 3, 5, 7, 8}>>> set2 = {1,2,6,4,2} >>> print(set2){1, 2, 4, 6}>>> print(set1.union(set2))        # set1 | set2{1, 2, 3, 4, 5, 6, 7, 8}>>> print(set1.intersection(set2)) # set1 & set2{1, 2}>>> print(set1.difference(set2))   # set1 - set2{8, 3, 5, 7}>>> print(set2.difference(set1))   # set2 - set1{4, 6}▍5、字典字典是作为键值对的可变无序项汇合。 与其余数据类型不同,它以【键:值】对格局保留数据,而不是存储单个数据。此性能使其成为映射JSON响应的最佳数据结构。 >>> # example 1>>> user = { 'username': 'Fan', 'age': 20, 'mail_id': 'codemaker2022@qq.com', 'phone': '18650886088' }>>> print(user){'mail_id': 'codemaker2022@qq.com', 'age': 20, 'username': 'Fan', 'phone': '18650886088'}>>> print(user['age'])20>>> for key in user.keys():>>>     print(key)mail_idageusernamephone>>> for value in user.values():>>>  print(value)codemaker2022@qq.com20Fan18650886088>>> for item in user.items():>>>  print(item)('mail_id', 'codemaker2022@qq.com')('age', 20)('username', 'Fan')('phone', '18650886088')>>> # example 2>>> user = {>>>     'username': "Fan",>>>     'social_media': [>>>         {>>>             'name': "Linkedin",>>>             'url': "https://www.linkedin.com/in/codemaker2022">>>         },>>>         {>>>             'name': "Github",>>>             'url': "https://github.com/codemaker2022">>>         },>>>         {>>>             'name': "QQ",>>>             'url': "https://codemaker2022.qq.com">>>         }>>>     ],>>>     'contact': [>>>         {>>>             'mail': [>>>                     "mail.Fan@sina.com",>>>                     "codemaker2022@qq.com">>>                 ],>>>             'phone': "18650886088">>>         }>>>     ]>>> }>>> print(user){'username': 'Fan', 'social_media': [{'url': 'https://www.linkedin.com/in/codemaker2022', 'name': 'Linkedin'}, {'url': 'https://github.com/codemaker2022', 'name': 'Github'}, {'url': 'https://codemaker2022.qq.com', 'name': 'QQ'}], 'contact': [{'phone': '18650886088', 'mail': ['mail.Fan@sina.com', 'codemaker2022@qq.com']}]}>>> print(user['social_media'][0]['url'])https://www.linkedin.com/in/codemaker2022>>> print(user['contact']) [{'phone': '18650886088', 'mail': ['mail.Fan@sina.com', 'codemaker2022@qq.com']}]▍6、正文单行正文,以井字符(#)结尾,前面带有音讯并在行尾完结。 # 定义用户年龄age = 27dob = '16/12/1994' # 定义用户生日多行正文,用非凡引号(""")括起来,你能够将音讯放在多行中。 """Python小常识This is a multi line comment"""▍7、基本功能print()函数在控制台中打印提供的音讯。此外你还能够提供文件或缓冲区输出作为在屏幕上打印的参数。 print(object(s), sep=separator, end=end, file=file, flush=flush)print("Hello World")               # prints Hello World print("Hello", "World")            # prints Hello World?x = ("AA", "BB", "CC")print(x)                           # prints ('AA', 'BB', 'CC')print("Hello", "World", sep="---") # prints Hello---Worldinput()函数用于收集来自控制台的用户输出 。 这里须要留神,input()会把你输出的任何内容转换为字符串。 因而,如果你将年龄作为整数值提供,但input()办法将其作为字符串返回,此时就须要手动将其转换为整数。 >>> name = input("Enter your name: ")Enter your name: Codemaker>>> print("Hello", name)Hello Codemakerlen()能够查看对象的长度。如果你输出一个字符串,则能够获取指定字符串中的字符数。 >>> str1 = "Hello World">>> print("The length of the string  is ", len(str1))The length of the string  is 11str()用于将其余数据类型转换为字符串值。 >>> str(123)123>>> str(3.14)3.14int()用于将字符串转换为整数。 >>> int("123")123>>> int(3.14)3▍8、条件语句条件语句是用于依据特定条件更改程序流程的代码块。这些语句只有在满足特定条件时才会执行。 在Python中,咱们应用if,if-else,循环(for,while)作为条件语句依据某些条件来改变程序的流程。 if-else语句。 >>> num = 5>>> if (num > 0):>>>    print("Positive integer")>>> else:>>>    print("Negative integer")elif语句。 >>> name = 'admin'>>> if name == 'User1':>>>     print('Only read access')>>> elif name == 'admin':>>>     print('Having read and write access')>>> else:>>>     print('Invalid user')Having read and write access▍9、循环语句循环是一个条件语句,用于反复某些语句(在其主体中),直到满足某个条件。 在Python中,咱们通常应用for和while循环。 for循环。 >>> # loop through a list>>> companies = ["apple", "google", "tcs"]>>> for x in companies:>>>     print(x)applegoogletcs>>> # loop through string>>> for x in "TCS":>>>  print(x)TCSrange()函数返回一个数字序列,它能够用作for循环管制。 它基本上须要三个参数,其中第二个和第三个是可选的。参数是开始值、进行值和步进数。步进数是每次迭代循环变量的增量值。 >>> # loop with range() function>>> for x in range(5):>>>  print(x)01234>>> for x in range(2, 5):>>>  print(x)234>>> for x in range(2, 10, 3):>>>  print(x)258咱们还能够应用else关键字在循环完结时执行一些语句。 在循环完结时提供else语句以及循环完结时须要执行的语句。 >>> for x in range(5):>>>  print(x)>>> else:>>>  print("finished")01234finishedwhile循环。 >>> count = 0>>> while (count < 5):>>>  print(count)>>>  count = count + 101234咱们能够在while循环的开端应用else,相似于for循环,当条件为假时执行一些语句。 >>> count = 0>>> while (count < 5):>>>  print(count)>>>  count = count + 1>>> else:>>>  print("Count is greater than 4")01234Count is greater than 4▍10、函数函数是用于执行工作的可重用代码块。在代码中实现模块化并使代码可重用,这是十分有用的。 >>> # This prints a passed string into this function>>> def display(str):>>>  print(str)>>>  return>>> display("Hello World")Hello World▍11、异样解决即便语句在语法上是正确的,它也可能在执行时产生谬误。这些类型的谬误称为异样。咱们能够应用异样解决机制来防止此类问题。  在Python中,咱们应用try,except和finally关键字在代码中实现异样解决。 >>> def divider(num1, num2):>>>     try:>>>         return num1 / num2>>>     except ZeroDivisionError as e:>>>         print('Error: Invalid argument: {}'.format(e))>>>     finally:>>>         print("finished")>>>>>> print(divider(2,1))>>> print(divider(2,0))finished2.0Error: Invalid argument: division by zerofinishedNone▍12、字符串操作字符串是用单引号或双引号(',")括起来的字符汇合。 咱们能够应用内置办法对字符串执行各种操作,如连贯、切片、修剪、反转、大小写更改和格式化,如split()、lower()、upper()、endswith()、join()和ljust()、rjust()、format()。 >>> msg = 'Hello World'>>> print(msg)Hello World>>> print(msg[1])e>>> print(msg[-1])d>>> print(msg[:1])H>>> print(msg[1:])ello World>>> print(msg[:-1])Hello Worl>>> print(msg[::-1])dlroW olleH>>> print(msg[1:5])ello>>> print(msg.upper())HELLO WORLD>>> print(msg.lower())hello world>>> print(msg.startswith('Hello'))True>>> print(msg.endswith('World'))True>>> print(', '.join(['Hello', 'World', '2022']))Hello, World, 2022>>> print(' '.join(['Hello', 'World', '2022']))Hello World 2022>>> print("Hello World 2022".split())['Hello', 'World', '2022']>>> print("Hello World 2022".rjust(25, '-'))---------Hello World 2022>>> print("Hello World 2022".ljust(25, '*'))Hello World 2022*********>>> print("Hello World 2022".center(25, '#'))#####Hello World 2022####>>> name = "Codemaker">>> print("Hello %s" % name)Hello Codemaker>>> print("Hello {}".format(name))Hello Codemaker>>> print("Hello {0}{1}".format(name, "2022"))Hello Codemaker2022▍13、正则表达式导入regex模块,import re。 re.compile()应用该函数创立一个Regex对象。 将搜寻字符串传递给search()办法。 调用group()办法返回匹配的文本。>>> import re>>> phone_num_regex = re.compile(r'\d\d\d-\d\d\d-\d\d\d\d')>>> mob = phone_num_regex.search('My number is 996-190-7453.')>>> print('Phone number found: {}'.format(mob.group()))Phone number found: 996-190-7453>>> phone_num_regex = re.compile(r'^\d+$')>>> is_valid = phone_num_regex.search('+919961907453.') is None>>> print(is_valid)True>>> at_regex = re.compile(r'.at')>>> strs = at_regex.findall('The cat in the hat sat on the mat.')>>> print(strs)['cat', 'hat', 'sat', 'mat']好了,本期的分享就到此结束了,有趣味的小伙伴能够自行去实际学习。 以上就是本次分享的所有内容,如果你感觉文章还不错,欢送关注公众号:Python编程学习圈,每日干货分享,发送“J”还可支付大量学习材料,内容笼罩Python电子书、教程、数据库编程、Django,爬虫,云计算等等。或是返回编程学习网,理解更多编程技术常识。

July 20, 2022 · 1 min · jiezi

关于python:9个应知应会的单行Python代码

当咱们开始学习 Python 时,咱们通常会优先编写可能实现工作的代码,而不会关注代码的可读性以及代码的简洁性和效率。 确切来说,这是齐全没有问题的,然而有一些办法能够在不疏忽可读性的状况下缩短咱们的 Python 代码。单行 Python 代码,只有咱们可能正确的应用它们,那么咱们将可能很好的兼顾简洁和可读性! 上面任何学习 Python 的同学都应该晓得的 9 条单行代码,咱们一起来看看吧~ 1. If — Else 语句if-else 语句是咱们在 Python 中学习的第一批语句之一,它用于执行给定条件的虚实局部。 咱们常常应用这个语句,然而你晓得它能够被简化为一行代码吗?在很多状况下,咱们齐全能够把 if 和 else 语句放在在同一行中 age = 18valid = "You're an adult"invalid = "You're NOT an adult"print(valid) if age >= 18 else print(invalid)2. 依据现有列表创立新列表列表是一种罕用的数据存储形式,但你晓得只需一行代码即可基于现有列表创立新列表吗? 没错,它被称为列表推导,它提供了一种基于现有列表的值创立列表的简短语法,列表推导比用于制作列表的函数和循环更紧凑。 上面是语法 [expression for item in list]咱们来看个例子 words = ['united states', 'brazil', 'united kingdom']capitalized = [word.title() for word in words]>>> capitalized['United States', 'Brazil', 'United Kingdom']下面的代码的确看起来更好!然而要记住,咱们应该放弃代码对用户敌对,因而不举荐在一行代码中编写很长的列表推导式。 3. 字典推导与列表推导相似,Python 中也有字典推导。字典推导提供了一种简短的语法,能够在一行代码中创立字典。 上面是语法 {key: value for key, value in iterable}来个栗子 dict_numbers = {x:x*x for x in range(1,6) }>>> dict_numbers{1: 1, 2: 4, 3: 9, 4: 16, 5:25}4. 合并词典有多种办法能够合并字典,咱们能够应用 update() 办法、merge() 运算符,甚至是字典推导。 然而有一种更简略的办法能够在 Python 中合并字典,就是通过应用解包运算符 **。咱们只须要在咱们心愿组合的每个字典后面增加 ** 并应用额定的字典来存储输入即可 dict_1 = {'a': 1, 'b': 2}dict_2 = {'c': 3, 'd': 4}merged_dict = {**dict_1, **dict_2}>>> merged_dict{'a': 1, 'b': 2, 'c': 3, 'd': 4}在咱们将 ** 运算符利用于字典后,两者都将扩大其内容并合并以创立一个新字典。 5.删除列表中的反复项有时咱们须要确保列表中没有任何反复值,只管没有一种办法能够轻松进行解决,但咱们能够应用set来打消反复项。 set是一种无序汇合,其中每个元素都是惟一的。这意味着如果咱们将列表变成一个汇合,就能够疾速删除反复项,。而后咱们只须要将汇合再次转换为列表即可。 让咱们看一个根本的例子来把握它 numbers = [1,1,1,2,2,3,4,5,6,7,7,8,9,9,9]>>> list(set(numbers))[1, 2, 3, 4, 5, 6, 7, 8, 9]6. 在一行中给多个变量赋值每当咱们须要调配多个变量时,能够在 Python 中将它们调配在一行中,而不是逐行调配(即便是来自不同类型的变量)。 a, b, c = 1, "abc",  True>>> a1>>> b'abc'>>> cTrue很简洁吧,然而须要留神的是,咱们调配的变量越多,将它们调配给谬误值的机会就越大,双刃剑啊~ 7. 从列表中过滤值假如咱们想从列表中过滤一些值,能够应用许多办法来做到这一点,但有一种简略的办法是应用 filter() 函数。 这是过滤器函数的语法: filter(function, iterable)如果咱们在过滤器函数中增加一个 lambda 函数,成果会更好! 让咱们通过从列表中过滤偶数来把握它 my_list = [10, 11, 12, 13, 14, 15]>>> list(filter(lambda x: x%2 == 0, my_list ))[10, 12, 14]8. 按键排序字典对字典进行排序并不像对列表进行排序那样简略——咱们不能像应用列表那样应用 sort() 或 sorted() 对字典进行排序。 ...

July 20, 2022 · 1 min · jiezi

关于python:nameko-使用-http-做-k8s-健康检查注意事项

当你的工作是耗时工作的时候,不要用 http 来做健康检查 这里的 http 指的是:@http('GET', '/health/') 这样的 http 装璜器nameko 有 max_workers 限度 pool 的大小, http 也是要排队的 工作自身特地耗时,用 http client 就会 timeout

July 19, 2022 · 1 min · jiezi

关于python:通过-for-循环比较-Python-与-Ruby-编程思想的差别

Ruby 与 Python 之间的差别在很大水平上可通过for循环看出实质。 Python 领有for语句。对象通知for如何进行合作,而for的循环领会解决对象返回的内容。 Ruby 则相同。在 Ruby 中,for自身(通过each)是对象的一个办法。调用者将for循环体传递给这个办法。 在 Python 的语言习惯中,对象模型遵从于 for 循环。而在 Ruby 中,for 循环遵从于对象模型。 也就是说,在 Python 中,如果你想自定义迭代的过程,能够让对象通知解释器该如何作迭代: class Stuff: def __init__(self): self.a_list = [1,2,3,4] self.position = 0 def __next__(self): try: value = self.a_list[self.position] self.position += 1 return value except IndexError: self.position = 0 raise StopIteration def __iter__(self): return self在这里,Stuff 应用 next 和 iter 魔术办法使本身可迭代(变为了可迭代对象)。 for data in Stuff(): print(data)然而,在 Ruby 的用法中,你要做的恰恰相反。你要将 for 创立成一个办法,它接管代码(body 体)来运行。Ruby 将过程代码放在代码块中,这样它们就能够被用于传递。 ...

July 19, 2022 · 2 min · jiezi

关于python:115K-Star一个开源的-Python-静态类型检查库

简介Mypy 是 Python 的动态类型查看库,能够向 Python 程序增加类型注解,并用 mypy 对它们进行动态类型查看,无需运行代码即可发现程序中潜在的谬误。还能够退出到 git hook 中,实现在提交代码前主动查看。Mypy 具备弱小且易于应用的类型零碎,具备古代性能,如类型推断、泛型、可调用类型、元组类型、联结类型和构造子类型。 应用 Python 3 注解语法(PEP 484 和 PEP 526)或 Python 2 基于正文的注解,可能无效的正文代码并应用 mypy 查看代码中的常见谬误。 能够在程序中混合应用动静类型和动态类型,对于遗留代码,如果不方便使用动态类型,能够随时回退到动静类型。如: from typing import Iteratordef fib(n: int) -> Iterator[int]: a, b = 0, 1 while a < n: yield a a, b = b, a + b对于 Python 2.7,规范注解写成正文: def is_palindrome(s): # type: (str) -> bool return s == s[::-1]我的项目地址: https://github.com/python/mypy 疾速开始应用 pip 进行装置: ...

July 19, 2022 · 1 min · jiezi

关于python:大型Python项目依赖树很烦教你一键理清

你可能时常会遇到因为包的版本不匹配导致代码报错的问题,因为 pip freeze 将所有依赖项显示为二维列表,这时候如果想找到这个谬误版本的包是比拟麻烦的事件。这时候,有个工具你必须得晓得,它就是 pipdeptree. pipdeptree 是一个命令行实用程序,它能用于以依赖关系树可视化的模式显示已装置的python包。 它实用于全局装置在计算机上的各个模块,也实用于Virtualenv等虚拟环境中的模块。 1.装置 你只须要在你的环境中输出以下命令就能装置 pipdeptree: pip install pipdeptree已通过测试的Python版本:2.7,3.5,3.6,3.7,3.8,3.9. 2.用法和示例 pip freeze 和 pipdeptree 最大的区别如下: # pip freeze 的显示$ pip freezeFlask==0.10.1itsdangerous==0.24Jinja2==2.11.2-e git+git@github.com:naiquevin/lookupy.git@cdbe30c160e1c29802df75e145ea4ad903c05386#egg=LookupyMarkupSafe==0.22pipdeptree @ file:///private/tmp/pipdeptree-2.0.0b1-py3-none-any.whlWerkzeug==0.11.2可见,pip freeze 最多只能显示一个依赖的列表,而在 pipdeptree ,每个模块的依赖关系可能十分直观地展现进去: $ pipdeptreeWarning!!! Possibly conflicting dependencies found:* Jinja2==2.11.2 - MarkupSafe [required: >=0.23, installed: 0.22]------------------------------------------------------------------------Flask==0.10.1  - itsdangerous [required: >=0.21, installed: 0.24]  - Jinja2 [required: >=2.4, installed: 2.11.2]    - MarkupSafe [required: >=0.23, installed: 0.22]  - Werkzeug [required: >=0.7, installed: 0.11.2]Lookupy==0.1pipdeptree==2.0.0b1  - pip [required: >=6.0.0, installed: 20.1.1]setuptools==47.1.1wheel==0.34.2请留神这个 Warning,提醒了你哪些模块会造成其依赖的模块版本发生冲突,这是十分有用的提醒,很多时候问题就呈现在这里。 不仅如此,如果存在循环性依赖,比方: CircularDependencyA => CircularDependencyB => CircularDependencyA 它会进行如下提醒: ...

July 19, 2022 · 1 min · jiezi

关于python:Python-超简单一键美化你的文章

在平时写文章的时候,我都会留神在中文和英文单词之间保留一个空格的习惯,这样能使文本具备良好的可读性。 然而我常常疏忽某些半角字符(数字和符号)与中文之间的空格,导致可读性比拟差,在浏览他人的文章或者批改他人的文章时候,也常常为懊恼别人没有这种优化可读性的细节。 当初,有一个很棒的工具,叫做 pangu , 它能够在中文、日文、韩文和半角字符(字母,数字和符号)之间主动插入空格。 有了它,你能够在每次写完文章后利用 pangu 一键丑化文章。也能够用 pangu 丑化他人的文章,比方: import pangunew_text = pangu.spacing_text('你能够在每次写完文章后利用pangu一键丑化文章。也能够用pangu 丑化他人的文章:')print(new_text)# new_text = '你能够在每次写完文章后利用 pangu 一键丑化文章。也能够用 pangu 丑化他人的文章:'1.筹备 开始之前,你要确保Python和pip曾经胜利装置在电脑上。 如果你用Python的目标是数据分析,能够间接装置Anaconda,它内置了Python和pip. 此外,举荐大家用VSCode编辑器,它有许多的长处。 请抉择以下任一种形式输出命令装置依赖: Windows 环境 关上 Cmd (开始-运行-CMD)。MacOS 环境 关上 Terminal (command+空格输出Terminal)。如果你用的是 VSCode编辑器 或 Pycharm,能够间接应用界面下方的Terminal.pip install -U pangu2.应用 装置实现之后,你能够尝试写一些简略的句子并丑化它们: import pangunew_text = pangu.spacing_text('Windows环境下关上Cmd(开始—运行—CMD),苹果零碎环境下请关上Terminal(command+空格输出Terminal)')print(new_text)# new_text = 'Windows 环境下关上 Cmd (开始 — 运行 —CMD),苹果零碎环境下请关上 Terminal (command + 空格输出 Terminal)'一键执行 你也能够不写 python 文件,间接通过 -m 参数执行命令丑化文本: python -m pangu "為什麼小明有問題都不Google?因為他有Bing"# 為什麼小明有問題都不 Google?因為他有 Bing此外,pangu 也反对 pangu 命令间接格式化文本: ...

July 19, 2022 · 1 min · jiezi

关于python:快来试试用-Python-将你的照片转化为速写

Photo-Sketching 一个能将照片的轮廓辨认进去并将其转化为“速写”型图像的开源模块。 比方,这只小狗: 通过模型的转化,会变成卡通版的小狗: 当然,也不是什么照片都解决的好,比方这个风景画就不行: 摇身一变,成了形象格调: 十分秀,这很人工智能。 这个模块的应用也绝对简略,上面给大家带上全方面的教程: 1.虚拟环境及依赖装置 这个我的项目举荐大家间接用Anaconda进行环境的构建和开发:,因为作者提供了一个 environment.yml 文件,你只须要输出以下命令,就能一键装置环境和依赖: conda env create -f environment.yml此外,举荐大家用VSCode编辑器来编写像这样的小型Python我的项目:Python 编程的最好搭档—VSCode 具体指南。 2.下载预训练模型 下载实现后解压文件,将 latest_net_D.pth 和 latest_net_G.pth 搁置到 Checkpoints 文件夹下: 3.运行预训练模型 接下来,咱们须要批改应用预训练模型的启动脚本,这些脚本都放在 PhotoSketch\scripts 下,咱们须要应用的是 test_pretrained.cmd 或者 test_pretrained.sh 这两个脚本。 如果你是 windows 零碎,请批改 test_pretrained.cmd 脚本,重点是dataDir、results_dir、checkpoints_dir: dataDir 指向到 PhotoSketch 所在的文件夹目录,如果你是跟我一样这么配的,results_dir 只须要配成 %dataDir%\PhotoSketch\Results* 即可,checkpoints_dir 则为 %dataDir%\PhotoSketch\Checkpoints* 。 如果你是macOS或者Linux,则批改 test_pretrained.sh 文件,批改办法与下面windows 的一样,只不过 反斜杠 "\" 要换成 斜杆 "/" 。 批改完脚本后,关上命令行/终端,输出以下命令,就会将你 PhotoSketch\examples 目录下的文件转化为“速写”。 windows: scripts\test_pretrained.cmdLinux/MacOS: ./scripts/test_pretrained.sh转化后果能够在 PhotoSketch\Results 中看到,如下两图所示。 待转化目录: ...

July 19, 2022 · 1 min · jiezi

关于python:Python自动化结算工资和统计报表

实例需要阐明你好,我是悦创。 博客首发:https://bornforthis.cn/column/pyauto/auto_base07.html 学习了 Excel 文件的写入、读取和追加内容,那当初来做个案例。 需要形容并整顿,如下: 每个月的 2 号,你会收到一个 Excel 文件;文件中蕴含了 各个部门的员工信息;你须要一天之内实现这些报表的整顿和统计,而后交给领导检查和发放工资;工夫要快,工资发晚了,共事会埋怨你;工作量还是比拟大的,你须要解放双手,让程序去解决问题让程序疾速的计算出每个人的工资,并将统计信息联合模板,生成“xxxx年xx月各部门员工数据总览”;薪资计算规定:早退一次扣 20,一个月最多扣 200;简略的财务自动化结算需要,并且给出了各部门的工资表格文件和统计报表的模板文件。 需要阐明图示简略的财务自动化结算需要,并且给出了各部门的工资表格文件和统计报表的模板文件,截图如下: “批量生成财务报表.ipynb”这个文件外面有可执行代码,执行后会主动的生成 5 个部门的财务文件。你也能够本人应用上面代码主动生成: # -*- coding: utf-8 -*-# @Time : 2022/7/15 21:48# @Author : AI悦创# @FileName: demo2.py# @Software: PyCharm# @Blog :http://www.aiyc.top# @公众号 :AI悦创import xlwtimport fakerimport randomimport datetimedef create_excel_file(filename, department): wb = xlwt.Workbook(filename) sheet = wb.add_sheet('sheet1') fake = faker.Faker("zh_CN") head_data = ['部门', '姓名', '工号', '薪资(元)', '早退次数(次)', '奖金(元)', '实发工资'] for head in head_data: sheet.write(0, head_data.index(head), head) for i in range(1, random.randint(5, 100)): sheet.write(i, 0, department) sheet.write(i, 1, fake.last_name() + fake.first_name()) sheet.write(i, 2, "G{}".format(random.randint(1, 1000))) sheet.write(i, 3, random.randint(4000, 16000)) sheet.write(i, 4, random.choice([0, 0, 0, 1, 2, 3, 4])) sheet.write(i, 5, random.choice([200, 300, 400, 500, 600, 700, 800, 900])) wb.save(filename)department_name = ['技术部', '推广部', '客服部', '行政部', '财务部']for dep in department_name: xls_name = "{}-{}.xls".format(datetime.datetime.now().strftime("%Y-%m"), dep) create_excel_file(xls_name, dep) print(xls_name, " 新建实现")上面是财务文件和模板文件的截图: ...

July 18, 2022 · 3 min · jiezi

关于python:Python-Excel追加数据

xlutils 库的装置你好,我是悦创。 后面我分享了 Excel 的读写:Python 实现 Excel 的读写操作:https://bornforthis.cn/column/pyauto/auto_base05.html 需要往“虚伪用户数据.xls”外面,追加额定的 50 条用户数据,就是题目+数据,达到 150 条。 思路xlrd 是读取 Excel 文件的库xlwt 是写入 Excel 的库如果应用以上两个库,能够一边读取,一边写入新文件。 不过在此,有另一个方便使用的库,库名是 xlutils,装置命令:pip install xlutils。 pip install xlutils装置好之后,开始写代码,实现追加 50 条数据的需要。 书写代码导入所需的库,别离是 xlrd 和 xlutilsimport xlrdfrom xlutils.copy import copy应用 xlrd 关上文件,而后 xlutils 赋值关上后的 workbook,如下代码:wb = xlrd.open_workbook('虚伪用户数据.xls', formatting_info=True)xwb = copy(wb)wb 对象是 workbook,xwb 也是 workbook,然而后者能够写操作,前者不能够。 有了 workbook 之后,就开始指定 sheet,并获取这个 sheet 的总行数。sheet = xwb.get_sheet('第一个sheet')rows = sheet.get_rows()length = len(rows)print(length) # 输入 100指定名称为“第一个sheet”的 sheet,而后获取全副的行,并输入总量,就失去了 sheet 中有 100 行。 ...

July 17, 2022 · 1 min · jiezi

关于python:Pyodide-中实现网络请求的-3-种方法

原文:https://lwebapp.com/zh/post/p... 需要小编之前提过一个在线 Python 工具,核心技术是用到了一个叫 Pyodide 的库,可能让 Python 在网页上运行,然而小编在学习过程中发现,并不是所有 Python 内置库或者扩大库都能运行,比方 requests是不反对的。 依据这个 issue 下的探讨,requests依赖于 Lib/http.client.py,后者依赖于 Lib/sockets.py,后者依赖于须要 <sys/socket.h> 的 socketmodule.c。 Emscripten 提供 <sys/socket.h> 反对,但如果咱们应用它,那么 http 申请只有在咱们将它们与承受 WebSocket 的自定义服务器一起应用时才会起作用(或通过能够转发申请的此类服务器代理所有申请) 作为真正的 http 申请,这个设计不太现实。 所以如果你的本地 Python 程序用到了requests的办法,转换到咱们的在线 Python 工具运行的时候,是须要更新网络申请的用法。这里咱们简要介绍下 3 种网络申请的办法。 办法1. http.open_url同步获取给定的 URL 申请数据 import pyodideprint(pyodide.http.open_url('https://mocki.io/v1/d4867d8b-b5d5-4a48-a4ab-79131b5809b8').read())在线 Demo: Python Playground - http.open_url 2. http.pyfetch获取 url 并返回响应 import pyodideasync def get_data(): response = await pyodide.http.pyfetch('https://mocki.io/v1/d4867d8b-b5d5-4a48-a4ab-79131b5809b8') data = await response.json() print(data)get_data()在线 Demo: Python Playground - http.pyfetch ...

July 17, 2022 · 1 min · jiezi

关于python:docker-打包-seleniumchromedriverchrome-解决方案

Dockerfile FROM python:3.10-busterRUN (echo "deb http://mirrors.aliyun.com/debian/ buster main non-free contrib" > /etc/apt/sources.list) RUN (apt-get update) && (apt-get upgrade)RUN (apt-get install -y lsb-release wget ttf-wqy-zenhei xfonts-intl-chinese wqy*) WORKDIR /codeRUN mkdir /code/depends# 下载并装置 chrome, TIPS: dpkg 不会解决依赖,要应用 apt 装置 debRUN (wget -P /code/depends https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb) && ( apt install -y /code/depends/google-chrome-stable_current_amd64.deb)COPY install.py /code/RUN python install.pyRUN /usr/local/bin/python -m pip install --upgrade pip -i https://pypi.tuna.tsinghua.edu.cn/simpleCOPY requirements-prd.txt /code/RUN pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements-prd.txtCOPY config.yaml /code/COPY . /code/让咱们一行一行来看 ...

July 17, 2022 · 1 min · jiezi

关于python:Python-项目管理与构建工具CookieCutter-PyScaffold-PyBuilder-Poetry

Python 历时这么久以来至今还未有一个事实上规范的项目管理及构建工具,以至于造成 Python 我的项目的构造与构建形式形形色色。这或者是体现了 Python 的自在意志。 不像 Java 在经验了最后的手工构建,到半自动化的 Ant, 再到 Maven 根本就是事实上的规范了。其间 Maven 还承受了其余的 Gradle(Android 我的项目主推), SBT(次要是 Scala 我的项目), Ant+Ivy, Buildr 等的挑战,但都很难撼动 Maven 的江湖位置,而且其余的差不多遵循了 Maven 的目录布局。 回到 Python,产生过 pip, pipenv, conda 那样的包管理工具,但对我的项目的目录布局没有任何约定。 对于构建很多还是连续了传统的 Makefile 的形式,再就是加上 setup.py 和 build.py 用程序代码来进行装置与构建。对于我的项目目录布局,有做成我的项目模板的,而后做成工具来利用我的项目模板。 上面大略浏览一下四个工具的应用 CookieCutterPyScaffoldPyBuilderPoetryCookieCutter 一个经典的 Python 我的项目目录构造 $ pip install cookiecutter$ cookiecutter gh:audreyr/cookiecutter-pypackage # 以 github 上的 audreyr/cookiecutter-pypackage 为模板,再答复一堆的问题生成一个 Python 我的项目......project_name [Python Boilerplate]: sample......最初由 cookiecutter 生成的我的项目模板是上面的样子: $ tree samplesample├── AUTHORS.rst├── CONTRIBUTING.rst├── HISTORY.rst├── LICENSE├── MANIFEST.in├── Makefile├── README.rst├── docs│ ├── Makefile│ ├── authors.rst│ ├── conf.py│ ├── contributing.rst│ ├── history.rst│ ├── index.rst│ ├── installation.rst│ ├── make.bat│ ├── readme.rst│ └── usage.rst├── requirements_dev.txt├── sample│ ├── __init__.py│ ├── cli.py│ └── sample.py├── setup.cfg├── setup.py├── tests│ ├── __init__.py│ └── test_sample.py└── tox.ini 3 directories, 26 files这大略是以后比拟风行的目录构造的主体框架,次要元素是: ...

July 16, 2022 · 5 min · jiezi

关于python:Python-微服务框架-Nameko-初体验

1. 前言思考到 Python 性能及效率性,Python Web 端始终不温不火,JAVA 和 Golang 的微服务生态始终很凋敝,也被宽泛用于企业级利用开发当中 本篇文章将介绍一款 Python 微服务框架:「 Nameko 」 2. Nameko 介绍Nameko 是一款玲珑、简洁的、异步通信形式的微服务架构 它采纳 RabbitMQ 音讯队列作为消息中间件,基于发布者、订阅者模式 其中,消费者与生产者基于 RPC 进行通信 我的项目地址:https://github.com/nameko/nameko 3. 实战一下上面以 Flask 为例聊聊搭建 Python 微服务的步骤 3-1 装置 RabbitMQ 及启动 这里举荐利用 Docker 装置 RabbitMQ,以 Centos 为例 # 1、下载某个版本的RabbitMQ的镜像# MQ版本号:3.9.5docker pull rabbitmq:3.9.5-management# 2、查看镜像docker images# 3、启动MQ容器# p:指定利用端口及Web控制台端口# hostname:主机名# e:环境变量# RABBITMQ_DEFAULT_VHOST:虚拟机名称# RABBITMQ_DEFAULT_USER:用户名# RABBITMQ_DEFAULT_PASS:明码# 3e83da0dc938:MQ镜像IDdocker run -d --name rabbitmq3.9.5 -p 5672:5672 -p 15672:15672 -v `pwd`/data:/var/lib/rabbitmq --hostname myRabbit -e RABBITMQ_DEFAULT_VHOST=my_vhost -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin 3e83da0dc938须要留神的是,启动 MQ 容器时,利用 -p 指定了两个端口 ...

July 16, 2022 · 2 min · jiezi

关于python:分享10个超级实用事半功倍的Python自动化脚本

在日常的工作学习当中,咱们总会遇到各式各样的问题,其中不少的问题都是一遍又一遍简略反复的操作,无妨间接用Python脚本来自动化解决,明天小编就给大家分享10个Python高级脚本,帮忙咱们缩小无谓的工夫节约,进步工作学习中的效率。 给照片增加水印给照片增加水印的代码多种多样,上面这种的或者是最为简略的模式, from PIL import Imagefrom PIL import ImageFontfrom PIL import ImageDrawdef watermark_Image(img_path,output_path, text, pos):    img = Image.open(img_path)    drawing = ImageDraw.Draw(img)    black = (10, 5, 12)    drawing.text(pos, text, fill=black)    img.show()    img.save(output_path)img = '2.png'watermark_Image(img, 'watermarked_2.jpg','Python', pos=(10, 10))检测文本文件的相似性很多时候咱们须要来查看两文件的相似性,到底存在着多少的雷同,或者以下的这个脚本文件能够派得上用场 from difflib import SequenceMatcherdef file_similarity_checker(f1, f2):    with open(f1, errors="ignore") as file1, open(f2, errors="ignore") as file2:        f1_data = file1.read()        f2_data = file2.read()        checking = SequenceMatcher(None, f1_data, f2_data).ratio()        print(f"These files are {checking*100} % similar")        file_1 = "门路1"file_2 = "门路2"file_similarity_checker(file_1, file_2)对文件内容进行加密有时候咱们手中文件的内容非常的重要、非常地秘密,咱们能够抉择对此进行加密,代码如下 from cryptography.fernet import Fernetdef encrypt(filename, key):    fernet = Fernet(key)    with open(filename, 'rb') as file:        original = file.read()    encrypted = fernet.encrypt(original)    with open(filename, 'wb') as enc_file:        enc_file.write(encrypted)        key = Fernet.generate_key()filename = "file.txt"encrypt(filename, key)咱们生成密钥,而后对文件内容进行加密,当然这个密钥前面在对文件进行解密的时候会派上用场,因而密钥肯定要保留完整,解密的代码如下 def decrypt(filename, key):    fernet = Fernet(key)    with open(filename, 'rb') as enc_file:        encrypted = enc_file.read()    decrypted = fernet.decrypt(encrypted)    with open(filename, 'wb') as dec_file:        dec_file.write(decrypted)decrypt(filename, key)下面的脚本,其中的密钥是一个随机生成的随机数,当然密钥也能够是咱们本人指定的,代码如下 import pyAesCryptdef Encryption(input_file_path, output_file_path, key):    pyAesCrypt.encryptFile(input_file_path, output_file_path, key)    print("File has been decrypted")def Decryption(input_file_path, output_file_path, key):    pyAesCrypt.decryptFile(input_file_path, output_file_path, key)    print("File has been decrypted")将照片转换为PDF有时候咱们须要将照片转换成PDF格局,或者将照片顺次增加到PDF文件当中去,代码如下 import osimport img2pdfwith open("Output.pdf", "wb") as file:    file.write(img2pdf.convert([i for i in os.listdir('文件门路') if i.endswith(".jpg")]))批改照片的长与宽咱们要是想要批改照片的长度和宽度的话,上面的这个代码能够帮得上忙,代码如下 from PIL import Imageimport osdef img_resize(file, h, w):  img = Image.open(file)    Resize = img.resize((h,w), Image.ANTIALIAS)    Resize.save('resized.jpg', 'JPEG', quality=90)    img_resize("文件门路", 400, 200)对于照片的其余操作除了下面批改照片的长度与宽度之外,针对照片咱们还有其余的操作,例如模糊化照片的内容 img = Image.open('1.jpg')blur = img.filter(ImageFilter.BLUR)blur.save('output.jpg')照片翻转90度 img = Image.open('1.jpg')rotate = img.rotate(90)rotate.save('output.jpg')照片进行锐化的解决 img = Image.open('1.jpg')sharp = img.filter(ImageFilter.SHARPEN)sharp.save('output.jpg')照片左右对称翻转,代码如下 img = Image.open('1.jpg')transpose = img.transpose(Image.FLIP_LEFT_RIGHT)transpose.save('output.jpg')照片进行灰度解决 img = Image.open('1.jpg')convert = img.convert('L')convert.save('output.jpg')测试网速当然咱们在开始测网速之前须要提前下载好依赖的模块 pip install speedtest-cli而后咱们开始尝试测试一下网速 from speedtest import Speedtestdef Testing_Speed(net):    download = net.download()    upload = net.upload()    print(f'下载速度: {download/(1024*1024)} Mbps')    print(f'上传速度: {upload/(1024*1024)} Mbps')    print("开始网速的测试 ...")net = Speedtest()Testing_Speed(net)货币汇率的转换例如咱们想要看一下美元与英镑之间的汇率转换,100美元能够换成多少的英镑,代码如下 # 导入模块from currency_converter import CurrencyConverterfrom datetime import date# 案例一conv = CurrencyConverter()c = conv.convert(100, 'USD', 'GBP')print(round(c, 2)) # 保留两位小数或者咱们想要看一下美元与欧元之间的汇率转换,100美元能够换成多少的欧元, # 案例二c = conv.convert(100, 'USD', 'EUR', date=date(2022, 3, 30))print(round(c, 2)) # 44.1生成二维码其中包含了二维码的生成以及二维码的解析,代码如下 import qrcodefrom PIL import Imagefrom pyzbar.pyzbar import decodedef Generate_qrcode(data):    qr = qrcode.QRCode(        version=1,        error_correction=qrcode.constants.ERROR_CORRECT_L,        box_size=10,        border=4,)    qr.add_data(data)    qr.make(fit=True)    image = qr.make_image(fill_color="black", back_color="white")    image.save("qrcode.png")Generate_qrcode("Python")咱们再来看一下二维码的解析,代码如下 def Decode_Qrcode(file_name):    result = decode(Image.open(file_name))    print("Data:", result[0][0].decode())Decode_Qrcode("文件名")制作一个简略的网页利用调用的是Python当中的flask模块来制作网页利用,代码如下 from flask import Flaskapp = Flask(__name__)@app.route("/")def home():    return "Hello World!"    @app.route("/python")def test():    return "欢送来到Python"    if __name__ == "__main__":    app.run(debug=True)以上就是本次分享的所有内容,如果你感觉文章还不错,欢送关注公众号:Python编程学习圈,每日干货分享,发送“J”还可支付大量学习材料,内容笼罩Python电子书、教程、数据库编程、Django,爬虫,云计算等等。或是返回编程学习网,理解更多编程技术常识。

July 16, 2022 · 1 min · jiezi

关于python:Python制作可视化GUI界面一键实现自动分类管理文件

常常横七竖八的文件夹会让咱们找不到所想要的文件,因而特意制作了一个可视化GUI界面,通过输出门路一键点击实现文件分门别类的归档。 不同的文件后缀归类为不同的类别咱们先列举一下大抵有几类文件,依据文件的后缀来设定,大抵如下 SUBDIR = {    "DOCUMENTS": [".pdf", ".docx", ".txt", ".html"],    "AUDIO": [".m4a", ".m4b", ".mp3", ".mp4"],    "IMAGES": [".jpg", ".jpeg", ".png", ".gif"],    "DataFile": [".csv", ".xlsx"]}下面所列举进去的文件后缀并不全面,读者能够依据本人的需要往里面增加,能够依据本人的爱好来进行分文别类,而后咱们自定义一个函数,依据输出的一个文件后缀来判断它是属于哪个类的 def pickDir(value):    for category, ekstensi in SUBDIR.items():        for suffix in ekstensi:            if suffix == value:                return category例如输出的是.pdf返回的则是DOCUMENTS这个类。咱们还须要再自定义一个函数,遍历当前目录下的所有文件,获取泛滥文件的后缀,将这些不同后缀的文件别离移入不同类别的文件夹,代码如下 def organizeDir(path_val):    for item in os.scandir(path_val):        if item.is_dir():            continue        filePath = Path(item)        file_suffix = filePath.suffix.lower()        directory = pickDir(file_suffix)        directoryPath = Path(directory)        # 新建文件夹,要是该文件夹不存在的话        if directoryPath.is_dir() != True:            directoryPath.mkdir()        filePath.rename(directoryPath.joinpath(filePath))output 咱们再次根底之上,再封装一下做成Python的可视化GUI界面,代码如下 class FileOrgnizer(QWidget):    def __init__(self):        super().__init__()        self.lb = QLabel(self)        self.lb.setGeometry(70, 25, 80, 40)        self.lb.setText('文件夹整顿助手:')        self.textbox = QLineEdit(self)        self.textbox.setGeometry(170, 30, 130, 30)        self.findButton = QPushButton('整顿', self)        self.findButton.setGeometry(60, 85, 100, 40)        self.quitButton = QPushButton('退出', self)        self.quitButton.clicked.connect(self.closeEvent)        self.findButton.clicked.connect(self.organizeDir)        self.quitButton.setGeometry(190, 85, 100, 40)        self.setGeometry(500, 500, 350, 150)        self.setWindowTitle('Icon')        self.setWindowIcon(QIcon('../751.png'))        self.show()    def pickDir(self, value):        for category, ekstensi in SUBDIR.items():            for suffix in ekstensi:                if suffix == value:                    return category    def organizeDir(self, event):        path_val = self.textbox.text()        print("门路为: " + path_val)        for item in os.scandir(path_val):            if item.is_dir():                continue            filePath = Path(item)            fileType = filePath.suffix.lower()            directory = self.pickDir(fileType)            if directory == None:                continue            directoryPath = Path(directory)            if directoryPath.is_dir() != True:                directoryPath.mkdir()            filePath.rename(directoryPath.joinpath(filePath))        reply = QMessageBox.information(self, "实现", "工作实现,请问是否要退出?", QMessageBox.Yes | QMessageBox.No, QMessageBox.No)        if reply == QMessageBox.Yes:            event.accept()        else:            event.ignore()    def closeEvent(self, event):        reply = QMessageBox.question(self, '退出',                                     "确定退出?", QMessageBox.Yes |                                     QMessageBox.No, QMessageBox.No)        if reply == QMessageBox.Yes:            event.accept()        else:            event.ignore()成果如下图所示 最初咱们通过pyinstaller模块来将Python代码打包成可执行文件,操作指令如下 pyinstaller -F -w 文件名.py局部参数含意如下: -F:示意生成单个可执行文件-w:示意去掉控制台窗口,这在GUI界面时时十分有用的-i:示意可执行文件的图标以上就是本次分享的所有内容,如果你感觉文章还不错,欢送关注公众号:Python编程学习圈,每日干货分享,发送“J”还可支付大量学习材料,内容笼罩Python电子书、教程、数据库编程、Django,爬虫,云计算等等。或是返回编程学习网,理解更多编程技术常识。

July 16, 2022 · 1 min · jiezi

关于python:WhooshPython-的轻量级搜索工具

本文将简略介绍Python中的一个轻量级搜寻工具Whoosh,并给出相应的应用示例代码。 Whoosh简介Whoosh由Matt Chaput创立,它一开始是一个为Houdini 3D动画软件包的在线文档提供简略、疾速的搜寻服务工具,之后便缓缓成为一个成熟的搜寻解决工具并已开源。 Whoosh纯由Python编写而成,是一个灵便的,不便的,轻量级的搜索引擎工具,当初同时反对Python2、3,其长处如下: Whoosh纯由Python编写而成,但很快,只须要Python环境即可,不须要编译器;默认应用 Okapi BM25F排序算法,也反对其余排序算法;相比于其余搜索引擎,Whoosh会创立更小的index文件;Whoosh中的index文件编码必须是unicode;Whoosh能够贮存任意的Python对象。Whoosh的官网介绍网站为:https://whoosh.readthedocs.io... 。相比于ElasticSearch或者Solr等成熟的搜索引擎工具,Whoosh显得更轻便,操作更简略,能够思考在小型的搜寻我的项目中应用。 Index & query对于相熟ES的人来说,搜寻的两个重要的方面为mapping和query,也就是索引的构建以及查问,背地是简单的索引贮存、query解析以及排序算法等。如果你有ES方面的教训,那么,对于Whoosh是非常容易上手的。 依照笔者的了解以及Whoosh的官网文档,Whoosh的入门应用次要是index以及query。搜索引擎的弱小性能之一在于它可能提供全文检索,这依赖于排序算法,比方BM25,也依赖于咱们怎么贮存字段。因而,index作为名词时,是指字段的索引,index作为动词时,是指建设字段的索引。而query会将咱们须要查问的语句,通过排序算法,给出正当的搜寻后果。 对于Whoosh的应用,在官文文档中曾经给出了具体的阐明,笔者在这里只给出一个简略的例子,来阐明Whoosh如何能不便地晋升咱们的搜寻体验。 示例代码数据本我的项目的示例数据为poem.csv,下图为该数据集的前十行: poem.csv 字段依据数据集的特色,咱们创立四个字段(fields):title, dynasty, poet, content。创立的代码如下: # -*- coding: utf-8 -*-import osfrom whoosh.index import create_infrom whoosh.fields import *from jieba.analyse import ChineseAnalyzerimport json# 创立schema, stored为True示意可能被检索schema = Schema(title=TEXT(stored=True, analyzer=ChineseAnalyzer()),                dynasty=ID(stored=True),                poet=ID(stored=True),                content=TEXT(stored=True, analyzer=ChineseAnalyzer())                )其中,ID只能为一个单元值,不能宰割为若干个词,罕用于文件门路、URL、日期、分类;\TEXT文件的文本内容,建设文本的索引并存储,反对词汇搜寻;Analyzer抉择结巴中文分词器。 创立索引文件接着,咱们须要创立索引文件。咱们利用程序先解析poem.csv文件,并将它转化为index,写入到indexdir目录下。Python代码如下: # 解析poem.csv文件with open('poem.csv', 'r', encoding='utf-8') as f:    texts = [_.strip().split(',') for _ in f.readlines() if len(_.strip().split(',')) == 4]# 存储schema信息至indexdir目录indexdir = 'indexdir/'if not os.path.exists(indexdir):    os.mkdir(indexdir)ix = create_in(indexdir, schema)# 依照schema定义信息,减少须要建设索引的文档writer = ix.writer()for i in range(1, len(texts)):    title, dynasty, poet, content = texts[i]    writer.add_document(title=title, dynasty=dynasty, poet=poet, content=content)writer.commit()index创立胜利后,会生成indexdir目录,外面含有上述poem.csv数据的各个字段的索引文件。 查问index创立胜利后,咱们就利用进行查问。 比方咱们想要查问content中含有明月的诗句,能够输出以下代码: # 创立一个检索器searcher = ix.searcher()# 检索content中呈现'明月'的文档results = searcher.find("content", "明月")print('一共发现%d份文档。' % len(results))for i in range(min(10, len(results))):    print(json.dumps(results[i].fields(), ensure_ascii=False))输入后果如下: 一共发现44份文档。前10份文档如下:{"content": "床前明月光,疑是地上霜。举头望明月,抬头思故土。", "dynasty": "唐代", "poet": "李白 ", "title": "静夜思"}{"content": "边草,边草,边草尽来兵老。山南山北雪晴,千里万里月明。明月,明月,胡笳一声愁绝。", "dynasty": "唐代", "poet": "戴叔伦 ", "title": "调笑令·边草"}{"content": "独坐幽篁里,弹琴复长啸。深林人不知,明月来相照。", "dynasty": "唐代", "poet": "王维 ", "title": "竹里馆"}{"content": "汉江明月照归人,万里秋风一叶身。休把客衣轻浣濯,此中犹有帝京尘。", "dynasty": "明代", "poet": "边贡 ", "title": "重赠吴国宾"}{"content": "秦时明月汉时关,万里长征人未还。但使龙城飞将在,不教胡马度阴山。", "dynasty": "唐代", "poet": "王昌龄 ", "title": "出塞二首·其一"}{"content": "京口瓜洲一水间,钟山只隔数重山。春风又绿江南岸,明月何时照我还?", "dynasty": "宋代", "poet": "王安石 ", "title": "泊船瓜洲"}{"content": "四顾山光接水光,凭栏十里芰荷香。清风明月无人管,并作南楼一味凉。", "dynasty": "宋代", "poet": "黄庭坚 ", "title": "鄂州南楼书事"}{"content": "青山隐隐水迢迢,秋尽江南草未凋。二十四桥明月夜,玉人何处教吹箫?", "dynasty": "唐代", "poet": "杜牧 ", "title": "寄扬州韩绰判官"}{"content": "露气寒光集,微阳下楚丘。猿啼洞庭树,人在木兰舟。广泽生明月,苍山夹乱流。云中君不见,竟夕自悲秋。", "dynasty": "唐代", "poet": "马戴 ", "title": "楚江怀古三首·其一"}{"content": "海上生明月,天涯共此时。情人怨遥夜,竟夕起相思。灭烛怜光满,披衣觉露滋。不堪盈手赠,还寝梦佳期。", "dynasty": "唐代", "poet": "张九龄 ", "title": "望月怀远 / 望月怀古"}以上就是本次分享的所有内容,如果你感觉文章还不错,欢送关注公众号:Python编程学习圈,每日干货分享,发送“J”还可支付大量学习材料,内容笼罩Python电子书、教程、数据库编程、Django,爬虫,云计算等等。或是返回编程学习网,理解更多编程技术常识。

July 16, 2022 · 1 min · jiezi

关于python:TracedModule-更友好的模型表示方案模型训练到部署的桥梁

作者:曹文刚 | 旷视 MegEngine 架构师TracedModule 介绍TracedModule 是 MegEngine 中的一种模型格局,用于脱离模型源码对模型进行训练、量化、图手术和模型转换,它是模型训练到部署之间的桥梁。图 1 从一个一般 Module 生成 TracedModule TracedModule 产生自一般的 Module,它通过以下两步失去: 运行一次 Module,记录并捕捉模型运行过程中对输出 Tensor 的所有操作,对应图 1 中的 tm.trace_module通过一个由 5 种指令所形成的 “简略” 的 high-level IR(intermediate representation) 来形容捕捉到的程序(一般 Module 中的 forward 办法),对应于图 1 中的 SimpleModule.GraphTracedModule 的实质依然是一个 Module,它与一般 Module 的区别在于: 一般 Module 通过用户实现的 forward 办法形容模型运行过程,而 TracedModule 通过 TracedModule IR 来形容模型的运行过程。TracedModule IR 由 python 的根本数据类型以及 Node 和 Expr 形成,其中:Node 用来示意一个 Tensor 或 Module,并记录了 Tensor 或 Module 的一些信息;Expr 用来示意对 Tensor 或 Module 的操作,它的输出和输入都是 Node。 ...

July 15, 2022 · 4 min · jiezi

关于python:Python中LSTM回归神经网络的时间序列预测

原文链接 这个问题是国际航空乘客预测问题, 数据是1949年1月到1960年12月国际航空公司每个月的乘客数量(单位:千人),共有12年144个月的数据。 链接:https://pan.baidu.com/s/1JJTe... 提取码:6666 数据趋势: 训练程序: import numpy as np import pandas as pd import matplotlib.pyplot as plt import torch from torch import nnfrom torch.autograd import Variable#LSTM(Long Short-Term Memory)是长短期记忆网络data_csv = pd.read_csv('C:/Users/DZF/Desktop/LSTM/data.csv',usecols=[1])#pandas.read_csv能够读取CSV(逗号宰割)文件、文本类型的文件text、log类型到DataFrame#原有两列,工夫和乘客数量,usecols=1:只取了乘客数量一列plt.plot(data_csv)plt.show()#数据预处理data_csv = data_csv.dropna() #去掉na数据dataset = data_csv.values #字典(Dictionary) values():返回字典中的所有值。dataset = dataset.astype('float32') #astype(type):实现变量类型转换 max_value = np.max(dataset)min_value = np.min(dataset)scalar = max_value-min_valuedataset = list(map(lambda x: x/scalar, dataset)) #将数据标准化到0~1之间#lambda:定义一个匿名函数,区别于def#map(f(x),Itera):map()接管函数f和一个list,把函数f顺次作用在list的每个元素上,失去一个新的object并返回'''接着咱们进行数据集的创立,咱们想通过后面几个月的流量来预测当月的流量,比方咱们心愿通过前两个月的流量来预测当月的流量,咱们能够将前两个月的流量当做输出,当月的流量当做输入。同时咱们须要将咱们的数据集分为训练集和测试集,通过测试集的成果来测试模型的性能,这里咱们简略的将后面几年的数据作为训练集,前面两年的数据作为测试集。'''def create_dataset(dataset,look_back=2):#look_back 以前的工夫步数用作输出变量来预测下一个时间段 dataX, dataY=[], [] for i in range(len(dataset) - look_back): a = dataset[i:(i+look_back)] #i和i+1赋值 dataX.append(a) dataY.append(dataset[i+look_back]) #i+2赋值 return np.array(dataX), np.array(dataY) #np.array构建数组data_X, data_Y = create_dataset(dataset)#data_X: 2*142 data_Y: 1*142#划分训练集和测试集,70%作为训练集train_size = int(len(data_X) * 0.7)test_size = len(data_X)-train_size train_X = data_X[:train_size]train_Y = data_Y[:train_size] test_X = data_X[train_size:]test_Y = data_Y[train_size:] train_X = train_X.reshape(-1,1,2) #reshape中,-1使元素变为一行,而后输入为1列,每列2个子元素train_Y = train_Y.reshape(-1,1,1) #输入为1列,每列1个子元素test_X = test_X.reshape(-1,1,2) train_x = torch.from_numpy(train_X) #torch.from_numpy(): numpy中的ndarray转化成pytorch中的tensor(张量)train_y = torch.from_numpy(train_Y)test_x = torch.from_numpy(test_X)#定义模型 输出维度input_size是2,因为应用2个月的流量作为输出,暗藏层维度hidden_size可任意指定,这里为4class lstm_reg(nn.Module): def __init__(self,input_size,hidden_size, output_size=1,num_layers=2): super(lstm_reg,self).__init__() #super() 函数是用于调用父类(超类)的一个办法,间接用类名调用父类 self.rnn = nn.LSTM(input_size,hidden_size,num_layers) #LSTM 网络 self.reg = nn.Linear(hidden_size,output_size) #Linear 函数继承于nn.Module def forward(self,x): #定义model类的forward函数 x, _ = self.rnn(x) s,b,h = x.shape #矩阵从外到里的维数 #view()函数的性能和reshape相似,用来转换size大小 x = x.view(s*b, h) #输入变为(s*b)*h的二维 x = self.reg(x) x = x.view(s,b,-1) #卷积的输入从外到里的维数为s,b,一列 return xnet = lstm_reg(2,4) #input_size=2,hidden_size=4 criterion = nn.MSELoss() #损失函数均方差optimizer = torch.optim.Adam(net.parameters(),lr=1e-2)#结构一个优化器对象 Optimizer,用来保留以后的状态,并可能依据计算失去的梯度来更新参数#Adam 算法:params (iterable):可用于迭代优化的参数或者定义参数组的 dicts lr:学习率for e in range(10000): var_x = Variable(train_x) #转为Variable(变量) var_y = Variable(train_y) out = net(var_x) loss = criterion(out, var_y) optimizer.zero_grad() #把梯度置零,也就是把loss对于weight的导数变成0. loss.backward() #计算失去loss后就要回传损失,这是在训练的时候才会有的操作,测试时候只有forward过程 optimizer.step() #回传损失过程中会计算梯度,而后optimizer.step()依据这些梯度更新参数 if (e+1)%100 == 0: print('Epoch: {}, Loss:{:.5f}'.format(e+1, loss.data[0])) torch.save(net.state_dict(), 'net_params.pkl') #保留训练文件net_params.pkl#state_dict 是一个简略的python的字典对象,将每一层与它的对应参数建设映射关系测试程序: ...

July 15, 2022 · 2 min · jiezi

关于python:Python将图片输出为二维数组并保存到txt中

原文链接 应用Python将图片输入为二维数组,并保留到txt文件中。 代码如下: # coding=utf8from PIL import Imageimport numpy as npfrom scipy import miscimport matplotlib.pyplot as pyplot #读图片def loadImage(): im = Image.open("0001.jpg") #读取图片 im.show() #显示原图 im = im.convert("L") #转换成灰度图 data = im.getdata() data = np.matrix(data) #Image类返回矩阵的操作 data = np.reshape(data,(304,720)) #变换成304*720 new_im = Image.fromarray(data) #调用Image库,数组归一化 new_im.show() #显示新图片 misc.imsave('new_img.jpg', new_im) #保留新图片到本地 return data#写数据def Writedata(data): filename = 'C:\\Users\\DZF\\Desktop\\negative.txt' #数据文件保留地位 row = np.array(data).shape[0] #获取行数n with open(filename,'w') as f: # 若filename不存在会主动创立,写之前会清空文件 for i in range(0,row): f.write(str(data[i][0:])) f.write("\n") data = loadImage()Writedata(data)学习更多编程常识,请关注我的公众号: ...

July 15, 2022 · 1 min · jiezi

关于python:Python将二维数组输出为图片

原文链接 应用Python读取二维数组,将二维数组输入为图片,并保留在本地。 代码如下: # coding=utf8from PIL import Imageimport numpy as npfrom scipy import miscimport matplotlib.pyplot as pyplot a = 300b = 500x = 20y = 20w = 40h = 80 def Gener_mat(a,b,x,y,w,h): #生成图片矩阵 img_mat = np.zeros((a, b), dtype=np.int) for i in range(0,a): for j in range(0,b): img_mat[i][j] = 0 for i in range(x,x+w): for j in range(y,y+h): img_mat[i][j] = 1 return img_matdef out_img(data): #输入图片 new_im = Image.fromarray(data) #调用Image库,数组归一化 #new_im.show() pyplot.imshow(data) #显示新图片 misc.imsave('new_img.jpg', new_im) #保留图片到本地img_mat = Gener_mat(a,b,x,y,w,h)out_img(img_mat) 学习更多编程常识,请关注我的公众号: ...

July 15, 2022 · 1 min · jiezi

关于python:Python对txt进行读写操作

原文链接 全文件读写读操作应用pandas.read_csv,写操作应用data.to_csv。 import numpyimport pandas as pd#读data = pd.read_csv(r"/home/snowstorm/mmdetection/data/groundtruth.txt", header=None) #读取TXT:逗号分隔#data = pd.read_csv(r"/home/snowstorm/mmdetection/data/groundtruth.txt", header=None, sep=' ') #读取TXT:空格分隔print(data)#写data.to_csv("/home/snowstorm/mmdetection/data/write.txt",sep=',',header=False,index=False)指定行列读写import numpy#读数据def loadDatadet(infile,k): f = open(infile,'r') sourceInLine = f.readlines() dataset = [] for line in sourceInLine: #读数据 temp1 = line.strip('\n') temp2 = temp1.split('\t') dataset.append(temp2) for i in range(0,len(dataset)): #转为整数 for j in range(k): dataset[i].append(int(dataset[i][j])) del(dataset[i][0:k]) list = sum(dataset,[]) #变成一维数组 posit_data = numpy.array(list).reshape(len(list)//4,4) #变为n*4的二维数组 return posit_data#写数据def Writedata(negat_data): filename = 'C:\\Users\\DZF\\Desktop\\negative.txt' #要写入的文件 row = numpy.array(negat_data).shape[0] #获取行数n with open(filename,'w') as f: # 若filename不存在会主动创立,写之前会清空文件 for i in range(0,row): f.write(str(negat_data[i][0:12])) f.write("\n") infile = 'C:\\Users\\snow\\Desktop\\positive.txt' #要读取的文件k = 1 #列数posit_data = loadDatadet(infile,k)Writedata(posit_data)print(posit_data)学习更多编程常识,请关注我的公众号: ...

July 15, 2022 · 1 min · jiezi

关于python:Python-列表解析式竟然支持异步

摘要PEP-492 和 PEP-525 通过 async/await 语法,引入了对原生协程和异步生成器的反对。本 pep 提议给列表、汇合、字典解析式和生成器表达式增加异步的版本。 基本原理和指标Python 宽泛地反对同步的推导式,容许应用简略而简洁的语法生成列表、字典和汇合。咱们提议为异步代码实现相似的语法结构。 为了阐明可读性的改善,请思考上面的例子: result = []async for i in aiter(): if i % 2: result.append(i)有了提议的异步解析式语法,下面的代码会变得十分简短: result = [i async for i in aiter() if i % 2]本 PEP 也使得在各种解析式中应用 await 表达式成为可能: result = [await fun() for fun in funcs] 标准异步的解析式咱们提议容许在列表、汇合与字典解析式中应用 async。待 PEP-525 被批准之后,咱们还能够创立异步的生成器表达式。 例子: 汇合解析式:{i async for i in agen()}列表解析式:[i async for i in agen()]字典解析式:{i: i ** 2 async for i in agen()}生成器表达式:(i ** 2 async for i in agen())容许在异步解析式和生成器表达式中应用 async for 与 if 以及 for 子句: ...

July 15, 2022 · 2 min · jiezi

关于python:Python-数值中的下划线是怎么回事

Python 中下划线的用法令人叹为观止,置信你已在各种文章或教程中见识过了。在 2016 年的 3.6 版本之后,Python 还引入了一种新的语法,使得下划线也能够呈现在数值中。 概要和原理本 PEP 提议扩大 Python 的语法,使得在“字符串变成数”(number-from-string)结构器中,下划线能够作为视觉分隔符,对整数、浮点和复数字面量的数字进行分组。 这是其它古代语言的一个常见个性,有助于了解长的或者值应该被直观地分成几局部的字面量,如十六进制表示法中的字节或单词。 例子: # grouping decimal numbers by thousandsamount = 10_000_000.0# grouping hexadecimal addresses by wordsaddr = 0xCAFE_F00D# grouping bits into nibbles in a binary literalflags = 0b_0011_1111_0100_1110# same, for string conversionsflags = int('0b_1111_0000', 2)标准目前的提议是在数字之间和在数字字面量的根本标识符之后,容许有一个下划线。下划线没有语义上的意义,数字字面量会被解析得就像没有下划线一样。 字面量语法因而,整型字面量的表示法看起来像这样: integer: decinteger | bininteger | octinteger | hexintegerdecinteger: nonzerodigit (["_"] digit)* | "0" (["_"] "0")*bininteger: "0" ("b" | "B") (["_"] bindigit)+octinteger: "0" ("o" | "O") (["_"] octdigit)+hexinteger: "0" ("x" | "X") (["_"] hexdigit)+nonzerodigit: "1"..."9"digit: "0"..."9"bindigit: "0" | "1"octdigit: "0"..."7"hexdigit: digit | "a"..."f" | "A"..."F"浮点数和复数的字面量: ...

July 15, 2022 · 1 min · jiezi

关于python:聊天没有表情包被嘲讽用python爬取了十万张表情包

前言事件要从几天前说起,我有一个敌人,他在和他喜爱的小姐姐聊天时,聊天的氛围始终十分尬,这时他就想发点表情包来弛缓一下氛围,但一看本人的表情包珍藏都是这样的。。。 。。。这发过来,根本就间接和小姐姐说拜拜了,而后他就向我求救问我有没有表情包,表情包我是没有,但网站有呀,来来,爬虫整起。 剖析页面明天爬取的网站是斗图吧,有一说一表情包是真的多,看这惊人的页数 接下来就该看看怎么拿到表情包图片的url了,首先关上谷歌浏览器,而后点F12进入爬虫高兴模式 而后实现下图的操作,先点击1号箭头,而后再选中一个表情包即可,红色框中就是咱们要爬取的对象,其中表情包的src就在外面 当初咱们就搞清楚了怎么拿到表情包的url了,就开始写代码了 具体实现解析页面获取网页内容这里就是获取爬取网页的信息 def askURL(url): head = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.106 Safari/537.36" } req = urllib.request.Request(url=url, headers=head) html = "" try: response = urllib.request.urlopen(req) html = response.read() except Exception as result: print(result) return html解析网页内容# 取出图片src的正则式imglink = re.compile( r'<img alt="(.*?)" class="img-responsive lazy image_dta" data-backup=".*?" data-original="(.*?)" referrerpolicy="no-referrer" src=".*?"/>', re.S)def getimgsrcs(url): html = askURL(url) bs = BeautifulSoup(html, "html.parser") names = [] srcs = [] # 找到所有的img标签 for item in bs.find_all('img'): item = str(item) # 依据下面的正则表达式规定把图片的src以及图片名拿下来 imgsrc = re.findall(imglink, item) # 这里是因为拿取的img标签可能不是咱们想要的,所以匹配正则规定之后可能返回空值,因而判断一下 if (len(imgsrc) != 0): imgname = "" if imgsrc[0][0] != '': imgname = imgsrc[0][0] + '.' + getFileType(imgsrc[0][1]) else: imgname = getFileName(imgsrc[0][1]) names.append(imgname) srcs.append(imgsrc[0][1]) return names, srcs到当初为止,曾经拿到了所有的图片的链接和名字,那么就能够开始下载了 ...

July 15, 2022 · 1 min · jiezi

关于python:lambda-函数完美使用指南

明天咱们来学习 Python 中的 lambda 函数,并探讨应用它的长处和局限性 什么是 Python 中的 Lambda 函数lambda 函数是一个匿名函数(即,没有名称定义),它能够承受任意数量的参数,但与一般函数不同,它只计算并返回一个表达式 Python 中的 lambda 函数应用以下语法表白: lambda 参数:表达式 lambda 函数包含三个元素: 关键字 lambda:与一般函数中 def 相似参数:反对传递地位和关键字参数,与一般函数一样注释:解决定参数的表达式须要留神的是,一般函数不同,这里不须要用括号将 lambda 函数的参数括起来,如果 lambda 函数有两个或更多参数,咱们用逗号列出它们 咱们应用 lambda 函数只计算一个短表达式(现实状况下,单行)并且只计算一次,这意味着咱们当前不会再复用这个函数。通常来说咱们会将 lambda 函数作为参数传递给高阶函数(承受其余函数作为参数的函数),例如 Python 内置函数,如 filter()、map() 或 reduce()等 Python 中的 Lambda 函数如何工作让咱们看一个简略的 lambda 函数示例: lambda x: x + 1Output: <function __main__.<lambda>(x)>下面的 lambda 函数承受一个参数,将其递增 1,而后返回后果 它是以下带有 def 和 return 关键字的一般函数的更简略版本: def increment_by_one(x):    return x + 1到目前咱们的 lambda 函数 lambda x: x + 1 只创立一个函数对象,不返回任何内容,这是因为咱们没有为其参数 x 提供任何值(参数)。让咱们先调配一个变量,将它传递给 lambda 函数,看看这次咱们失去了什么: a = 2print(lambda x: a + 1)Output: <function <lambda> at 0x00000250CB0A5820>咱们的 lambda 函数没有像咱们预期的那样返回 3,而是返回了函数对象自身及其内存地位,能够看出这不是调用 lambda 函数的正确办法。要将参数传递给 lambda 函数,执行它并返回后果,咱们应该应用以下语法: ...

July 15, 2022 · 2 min · jiezi

关于python:Python-爬虫获取王者荣耀英雄图片

这两天闲来无事,恰好有个学弟在学 python,想爬王者的皮肤图片,于是将相干 url 给了我,我帮忙写了一个简略的脚本,分享上来供大家应用。 相干url本爬虫程序须要两个 url。 保留英雄信息的 JSON 文件:https://pvp.qq.com/web201605/js/herolist.json 样子长这样,应该是高深莫测: [{ "ename": 105, "cname": "廉颇", "title": "正义爆轰", "new_type": 0, "hero_type": 3, "skin_name": "正义爆轰|天堂岩魂"}, { "ename": 106, "cname": "小乔", "title": "恋之大风", "new_type": 0, "hero_type": 2, "skin_name": "恋之大风|万圣前夜|天鹅之梦|纯白花嫁|缤纷独角兽"}, { "ename": 107, "cname": "赵云", "title": "苍天翔龙", "new_type": 0, "hero_type": 1, "hero_type2": 4, "skin_name": "苍天翔龙|忍●炎影|将来纪元|皇家上将|嘻哈天王|白执事|引擎之心"}.....获取英雄图片的 url: https://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/{英雄编号}/{英雄编号}-bigskin-{皮肤编号}.jpg这条是什么意思呢?咱们拿小乔举例,下面的 JSON 里,小乔的 ename 是 106,就是这里的英雄编号,而皮肤编号是从 1 开始算的,JSON 里有 5 个皮肤,所以皮肤编号能够是 1 - 5。比方https://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/106/106-bigskin-1.jpg就是小乔的原皮肤。 编码实现通过观察 JSON 文件,能够发现其是以对象数组的模式存在的,数组中的值就是保留一个英雄信息的对象,如果咱们要获取指定英雄的皮肤,那么就要通过查找英雄的名称【ename】,获取其编号【cname】和皮肤名列表【skin_name】,因为【skin_name】是用 “|” 连在一起的,所以咱们要宰割字符串,统计其中有几个皮肤,咱们就失去了相应的皮肤编号,而后填入 url 模板中即可。同时咱们也能够将英雄名、皮肤名连接起来,作为下载的图片名称,方便管理。成果如图: 具体代码: ...

July 14, 2022 · 2 min · jiezi

关于python:Python基础Python进阶一对一答疑

写在后面的话你好,我是悦创。 敬爱的小伙伴们,大家好,十分欢迎您来到 CSDN、AI悦创平台学习,我是负责 Python 答疑的老师也负责教学的老师(一对一),当初也在网易云课堂独自授课,很快乐您们踏进编程的大门,并抉择 Python 作为一个 “敲门砖” 。Python 语言因为它的易学性和易了解性,深受小伙伴们的喜爱。 在当下人工智能与机器学习发展势头热火朝天,Python 语言在这个畛域堪称是编程语言中的佼佼者。无论您是首次学习编程,还是曾经接触过其余编程语言,其实每门编程语言的根底都尤为重要。 常言道:“合抱之木,生于毫末;九层之台,起于累土”,如果根底不可靠,又何谈进阶学习呢?所以咱们要将一门语言的根底打牢固,在今后学习中我将陪伴你们一起重点把握 Python 的基础知识。当然也不止这些,咱们也将一起探讨 Python 的进阶之路。 答疑/授课老师是谁?1) 已经的我I'm Mr AI悦创,很快乐能通过 CSDN、AI悦创等多个平台和大家相识,坐标:厦门,次要从事 Python 开发的工作,对于数据分析以及机器学习也略有钻研。编程世界的乏味,让我我深深的爱上了程序员这个职业,程序员的工作说起来枯燥无味,然而一个真正的编程爱好者是十分沉醉其中的。 接触 Python 的几年的工夫里接触过大大小小十多个我的项目,在我的项目中我把常识学以致用,过往的几年工夫里给我最深的领会就是做事要认真、灵便、粗疏、有效率。 2) 当初的我我本人创建公众号:AI悦创,网站:https://www.aiyc.top/ ,并且在圈内小有名气。编写了诸多文章,在编写的过程中我力求把每一个知识点讲明确,以通俗易懂的形式和读者交换,同时也退出我本人的一些理论工作经验,心愿本人踩过的坑,可能让大家防止,少走弯路。 当初正在编写无关数据以及人工智能方面的教程,比方 NumPy、Pandas、TensorFlow 等。我也踊跃的学习 Python 人工智能方面最新的常识,一直的武装空虚本人。程序员的世界无关风花雪月,只有学习才是最短暂的陪伴。 当然,我最善于的就是带你入门:Python、爬虫、Python 办公自动化、Django 等等能带你十分好的入门。 我的座右铭最初把我的座右铭分享给大家,心愿咱们能够共勉,“学习就像谈恋爱,如果足够爱它,那么所有的问题都不是问题”,当你累了倦了的时候,想想本人为什么登程,为什么抉择学习编程,我想你会拾掇好情绪,持续上路! 我的教育理念浅者感觉其浅,深者感觉其深。——AI悦创 我参加过的我的项目在几年中参加过的次要我的项目: 基于 Django 的 Web 开发批量解决过万 Excel「办公自动化」Python 爬虫提供数据反对分布式爬虫清华团队、有道精品课、网易云课堂课程,技术答疑老师Python 课程设计Web 自动化测试等诸多我的项目答疑/上课办法腾讯会议一对一上课网易云课堂直播课微信、常识星球等如何免费Python 一对一答疑/教学,按具体须要来定制,反对私人定制。费用能够按具体内容交换。 答疑/教学人数答疑或教学人数,答疑 5000+(网易云课堂、有道精品课、清华团队等学员)教学:一对一私教学员:300 +此文章长期有效!微信:Jiabcdefh联系方式:Jiabcdefh

July 14, 2022 · 1 min · jiezi

关于python:饿了么数据采集app爬虫

咱们提供封装好的饿了么 数据采集接口,实时采集,接口稳固。长期保护应用便宜 接口应用详情请参考 接口地址: github 拜访地址:https://github.com/ping0206gu... 全副反对的接口如下,并且反对定制开发

July 14, 2022 · 1 min · jiezi

关于python:Python-Queue-进阶多生产者单消费者问题

生产者消费者模型在并发编程中,比方爬虫,有的线程负责爬取数据,有的线程负责对爬取到的数据做解决(荡涤、分类和入库)。如果他们是间接交互的,那么当二者的速度不匹配时势必呈现期待景象,这也就产生了资源的节约。 形象是一种很重要的通用能力,而生产者消费者模型是前人将一系列同类型的具体的问题形象进去的一个统一的最佳解决方案。 该模型有三个重要角色,容器,生产者和消费者,顾名思义,生产者就是负责生产数据或工作的,消费者就是负责生产数据或者工作的(下文统称为工作),容器是二者进行通信的媒介。 在该模型中,生产者和消费者不在间接进行通信,而是通过引入一个第三者容器(通常都是用阻塞队列)来达到解耦的目标。 这样生产者不用在因为消费者速度过慢而期待,间接将工作放入容器即可,消费者也不必因生产者生产速度过慢而期待,间接从容器中获取工作,以此达到了资源的最大利用。 应用该模型能够解决并发编程中的绝大部分并发问题。 简易版咱们先写一个单生产者和单消费者的简易版生产者消费者模型。 import threadingimport timeimport queuedef consume(thread_name, q): while True: time.sleep(2) product = q.get() print("%s consume %s" % (thread_name, product))def produce(thread_name, q): for i in range(3): product = 'product-' + str(i) q.put(product) print("%s produce %s" % (thread_name, product)) time.sleep(1) q = queue.Queue()p = threading.Thread(target=produce, args=("producer",q))c = threading.Thread(target=consume, args=("consumer",q))p.start()c.start()p.join()# 输入如下producer produce product-0producer produce product-1consumer consume product-0producer produce product-2consumer consume product-1consumer consume product-2...以上就是最简略的生产者消费者模型了,生产者生产三个工作供消费者生产。然而下面的写法有个问题,就是生产者将工作生产结束之后就和主线程一起退出了,然而消费者将所有的工作生产完之后还没进行,始终处于阻塞状态。 那可不可以将 while True 的判断改为 while not q.empty()呢,必定是不行的。因为 empty() 返回 False ,不保障后续调用的 get()不被阻塞。 ...

July 14, 2022 · 1 min · jiezi

关于python:为什么-Python-没有函数重载如何用装饰器实现函数重载

函数重载指的是有多个同名的函数,然而它们的签名或实现却不同。当调用一个重载函数 fn 时,程序会测验传递给函数的实参/形参,并据此而调用相应的实现。 int area(int length, int breadth) { return length * breadth;}float area(int radius) { return 3.14 * radius * radius;}在以上例子中(用 c++ 编写),函数 area 被重载了两个实现。第一个函数接管两个参数(都是整数),示意矩形的长度和宽度,并返回矩形的面积。另一个函数只接管一个整型参数,示意圆的半径。 当咱们像 area(7) 这样调用函数 area 时,它会调用第二个函数,而 area(3,4) 则会调用第一个函数。 为什么 Python 中没有函数重载?Python 不反对函数重载。当咱们定义了多个同名的函数时,前面的函数总是会笼罩后面的函数,因而,在一个命名空间中,每个函数名仅会有一个注销项(entry)。 这里说 Python 不反对函数重载,指的是在不必语法糖的状况下。应用 functools 库的 singledispatch 装璜器,Python 也能够实现函数重载。 通过调用 locals() 和 globals() 函数,咱们能够看到 Python 的命名空间中有什么,它们别离返回部分和全局命名空间。 def area(radius): return 3.14 * radius ** 2>>> locals(){ ... 'area': <function area at 0x10476a440>, ...}在定义一个函数后,接着调用 locals() 函数,咱们会看到它返回了一个字典,蕴含了定义在部分命名空间中的所有变量。字典的键是变量的名称,值是该变量的援用/值。 ...

July 14, 2022 · 4 min · jiezi

关于python:分享两个好用的Python小工具

明天给大家介绍两个 Python 好用的小工具。 尽管用法简略,却能大大提高开发效率。 1. tqdm当程序中for循环须要耗费大量工夫来执行的时候,往往咱们会增加一个计数器输入程序执行的进度。 这种形式的毛病在于须要写一些与业务无关的代码,并且打印的信息过多。 如果咱们用tqdm能够用进度条的形式显示程序的执行进度,能够无效地防止上述毛病。 应用形式非常简单 import timefrom tqdm import tqdmfor i in tqdm(range(100)):    time.sleep(1)这个小工具还有其余好用的性能,感兴趣的能够自行摸索。 2. glob第二个小工具是 Python 库自带的模块——glob。 它能够以Unix格调拜访本地文件。 例如,咱们想列出当前目录下所有gif文件 import globglob.glob('./*.ipynb')输入后果如下: ['./cnn.ipynb', './blob.ipynb', './test.ipynb']还有更多的例子 >>> import glob>>> glob.glob('./[0-9].*')['./1.gif', './2.txt']>>> glob.glob('*.gif')['1.gif', 'card.gif']>>> glob.glob('?.gif')['1.gif']>>> glob.glob('**/*.txt', recursive=True)['2.txt', 'sub/3.txt']>>> glob.glob('./**/', recursive=True)['./', './sub/']怎么样,小工具是不是简略、高效,哈哈,心愿对大家有用。 以上就是本次分享的所有内容,如果你感觉文章还不错,欢送关注公众号:Python编程学习圈,每日干货分享,发送“J”还可支付大量学习材料,内容笼罩Python电子书、教程、数据库编程、Django,爬虫,云计算等等。或是返回编程学习网,理解更多编程技术常识。

July 14, 2022 · 1 min · jiezi

关于python:python中周日历与时间的相互转换

python中周日历与工夫的互相转换周日历(ISO国际标准)介绍在线周日历(2022年)根本介绍在开发过程中,有些汇总征询须要以周为单位统计,所以介绍下如何进行互相转换。 应用datetime类格式化进行转换strftime 办法能够将工夫转换为字符串strptime 办法能够将字符串转为工夫"%Y,%W,%w"中,"%Y"代表年份,"%W"代表周,"%w"代表一周内的第几天from datetime import datetime# 工夫转周日历a = datetime.now().strftime("%Y,%W,%w")print(a) # 2022,28,3# 周日历转工夫a = datetime.strptime("2022,12,3","%Y,%W,%w")print(a) # 2022-03-23 00:00:00问题以上貌似问题解决了,然而问题出在年初和年尾以2021年12月,2022年1月举例2021年12月 周数周一周二周三周四周五周六周日48 1234549678910111250131415161718195120212223242526522728293031 2022年1月 周数周一周二周三周四周五周六周日52 1213456789210111213141516317181920212223424252627282930531 from datetime import datetimea = datetime.strptime("2021-12-31", "%Y-%m-%d")print(a.strftime("%Y,%W,%w")) # 2021,52,5a = datetime.strptime("2022-01-01", "%Y-%m-%d")print(a.strftime("%Y,%W,%w")) # 2022,00,6按iso规范,2022年1月1日应该归为2021年的最初一周应用strftime办法格式化后为2022年第0月,所以这是有问题的正确办法应用isocalendar将日期转换为周日历datetime类型的工夫间接调用 isocalendar 办法 from datetime import datetimedef str_to_time(time_str: str) -> datetime: return datetime.strptime(time_str, "%Y-%m-%d")time_list = [ "2021-12-30", "2021-12-31", "2022-01-01", "2022-01-02", "2022-01-03",]for i in time_list: t = str_to_time(i) iso = t.isocalendar() print(i, " > ", f"{iso.year},{iso.week},{iso.weekday}")# 2021-12-30 > 2021,52,4# 2021-12-31 > 2021,52,5# 2022-01-01 > 2021,52,6# 2022-01-02 > 2021,52,7# 2022-01-03 > 2022,1,1应用 fromisocalendar 将周日历转换为日期from datetime import datetimetime_list = ( (2021, 52, 4), (2021, 52, 5), (2021, 52, 6), (2021, 52, 7), (2022, 1, 1),)for year, week, weekday in time_list: t = datetime.fromisocalendar(year, week, weekday) print(f"{year},{week},{weekday}", " > ", t)# 2021,52,4 > 2021-12-30 00:00:00# 2021,52,5 > 2021-12-31 00:00:00# 2021,52,6 > 2022-01-01 00:00:00# 2021,52,7 > 2022-01-02 00:00:00# 2022,1,1 > 2022-01-03 00:00:00python代码from datetime import datetimedef datetime_to_isoweek(datetime_: datetime) -> tuple[int, int, int]: """工夫转换为iso周日历 Args: datetime_ (datetime): 工夫 Returns: tuple[int,int,int]: year,week,weekday """ iso = datetime_.isocalendar() return iso.year, iso.week, iso.weekdaydef isoweek_to_datetime(isoweek: tuple[int, int, int]) -> datetime: """iso周日历转换为工夫 Args: isoweek (tuple[int,int,int]): year,week,weekday Returns: datetime: 工夫 """ year, week, weekday = isoweek return datetime.fromisocalendar(year, week, weekday)

July 13, 2022 · 1 min · jiezi

关于python:Python全能工程师2022版完结

download:Python全能工程师2022版完结Java 17 升级指南分为几个部分: 编译相干参数迁徙相干运行相干 编译相干JEP 320在 Java11 中引入了一个提案 JEP 320: Remove the Java EE and CORBA Modules 移除了 Java EE and CORBA 的模块,如果我的项目中用到需要手动引入。比如代码中用到了 javax.annotation.* 下的包:import javax.annotation.PreDestroy;public abstract class FridayAgent @PreDestroypublic void destroy() { agentClient.close();}} 在编译时会找不到相干的类。这是因为 Java EE 已经在 Java 9 中被标记为 deprecated,Java 11 中被正式移除,可能手动引入 javax 的包:<dependency> <groupId>javax.annotation</groupId><artifactId>javax.annotation-api</artifactId><version>1.3.2</version></dependency> 使用了 sun.misc.* 下的包比如 sun.misc.BASE64Encoder,这个简略,替换一下工具类即可。[ERROR] symbol: class BASE64Encoder[ERROR] location: package sun.misc netty 低版本使用了 sun.misc.*,编译错误信息如下Caused by: java.lang.NoClassDefFoundError: Could not initialize class io.netty.util.internal.PlatformDependent0 at io.netty.util.internal.PlatformDependent.getSystemClassLoader(PlatformDependent.java:694) ~[netty-all-4.0.42.Final.jar!/:4.0.42.Final]对应的源码如下:/** ...

July 13, 2022 · 4 min · jiezi

关于python:如何正确使用yield

在 Python 开发中,yield 关键字的应用其实较为频繁,例如大汇合的生成,简化代码构造、协程与并发都会用到它。 然而,你是否真正理解 yield 的运行过程呢? 这篇文章,咱们就来看一下 yield 的运行流程,以及在开发中哪些场景适宜应用 yield。 生成器如果在一个办法内,蕴含了 yield 关键字,那么这个函数就是一个「生成器」。 生成器其实就是一个非凡的迭代器,它能够像迭代器那样,迭代输入办法内的每个元素。 咱们来看一个蕴含 yield 关键字的办法: # coding: utf8# 生成器def gen(n): for i in range(n): yield ig = gen(5) # 创立一个生成器print(g) # <generator object gen at 0x10bb46f50>print(type(g)) # <type 'generator'># 迭代生成器中的数据for i in g: print(i) # Output:# 0 1 2 3 4留神,在这个例子中,当咱们执行 g = gen(5) 时,gen 中的代码其实并没有执行,此时咱们只是创立了一个「生成器对象」,它的类型是 generator。 而后,当咱们执行 for i in g,每执行一次循环,就会执行到 yield 处,返回一次 yield 前面的值。 ...

July 13, 2022 · 3 min · jiezi

关于python:Python-优化提速的-8-个小技巧

Python 是一种脚本语言,相比 C/C++ 这样的编译语言,在效率和性能方面存在一些有余。然而,有很多时候,Python 的效率并没有设想中的那么夸大。本文对一些 Python 代码减速运行的技巧进行整顿。 0. 代码优化准则本文会介绍不少的 Python 代码减速运行的技巧。在深刻代码优化细节之前,须要理解一些代码优化根本准则。 第一个根本准则是不要过早优化。很多人一开始写代码就奔着性能优化的指标,“让正确的程序更快要比让疾速的程序正确容易得多”。因而,优化的前提是代码能失常工作。过早地进行优化可能会漠视对总体性能指标的把握,在失去全局后果前不要主次颠倒。 第二个根本准则是衡量优化的代价。优化是有代价的,想解决所有性能的问题是简直不可能的。通常面临的抉择是工夫换空间或空间换工夫。另外,开发代价也须要思考。 第三个准则是不要优化那些无关紧要的局部。如果对代码的每一部分都去优化,这些批改会使代码难以浏览和了解。如果你的代码运行速度很慢,首先要找到代码运行慢的地位,通常是外部循环,专一于运行慢的中央进行优化。在其余中央,一点工夫上的损失没有什么影响。 1. 防止全局变量 # 不举荐写法。代码耗时:26.8秒import mathsize = 10000for x in range(size): for y in range(size): z = math.sqrt(x) + math.sqrt(y)许多程序员刚开始会用 Python 语言写一些简略的脚本,当编写脚本时,通常习惯了间接将其写为全局变量,例如下面的代码。然而,因为全局变量和局部变量实现形式不同,定义在全局范畴内的代码运行速度会比定义在函数中的慢不少。通过将脚本语句放入到函数中,通常可带来 15% - 30% 的速度晋升。 # 举荐写法。代码耗时:20.6秒import mathdef main(): # 定义到函数中,以缩小全副变量应用 size = 10000 for x in range(size): for y in range(size): z = math.sqrt(x) + math.sqrt(y)main()2. 防止. 2.1 防止模块和函数属性拜访 # 不举荐写法。代码耗时:14.5秒import mathdef computeSqrt(size: int): result = [] for i in range(size): result.append(math.sqrt(i)) return resultdef main(): size = 10000 for _ in range(size): result = computeSqrt(size)main()每次应用.(属性拜访操作符时)会触发特定的办法,如__getattribute__()和__getattr__(),这些办法会进行字典操作,因而会带来额定的工夫开销。通过from import语句,能够打消属性拜访。 ...

July 13, 2022 · 5 min · jiezi

关于python:一行Python代码到底有多强大

Python是一门十分简洁而柔美的编程语言,在其余编程语言中须要繁琐的代码逻辑能力实现的事件,往往在Python中一行就能够解决。 这样,它不仅能够缩小开发工作量,还可能大大晋升可读性,防止在开发简单逻辑过程中造成的失误。 本文,就来给大家介绍10个一行代码到底有多弱小! 1. 替换变量如果大学学过C/C++编程课的同学,对于替换变量肯定不会生疏,这是最根底,也是十分罕用的。 如果用C/C++实现替换变量,须要这样的操作: int a, b, c;c = a;a = b;b = c;而在Python中,一行代码就能够实现变量的替换。 # a = 1; b = 2a, b = b, a# print(a,b) >> 2 1这样,咱们就不须要去额定定义一个长期变量,不仅简略,而且十分直观。 2. 多变量调配如果你在调配变量时同时蕴含多种类型的变量,这在很多编程语言中是无奈实现的,然而在Python中一行代码就能够实现: a, b, *c = [1,2,3,4,5]# print(a,b,c) >> 1 2 [3, 4, 5]在Python中,能够通过符号*把列表元素调配给指定的变量,这也叫unpacking。 3. 每隔一个元素求和如果有这么一个列表[1,2,3,4,5,6],你想每隔一个元素进行求和[2, 4, 6],能够这样应用: # a = [1,2,3,4,5,6]s = sum(a[1::2])# print(s) >> 12这里,不须要利用简单的逻辑,只须要正当利用Python切片就能够实现,[1::]标识,从第2个元素直到列表完结。 4. 删除多个元素# a = [1,2,3,4,5]del a[::2]# print(a) >> [2, 4]弱小的切片语法也能够用于一次删除多个列表元素。 5. 将文件行读入到数组如果条件或循环语句比较简单的话,能够利用列表达式去简化代码: ...

July 13, 2022 · 1 min · jiezi

关于python:Python白学了

提起Python,绝大多数同学第一印象就是”简略“。 然而,Python中也有很多乏味、奥妙的事件,如果不用心去理解,很容易在开发过程中陷入误区,久久无法自拔。 上面,就介绍几个Python中乏味的事件。 1. 奥妙的字符串>>> a = "wtf">>> b = "wtf">>> a is bTrue>>> a = "wtf!">>> b = "wtf!">>> a is bFalse>>> a, b = "wtf!", "wtf!">>> a is b True是不是感觉很神奇? 为什么加上!返回就是False,不加则返回True? 为什么加上!并搁置同一行时,又返回True了? 这些行为是因为 Cpython 在编译优化时, 某些状况下会尝试应用曾经存在的不可变对象而不是每次都创立一个新对象. (这种行为被称作字符串的驻留[string interning])产生驻留之后, 许多变量可能指向内存中的雷同字符串对象. (从而节俭内存)在下面的代码中, 字符串是隐式驻留的. 何时产生隐式驻留则取决于具体的实现. 这里有一些办法能够用来猜想字符串是否会被驻留:所有长度为 0 和长度为 1 的字符串都被驻留.字符串在编译时被实现 ('wtf' 将被驻留, 然而 ''.join(['w', 't', 'f']) 将不会被驻留)字符串中只蕴含字母,数字或下划线时将会驻留. 所以 'wtf!' 因为蕴含 ! 而未被驻留.当在同一即将 a 和 b 的值设置为 "wtf!" 的时候, Python 解释器会创立一个新对象, 而后同时援用第二个变量。如果你在不同的行上进行赋值操作, 它就不会“晓得”曾经有一个 wtf! 对象 (因为 "wtf!" 不是依照下面提到的形式被隐式驻留的). 它是一种编译器优化, 特地实用于交互式环境.2. is和==的区别>>> a = 256>>> b = 256>>> a is bTrue>>> a = 257>>> b = 257>>> a is bFalse>>> a = 257; b = 257>>> a is bTrueis 运算符查看两个运算对象是否援用自同一对象 (即, 它查看两个运算对象是否雷同).== 运算符比拟两个运算对象的值是否相等.因而is代表援用雷同,==代表值相等. 上面的例子能够很好的阐明这点, ...

July 13, 2022 · 1 min · jiezi

关于python:如何在-JavaScript-中调用-Python

谁才是最好的编程语言?Java、PHP、Python、Go、JavaScript…. 每个人都有本人的答案,然而,当范畴限定在Web开发,没有什么能胜过JavaScript。 但有时咱们必须做一些要求更高的工作,例如,剖析大量的数据。 在这种状况下,Python可能是一个更好的抉择。 但这只是咱们网站的一个性能,天然不会因为这一点需要而用Python开发整个工程。 明天,就来给大家介绍一种可能将JavaScript和Python完满联合在一起,高效解决工程问题的办法。  JavaScript+Python这对于很多开发同学来说,相对算得上一个很吸引人的音讯。 咱们能够在Node.JS中应用子过程,在须要时运行一个Python脚本。 const spawn = require('child_process').spawnapp.get("process_data", (req, res) => {    spawn('python3', ['script.py'])})再来写一个Python脚本: # script.pydoSometing()除了这种形式,咱们也能够将数据传递给咱们的Python脚本。 const spawn = require('child_process').spawnapp.get("process_data", (req, res) => {    const msg = "Hello"    spawn('python3', ['script.py', msg])})在Python中,为了可能读取数据,你必须导入sys模块。 import sys, jsondef main():    msg = sys.argv[1]    doSometing(msg)if __name__ == '__main__':    main()当初,咱们不须要在生成Python过程时传递数据,而是在工作工作流中发送数据。 const spawn = require('child_process').spawn,const py = spawn('python3', ['script.py'])const data = {    msg: "Hello"}py.stdin.write(JSON.stringify(data)) //we have to send data as a string, so we are using JSON.stringifypy.stdin.end()批改一下Python脚本: import sys, jsondef main():    lines = sys.stdin.readlines()    data = json.loads(lines)    doSometing(data['msg'])if __name__ == '__main__':    main()最初,咱们能够从Python脚本中向nodejs发送响应。 const spawn = require('child_process').spawnconst py = spawn('python3', ['cscript.py'])py.stdout.on('data', function(res){   let data = JSON.parse(res.toString())   console.log(data)})Python代码为: import sys# You will have your own implementation of get data. In this case lets assume it returns a dict/jsonres = getData()print(json.dumps(data))sys.stdout.flush()这样,咱们就能够在Web开发过程中,可能同时兼顾JavaScript、Python的劣势,最大化施展不同编程语言的价值。无需借助数据库,或者开发繁琐的api构造就能够有机的把JavaScript与Python联合到一起,晋升开发效率。 以上就是本次分享的所有内容,如果你感觉文章还不错,欢送关注公众号:Python编程学习圈,每日干货分享,发送“J”还可支付大量学习材料,内容笼罩Python电子书、教程、数据库编程、Django,爬虫,云计算等等。或是返回编程学习网,理解更多编程技术常识。

July 13, 2022 · 1 min · jiezi

关于python:10个办公自动化的常用操作代码拿走就用

这篇文章分享了一些办公自动化罕用操作的代码,大家拿走就能够用在本人的脚本中! 01OS模块相干 一、遍历文件夹批量操作的前提就是对文件夹进行遍历,应用os模块能够轻松的遍历文件夹,os.walk 遍历后产生三个参数: 以后文件夹门路蕴含文件夹名称[列表模式]蕴含文件名称[列表模式]代码如下,大家能够依据本人的门路进行批改 import os for dirpath, dirnames, filenames in os.walk(r'C:\\Program Files (x86)'): print(f'关上文件夹{dirpath}') # 以后文件夹门路 if dirnames: print(dirnames) # 蕴含文件夹名称[列表模式] if filenames: print(filenames) # 蕴含文件名称[列表模式] print('-' * 10)当手上的需要明确有获取给定门路各级文件夹下所有符合条件的文件,并进行相应的批处理操作时,即可应用 os.walk 二、 指标门路是否是文件有时咱们须要判断一个目录下是否存在文件也能够应用os模块。 给定一个指标门路 path ,通过一行代码就可能判断这是文件还是文件夹门路 import ospath = 'xxx'print(os.path.isfile(path))三、获取门路中的文件名os.path.basename 能够间接从绝对路径中获取最初的文件名,当然如果用传统的字符串切割形式也能够,即 path.split('\')[-1] import ospath = 'xxx'print(os.path.basename)四、创立文件夹创立文件夹的代码十分罕用,因为往往生成的新文件都心愿有个新的文件夹存储,代码如下: import osdirpath = 'xxx'os.mkdir(dirpath)然而,如果心愿创立的文件夹曾经存在,再运行 os.mkdir() 则会报错而终止代码。为了防止这一状况的产生,能够在创立文件夹之前先判断文件夹是否存在。 用到的代码是 os.path.exists,只有当门路不存在(即 os.path.exists 返回的后果是 False 时),才会创立: import osdirpath = 'xxx'if not os.path.exists(dirpath): os.mkdir(dirpath)五、获取桌面门路获取桌面门路也是十分罕用的操作,能够应用os.path.join(os.path.expanduser("~"), 'Desktop') 获取桌面的绝对路径。 这样做的益处是能够把数据放在桌面上,在不同的电脑上都能调用代码对数据进行解决。如果是在一条电脑上把桌面门路固定在字符串中,则换一台电脑就必须批改桌面门路。代码如下: ...

July 12, 2022 · 1 min · jiezi

关于python:Python重大变化是matchcase不是switchcase

前言2021 年 2 月 8 日,领导委员会通过了 PEP 634, PEP635, PEP636,至此,Python 总算领有了 match-case, 不必再写一连串的 if-else 了 1最简略的模式如下,将 match 主题表达式与一个或多个字面量模式进行比拟 def http_error(status): match status: case 400: return "Bad request" case 401: return "Unauthorized" case 403: return "Forbidden" case 404: return "Not found" case 418: return "I'm a teapot" case _: return "Something else"最初一个 case 中,case _:相似于 C 和 Java 中的default:,永远不会匹配失败,即当其余 case 都无奈匹配时,匹配这条 2能够应用|将多个字面量组合起来示意或 ... case 401|403|404: return "Not allowed"3模式也能够是解包操作,用于绑定变量 # 主题表达式是一个(x, y)元组match point: case (0, 0): print("Origin") case (0, y): print(f"Y={y}") case (x, 0): print(f"X={x}") case (x, y): print(f"X={x}, Y={y}") case _: raise ValueError("Not a point")留神,第一个模式中有两个字面量,能够看作是上述一般模式的加强版。然而后两个模式有些不同,元组中一个是字面量一个是变量,这个变量会捕捉主题元组中的值。同理,第四个模式case (x, y):会捕捉两个值,这在实践上与解包作业类似,就如同point(x, y) = point ...

July 12, 2022 · 2 min · jiezi

关于python:使用-contextvars-管理上下文变量

Python 在 3.7 的时候引入了一个模块:contextvars,从名字上很容易看出它指的是上下文变量(Context Variables),所以在介绍 contextvars 之前咱们须要先理解一下什么是上下文(Context)。 Context 是一个蕴含了相干信息内容的对象,举个例子:"比方一部 13 集的动漫,你间接点进第八集,看到女主角在男主角背后流泪了"。置信此时你是不晓得为什么女主角会流泪的,因为你没有看后面几集的内容,缺失了相干的上下文信息。 所以 Context 并不是什么神奇的货色,它的作用就是携带一些指定的信息。 web 框架中的 request咱们以 fastapi 和 sanic 为例,看看当一个申请过去的时候,它们是如何解析的。 # fastapifrom fastapi import FastAPI, Requestimport uvicornapp = FastAPI()@app.get("/index")async def index(request: Request):    name = request.query_params.get("name")    return {"name": name}uvicorn.run("__main__:app", host="127.0.0.1", port=5555)# -------------------------------------------------------# sanicfrom sanic import Sanicfrom sanic.request import Requestfrom sanic import responseapp = Sanic("sanic")@app.get("/index")async def index(request: Request):    name = request.args.get("name")    return response.json({"name": name})app.run(host="127.0.0.1", port=6666) 发申请测试一下,看看后果是否正确。 能够看到申请都是胜利的,并且对于 fastapi 和 sanic 而言,其 request 和 视图函数是绑定在一起的。也就是在申请到来的时候,会被封装成一个 Request 对象、而后传递到视图函数中。 但对于 flask 而言则不是这样子的,咱们看一下 flask 是如何接管申请参数的。 from flask import Flask, requestapp = Flask("flask")@app.route("/index")def index():    name = request.args.get("name")    return {"name": name}app.run(host="127.0.0.1", port=7777)咱们看到对于 flask 而言则是通过 import request 的形式,如果不需要的话就不必 import,当然我这里并不是在比拟哪种形式好,次要是为了引出咱们明天的主题。首先对于 flask 而言,如果我再定义一个视图函数的话,那么获取申请参数仍旧是雷同的形式,然而这样问题就来了,不同的视图函数外部应用同一个 request,难道不会发生冲突吗? 显然依据咱们应用 flask 的教训来说,答案是不会的,至于起因就是 ThreadLocal。 ThreadLocalThreadLocal,从名字上看能够得出它必定是和线程相干的。没错,它专门用来创立局部变量,并且创立的局部变量是和线程绑定的。 import threading# 创立一个 local 对象local = threading.local()def get():    name = threading.current_thread().name    # 获取绑定在 local 上的 value    value = local.value    print(f"线程: {name}, value: {value}")def set_():    name = threading.current_thread().name    # 为不同的线程设置不同的值    if name == "one":        local.value = "ONE"    elif name == "two":        local.value = "TWO"    # 执行 get 函数    get()t1 = threading.Thread(target=set_, name="one")t2 = threading.Thread(target=set_, name="two")t1.start()t2.start()"""线程 one, value: ONE线程 two, value: TWO"""能够看到两个线程之间是互不影响的,因为每个线程都有本人惟一的 id,在绑定值的时候会绑定在以后的线程中,获取也会从以后的线程中获取。能够把 ThreadLocal 设想成一个字典: {    "one": {"value": "ONE"},    "two": {"value": "TWO"}}更精确的说 key 应该是线程的 id,为了直观咱们就用线程的 name 代替了,但总之在获取的时候只会获取绑定在该线程上的变量的值。 而 flask 外部也是这么设计的,只不过它没有间接用 threading.local,而是本人实现了一个 Local 类,除了反对线程之外还反对 greenlet 的协程,那么它是怎么实现的呢?首先咱们晓得 flask 外部存在 "申请 context" 和 "利用 context",它们都是通过栈来保护的(两个不同的栈)。 ...

July 12, 2022 · 2 min · jiezi

关于python:如何优雅地对数据进行分组

假如咱们有这样一种数据: data = [    ("apple", 30), ("apple", 35),    ("apple", 32), ("pear", 60),    ("pear", 32), ("pear", 60),    ("banana", 102), ("banana", 104)]# 咱们心愿变成如下格局"""[('apple', [30, 35, 32]),  ('pear', [60, 32, 60]),  ('banana', [102, 104])]"""如果是你的话,你会怎么做呢?很容易想到的一种解决方案是结构一个字典: data = [    ("apple", 30), ("apple", 35),    ("apple", 32), ("pear", 60),    ("pear", 32), ("pear", 60),    ("banana", 102), ("banana", 104)]data_dict = {}for name, count in data:    if name not in data_dict:        data_dict[name] = []    data_dict[name].append(count)print(data_dict)"""{'apple': [30, 35, 32],  'pear': [60, 32, 60],  'banana': [102, 104]}"""print(list(data_dict.items()))"""[('apple', [30, 35, 32]),  ('pear', [60, 32, 60]),  ('banana', [102, 104])]"""这种计划齐全没有问题,不过咱们还能够写的更优雅一些,也就是应用字典的 setdefault 办法: data = [    ("apple", 30), ("apple", 35),    ("apple", 32), ("pear", 60),    ("pear", 32), ("pear", 60),    ("banana", 102), ("banana", 104)]data_dict = {}for name, count in data:    # setdefault(k, v) 含意如下    # 当 k 不存在时,将 k: v 设置在字典中,并返回 v    # 当 k 存在时,间接返回 k 对应值    data_dict.setdefault(name, []).append(count)print(list(data_dict.items()))"""[('apple', [30, 35, 32]),  ('pear', [60, 32, 60]),  ('banana', [102, 104])]"""setdefault 是一个十分不便的办法,然而应用频率却不怎么高,或者说该办法不太让人喜爱。次要是每次调用都要给一个初始值,比方代码中的空列表 []。另外这里的初始值能够任意,如果你心愿增加的时候还能实现去重成果,那么就将空列表换成空集合即可。 或者咱们还能够应用 defaultdict,它位于 collections 模块中。 from collections import defaultdictdata = [    ("apple", 30), ("apple", 35),    ("apple", 32), ("pear", 60),    ("pear", 32), ("pear", 60),    ("banana", 102), ("banana", 104)]# 外面接管一个 callable# 当拜访的 k 不存在时,返回 callable 调用之后的值data_dict1 = defaultdict(list)for name, count in data:    data_dict1[name].append(count)print(list(data_dict1.items()))"""[('apple', [30, 35, 32]),  ('pear', [60, 32, 60]),  ('banana', [102, 104])]"""# 也能够指定为 setdata_dict2 = defaultdict(set)for name, count in data:    data_dict2[name].add(count)print(list(data_dict2.items()))"""[('apple', {32, 35, 30}),  ('pear', {32, 60}),  ('banana', {104, 102})]"""总的来说,defaultdict 和字典的 setdefault 办法十分相似,咱们应用 setdefault 即可。 当然啦,对于分组,还有一种非凡状况,就是词频统计。假如咱们想统计可迭代对象中,每个元素呈现的次数该怎么做呢? data = ["apple", "apple", "apple",        "pear", "pear", "pear",        "banana", "banana"]data_dict = {}for item in data:    # 此处不能应用 setdefault,因为它是函数    # .setdefault(item, 0) += 1 是不合乎语法规定的    if item not in data_dict:        data_dict[item] = 0    data_dict[item] += 1print(data_dict)"""{'apple': 3, 'pear': 3, 'banana': 2}"""# 或者应用 defaultdictfrom collections import defaultdictdata_dict = defaultdict(int)for item in data:    data_dict[item] += 1print(data_dict)"""defaultdict(<class 'int'>,             {'apple': 3, 'pear': 3, 'banana': 2})"""然而说到词频统计,咱们还能够应用 collections 下的 Counter 类。 from collections import Counterdata = ["apple", "apple", "apple",        "pear", "pear", "pear",        "banana", "banana"]data_dict = Counter(data)# 间接搞定,Counter 曾经蕴含了咱们之前的逻辑print(data_dict)"""Counter({'apple': 3, 'pear': 3, 'banana': 2})"""# Counter 继承 dict,除了反对字典操作之外# 还提供了很多其它操作,其中一个就是 most_common# 用于抉择呈现频率最高的几个元素print(data_dict.most_common(2))"""[('apple', 3), ('pear', 3)]"""还是很简略的。 以上就是本次分享的所有内容,如果你感觉文章还不错,欢送关注公众号:Python编程学习圈,每日干货分享,发送“J”还可支付大量学习材料,内容笼罩Python电子书、教程、数据库编程、Django,爬虫,云计算等等。或是返回编程学习网,理解更多编程技术常识。

July 12, 2022 · 1 min · jiezi

关于python:写-Python-脚本一定要加上这个

应用 Python 的人,平时常常会写一些脚本,不论是为了晋升工作效率,还是为了满足一些特定的需要,Python 脚本都是一个常见又有用的货色。 然而,我最近发现了一个以前未曾觉察的问题,就是脚本外面是否增加 if __name__ == "__main__": 这个语句,对脚本的应用其实是有很大影响的,并且这外面还有很大的学识。 常见误区很多敌人在写脚本时比拟随便,简略的脚本间接一溜写下来,没有函数,程序执行。简单点的脚本,可能会加函数。这种写法可读性比拟差,常常让人一眼找不到程序运行的入口和程序。 而 Python 社区比拟举荐的写法是在写脚本时,加上上面这个语句: def main():    # do something    print("do something.")if __name__ == "__main__":    main()大多数人看到这里,会不会说,这有什么,加不加这个没那么重要吧! 先不要忙着不屑,让咱们一起来认真掰扯掰扯! 有什么用在具体阐明 if __name__ == '__main__' 的作用前,先从一个简略的实例直观上感受一下。 # const.py PI = 3.14 def train():    print("PI:", PI) train()# area.py from const import PI def calc_round_area(radius):    return PI * (radius ** 2) def calculate():    print("round area: ", calc_round_area(2)) calculate()咱们看下 area.py 的运行后果: PI: 3.14round area:  12.56的 PI 变量,在运行的时候,const.py 中函数 train() 中的打印也带过去了,而咱们只是援用变量,并没有援用函数,所以这是咱们不违心看到的。 解决这个问题的办法也很简略,咱们只需在 const.py 中加上一句: PI = 3.14def train():   print("PI:", PI)if __name__ == "__main__":   train()再次运行 area.py ,输入后果如下: round area:  12.56这是咱们预期的后果。 程序运行入口丛上述实例能够发现,如果没有 if __name__=="__main__": ,作为 area.py 导入文件时 const.py 中的所有代码都被执行了,而加上之后就只运行导入的局部代码。 这就是 if __name__=="__main__": 不言而喻的作用,实际上 if __name__=="__main__": 就相当于是 Python 模仿的程序入口。因为模块之间互相援用,不同模块可能都有这样的定义,而入口程序只能有一个,选中哪个入口程序取决于 __name__ 的值。 咱们再来看一个小程序: # test.pyprint("look here")print(__name__) if __name__ == '__main__':    print("I'm test.py")程序的运行后果如下: look here__main__I'm test.py能够发现,此时变量 __name__ 的值为 __main__,所以打印 “I'm test.py”。如果运行其余文件,通过运行的文件调用本文件,则不会打印该语句,因为程序入口不对,该语句不执行。 代码标准有了 if __name__=="__main__": 相当于 Python 程序也有了一个入口函数,咱们能够清晰的晓得程序的逻辑开始于何处,当然还须要咱们盲目的把程序的开始逻辑都放在这里。其实,这也是 PyCharm 举荐的作法。 为什么很多优良的编程语言,比方 C、Java、Golang、C++ 都有一个 main 入口函数呢?我想很重要的一个起因就是就是程序入口对立,容易浏览。 多过程场景大作用如果你用多过程来做并行计算,相似这样的代码: import multiprocessing as mpdef useful_function(x):    return x * xprint("processing in parallel")with mp.Pool() as p:    results = p.map(useful_function, [1, 2, 3, 4])    print(results)运行这段代码,控制台会始终打印: processing in parallelprocessing in parallelprocessing in parallelprocessing in parallelprocessing in parallelprocessing in parallelprocessing in parallelprocessing in parallelprocessing in parallel并且程序会不停的报错 RuntimeError。 如果你加上了 if __name__=="__main__": ,程序就会依照预期的进行: import multiprocessing as mpdef useful_function(x):    return x * xif __name__ == '__main__':    print("processing in parallel")    with mp.Pool() as p:        results = p.map(useful_function, [1, 2, 3, 4])        print(results)Python 的多程序就是启动了多个 Python 解器器,每个 Python 解释器都会导入你这个脚本,复制一份全局变量和函数给子过程用,如果有了 if __name__=="__main__":,那它前面的代码就不会被 import,也就不会被反复执行。否则,这个创立多过程的代码就会被 import,就会被执行,从而有限递归的去创立子过程 ...

July 12, 2022 · 1 min · jiezi

关于python:Python-不写硬盘上传文件

你写了一个 api,承受 client 上传的文件,而后在上传到 oss,你会怎么做?先写硬盘,而后在上传到 oss?太笨了! 你写了一个截图服务,截到的图要上传到 oss,你会怎么做?先写硬盘,在上传到 oss?太笨了! 这篇文章教你重新做人! 文本类型应用 io.StringIO import iofrom loguru import loggerfile_like_obj = io.StringIO("hahaha")logger.debug(file_like_obj)logger.debug(type(file_like_obj))logger.debug(getattr(file_like_obj,'read'))logger.debug(file_like_obj.read())输入后果如下: 2022-07-11 21:23:51.206 | DEBUG | __main__:<module>:8 - <_io.StringIO object at 0x100323eb0>2022-07-11 21:23:51.206 | DEBUG | __main__:<module>:9 - <class '_io.StringIO'>2022-07-11 21:23:51.206 | DEBUG | __main__:<module>:10 - <built-in method read of _io.StringIO object at 0x100323eb0>2022-07-11 21:23:51.206 | DEBUG | __main__:<module>:11 - hahaha再看一个相熟的: import iofrom loguru import loggerfile_like_obj = io.StringIO("hahaha")with file_like_obj as f: logger.debug(f.read())输入后果如下: ...

July 11, 2022 · 1 min · jiezi

关于python:python是什么语言

一、python语言介绍 Python是一种面向对象、解释型、动静类型计算机程序设计语言 。是一种面向对象的动静类型语言。python是C语言编写的,它有很多包也是用C语言写的。所以说,C语言还是很弱小的,千万不要因为它入门简略就小瞧他哦!与此同时,也不要因为Python是C语言编写的就感觉它很难,其实它也是很容易了解的! 二、深刻理解 解释型:程序无需编译成二进制代码,而是在执行时对语句一条一条编译 ,动静类型:在程序执行过程中,能够扭转变量的类型 ,它常被昵称为胶水语言,可能把用其余语言制作的各种模块(尤其是C/C++)很轻松地联结在一起。

July 11, 2022 · 1 min · jiezi

关于python:python界面是什么样的

1.装置完Python,在命令行输出“python”之后,如果胜利,会失去相似于上面的窗口: 能够看到,结尾有3个>符号(>>>)。 2.>>>被叫做Python命令提示符(prompt),此时Python在期待你输出代码。 你当初能够输出一行Python代码,Python就会执行该代码。这种模式叫做Python交互模式(interactive mode),因为Python在期待你输出代码,而后执行。 例如,能够输出一个表达式,让Python进行计算。例如,要计算1+1,能够在命令提示符前面输出1+1,而后按enter: >>> 1 + 1 3.按下enter之后,Python就会输入计算结果,这里是2。 4.要退出Python交互模式,能够在Python命令提示符后,输出exit(): >>> exit() 5.也能够输出quit(): >>> quit() 6.还能够输出一个EOF(文件尾,end of file)字符,Windows上是ctrl+Z,Linux是ctrl+D。 当前的代码,如果呈现以>>>结尾的行,就代表这行代码是在Python交互模式下输出的。 在Python交互模式下输出代码和运行.py文件是有区别的。在Python命令行,Python会期待你一行一行地输出代码;但运行.py文件时你没有这个机会,而且个别运行完一个.py文件就会立刻退出(这样你就不能看到程序输入了什么)。

July 11, 2022 · 1 min · jiezi

关于python:python-shell是什么

1.Shell解释 Shell 是一个用 C 语言编写的程序,它是用户应用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。 Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面拜访操作系统内核的服务。 Ken Thompson 的 sh 是第一种 Unix Shell,Windows Explorer 是一个典型的图形界面 Shell。 2.Shell 脚本 Shell 脚本(shell script),是一种为 shell 编写的脚本程序。 业界所说的 shell 通常都是指 shell 脚本,但读者敌人要晓得,shell 和 shell script 是两个不同的概念。 因为习惯的起因,简洁起见,本文呈现的 "shell编程" 都是指 shell 脚本编程,不是指开发 shell 本身。 相干举荐:Python根底视频教程(前端根底) 3.Shell 环境 Shell 编程跟 JavaScript、php 编程一样,只有有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就能够了。 Linux 的 Shell 品种泛滥,常见的有: Bourne Shell(/usr/bin/sh或/bin/sh)Bourne Again Shell(/bin/bash)C Shell(/usr/bin/csh)K Shell(/usr/bin/ksh)Shell for Root(/sbin/sh)……本教程关注的是 Bash,也就是 Bourne Again Shell,因为易用和收费,Bash 在日常工作中被宽泛应用。同时,Bash 也是大多数Linux 零碎默认的 Shell。 ...

July 11, 2022 · 1 min · jiezi

关于python:python中pip是什么

1、pip介绍 pip 是一个古代的、通用的装置和治理 Python 包的工具,这意味着它是一个工具,容许你装置和治理不属于规范库的其余库和依赖。 英文python install packages 。 pip是easy_install的替代品。 2、pip装置 apt-get install python-pip 3、降级 pip install -U pip 4、安装包列表 pip list 5、显示安装包信息 pip show 6、显示版本和门路 pip --version

July 11, 2022 · 1 min · jiezi

关于python:python中num是什么意思

其实num就是函数numpy的缩写。 Numpy提供的次要性能具体如下: lndarray——一个具备向量算术运算和简单播送能力的多维数组对象。 l用于对数组数据进行疾速运算的规范数学函数。 l用于读写磁盘数据的工具以及用于操作内存映射文件的工具。 l十分有用的线性代数,傅里叶变换和随机数操作。 l用于集成C /C++和Fortran代码的工具。 除了显著的科学计算用处之外,Numpy还能够用作通用数据的高效多维容器,定义任意的数据类型。 性能实现 1、创立数组 2、创立numpy数组 咱们能够通过创立Python列表(list)的形式来创立Numpy矩阵,比方输出 nparray = np.array([i for i in range(10)])能够看到返回的后果是 array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

July 11, 2022 · 1 min · jiezi

关于python:python中index是什么意思

Python index()办法检测字符串中是否蕴含子字符串str ,如果指定beg(开始)和end(完结)范畴,则查看是否蕴含在指定范畴内,该办法与python find()办法一样,只不过如果str不在string中会报一个异样。 语法 index()办法语法: str.index(str, beg=0, end=len(string)) 参数 ·str -- 指定检索的字符串。 ·beg -- 开始索引,默认为0。 ·end -- 完结索引,默认为字符串的长度。 返回值 如果蕴含子字符串返回开始的索引值,否则抛出异样。 实例 以下实例展现了index()办法的实例: #!/usr/bin/python str1 = "this is string example....wow!!!";str2 = "exam"; print str1.index(str2);print str1.index(str2, 10);print str1.index(str2, 40);以上实例输入后果如下: 1515Traceback (most recent call last): File "test.py", line 8, in print str1.index(str2, 40);ValueError: substring not foundshell returned 1泛滥python培训视频,尽在开源中国学习网,欢送在线学习!

July 11, 2022 · 1 min · jiezi

关于python:python中in是什么意思

in在python中是成员运算符,如果在指定的序列中找到值返回 True,否则返回 False。 对序列(字符串、元组、列表)、汇合(set)和映射(字典)等数据类型进行成员判断,天然成员判断的回归在其中和其中,Python的说法是True、False,也就是说xxinxxxxx、whilexxinxxx等典型的判断(不仅如此,还有更多)。 例如 x 在 y 序列中 , 如果 x 在 y 序列中返回 True。 与in相同的是not in,如果在指定的序列中没有找到值返回 True,否则返回 False。 x 不在 y 序列中 , 如果 x 不在 y 序列中返回 True。

July 11, 2022 · 1 min · jiezi

关于python:python-库-是什么

1、概念 即具备弱小的规范库、第三方库以及自定义模块。库的概念是具备相干功能模块的汇合。这也是Python的一大特色之一。 2、库的分类 在Python语言的库中,分为Python规范库和Python的第三方库。python的规范库是随着pyhon装置的时候默认自带的库,python的第三方库,须要下载后装置到python的装置目录下,不同的第三方库装置及应用办法不同。它们调用形式是一样的,都须要用import语句调用。 (1)罕用的规范库 Python 程序员必须依附它们来实现零碎级性能,例如文件 I/O,此外还有大量以 Python 编写的模块,提供了日常编程中许多问题的规范解决方案。 (2)罕用的第三方库 Scapy.用Python写的数据包探测和剖析库 pywin32.一个提供和windows交互的办法和类的Python库 BeautifulSoup.我晓得它很慢,但这个xml和html的解析库对于老手十分有用

July 11, 2022 · 1 min · jiezi

关于python:python-json是什么

1.Json模块简略介绍: 实质上认为就是一个有法则的字符串 2.性能应用: 能够进行替换格局、解析字符串以及转换对象与字符串 模块装置: Pip install Json 模块应用: Import jsonLst = [‘a’,’c’’b’,]Dct =[‘a;:1,’c’:3, ‘b’:2] S1=json.dumps(lst)Print(s1)S2 = json.dumps(dct)Print(s2)以上就是对于json模块的根本应用了,常见的表现形式在上述都有具体介绍,心愿大家能够好好把握理解下哦~

July 11, 2022 · 1 min · jiezi

关于python:python-def是什么

Python应用def开始函数定义,紧接着是函数名,括号外部为函数的参数,外部为函数的 具体性能实现代码,如果想要函数有返回值, 在expressions中的逻辑代码中用return返回。 1.如果想要函数有返回值, 在expressions中的逻辑代码中用return返回。 根本应用 def function_name(parameters): expressions2.实例 1 def function():2 print('This is a function')3 a = 1+24 print(a)下面咱们定义了一个名字为 function 的函数,函数没有不承受参数,所以括号外部为空,紧接着就是 函数的性能码。 如果执行该脚本,发现并没有输入任何输入,因为咱们只定义了函数,而并没有执行函数。 这时咱们在 Python 命令提示符中输出函数调用 function(), 留神这里调用函数的括号不能省略。那么 函数外部的性能代码将会执行,输入后果: 1 This is a function2 3更多收费学习内容,请点击能够中国根底学习。

July 11, 2022 · 1 min · jiezi

关于python:python类-是什么

1.python类 简略来说,类是一种高级形象,就是一种高级的数据类型,是对象的蓝图,就是用来定义你要用的对象的属性和行为的。 (举荐教程:面向对象中类Class) 2.面向对象简介 类(Class): 用来形容具备雷同的属性和办法的对象的汇合。它定义了该汇合中每个对象所共有的属性和办法。对象是类的实例。 类变量:类变量在整个实例化的对象中是专用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量应用。 数据成员:类变量或者实例变量, 用于解决类及其实例对象的相干的数据。 办法重写:如果从父类继承的办法不能满足子类的需要,能够对其进行改写,这个过程叫办法的笼罩(override),也称为办法的重写。 局部变量:定义在办法中的变量,只作用于以后实例的类。 实例变量:在类的申明中,属性是用变量来示意的。这种变量就称为实例变量,是在类申明的外部然而在类的其余成员办法之外申明的。 继承:即一个派生类(derived class)继承基类(base class)的字段和办法。继承也容许把一个派生类的对象作为一个基类对象看待。例如,有这样一个设计:一个Dog类型的对象派生自Animal类,这是模仿"是一个(is-a)"关系(例图,Dog是一个Animal)。 实例化:创立一个类的实例,类的具体对象。 办法:类中定义的函数。 对象:通过类定义的数据结构实例。对象包含两个数据成员(类变量和实例变量)和办法。 应用类:能够实现代码的复用,进步开发效率,节省时间。

July 11, 2022 · 1 min · jiezi

关于python:python-框架是什么

python框架是对根底代码进行封装和提供相应的利用编程接口,开发人员在应用框架时间接调用封装的利用编程接口能够,进步生产效率和开发速度。 python支流框架 Django,它是一个高级的python web框架,以疾速开发和应用简洁的设计闻名; CherryPy,它是历史最久的框架之一,运行十分稳固且疾速; Web2Py,它是一个开源、收费的web框架。 1、Django Django是一个高级的Python Web框架,以疾速开发和实用简洁的设计闻名。它由经验丰富的开发人员构建,解决了Web开发的麻烦,因而用户能够专一于编写应用程序,而不须要放心返工。并且它是开源和收费的。 特点: 安全系数高,能帮忙开发者躲避常见谬误。 速度特地快,因为它的设计目标是使应用程序十分快地从概念阶段过渡到最终阶段。 扩展性好。 从21世纪初Django成为开源框架到当初,它始终是归档形式。 2、CherryPy CherryPy是历史最久的框架之一,运行十分稳固且疾速。该框架容许开发人员构建web应用程序,和以Python为对象的利用程序开发过程相似,因此可在更短的工夫内开发更小的源代码。 从一开始,CherryPy就被证实是高效疾速的,并被许多站点用于生产,无论是最简略的站点,还是有高要求的站点。 特点: 能够在2.7+、3.5+、Jython、Android和PyPy上运行。 内置笼罩、剖析和测试反对。 容易疾速运行多个HTTP服务器(例如,在多个端口上)。 是为部署人员和开发人员提供的最弱小的配置零碎之一。 灵便的插件零碎。 3、Web2Py Web2Py是一个开源、收费的web框架,用于麻利开发,其中包含数据库驱动的web应用程序。它是用Python编写的,并可用于python编程。它是个全堆栈框架,由开发人员构建功能齐全的web应用程序所需的所有必要组件组成。 特点: 可能简化简单大型利用的开发 反对MVC体系结构 合乎Ni配置和装置要求 提供本地化和国际化反对

July 11, 2022 · 1 min · jiezi

关于python:python中temp是什么

一、temp:长期文件夹。 依据操作的过程进行长期保留的文件技术。python中临时文件及文件夹应用。应用的是tempfile包 装置 pip install tempfile 二、temp :一个变量 for 循环前面的temp是一个变量,这个变量循环一次,顺次是前面列表中的元素,具体来说,temp的值是循环。 第一次是student_infos[0],第二次是 student_infos[1],......最初一次是 student_infos[-1].以上就是python中对于temp的简略介绍,心愿能对你有所帮哦~

July 11, 2022 · 1 min · jiezi

关于python:python-int是什么意思

1.python中的int python中的int()函数用于将一个字符串或数字转换为整型。 2.语法 以下是 int() 办法的语法: class int(x, base=10) 3.参数 x -- 字符串或数字。 base -- 进制数,默认十进制。 4.返回值 返回整型数据。 5.实例 以下展现了应用 int() 办法的实例: >>>int() # 不传入参数时,失去后果00>>> int(3)3>>> int(3.6)3>>> int('12',16) # 如果是带参数base的话,12要以字符串的模式进行输出,12 为 16进制18>>> int('0xa',16) 10 >>> int('10',8) 8更多Python常识请关注开源中国教程栏目。

July 11, 2022 · 1 min · jiezi

关于python:python中format是什么

一、什么是format函数? 是一种字符串格式化的办法,次要是用来结构字符串。 根本语法:通过 {} 和 : 来代替以前的 % 。在 {} 符号操作过程中,每一个 {} 都能够设置程序,别离与format的参数程序对应,如果没有设置{}下标,默认重0开始递增。 二、应用办法? 示例: str = "{}{}{}{}".format(5,6,7,8) # {} 下标没有设置,默认为 0 ,1,2,3str1 = "{0}{1}{2}{3}".format(5,6,7,8)str2 = "{0}{0}{2}{3}".format(5,6,7,8) # {} 依据下标索引取值str3 = "{3}{0}{2}{1}".format(5,6,7,8)print(str)print(str1)print(str2)print(str3)输入后果: 5678567855788576这么一看,format函数还是很简略的吧。好了,明天的format 函数就介绍到这里,更多乏味不便的应用形式大家也能够去尝试一下。

July 11, 2022 · 1 min · jiezi

关于python:python-pos是什么

在接口测试中,接口通常是GET申请或者POST申请。以下是对接口测试中常见的四种Post申请数据形式进行一个具体的解说: 一、post申请主体详解 一个失常的post申请次要包含申请行,申请头,申请主体。 对于get申请来说没有申请主体entity-body。对于post申请而言,不会对发送申请的数据格式进行限度,实践上你能够发任意数据,然而服务器能不能解决就是另一回事了。服务器收到数据后,如何解析数据呢?它会以申请头中的Content-Type设置的内容来进行数据解析。确定好Content-Type的格局之后,申请主体的数据格式也就确定下来了。 二、Content-Type的格局有四种: application/x-www-form-urlencoded(这也是默认格局) application/json text/xml multipart/form-data 这些不同的post申请数据格式要通过HttpEntity来结构,有必要简略理一下HttpClient的HttpEntity对象,因为所有的post申请数据均须要置于HttpEntity实体中进行发送。HttpEntity是一个接口,实现这个接口的具体类有很多,比拟罕用的是StringEntity、UrlEncodedFormEntity(继承自StringEntity)、MultipartEntity。他们将在发送不同格局的post申请时被用到。接下来就具体地介绍每一种数据格式对应的fiddler申请模仿和Requests申请模仿(Python实现)的实现状况。 三、application/x-www-form-urlencoded数据格式 在W3C官网上明确对这种数据格式进行了定义: This is the default content type. Forms submitted with this content type must be encoded as follows:Control names and values are escaped. Space characters are replaced by '+', and then reserved characters are escaped as described in [RFC1738], section 2.2: Non-alphanumeric characters are replaced by '%HH', a percent sign and two hexadecimal digits representing the ASCII code of the character. Line breaks are represented as "CR LF" pairs (i.e., '%0D%0A').The controlnames/values are listed in the order they appear in the document. The name is separated from the value by '=' and name/value pairs are separated from each other by '&'.这是post申请最常见也是默认的数据提交格局。它要求数据名称(name)和数据值(value)之间以等号相连,与另一组name/value值之间用&相连。例如:parameter1=12345&parameter2=23456。将申请的内容进行格式化了,其实这个办法同时简化的客户端发送,也简化了服务器端获取,服务器通过getParameters(String name)即可获取到传送来的信息。这是最常见post提交数据的形式,以form表单模式提交数据。 ...

July 11, 2022 · 1 min · jiezi

关于python:用python如何做自动化运维

一、自动化运维关怀问题: 自动化 易实现 跨平台 轻量级 二、python做自动化运维施行内容: 应用代码如下: def initSshClinet(): ''' 初始化,SSH连贯账号密码登录服务器 :return: sshClinet ''' ip = ""#服务器ip地址 sshClinet = paramiko.SSHClient() sshClinet.set_missing_host_key_policy(paramiko.AutoAddPolicy()) sshClinet.connect(ip, 22, userName, pw, timeout=360)三、适宜自动化运维编程语言特点: 丰盛的第三方库 学习成本低 跨平台 轻量级

July 11, 2022 · 1 min · jiezi

关于python:人工智能为什么用python

1、阐明 Python是一种最适宜人工智能的编程语言。因为应用简略,成为了人工智能畛域利用最宽泛的编程语言之一,它能够与数据结构和其余罕用的AI算法无缝联合。 机器学习属于人工智能的一个分支,是指让机器能具备解脱对人工指令的依赖,能依照肯定的算法发展自主学习的能力。而Python的语法清晰、易于操作纯文本文件、存在大量的开发文档、还有可执行伪代码,十分易于解决非数值型数据,也因而成为了机器学习的次要编程语言。 2、python与人工智能的关系 Python在根本层面上是最适宜人工智能倒退的编程语言。 Python语言非常简单,易于应用,是人工智能畛域利用最宽泛的编程语言之一,它能够与数据结构和罕用AI算法无缝地无效联合。 Python是一个现代化的抉择,因为它提到了人工智能。Python能够使原型设计变得更不便,同时稳定性更高,而且在下一个十年,Python将会是一个大数据和人工智能的时代,Python劣势就是对接数据处理,这使得Python在将来十分火。 以上就是人工智能python的无关介绍,心愿对想要理解python的人有所帮忙。

July 11, 2022 · 1 min · jiezi

关于python:python-fire是什么

1、阐明 就是以狭义对象的形式玩命令行,能够是类、函数、字典、列表等,更灵便简略。 2、个性 CLI能够以简略的形式生成。 是开发调试Python代码的实用工具。 能够将现存代码或其余代码转换成CLI。 使Bash和Python之间的转换更加容易。 通过预设REPL所需的模块和变量,实用REPL更容易。 3、装置 pip install fire 以上就是python fire的介绍,心愿对大家有所帮忙。

July 11, 2022 · 1 min · jiezi

关于python:python正则表达式查找和替换内容

1、编写Python正则表达式字符串s。 2、应用re.compile将正则表达式编译成正则对象Patternp。 3、正则对象p调用p.search或p.findall或p.finditer查找内容。 4、正则对象p调用p.sub或p.subn替换内容。 实例 import re s = "正则表达式"p = re.compile(s) # 查找mf1 = p.search("检测内容")mf2 = p.findall("检测内容")mf3 = p.finditer("检测内容") # 替换ms = p.sub("检测内容")ms2 = p.subn("检测内容") # 宰割mp = p.split("检测内容")以上就是python正则表达式查找和替换内容,心愿对大家有所帮忙。

July 11, 2022 · 1 min · jiezi

关于python:python中ifelifelse语句的使用注意

1、判断多个条件的语句,if为真则执行if前面的语句。 2、如果elif是真的,则执行elif,前面的代码块不执行。 3、如果if和elif不称心,执行else语句。 实例 if expression: statements...elif expression: statements... # 能够有1条或多条elif语句else: statement...以上就是python中if-elif-else语句的应用留神,心愿对大家有所帮忙。

July 11, 2022 · 1 min · jiezi

关于python:python中删除文档的方法

1、delete_one()办法删除文档。delete_one()须要一个查问对象参数。它只删除了第一次呈现。 2、在删除大量文档时,应用delete_many办法,须要查问对象。 如果咱们向delete_many({})传e_many({}),它将删除汇合中的所有文档。 实例 # 让咱们从 Flask 导入Flask import Flask , render_templateimport os # 导入操作系统模块import pymongo MONGODB_URI = 'mongodb+srv://asabeneh:your_password_goes_here@30daysofpython-twxkr.mongodb.net/test?retryWrites=true&w=majority'client = pymongo.MongoClient(MONGODB_URI)db = client['thirty_days_of_python'] # accessing the database query = {'name':'John'}db.students.delete_one(query) for student in db.students.find(): print(student)# lets check the result if the age is modifiedfor student in db.students.find(): print(student) app = Flask(__name__)if __name__ == '__main__': # for deployment we use the environ # to make it work for both production and development port = int(os.environ.get("PORT", 5000)) app.run(debug=True, host='0.0.0.0', port=port)以上就是python中删除文档的办法,心愿对大家有所帮忙。 ...

July 11, 2022 · 1 min · jiezi

关于python:python函数定义的规则

1、函数代码块从def关键字开始,而后连贯函数标识符名称和圆括号()。 2、任何传入参数和自变量都必须放在圆括号两头,圆括号能够用来定义参数。 3、函数的第一行语句能够选择性地应用文档字符串来存储函数阐明。 函数内容冒号:开始,缩进。 return[表达式]完结函数,选择性地将值返回给调用方。 实例 def max(a,b): if a>b: return a else: return bgetMax=max(3,4) print ( getMax )以上就是python函数定义的规定,心愿对大家有所帮忙。

July 11, 2022 · 1 min · jiezi

关于python:python匿名函数的命名规则

1、lambda函数体比def简略得多。 2、lambda的主体是在lambda表达式中包装无限逻辑的表达式。 3、lambda函数有本人的命名空间,不能拜访本人参数列表以外或寰球命名空间中的参数。 实例 #匿名函数sum =lambda x,y:x+ysub =lambda x,y:x-ymul =lambda x,y:x*ydiv =lambda x,y:x/ymod =lambda x,y:x%yprint("输出两个数之和",sum(10,20))print("输出两个数之差",sub(10,20))print("输出两个数之积",mul(10,20))print("输出两个数之商",div(10,20))以上就是python匿名函数的命名规定,心愿对大家有所帮忙。

July 11, 2022 · 1 min · jiezi

关于python:python中rindex函数是什么

1、rindex函数次要用于在给定的字符串中找到子字符串是否存在。如果找到,返回子串的第一个索引地位,否则会间接抛出异样。 2、rindex开始从字符串的右侧搜寻,但返回的索引依然从左侧计算。 实例 mystr = 'hello world and hello python' #1.在整个字符串中查找print(mystr.rindex('python')) #输入后果22 #2.在字符串的指定地位内查找print(mystr.rindex('python',0,20)) #返回后果报异样:ValueError:substring not found以上就是python中rindex函数的介绍,心愿对大家有所帮忙。

July 11, 2022 · 1 min · jiezi

关于python:python中TKinter组件的使用

1、创立总面板。 2、在面板上创立各种组件,指定组件的父组件,即从属关系。利用相应的属性设置组件,安顿组件布局。 3、同步2相似,创立多个组件,最初启动总面板的音讯循环。 实例 # Label案例 import tkinter base = tkinter.Tk()# 负责题目base.wm_title("Label Test") lb = tkinter.Label(base, text="Python Label")# 给相应组件指定布局lb.pack() base.mainloop()以上就是python中TKinter组件的应用,心愿对大家有所帮忙。

July 11, 2022 · 1 min · jiezi

关于python:python-TKinter的消息传递机制

1、主动发送事件/音讯。 2、零碎负责将音讯发送到队列。 3、绑定/设置相干组件。 4、后端主动抉择感兴趣的事件并做出相应的反馈。 5、音讯格局<[modifier-]---type-[-detail]>。 实例 # 事件的简略例子import tkinter def baseLabel(event): global baseFrame print("被点击") lb = tkinter.Label(baseFrame, text="谢谢点击") lb.pack() # 画出程序的总框架baseFrame = tkinter.Tk() lb = tkinter.Label(baseFrame, text="模仿按钮")# Label绑定相应的音讯和处理函数# 主动获取左键点击,并启动相应的处理函数baseLabellb.bind("<Button-1>", baseLabel)lb.pack() # 启动音讯循环# 至此,示意程序开始执行baseFrame.mainloop()以上就是python TKinter的消息传递机制,心愿对大家有所帮忙。

July 11, 2022 · 1 min · jiezi

关于python:python中TKinter的绑定方法

1、bind_all全局绑定,默认是全局快捷键,比方F1是帮忙文档。 2、bind_class承受三个参数,第一个是类名,第二个是事件,第三个是操作。 3、bind独自绑定某个实例。 4、unbind解绑须要一个参数,即想解绑哪个事件。 实例 from Tkinter import * root = Tk()def callback(event): print "clicked at", event.x, event.yframe = Frame(root, width=100, height=100)frame.bind("<Button-1>", callback)frame.pack() root.mainloop()以上就是python中TKinter的绑定办法,心愿对大家有所帮忙。

July 11, 2022 · 1 min · jiezi