关于python:神器轻松可视化Python程序调用流程

明天咱们来分享一个 Python 畛域的神级第三方库 -- pycallgraph,通过该库并联合 graphviz 工具,就能够十分不便的实现 Python 应用程序调用流程的可视化工作 咱们先来看下效果图 怎么样,很是惊艳吧~ 上面咱们就来一起实现这个可视化过程 装置 graphviz 工具生成图片的过程,是依赖工具 graphviz 的,咱们先进行下载安装 下载地址 http://www.graphviz.org/downl...实战接下来咱们还须要装置两个 Python 依赖库 pip install pycallgraph上面咱们先写一个根底的代码 from pycallgraph import PyCallGraphfrom pycallgraph.output import GraphvizOutputclass Banana:    def eat(self):        passclass Person:    def __init__(self):        self.no_bananas()    def no_bananas(self):        self.bananas = []    def add_banana(self, banana):        self.bananas.append(banana)    def eat_bananas(self):        [banana.eat() for banana in self.bananas]        self.no_bananas()def main():    graphviz = GraphvizOutput()    graphviz.output_file = 'basic.png'    with PyCallGraph(output=graphviz):        person = Person()        for a in range(10):            person.add_banana(Banana())        person.eat_bananas()if __name__ == '__main__':    main()代码比较简单,定义了两个简略类,次要 pycallgraph 的外围代码在 main 函数中,在 with 代码块下,把咱们定义的代码执行一遍即可 运行下面的代码,会在当前目录下生成 basic.png 图片文件 从生成的图片能够十分清晰的看出整个代码的运行过程,从 main 代码块到各个类的初始化,能够说高深莫测 咱们再来一个简单一点的例子 import refrom pycallgraph import PyCallGraphfrom pycallgraph import Configfrom pycallgraph.output import GraphvizOutputdef main():    graphviz = GraphvizOutput()    graphviz.output_file = 'regexp.png'    config = Config(include_stdlib=True)    with PyCallGraph(output=graphviz, config=config):        reo = compile()        match(reo)def compile():    return re.compile('^[abetors]*$')def match(reo):    [reo.match(a) for a in words()]def words():    return [        'abbreviation',        'abbreviations',        'abettor',        'abettors',        'abilities',        'ability',        'abrasion',        'abrasions',        'abrasive',        'abrasives',    ]if __name__ == '__main__':    main()代码同样不负责,不过在编译器外部是调用了 re 正则的,咱们来看看最终生成的图片 能够看到整个代码过程简单了很多,因为外部调用了很多正则外部函数等,然而整体还是十分清晰的 能够说这个神级第三方库,相对是泛滥 Python 爱好者,尤其是刚刚入门 Python 畛域的敌人的福音,当咱们遇到某些不相熟的较为简单的代码块时,无妨应用该库来尝试一下可视化,看看能不能从中暴发灵感呢~ 以上就是本次分享的所有内容,如果你感觉文章还不错,欢送关注公众号:Python编程学习圈,每日干货分享,发送“J”还可支付大量学习材料。或是返回编程学习网,理解更多编程技术常识。

June 29, 2022 · 1 min · jiezi

关于python:python刷题模板-子序列自动机

@TOC 一、 算法&数据结构1. 形容子序列自动机能够用来解决子序列判断问题:问模式串p是否是原串s的子序列。当须要对同一个串进行屡次不同模式串匹配时,能够事后对s进行自动机的结构。用一次结构开销,节俭询问开销。这类问题奢侈的做法显然是双指针: 让i在原串s上,j在模式串p上。字符相等,模式串能力后移,不同的话,i要始终后移,直到相等。这个做法复杂度是 O(n+m),n,m别离是两个串的长度。咱们发现:i后移时,肯定会挪动到后边第一个(最近的),与p[j]雷同的字符上。那咱们能够预处理进去原串上每个字符后边的所有字符最近呈现的地位。这就是子序列自动机的做法。用dp的形式预处理,逆序遍历s串,dpi贮存每个字符后边每个字母最近呈现的地位。这样能够间接转移,省去大量无用扫描。2. 复杂度剖析1) 奢侈做法, O(n+m) 2) 自动机: 自动机结构复杂度 O(mc)*,c=26即为字典长度,m是原串长度。每次匹配复杂度为 O(n)。3. 常见利用1) 判断子序列问题,当屡次对同一个原串进行询问时,事后结构原串的自动机。 4. 罕用优化1) 对python来说,从dp[i+1]转移到dp[i]时,能够间接切片复制,比一个一个赋值快十分多。 二、 模板代码1. 奢侈询问判断子序列例题: 392. 判断子序列 间接询问。 class SubSequenceAuto: def __init__(self,s,abc='abcdefghijklmnopqrstuvwxyz'): self.s,self.abc = s,abc self.n,abc_len = len(s),len(abc) self.abc_index = {v:k for k,v in enumerate(abc)} self.dp = [[self.n]*abc_len for _ in range(self.n+1)] dp = self.dp # dp.append([self.n]*abc_len) for i in range(self.n-1,-1,-1): dp[i] = dp[i+1][:] dp[i][self.abc_index[s[i]]] = i # for j in range(abc_len): # dp[i][j] = i if s[i]==abc[j] else dp[i+1][j] def query_is_sub_seq(self,t): dp = self.dp abc_index = self.abc_index n = self.n r = 0 for c in t: r = dp[r][abc_index[c]] if r == n: return False r += 1 return Trueclass Solution: def isSubsequence(self, s: str, t: str) -> bool: ssa = SubSequenceAuto(t) return ssa.query_is_sub_seq(s)2. 屡次询问,应用自动机链接: 522. 最长非凡序列 II ...

June 28, 2022 · 2 min · jiezi

关于python:python协程asyncio的个人理解

目录协程与工作根本语法协程的申明和运行可期待对象运行asyncio程序创立工作休眠机制解析运行的流程图示协程与工作python语境中,协程 coroutine 的概念有两个:协程函数、协程对象,协程对象由协程函数创立失去(相似于类实例化失去一个对象). 了解协程,最重要的是理解事件循环和工作执行的机制,上面是三个准则: 事件循环中,一直循环执行各个工作,若一个工作遇到await或者执行实现,则返回控制权给事件循环,这时候事件循环再去执行下一个工作事件循环同一时刻只会运行一个工作协程不会被退出事件循环的执行日程,只有被注册为工作之后,事件循环才能够通过工作来设置日程以便并发执行协程根本语法协程的申明和运行应用async def语句定义一个协程函数,但这个函数不可间接运行 async def aaa(): print('hello')print(aaa())# 输入----------------------------------<coroutine object aaa at 0x7f4f9a9dfec0>/root/Project/test01/test2.py:4: RuntimeWarning: coroutine 'aaa' was never awaited print(aaa())RuntimeWarning: Enable tracemalloc to get the object allocation traceback如何运行一个协程呢,有三种形式: 1.应用asyncio.run()函数,可间接运行 import asyncioasync def aaa(): print('hello')asyncio.run(aaa())# 输入-------------------------hello2.应用await进行异步期待在协程函数中最重要的性能是应用await语法期待另一个协程,这将挂起以后协程,直到另一个协程返回后果。 await的作用:挂起 coroutine 的执行以期待一个 awaitable 对象。 只能在 coroutine function 外部应用。 import asyncioasync def aaa(): print('hello')async def main(): await aaa()asyncio.run(main())3.应用asyncio.create_task() 函数来创立一个工作,放入事件循环中 import asyncioasync def aaa(): print('hello')async def main(): asyncio.create_task(aaa())asyncio.run(main())可期待对象下面说过,协程函数中最重要的性能是应用await语法期待另一个协程,这将挂起以后协程,直到另一个协程返回后果。(重要,反复一遍) await前面须要跟一个可期待对象(awaitable),有上面三种可期待对象: 协程:包含协程函数和协程对象工作:通过asyncio.create_task()函数将协程打包为一个工作Futures:非凡的 低层级 可期待对象,示意一个异步操作的 最终后果运行asyncio程序asyncio.run(coro, *, debug=False) ...

June 28, 2022 · 2 min · jiezi

关于python:经验分享Python技巧之推导式

简介列表推导式(List Comprehensions)也是来自函数式编程语言,能够优雅的对一个序列进行数据筛选和解决失去一个后果列表。比方,把一个列表中所有大于0的数平方后生产一个新的列表。 num = [-2, 3, 5, -4, 10, 7]按惯例做法,咱们会 num = [-2, 3, 5, -4, 10, 7]result = []for x in num:if x > 0:result.append(x**2)print result而后,用列表推导式的话,只须要 print [x**2 for x in num if x > 0]组成怎么解读这个式子呢?把这个式子分成三个局部:输入解决、for循环、if判断。其中if判断局部是可选的。if 判断局部是用来筛选。 输入解决局部比拟灵便,轻易本人想怎么解决。 比方有个列表A = [‘1’, ‘2’, ‘3’],咱们能够[int(x) for x in A],把列表所有元素转换成int类型。下面是最根本的模式了。还有一些略微简单的模式,怎么解读呢? 办法办法是,除开“输入解决”局部,其它都是按从左到右程序来的。 1)多个for循环 [(x, y) for x in range(3) for y in range(5)]在这里,解决局部是(x, y),其它按从左到右。等价于 for x in range(3):for y in range(5):#解决局部2)嵌套列表推导式 [[0 for y in range(3)] for x in range(5)]在这里,解决局部是[0 for y in range(3)],其它按从左到右。等价于 ...

June 28, 2022 · 1 min · jiezi

关于python:Python-工匠容器的门道

序言这是 “Python 工匠”系列的第 4 篇文章容器”这两个字很少被 Python 技术文章提起。一看到“容器”,大家想到的多是那头蓝色小鲸鱼:Docker,但这篇文章和它没有任何关系。本文里的容器,是 Python 中的一个抽象概念,是对专门用来装其余对象的数据类型的统称。 在 Python 中,有四类最常见的内建容器类型:列表(list)、元组(tuple)、字典(dict)、汇合(set)。通过独自或是组合应用它们,能够高效的实现很多事件。 Python 语言本身的外部实现细节也与这些容器类型非亲非故。比方 Python 的类实例属性、全局变量 globals() 等就都是通过字典类型来存储的。 在这篇文章里,我首先会从容器类型的定义登程,尝试总结出一些日常编码的最佳实际。之后再围绕各个容器类型提供的非凡机能,分享一些编程的小技巧。 内容目录1) 底层看容器 - 防止频繁裁减列表/创立新列表 - 在列表头部操作多的场景应用 deque 模块 - 应用汇合/字典来判断成员是否存在 - 写更快的代码2) 高层看容器 - 面向容器接口编程 - 写扩展性更好的代码3) 罕用技巧 - 应用元组改善分支代码 - 在更多中央应用动静解包 - 最好不必“获取许可”,也无需“要求原谅” - 应用 next() 函数 - 应用有序字典来去重4) 常见误区 - 当心那些曾经枯竭的迭代器 - 别在循环体内批改被迭代对象5) 总结6) 系列其余文章7) 注解当咱们议论容器时,咱们在谈些什么?我在后面给了“容器”一个简略的定义:专门用来装其余对象的就是容器。但这个定义太宽泛了,无奈对咱们的日常编程产生什么领导价值。要真正把握 Python 里的容器,须要别离从两个层面动手: 底层实现:内置容器类型应用了什么数据结构?某项操作如何工作?高层形象:什么决定了某个对象是不是容器?哪些行为定义了容器?上面,让咱们一起站在这两个不同的层面上,重新认识容器。 底层看容器Python 是一门高级编程语言,它所提供的内置容器类型,都是通过高度封装和形象后的后果。和 “链表”、“红黑树”、“哈希表” 这些名字相比,所有 Python 内建类型的名字,都只形容了这个类型的性能特点,其他人齐全没法只通过这些名字理解它们的哪怕一丁点外部细节。 这是 Python 编程语言的劣势之一。相比 C 语言这类更靠近计算机底层的编程语言,Python 从新设计并实现了对编程者更敌对的内置容器类型,屏蔽掉了内存治理等额定工作。为咱们提供了更好的开发体验。 ...

June 28, 2022 · 5 min · jiezi

关于python:不可出外网的主机如何快速方便优雅的安装Python库

场景形容做一个假如,您的生产环境(或者说线上环境)是处于内网的主机,且不能出外网(也就是不能上网),但又须要装置Python的第三方库,怎么办?在本篇文章中,笔者拿装置Flask库(轻量级web框架)来解说,经剖析Flask自身还依赖了其余泛滥的库。依赖了有多少,依赖的是哪些,这些目前都是未知的。上面笔者把认为最疾速、最不便、最优雅、最没那么遭罪的装置方法进行分享,心愿能够做到抛砖引玉的成果,如果您有更好的装置办法,笔者十分心愿您能来稿进行分享。 确认线上主机的Python版本上面操作是为了确认线上主机的python版本# python --versionPython 2.7.5比方笔者的是python2.7.5接着在本地主机确认python版本上面操作是在本人的本地测试机上进行# 确认python版本[root@host-for-dev soft-tmp]# python --versionPython 2.7.5[root@host-for-dev soft-tmp]# # 同时确认一下的确没有装置过flask[root@host-for-dev soft-tmp]# pythonPython 2.7.5 (default, Nov 16 2020, 22:23:17) [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)] on linux2Type "help", "copyright", "credits" or "license" for more information.>>> import flaskTraceback (most recent call last): File "<stdin>", line 1, in <module>ImportError: No module named flask>>> 运气十分好,刚好笔者本地的CentOS默认的Python也是2.7.5版本。如果不是,那么就须要编译装置一个和线上一样的版本了。前戏完结!上面正式进入主题上面的操作均在本人的本地测试机上进行哈关上https://pypi.org/ 搜寻pip 查看以往的版本 须要找到反对python2.7的pip 下载源码包 依照同样的套路,下载setuptools的源码包 装置setuptoolsunzip setuptools-44.1.1.zippython setup.py install接着装置pipcd pip-20.3.4python setup.py install验证pip是否装置胜利[root@host-for-dev ~]# pip -Vpip 20.3.4 from /usr/lib/python2.7/site-packages/pip-20.3.4-py2.7.egg/pip (python 2.7)[root@host-for-dev ~]# 下载Flask的和与其无关的依赖,格局是whl格局[root@host-for-dev soft-tmp]# mkdir flask-pak[root@host-for-dev soft-tmp]# cd flask-pak/[root@host-for-dev flask-pak]# [root@host-for-dev flask-pak]# pip download FlaskDEPRECATION: Python 2.7 reached the end of its life on January 1st, 2020. Please upgrade your Python as Python 2.7 is no longer maintained. pip 21.0 will drop support for Python 2.7 in January 2021. More details about Python 2 support in pip can be found at https://pip.pypa.io/en/latest/development/release-process/#python-2-support pip 21.0 will remove support for this functionality.Collecting Flask Downloading Flask-1.1.4-py2.py3-none-any.whl (94 kB) |████████████████████████████████| 94 kB 216 kB/s Collecting click<8.0,>=5.1 Downloading click-7.1.2-py2.py3-none-any.whl (82 kB) |████████████████████████████████| 82 kB 237 kB/s Collecting Jinja2<3.0,>=2.10.1 Downloading Jinja2-2.11.3-py2.py3-none-any.whl (125 kB) |████████████████████████████████| 125 kB 171 kB/s Collecting Werkzeug<2.0,>=0.15 Downloading Werkzeug-1.0.1-py2.py3-none-any.whl (298 kB) |████████████████████████████████| 298 kB 54 kB/s Collecting itsdangerous<2.0,>=0.24 Downloading itsdangerous-1.1.0-py2.py3-none-any.whl (16 kB)Collecting MarkupSafe>=0.23 Downloading MarkupSafe-1.1.1-cp27-cp27mu-manylinux1_x86_64.whl (24 kB)Saved ./Flask-1.1.4-py2.py3-none-any.whlSaved ./click-7.1.2-py2.py3-none-any.whlSaved ./Jinja2-2.11.3-py2.py3-none-any.whlSaved ./Werkzeug-1.0.1-py2.py3-none-any.whlSaved ./itsdangerous-1.1.0-py2.py3-none-any.whlSaved ./MarkupSafe-1.1.1-cp27-cp27mu-manylinux1_x86_64.whlSuccessfully downloaded Flask click Jinja2 Werkzeug itsdangerous MarkupSafe[root@host-for-dev flask-pak]# lltotal 640-rw-r--r-- 1 root root 82780 Jun 24 21:33 click-7.1.2-py2.py3-none-any.whl-rw-r--r-- 1 root root 94591 Jun 24 21:33 Flask-1.1.4-py2.py3-none-any.whl-rw-r--r-- 1 root root 16743 Jun 24 21:33 itsdangerous-1.1.0-py2.py3-none-any.whl-rw-r--r-- 1 root root 125699 Jun 24 21:33 Jinja2-2.11.3-py2.py3-none-any.whl-rw-r--r-- 1 root root 24348 Jun 24 21:33 MarkupSafe-1.1.1-cp27-cp27mu-manylinux1_x86_64.whl-rw-r--r-- 1 root root 298631 Jun 24 21:33 Werkzeug-1.0.1-py2.py3-none-any.whl[root@host-for-dev flask-pak]# 对于Flask库的依赖到底有有哪些?答案很显著了,如下:click-7.1.2-py2.py3-none-any.whlFlask-1.1.4-py2.py3-none-any.whl # 除了Flask自身,其它的whl格局的包,都是它所依赖的。itsdangerous-1.1.0-py2.py3-none-any.whlJinja2-2.11.3-py2.py3-none-any.whlMarkupSafe-1.1.1-cp27-cp27mu-manylinux1_x86_64.whlWerkzeug-1.0.1-py2.py3-none-any.whl接着打包flask-pak目录[root@host-for-dev soft-tmp]# tar -zcf flask-pak.tar.gz flask-pak/自行将上面3个包上传到线上的主机(不可出外网的主机)flask-pak.tar.gzpip-20.3.4.tar.gzsetuptools-44.1.1.zip上传到线上主机(不可出外网的主机)后,依照同样的套路装置好setuptools和pip,在此不再演示步骤。且到此为止,在本地测试主机的操作就此结束。线上内网主机(不可出外网的主机)上开始装置Flask库上面的操作请切换您的线上主机(不可出外网的主机)接着解压flask-pak.tar.gz[root@hngz3-YWGLXT-PRM-ser07 ~/soft_pak]# tar -zxf flask-pak.tar.gz[root@hngz3-YWGLXT-PRM-ser07 ~/soft_pak/flask-pak]# lltotal 640-rw-r--r-- 1 root root 82780 Jun 24 2022 click-7.1.2-py2.py3-none-any.whl-rw-r--r-- 1 root root 94591 Jun 24 2022 Flask-1.1.4-py2.py3-none-any.whl-rw-r--r-- 1 root root 16743 Jun 24 2022 itsdangerous-1.1.0-py2.py3-none-any.whl-rw-r--r-- 1 root root 125699 Jun 24 2022 Jinja2-2.11.3-py2.py3-none-any.whl-rw-r--r-- 1 root root 24348 Jun 24 2022 MarkupSafe-1.1.1-cp27-cp27mu-manylinux1_x86_64.whl-rw-r--r-- 1 root root 298631 Jun 24 2022 Werkzeug-1.0.1-py2.py3-none-any.whl装置Flask# 装置pip install Werkzeug-1.0.1-py2.py3-none-any.whlpip install MarkupSafe-1.1.1-cp27-cp27mu-manylinux1_x86_64.whlpip install Jinja2-2.11.3-py2.py3-none-any.whlpip install itsdangerous-1.1.0-py2.py3-none-any.whlpip install click-7.1.2-py2.py3-none-any.whlpip install Flask-1.1.4-py2.py3-none-any.whl留神装置程序,先装置依赖,最初再装置Flask-1.1.4-py2.py3-none-any.whl验证flask是否装置实现进入python,导入flask看看是否能导入,导入胜利阐明装置胜利[root@hngz3-YWGLXT-PRM-ser07 ~/soft_pak/flask-pak]# pythonPython 2.7.5 (default, Oct 30 2018, 23:45:53) [GCC 4.8.5 20150623 (Red Hat 4.8.5-36)] on linux2Type "help", "copyright", "credits" or "license" for more information.>>> import flask>>> from flask import Flask, request写在最初好了!笔者曾经把认为最疾速、最不便、最优雅、最没那么遭罪的装置方法分享完结了。如果您认为不是最好的办法,欢送来怼我,更欢迎您能够来稿,把您认为最好的装置办法分享进去,有稿费哦。好了,就此搁笔,望宽广敌人能多多关注咱们,望多多点赞、转发,非常感谢!本文转载于:https://mp.weixin.qq.com/s/-j...

June 28, 2022 · 2 min · jiezi

关于python:测试部门来了个00后卷王之王老油条感叹真干不过但是

在程序员职场上,什么样的人最让人恶感呢? 是技术不好的人吗?并不是。技术不好的共事,咱们能够帮他。 是技术太强的人吗?也不是。技术很强的共事,可遇不可求,向他学习还来不及呢。 真正让人恶感的,是技术平平,却急于体现本人的人,每天加班到12点,在老板背后体现得分外踊跃,弄得其他人都很难堪。这就是行业当中的“卷王”。 2022年开年了,上个月公司来了许多新面孔,其中竟然有一个是00年的,尽管也给公司带来了一些新的血液,但也让我意识到,本人年级的确不小了。这小老弟是去年毕业的,在某软件公司干了半年,当初跳槽到咱们公司起薪18K,都快靠近我了。起初才晓得人家以前是个卷王,上班路上也是不来到学习,甚至在路上都没有来到过他的手机,从早干到晚就差搬张床到工位睡觉了。 这两天公司团建他喝多了,聊的比拟开,才晓得原来这位小老弟是村里进去的,爹妈退休金都没有,靠着他生存呢。所以他再大三的时候就曾经开始自学测试了,大四取得了一个小公司的实习机会。在工作中一直的学习、实际,花的工夫比他人多一倍,所以能力打下扎实的根底,当初工作也是得心应手。 我认为这位小老弟正式咱们学习的楷模,倒不是说应该学习他加班内卷,而是他这种一直学习进阶的精力! 为了助力程序员敌人们跳槽面试、升职加薪、职业窘境,进步本人的技术,本文给大家整了一套涵盖测试所有技术栈的疾速学习办法和笔记。目前曾经收到了七八个网友的反馈,说是面试问到了很多这外面的知识点。 内容波及:测试实践、Linux根底、MySQL根底、Web测试、接口测试、App测试、管理工具、Python根底、Selenium相干、性能测试、LordRunner相干等大厂软件测试岗教训分享通过大数据总结发现,其实软件测试岗的面试都是差不多的。常问的有上面这几块知识点: 全网首发-涵盖16个技术栈第一局部,测试实践(测试根底+需要剖析+测试模型+测试计划+测试策略+测试案例等等)第二局部,Linux( Linux根底+Linux练习题)第三局部,MySQL(基础知识+查问练习+万年学生表经典面试题汇总+数据库企业真题)第四局部,Web测试第五局部,API测试第六局部,App测试第七局部,管理工具第八局部,Python根底(Python根底+编程题+汇合+函数+Python个性等等)第九局部,Selenium相干第十局部,性能测试第十一部分,LordRunner相干第十二局部,计算机网络第十三局部,组成原理第十四局部,数据结构与算法第十五局部,逻辑题第十六局部,人力资源 软件测试根底软件测试的步骤是什么?如何录制测试脚本?应该思考进行如何测试的测试方法怎么预计测试工作量?测试设计的问题当测试过程产生谬误时,有哪几种解决办法?测试执行的问题测试评估的指标如何进步测试?C/S模式的长处和毛病B/S模式的长处和毛病… Linuxgrep和find的区别? grep 都有哪些用法?查看IP地址?创立和删除一个多级目录?在以后用户家目录中查找haha.txt文件?如何查问出tomcat的过程并杀掉这个过程,写出linux命令?动静查看日志文件?查看系統硬盘空间的命令?查看以后机器listen 的所有端口?… Python统计python源代码文件中代码行数,去除正文,空行,进行输入?python调用cmd并返回后果?冒泡排序1,2,3,4 这4个数字,能组成多少个互不雷同的且无反复的三位数,都是多少?请用 python 打印出 10000 以内的对称数(对称数特点:数字左右对称,如:1,2,11,121,1221 等)给定一个整数 N,和一个 0-9 的数 K,要求返回 0-N 中数字 K 呈现的次数判断 101-200 之间有多少个素数,并输入所有的素数一个输出三角形的函数,输出后输入是否能组成三角形,三角形类型,请用等价类- 划分法设计测试用例… MySQL你用的Mysql是哪个引擎,各引擎之间有什么区别?如何对查问命令进行优化?数据库的优化?Sql注入是如何产“生的,如何避免?NoSQL和关系数据库的区别?MySQL与MongoDB实质之间最根本的差异是什么Mysql数据库中怎么实现分页?Mysql数据库的操作?优化数据库?进步数据库的性能?什么是数据的完整性?… WebWeb测试和app测试区别?WEB测试环境搭建和测试方法WEB测试教程WEB测试要点及根本办法Web测试页面总结… 接口测试什么是接口如果模块申请http改为了https,测试计划应该如何制订,批改?罕用HTTP 协定调试代理I具备什么?具体阐明抓取HTTPS协定的设置过程?形容TCP/IP协定的层次结构,以及每一-层中重要协定jmeter,一个接口的响应后果如下:接口产生的垃圾数据如何清理依赖第三方的接口如何解决测试的数据你放在哪?什么是数据驱动,如何参数化?… 性能测试你认为性能测试的目标是什么?做好性能测试的工作的要害是什么?服务端性能剖析都从哪些角度来进行?如何了解压力测试,负裁测试以及性能测试?如何判断是否有内存透露及关注的指标?形容软件产“生内存泄露的起因以及查看形式。(能够联合- 种开发语言进行形容)简述什么是值传递,什么是地址传递,两者区别是什么?什么是零碎瓶颈?… selenium如何发展自动化测试框架的构建?如何设计自动化测试用例:webdriver如何开启和退出一个浏览器?什么是自动化测试框架?Selenium是什么,风行的版本有哪些?你如何从命令行启动Selenium RC?在我的机器端口4444不是收费的。我怎样才能应用另一个端口?什么是Selenium Server,它与Selenium Hub有什么不同?你如何从Selenium连贯到数据库?你如何验证多个页面上存在的一个对象?XPath中应用单斜杠和双斜杠有什么区别?如何编写SeleniumIDE/ RC的用户扩大?如何在页面加载胜利后验证元素的存在?你对Selenium Grid有什么理解?它提供了什么性能?如何从你的Java Class启动Selenium服务器?Selenium中有哪些验证点?什么是XPath?什么时候应该在Selenium中应用XPath?… 计算机与网络一台计算机的IP是192.168.10.71子网掩码255.255.255.64与192.168.10.201 …请简述DNS、流动目录、域的概念。10M兆宽带是什么意思?实践下载速度是多少?什么是IP地址?OSI七层网络模型的划分?TCP和UDP有什么不同?HTTP属于哪一层的协定?HTTP和HTTPS的区别?cookies和session的区别?HTTP的get申请和post申请的区别?HTTP1.0和HTTP1.1有什么区别TCP的连贯建设过程,以及断开过程?客户端应用DHCP获取IP的过程?写出某个网段的网络地址和播送地址?… 人力资源你的测试职业倒退是什么?你自认为做测试的劣势在哪里?你找工作时,最重要的思考因素为何?为什么咱们应该录取你?请谈谈你集体的最大特色。一个测试工程师应具备那些素质和技能?还有问一下你是怎么保障软件品质的,也就是说你感觉怎样才能最大限度地保障软件品质?为什么抉择测试这行?如果我雇用你,你能给部门带来什么奉献?… 文档获取形式:这份文档,对于想从事【软件测试】的敌人来说应该是最全面最残缺的备战仓库,这个仓库也陪伴我走过了最艰巨的途程,心愿也能帮忙到你!以上均能够分享,喜爱帮忙点个小赞,

June 28, 2022 · 1 min · jiezi

关于python:Python-海象运算符-的三种用法

随着Python 3.8的公布,赋值表达式运算符(也称为海象运算符)也公布了。运算符使值的赋值能够传递到表达式中。这通常会使语句数缩小一个。例如: my_list = [1,2,3]count = len(my_list)if count > 3: print(f"Error, {count} is too many items")# when converting to walrus operator...if (count := len(my_list)) > 3: print(f"Error, {count} is too many items")如果您疾速浏览了一下,就会了解对这个新操作的担心。仿佛将两个简略的语句一概而论,以使收益最小。假如对于为什么引入此运算符有正当答案?那么让人很天然的想到,它在事实世界中如何有用?我发现了我将要持续采纳海象运算符的三个方面,且每个方面除了能省一行代码之外都还能带来其余益处。 While 循环尽管循环仿佛是最常见的应用海象运算符的状况。在此处应用海象运算符的益处是能够在while语句中合并表达式和修饰符。我曾经写过无数次有限循环了,因为我总是遗记在循环开端写批改语句。 line = f.readLine()while line: print(line) line = f.readLine()# when converting to walrus operator...while line := f.readLine(): print(line)不过要留神, 应用海象运算符更适宜用于传统的do/while 循环,因为赋值在循环表达式之前。请参见上面的差别: n = 0while n < 3: print(n) # 0,1,2 n += 1# when converting to walrus operator...w = 0while (w := w + 1) < 3: print(w) # 1,2依据我无限的教训,我发现它在替换有限while循环中最有用: ...

June 28, 2022 · 1 min · jiezi

关于python:最好用的-Python-命令行库click

一、前言明天要介绍的 click[2] 则是用一种你很熟知的形式来玩转命令行。命令行程序实质上是定义参数和解决参数,而解决参数的逻辑肯定是与所定义的参数有关联的。那可不可以用函数和装璜器来实现解决参数逻辑与定义参数的关联呢?而 click 正好就是以这种形式来应用的。 本系列文章默认应用 Python 3 作为解释器进行解说。若你仍在应用 Python 2,请留神两者之间语法和库的应用差别哦~二、介绍click 是一个以尽可能少的代码、以组合的形式创立柔美的命令行程序的 Python 包。它有很高的可配置性,同时也能开箱即用。 它旨在让编写命令行工具的过程既疾速又乏味,还能避免因为无奈实现预期的 CLI API 所产生挫败感。它有如下三个特点: 任意嵌套命令主动生成帮忙反对运行时提早加载子命令三、疾速开始3.1 业务逻辑首先定义业务逻辑,是不是感觉到有些难以置信呢? 不论是 argparse 还是 docopt,业务逻辑都是被放在最初一步,但 click 却是放在第一步。细想想 click 的这种形式才更合乎人的思维吧?不管用什么命令行框架,咱们最终关怀的就是实现业务逻辑,其它的能省则省。 咱们以官网示例为例,来介绍 click 的用法和哲学。假如命令行程序的输出是 name 和 count,性能是打印指定次数的名字。 那么在 hello.py 中,很容易写出如下代码: def hello(count, name): """Simple program that greets NAME for a total of COUNT times.""" for x in range(count): click.echo('Hello %s!' % name)这段代码的逻辑很简略,就是循环 count 次,应用 click.echo 打印 name。其中,click.echo 和 print 的作用类似,但性能更加弱小,能解决好 Unicode 和 二进制数据的状况。 ...

June 28, 2022 · 2 min · jiezi

关于python:如何使用-Python-操作-Git-代码GitPython-入门介绍

有时,须要做简单的 Git 操作,并且有很多两头逻辑。用 Shell 做简单的逻辑运算与流程管制就是一个劫难。所以,用 Python 来实现是一个欢快的抉择。这时,就须要在 Python 中操作 Git 的库。 GitPython 简介GitPython是一个与Git库交互的Python库,包含底层命令(Plumbing)与高层命令(Porcelain)。它能够实现绝大部分的Git读写操作,防止了频繁与Shell交互的畸形代码。它并非是一个纯正的Python实现,而是有一部分依赖于间接执行git命令,另一部分依赖于GitDB。 GitDB也是一个Python库。它为.git/objects建设了一个数据库模型,能够实现间接的读写。因为采纳流式(stream)读写,所以运行高效、内存占用低。 GitPython装置pip install GitPython其依赖GitDB会主动装置,不过可执行的git命令须要额定装置。 根本用法init import gitrepo = git.Repo.init(path='.')这样就在当前目录创立了一个Git库。当然,门路能够自定义。 因为git.Repo实现了__enter__与__exit__,所以能够与with联结应用。 with git.Repo.init(path='.') as repo: # do sth with repo不过,因为只是实现了一些清理操作,敞开后依然能够读写,所以应用这种模式的必要性不高。详见附录。 cloneclone分两种。一是从以后库clone到另一个地位: new_repo = repo.clone(path='../new')二是从某个URL那里clone到本地某个地位: new_repo = git.Repo.clone_from(url='git@github.com:USER/REPO.git', to_path='../new')commit with open('test.file', 'w') as fobj: fobj.write('1st line\n')repo.index.add(items=['test.file'])repo.index.commit('write a line into test.file')with open('test.file', 'aw') as fobj: fobj.write('2nd line\n')repo.index.add(items=['test.file'])repo.index.commit('write another line into test.file')statusGitPython并未实现原版git status,而是给出了局部的信息。 >>> repo.is_dirty()False>>> with open('test.file', 'aw') as fobj:>>> fobj.write('dirty line\n')>>> repo.is_dirty()True>>> repo.untracked_files[]>>> with open('untracked.file', 'w') as fobj:>>> fobj.write('')>>> repo.untracked_files['untracked.file']checkout(清理所有批改) ...

June 28, 2022 · 1 min · jiezi

关于python:如何利用现有加密方案保护你的-Python-代码

本系列将首先介绍下现有源码加密计划的思路、办法、长处与有余,进而介绍如何通过定制 Python 解释器来达到更好地加解密源码的目标。 因为 Python 的动静个性和开源特点,导致 Python 代码很难做到很好的加密。社区中的一些声音认为这样的限度是事实,应该通过法律手段而不是加密源码达到商业爱护的目标;而还有一些声音则是不论如何都心愿能有一种伎俩来加密。于是乎,人们想出了各种或加密、或混同的计划,借此来达到爱护源码的目标。 常见的源码爱护伎俩有如下几种: 发行 .pyc 文件代码混同应用 py2exe应用 Cython上面来简略说说这些计划。 1 发行 .pyc 文件1.1 思路大家都晓得,Python 解释器在执行代码的过程中会首先生成 .pyc 文件,而后解释执行 .pyc文件中的内容。当然了,Python 解释器也可能间接执行 .pyc 文件。而 .pyc 文件是二进制文件,无奈间接看出源码内容。如果发行代码到客户环境时都是 .pyc 而非 .py 文件的话,那岂不是能达到爱护 Python 代码的目标? 1.2 办法把 .py 文件编译为 .pyc 文件,是件十分轻松地事件,可不须要把所有代码跑一遍,而后去捞生成的 .pyc 文件。 事实上,Python 规范库中提供了一个名为 compileall 的库,能够轻松地进行编译。 执行如下命令可能将遍历 <src> 目录下的所有 .py 文件,将之编译为 .pyc 文件: python -m compileall <src> 而后删除 <src> 目录下所有 .py 文件就能够打包公布了: $ find <src> -name '*.py' -type f -print -exec rm {} \;1.3 长处 ...

June 28, 2022 · 3 min · jiezi

关于python:这几个-Python-小游戏上班摸鱼我能玩一天-|-内附源码

人不知;鬼不觉往年曾经要过完一半了,都晓得往年整体的大环境真的十分差,以至于下班也没有啥激情了。 刚好六一儿童节快到了,忽然想再玩下小时候玩过的一些经典游戏,但又不想花钱买设施,于是... 俄罗斯方块十分经典的游戏,小时候常常拿一个红白掌机去玩,一玩就停不下来。 class TetrisGame(QMainWindow):    def __init__(self, parent=None):        super(TetrisGame, self).__init__(parent)        # 是否暂停ing        self.is_paused = False        # 是否开始ing        self.is_started = False        self.initUI()        ... 消消乐这个游戏到当初都有大把的人来玩,尽管简略,但却十分解压。 def main():    pygame.init()    screen = pygame.display.set_mode(cfg.SCREENSIZE)    pygame.display.set_caption('Gemgem —— 九歌')    # 加载背景音乐    pygame.mixer.init()    ... 贪吃蛇也是童年经典游戏之一,一般的没难度,要玩就玩减速的才够刺激。 food = vector(0, 0)snake = [vector(10, 0)]aim = vector(0, -10)... 吃豆人state = {'score': 0}path = Turtle(visible=False)writer = Turtle(visible=False)aim = vector(5, 0)pacman = vector(-40, -80)... 乒乓球球虽小,单却蕴藏着微小的乐趣。 ball = vector(0, 0)aim = vector(value(), value())state = {1: 0, 2: 0}... 总结大家之所以都感觉童年的游戏好玩,并不是游戏真的好玩,而是过后的本人基本无需思考其余任何事件,美滋滋的生存在父母的庇佑之下,真正长大之后才发现社会的简单,以至于满身疲乏。 不过,不管怎样,还是心愿大家都要致力向上,好好生存。 以上就是本次分享的所有内容,如果你感觉文章还不错,欢送关注公众号:Python编程学习圈,每日干货分享,发送“J”还可支付大量学习材料。或是返回编程学习网,理解更多编程技术常识。

June 28, 2022 · 1 min · jiezi

关于python:这些fstring的用法90的Pythoner不知道

f-string 是 Python3.6 版本开始引入的个性,想必很多 Python 用户都基础性的应用过,通过它咱们能够更加不便地向字符串中嵌入自定义内容,但 f-string 真正蕴含的性能远比大多数用户晓得的要丰盛,明天咱们就来一起摸索它们! 根底用法f-string 最根底的用法很简略,如下例所示,在前缀f的字符串中向{}内间接填入要嵌入的值、变量或计算表达式: print(f'1+1 = {2}')# 输入:1+1 = 2 a = 1 + 1print(f'1+1 = {a}')# 输入:1+1 = 2 print(f'1+1 = {1+1}')# 输入:1+1 = 2自记录表达式从 Python3.8 版本开始,f-string 引入了自记录表达式,使得咱们能够依照上面的写法疾速输入一些计算表达式: import matha = 8print(f'{math.log(8) = }')# 输入:math.log(8) = 2.0794415416798357多行 f-string通过最外层包裹小括号,咱们能够像上面这样非常灵活地撰写多行 f-string: a = 1b = 2c = 3s = (    f'{a = }\n'    f'{b = }\n'    f'{c = }\n')print(s)# 输入:a = 1b = 2c = 3管制浮点数精度在 f-string 中咱们能够依照下列形式灵便地管制浮点数的小数位数: import mathpi = math.piprint(f'{pi:.3f}')print(f'{pi:.8f}')# 输入3.1423.14159265进制转换输入在 f-string 中,咱们能够间接在输入时将指标转换成不同的进制进行输入: number_10 = 1024print(f'{number_10:b}')  # 2进制print(f'{number_10:o}')  # 8进制print(f'{number_10:x}')  # 16进制小写print(f'{number_10:X}')  # 16进制大写print(f'{number_10:c}')  # ASCII编码# 输入:100000000002000400400字符串对齐f-string 默认为右对齐,咱们能够批改对齐形式: text = 'python'print(f'{text:>10}')  # 右对齐print(f'{text:<10}')  # 左对齐print(f'{text:^10}')  # 居中对齐print(f'{text:*^10}')  # 居中对齐,用*补齐空白n = 10print(f'{text:#^{n}}')  # 参数嵌套,居中对齐,用~补齐空白# 输入:    pythonpython  python**python**##python##标准化显示宽度当咱们须要对 f-string 打印内容的显示最小宽度进行限度时,譬如打印出相似表格的构造,能够这样写: for x in range(1,11):    print(f'{x:02}|{x**2:3}/{x**5:6}')    # 输入:01|  1|     102|  4|    3203|  9|   24304| 16|  102405| 25|  312506| 36|  777607| 49| 1680708| 64| 3276809| 81| 5904910|100|100000格式化日期针对日期类型的变量,咱们能够参考上面的形式,间接在 f-string 中疾速地进行格式化: import datetimenow = datetime.datetime.now()print(f'{now:%Y年%m月%d号%H点%M分%S秒}') # 输入:2022年05月21号17点04分08秒迷信计数咱们能够实现指定位数的迷信计数法显示方式: import mathpi = math.piprint(f'{pi*100:.10e}') # 输入3.1415926536e+02管制有效数字位数咱们还能够管制所显示数字的有效数字位数,即从左开始第一个不为0的数字往右一共显示的个数,当位数低于整数局部时会主动变成迷信计数法格局: a = 1312.3123123123123print(f'{a:.10g}')#输入:1312.312312 a = 1312.3123123123123print(f'{a:.3g}')#输入:1.31e+03总结对于在 Python 中 f-string 的几个技巧的文章就介绍到这里,这些骚操作你学会了吗?还有哪些狂拽炫酷吊炸天的代码,欢送留言区探讨! 以上就是本次分享的所有内容,如果你感觉文章还不错,欢送关注公众号:Python编程学习圈,每日干货分享,发送“J”还可支付大量学习材料。或是返回编程学习网,理解更多编程技术常识。

June 28, 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,就会被执行,从而有限递归的去创立子过程 ...

June 28, 2022 · 1 min · jiezi

关于python:用-Python-实现图片转字符画so-easy

置信大家在网上常常看到有人秀出各种各样的字符画,对于这个五彩斑斓的世界来说,咱们日常看到的都是一些高清的黑白的图片,偶然来个毛糙的黑白的字符画,还是比拟解乏的。 字符画的原理这种字符画的原理也比较简单,咱们能够把每个字符看成是一个大的像素,一个字符能够代表一种色彩,字符各类越多,可体现的色彩越多,字符画就更有层次感。 灰度值和RGB灰度值是指黑白图像中点的色彩的深度,它的范畴是0-255,红色为255,彩色为0,其余色彩介于两者之间。 RGB 是红绿蓝三色彩,通过不同的叠加可失去其余色彩。 要将图片转字符画,须要先定义一个字符集,用来和灰度值做映射,将图片每个像素的 RGB 值转换为一个灰度值,将其对应的字符输入就失去字符画。 RGB 转灰度值,有个转换学公式,来源于网络: gray = (2126 r + 7152 g + 722 * b) / 10000代码实战我随便抉择了一张图片: 我的指标是转化成上面这样: 依据以上转换原理,咱们间接上代码: from PIL import Imagechar = list('M3NB6Q#OC?7>!:–;. ')def get_char(r, g, b, alpha=256):    if alpha == 0:        return ' '        grey = (2126 * r + 7152 * g + 722 * b) / 10000        char_idx = int((grey / (alpha + 1.0)) * len(char))    return char[char_idx]def write_file(out_file_name, content):    with open(out_file_name, 'w') as f:        f.write(content)def main(file_name="input.jpg", width=100, height=80, out_file_name='output.txt'):    text = ''    im = Image.open(file_name)    im = im.resize((width, height), Image.NEAREST)    for i in range(height):        for j in range(width):            text += get_char(*im.getpixel((j, i)))        text += '\n'    print(text)    write_file(out_file_name, text)if __name__ == '__main__':    main('dance.png')程序的思路: 定义一个字符数组,这个数组外面的字符能够随便写。解析图片,将图片外面的每个像素点解析成 RGB 值。依据咱们下面的公式,将每个像素点转换成字符数组外面的一个字符。将所有像素点对应的字符拼接起来,就实现了转换。总结图片转字符画,转换的原理和思路还是比较简单的,实现也不简单,大家能够入手试试看! 以上就是本次分享的所有内容,如果你感觉文章还不错,欢送关注公众号:Python编程学习圈,每日干货分享,发送“J”还可支付大量学习材料。或是返回编程学习网,理解更多编程技术常识。

June 28, 2022 · 1 min · jiezi

关于python:LeetCode解题报告-522-最长特殊序列-II

@TOC 一、 题目1. 题目形容最长非凡序列 II难度:中等 给定字符串列表 strs ,返回其中 最长的非凡序列 。如果最长非凡序列不存在,返回 -1 。 非凡序列 定义如下:该序列为某字符串 独有的子序列(即不能是其余字符串的子序列)。 s 的 子序列能够通过删去字符串 s 中的某些字符实现。 例如,"abc" 是 "aebdc" 的子序列,因为您能够删除"a<u>e</u>b<u>d</u>c"中的下划线字符来失去 "abc" 。"aebdc"的子序列还包含"aebdc"、 "aeb" 和 <font face="Menlo, Monaco, Consolas, Courier New, monospace" color="#c7254e"><span style="font-size: 12.6px; background-color: rgb(249, 242, 244);">""</span></font> (空字符串)。示例 1: 输出: strs = ["aba","cdc","eae"]输入: 3示例 2: 输出: strs = ["aaa","aaa","aa"]输入: -1提醒: 2 <= strs.length <= 501 <= strs[i].length <= 10strs[i] 只蕴含小写英文字母2. 原题链接链接: 522. 最长非凡序列 II 二、 解题报告1. 思路剖析这题难就难在下边这个显然上,剩下的都是套路。 先说一个显然:如果s的子序列ss是一个非凡序列,那么s更是非凡序列。因而本题只须要判断每个字符串是否是其它字符串的子序列。如果一个字符串不是任何一个其它字符串的子序列,这个字符串自身就是一个非凡序列,能够用来更新答案。最初取所有非凡字符串的长度求max即可,没有就置-1.子序列自动机因为枚举每两个点对,因而对每个字符串,都要查看n-1个别的串是否是它的子序列(不剪枝的状况)。对一个串屡次查看子序列的办法,能够用到子序列自动机。判断子序列的奢侈办法是用双指针i,j。i在原串上,j在模式串上。咱们发现i向右挪动时,肯定优先取最近的(即最早呈现)、等于p[j]的字符,复每次最坏匹配复杂度 O(n+m)。那么咱们能够用dp的形式预处理进去每个字符下一个字符最早呈现的地位,匹配时就能够间接i指针挪动到下一个合乎的字符,跳过大量无用比拟。自动机结构复杂度 O(mc)*,c=26即为字典长度,m是原串长度。每次匹配复杂度为 O(n)。参考我的题解Python子序列自动机做法 ...

June 27, 2022 · 2 min · jiezi

关于python:超好用分享8个-Python-自动化脚本

每天你都可能会执行许多反复的工作,例如浏览新闻、发邮件、查看天气、关上书签、清理文件夹等等,应用自动化脚本,就无需手动一次又一次地实现这些工作,十分不便。而在某种程度上,Python 就是自动化的代名词。 明天分享 6 个十分有用的 Python 自动化脚本。喜爱记得珍藏、关注、点赞。 注:文末提供技术交换群 1、自动化浏览网页新闻这个脚本可能实现从网页中抓取文本,而后自动化语音朗诵,当你想听新闻的时候,这是个不错的抉择。 代码分为两大部分,第一通过爬虫抓取网页文本呢,第二通过浏览工具来朗诵文本。 须要的第三方库: Beautiful Soup - 经典的HTML/XML文本解析器,用来提取爬下来的网页信息 requests - 好用到逆天的HTTP工具,用来向网页发送申请获取数据 Pyttsx3 - 将文本转换为语音,并管制速率、频率和语音———————————————— import pyttsx3import requestsfrom bs4 import BeautifulSoupengine = pyttsx3.init('sapi5')voices = engine.getProperty('voices')newVoiceRate = 130 ## Reduce The Speech Rateengine.setProperty('rate',newVoiceRate)engine.setProperty('voice', voices[1].id)def speak(audio): engine.say(audio) engine.runAndWait()text = str(input("Paste article\n"))res = requests.get(text)soup = BeautifulSoup(res.text,'html.parser')articles = []for i in range(len(soup.select('.p'))): article = soup.select('.p')[i].getText().strip() articles.append(article)text = " ".join(articles)speak(text)# engine.save_to_file(text, 'test.mp3') ## If you want to save the speech as a audio fileengine.runAndWait()2、自动化数据摸索数据摸索是数据迷信我的项目的第一步,你须要理解数据的根本信息能力进一步剖析更深的价值。 ...

June 27, 2022 · 3 min · jiezi

关于python:Python-为什么要保留显式的-self

Bruce 的提议Bruce 晓得,咱们须要一种办法来辨别对实例变量的援用和对其它变量的援用,因而他倡议将“self”设为关键字。思考一种典型的类,它有一个办法,例如: class C: def meth(self, arg): self.val = arg return self.val跟据 Bruce 的提议,这将变为: class C: def meth(arg):# Look ma, no self! self.val = arg return self.val这样每个办法会节俭 6 个字符。但我不感觉 Bruce 提出这个倡议是为了缩小打字。我认为他真正关怀的是程序员(可能来自其它语言)所节约的工夫,有时候仿佛不须要指定“self”参数,而且他们偶然遗记了要加(即便他们非常分明——习惯是一种弱小的力量)。的确,与遗记在实例变量或办法援用之前键入“self.”相比,从参数列表中省略“self”,往往会导致很含糊的谬误音讯。 兴许更蹩脚的是(如 Bruce 所述),当正确地申明了办法,然而在调用时的参数数量不对,这时收到的谬误音讯。如 Bruce 给出的以下示例: Traceback (most recent call last):File "classes.py", line 9, in obj.m2(1)TypeError: m2() takes exactly 3 arguments (2 given)我同意它是令人困惑的,然而我宁愿去解决此谬误音讯,而不是批改语言。 为什么 Bruce 的提议不可行首先,让我提出一些与 Bruce 的提议相同的典型论点。这有一个很好的论据能够证实,在参数列表中应用显式的“self”,能够加强以下两种调用办法在实践上的等效性。假如“ foo”是“C”的一个实例:foo.meth(arg) == C.meth(foo, arg)(译注:说实话,我没有了解这个例子的意思。以下仅是集体认识。在类的外部定义方法时,可能会产生几种不同的办法:实例办法、类办法和 静态方法。它们的作用和行为是不同的,那么在定义和调用时怎么做辨别呢?Python 约定了一种形式,即在定义时用第一个参数作辨别:self 示意实例办法、cls或其它符号 示意类办法……三种办法都能够被类的实例调用,而且看起来截然不同,如上例的等号左侧那样。这时候就要靠定义时赋予的参数来辨别了,像上例等号右侧,第一个参数是实例对象,表明此处是个实例办法。)另一个论据是,在参数列表中应用显式的“self”,将一个函数插入一个类,取得动静地批改一个类的能力,创立出相应的一个类办法。例如,咱们能够创立一个与下面的“C”齐全等效的类,如下所示: # Define an empty class:class C: pass# Define a global function:def meth(myself, arg): myself.val = arg return myself.val# Poke the method into the class:C.meth = meth请留神,我将“self”参数重命名为“myself”,以强调(在语法上)咱们不是在此处定义一个办法(译注:类内部的是函数,即 function,类外部的是办法,即 method)。 ...

June 27, 2022 · 1 min · jiezi

关于python:Python-浮点数的冷知识

本周的PyCoder's Weekly上分享了一篇小文章,它外面提到的冷常识很有意思,我稍作补充,分享给大家。 它提到的局部问题,读者们能够先思考下: 若两个元组相等,即 a==b 且 a is b,那么雷同索引的元素(如a[0] 、b[0])是否必然相等?若两个对象的 hash 后果相等,即 hash(a) == hash(b),那么它们是否必然相等呢?答案当然都为否(不然就不叫冷常识了),大家能够先尝试答复一下,而后再往下看。好了,先来看看第一个问题。两个雷同的元组 a、b,它们有如下的关系: >>> a = (float('nan'),)>>> b = a>>> a # (nan,)>>> b # (nan,)>>> type(a), type(b)(<type 'tuple'>, <type 'tuple'>)>>> a == bTrue>>> a is b # 即 id(a) == id(b)True>>> a[0] == b[0]False以上代码表明:a 等于 b(类型、值与 id 都相等),然而它们的对位元素却不相等。 两个元组都只有一个元素(逗号前面没有别的元素,这是单元素的元组的示意办法,即 len(a)==1 )。float() 是个内置函数,能够将入参结构成一个浮点数。 为什么会这样呢?先查阅一下文档,这个内置函数的解析规定是: sign ::= "+" | "-"infinity ::= "Infinity" | "inf"nan ::= "nan"numeric_value ::= floatnumber | infinity | nannumeric_string ::= [sign] numeric_value它在解析时,能够解析前后的空格、前缀的加减号(+/-)、浮点数,除此之外,还能够解析两类字符串(不辨别大小写):"Infinity"或"inf",示意无穷大数;“nan”,示意不是数(not-a-number),确切地说,指的是除了数以外的所有货色。 ...

June 27, 2022 · 1 min · jiezi

关于python:Python-内存分配时的小秘密

Python 中的sys模块极为根底而重要,它次要提供了一些给解释器应用(或由它保护)的变量,以及一些与解释器强交互的函数。 本文将会频繁地应用该模块的getsizeof()办法,因而,我先简要介绍一下: 该办法用于获取一个对象的字节大小(bytes)它只计算间接占用的内存,而不计算对象内所援用对象的内存这里有个直观的例子: import sysa = [1, 2]b = [a, a] # 即 [[1, 2], [1, 2]]# a、b 都只有两个元素,所以间接占用的大小相等sys.getsizeof(a) # 后果:80sys.getsizeof(b) # 后果:80上例阐明了一件事:一个动态创立的列表,如果只蕴含两个元素,那它本身占用的内存就是 80 字节,不论其元素所指向的对象是什么。 好了,领有这把测量工具,咱们就来探索一下 Python 的内置对象都藏了哪些小机密吧。 1、空对象不是“空”的!对于咱们熟知的一些空对象,例如空字符串、空列表、空字典等等,不晓得大家是否曾好奇过,是否曾思考过这些问题:空的对象是不是不占用内存呢?如果占内存,那占用多少呢?为什么是这样调配的呢? 间接上代码吧,一起来看看几类根本数据结构的空对象的大小: import syssys.getsizeof("") # 49sys.getsizeof([]) # 64sys.getsizeof(()) # 48sys.getsizeof(set()) # 224sys.getsizeof(dict()) # 240# 作为参照:sys.getsizeof(1) # 28sys.getsizeof(True) # 28可见,尽管都是空对象,然而这些对象在内存调配上并不为“空”,而且调配得还挺大(记住这几个数字哦,前面会考)。 排一下序:根底数字<空元组 < 空字符串 < 空列表 < 空集合 < 空字典。 这个小机密该怎么解释呢? 因为这些空对象都是容器,咱们能够抽象地了解:它们的一部分内存用于创立容器的骨架、记录容器的信息(如援用计数、使用量信息等等)、还有一部分内存则是预调配的。 2、内存裁减不是平均的!空对象并不为空,一部分起因是 Python 解释器为它们预调配了一些初始空间。在不超出初始内存的状况下,每次新增元素,就应用已有内存,因此防止了再去申请新的内存。 那么,如果初始内存被调配完之后,新的内存是怎么调配的呢? import sysletters = "abcdefghijklmnopqrstuvwxyz"a = []for i in letters: a.append(i) print(f'{len(a)}, sys.getsizeof(a) = {sys.getsizeof(a)}')b = set()for j in letters: b.add(j) print(f'{len(b)}, sys.getsizeof(b) = {sys.getsizeof(b)}')c = dict()for k in letters: c[k] = k print(f'{len(c)}, sys.getsizeof(c) = {sys.getsizeof(c)}')别离给三类可变对象增加 26 个元素,看看后果如何: ...

June 27, 2022 · 2 min · jiezi

关于python:如何通过测试提升-Python-代码的健壮性

0x00 前言本文的更多的是写给 Python 后端的程序员。来简略分享一下我对写测试的了解。 本期就聊聊测试这件小事件。 本文目录如下: ▼ 如何通过测试晋升 Python 代码的健壮性 : section 0x00 前言 : section ▼ 0x01 测试的分类 : section 后端次要关注哪些测试 : section ▼ 0x02 为什么要写测试 : section 让老手更快的理解代码 : section 让公布代码的时候更加有底气 : section 让程序更容易重构 : section 放慢团队的开发速度 : section ▼ 0x03 为什么不要写测试 : section 测试不能解决的问题 : section 不适当的测试为什么是累赘 : section 并不是所有中央都容易测试的 : section ▼ 0x04 写 Python 测试的一些注意事项 : section 我的项目的环境隔离 : section 测试的根本环境 : section 单测 / 功测 / 端对端 : section 如何解决内部服务 : section 其余 Pytest 小技巧 : section 0xEE 参考 : section0x01 测试的分类测试有很多种,依照测试设计的办法能够分为:1. 黑盒 2. 白盒 ...

June 27, 2022 · 3 min · jiezi

关于python:Docker-又出了个新玩意儿

在上个月颁布的 Docker Desktop v4.7.0 中,介绍了一个新的 CLI 插件-docker/sbom-cli-plugin,其为 Docker CLI 缩小了一个子命令 – sbom,用于查看 Docker 容器镜像的软件物料清单(SBOM)。 什么是 SBOM?首先介绍下什么是 SBOM(Software Bill of  Materials),咱们称之为软件物料清单,是软件供应链中的术语。软件供应链是用于构建软件应用程序(软件产品)的组件、库和工具的列表,而物料清单则声明这些组件、库的清单,类似于食品的配料清单。软件物料清单可能帮忙组织或者个体避免利用有安全漏洞的软件。 DOCKER SBOM 命令当心: 从 Docker Desktop 4.7.0 版本开始到当初,docker sbom 命令还是实验性的,该性能兴许会在以后版本中删除和更改,当前 Linux 的 Docker CLI 还未蕴含该子命令。 docker sbom 命令用于生产一个容器镜像的软件物料清单(SBOM)  >$ docker sbom --helpUsage:  docker sbom [OPTIONS] COMMANDView the packaged-based Software Bill Of Materials (SBOM) for an image.EXPERIMENTAL: The flags and outputs of this command may change. Leave feedback on https://github.com/docker/sbom-cli-plugin.Examples: docker sbom alpine:latest                                          a summary of discovered packages docker sbom alpine:latest --format syft-json                       show all possible cataloging details docker sbom alpine:latest --output sbom.txt                        write report output to a file docker sbom alpine:latest --exclude /lib  --exclude '**/*.db'      ignore one or more paths/globs in the imageOptions: -D, --debug                 show debug logging     --exclude stringArray   exclude paths from being scanned using a glob expression     --format string         report output format, options=[syft-json cyclonedx-xml cyclonedx-json github-0-json spdx-tag-value spdx-json table text] (default "table")     --layers string         [experimental] selection of layers to catalog, options=[squashed all] (default "squashed") -o, --output string         file to write the default report output to (default is STDOUT)     --platform string       an optional platform specifier for container image sources (e.g. 'linux/arm64', 'linux/arm64/v8', 'arm64', 'linux')     --quiet                 suppress all non-report output -v, --version               version for sbomCommands: version     Show Docker sbom version informationRun 'docker sbom COMMAND --help' for more information on a command.从命令的帮忙信息中可能看到,除了间接生成表格模式的 SBOM 输出外,还拥护利用--format 指定多种类型的输出格局。 咱们尝试对镜像 neo4j:4.4.5 生成 SBOM:  >$ docker sbom neo4jh:4.4.5Syft v0.43.0 ✔ Loaded image ✔ Parsed image ✔ Cataloged packages      [385 packages]NAME                                VERSION                                    TYPECodePointIM                         11.0.15                                    java-archive  FastInfoset                         1.2.16                                     java-archiveFileChooserDemo                     11.0.15                                    java-archiveFont2DTest                          11.0.15                                    java-archiveHdrHistogram                        2.1.9                                      java-archiveJ2Ddemo                             11.0.15                                    java-archiveMetalworks                          11.0.15                                    java-archive...libuuid1                            2.36.1-8+deb11u1                           deblibxxhash0                          0.8.0-2                                    deblibzstd1                            1.4.8+dfsg-2.1                             deblistenablefuture                    9999.0-empty-to-avoid-conflict-with-guava  java-archivelog4j-api                           2.17.1                                     java-archivelog4j-core                          2.17.1                                     java-archivelogin                               1:4.8.1-1                                  deb...上面的输出表格之截取了部分,咱们可能看到在清单列表中,除了系统包(deb 类型)之外,还有 java 的软件包,其中就蕴含了 log4j  的包及其版本信息,从这些信息中就可能了解到容器镜像是否蕴含了存在安全漏洞的依赖和软件包,增强了应用软件镜像来部署利用的安全性。 上面的信息中还看到了 Syft v0.43.0,这是因为当前的 SBOM CLI 插件是利用 Anchore 的 Syft 我的我的项目来进行镜像层的扫描,以后的版本兴许会通过其余方法读取 SBOM 信息。 咱们再尝试输出一个镜像的 SPDX 格局的 SBOM 文件:  >$ docker sbom --form spdx-json --output hugo-sbom.json mengzyou/hugo:latestSyft v0.43.0 ✔ Loaded image ✔ Parsed image ✔ Cataloged packages >$ cat hugo-sbom.json{  "SPDXID": "SPDXRef-DOCUMENT",  "name": "mengzyou/hugo-latest",  "spdxVersion": "SPDX-2.2",  "creationInfo": {   "created": "2022-05-09T10:55:06.6343529Z",   "creators": [    "Organization: Anchore, Inc",    "Tool: syft-[not provided]"   ],   "licenseListVersion": "3.16"  },  "dataLicense": "CC0-1.0",  "documentNamespace": "https://anchore.com/syft/image/mengzyou/hugo-latest-162a6a05-379c-49f0-a7f2-b4b738a63d1b",  "packages": [   {    "SPDXID": "SPDXRef-ed18f2a986e77aab",    "name": "alpine-baselayout",    "licenseConcluded": "GPL-2.0-only",    "description": "Alpine base dir structure and init scripts",    "downloadLocation": "https://git.alpinelinux.org/cgit/aports/tree/main/alpine-baselayout", ...   }}因为生成的文件较长,上面只输出了一小部分。补充 – SPDX (Software Package Data  Exchage) 是一个形容 SBOM 信息的凋零标准,其中将蕴含软件组件、许可版权信息以及相干的安全参考。SPDX  通过为公司和社区提供共享重要数据的通用格局来放大冗余的工作,从而简化和提供合规性。 总结这里简略的介绍了 SBOM,以及 Docker CLI 的试验性子命令 –  sbom,可能通过该命令生成 r 容器镜像多种格局的 SBOM 信息,让开发人员和须要利用容器镜像来部署服务的运维人员可能容易的获取到镜像的 SBOM 信息,从而了解到镜像的安全信息,以满足利用的合规性。同时,也可能思考将该工具退出到公司交付利用的 CI/CD 流水中,作为镜像制品的安全检查工作。 ...

June 27, 2022 · 1 min · jiezi

关于python:七个好用的装饰器

分享七个好用的装璜器,不便你撸代码。  1、dispachPython 人造反对多态,但应用 dispatch 能够让你的代码更加容易浏览。 装置: pip install multipledispatch应用: >>> from multipledispatch import dispatch>>> @dispatch(int, int)... def add(x, y):...     return x + y>>> @dispatch(object, object)... def add(x, y):...     return "%s + %s" % (x, y)>>> add(1, 2)3>>> add(1, 'hello')'1 + hello' 2、clickclick 能够很不便地让你实现命令行工具。 装置: pip install click应用:demo2.py : import click@click.command()@click.option('--count', default=1, help='Number of greetings.')@click.option('--name', prompt='Your name',              help='The person to greet.')def hello(count, name):    """Simple program that greets NAME for a total of COUNT times."""    for x in range(count):        click.echo(f"Hello {name}!")if __name__ == '__main__':    hello()运行后果: ❯ python demo2.py --count=3 --name=joihHello joih!Hello joih!Hello joih!❯ python demo2.py --count=3Your name: somenzzHello somenzz!Hello somenzz!Hello somenzz! 3、celery分布式的工作队列,非 Celery 莫属。 from celery import Celeryapp = Celery('tasks', broker='pyamqp://guest@localhost//')@app.taskdef add(x, y):    return x + y 4、deprecated这个置信大家在应用别的包时都遇到过,当要下线一个老版本的函数的时候就能够应用这个装璜器。 装置: pip install Deprecated应用:demo4.py from deprecated import deprecated@deprecated ("This function is deprecated, please do not use it")def func1():    passfunc1()运行成果如下: ❯ python demo4.pydemo4.py:6: DeprecationWarning: Call to deprecated function (or staticmethod) func1. (This function is deprecated, please do not use it)  func1() 5、deco.concurrent装置: pip install deco应用 DECO 就像在 Python 程序中查找或创立两个函数一样简略。咱们能够用 @concurrent 装璜须要并行运行的函数,用 @synchronized 装璜调用并行函数的函数,应用举例: from deco import concurrent, synchronized @concurrent # We add this for the concurrent functiondef process_url(url, data):  #Does some work which takes a while  return result@synchronized # And we add this for the function which calls the concurrent functiondef process_data_set(data):  results = {}  for url in urls:    results[url] = process_url(url, data)  return results 6、cachetools缓存工具 装置: pip install cachetools应用: from cachetools import cached, LRUCache, TTLCache# speed up calculating Fibonacci numbers with dynamic programming@cached(cache={})def fib(n):    return n if n < 2 else fib(n - 1) + fib(n - 2)# cache least recently used Python Enhancement Proposals@cached(cache=LRUCache(maxsize=32))def get_pep(num):    url = 'http://www.python.org/dev/peps/pep-%04d/' % num    with urllib.request.urlopen(url) as s:        return s.read()# cache weather data for no longer than ten minutes@cached(cache=TTLCache(maxsize=1024, ttl=600))def get_weather(place):    return owm.weather_at_place(place).get_weather() 7、retry重试装璜器,反对各种各样的重试需要。 装置: pip install tenacity应用: import randomfrom tenacity import retry@retrydef do_something_unreliable():    if random.randint(0, 10) > 1:        raise IOError("Broken sauce, everything is hosed!!!111one")    else:        return "Awesome sauce!"@retry(stop=stop_after_attempt(7))def stop_after_7_attempts():    print("Stopping after 7 attempts")    raise Exception@retry(stop=stop_after_delay(10))def stop_after_10_s():    print("Stopping after 10 seconds")    raise Exception@retry(stop=(stop_after_delay(10) | stop_after_attempt(5)))def stop_after_10_s_or_5_retries():    print("Stopping after 10 seconds or 5 retries")    raise Exception以上就是本次分享的所有内容,如果你感觉文章还不错,欢送关注公众号:Python编程学习圈,每日干货分享,发送“J”还可支付大量学习材料。或是返回编程学习网,理解更多编程技术常识。

June 27, 2022 · 1 min · jiezi

关于python:最新小红书数据app爬虫接口

咱们提供封装好的小红书数据采集接口,实时采集,接口稳固。长期保护应用便宜 接口应用详情请参考 接口地址: github 拜访地址https://github.com/ping0206gu...: 全副反对的接口如下,并且反对定制开发返回值与小红书接口一样,对数据进行透传,请依照小红书页面对照了解意思 接口数据展现

June 27, 2022 · 1 min · jiezi

关于python:英雄星球六月集训LeetCode解题日报-第24日-线段树

@TOC 日报明天两题之前都做过,从新提交一遍。这两题我测试线段树和珂朵莉都能够过,珂朵莉快一点。[[python刷题模板] 珂朵莉树 ODT](https://blog.csdn.net/liulian...)[[python刷题模板] 线段树](https://blog.csdn.net/liulian...)[[LeetCode解题报告] 699. 掉落的方块](https://blog.csdn.net/liulian...)题目一、731. 我的日程安排表 II731. 我的日程安排表 II 1. 题目形容我的日程安排表 II难度:中等 实现一个 MyCalendar 类来寄存你的日程安排。如果要增加的工夫内不会导致三重预订时,则能够存储这个新的日程安排。 MyCalendar 有一个 book(int start, int end)办法。它意味着在 start 到 end 工夫内减少一个日程安排,留神,这里的工夫是半开区间,即 [start, end), 实数 x 的范畴为, start <= x < end。 当三个日程安排有一些工夫上的穿插时(例如三个日程安排都在同一时间内),就会产生三重预订。 每次调用 MyCalendar.book办法时,如果能够将日程安排胜利增加到日历中而不会导致三重预订,返回 true。否则,返回 false 并且不要将该日程安排增加到日历中。 请依照以下步骤调用MyCalendar 类: MyCalendar cal = new MyCalendar(); MyCalendar.book(start, end) 示例: MyCalendar();MyCalendar.book(10, 20); // returns trueMyCalendar.book(50, 60); // returns trueMyCalendar.book(10, 40); // returns trueMyCalendar.book(5, 15); // returns falseMyCalendar.book(5, 10); // returns trueMyCalendar.book(25, 55); // returns true解释: 前两个日程安排能够增加至日历中。 第三个日程安排会导致双重预订,但能够增加至日历中。第四个日程安排流动(5,15)不能增加至日历中,因为它会导致三重预订。第五个日程安排(5,10)能够增加至日历中,因为它未应用曾经双重预订的工夫10。第六个日程安排(25,55)能够增加至日历中,因为工夫 [25,40] 将和第三个日程安排双重预订;工夫 [40,50] 将独自预订,工夫 [50,55)将和第二个日程安排双重预订。提醒: ...

June 26, 2022 · 3 min · jiezi

关于python:LeetCode周赛复盘-第-299-场周赛20220626

@TOC 一、本周周赛总结再次感觉到本人的菜。最初一题图论,是真的不会,打死都不会。赛后看大佬解说,照着大佬代码复写,大略了解了,然而再给我一道新题,预计还是做不进去。得练。二、 [Easy] 6101. 判断矩阵是否是一个 X 矩阵链接: 6101. 判断矩阵是否是一个 X 矩阵 1. 题目形容判断矩阵是否是一个 X 矩阵难度:简略 如果一个正方形矩阵满足下述 全副 条件,则称之为一个 X 矩阵 : 矩阵对角线上的所有元素都 不是 0矩阵中所有其余元素都是 0给你一个大小为 n x n 的二维整数数组 grid ,示意一个正方形矩阵。如果 grid 是一个 X 矩阵 ,返回 true ;否则,返回 false 。 示例 1: <img style="width: 311px; height: 320px;" src="https://assets.leetcode.com/uploads/2022/05/03/ex1.jpg" alt=""> 输出:grid = [[2,0,0,1],[0,3,1,0],[0,5,2,0],[4,0,0,2]]输入:true解释:矩阵如上图所示。X 矩阵应该满足:绿色元素(对角线上)都不是 0 ,红色元素都是 0 。因而,grid 是一个 X 矩阵。示例 2: <img style="width: 238px; height: 246px;" src="https://assets.leetcode.com/uploads/2022/05/03/ex2.jpg" alt=""> 输出:grid = [[5,7,0],[0,3,1],[0,5,0]]输入:false解释:矩阵如上图所示。X 矩阵应该满足:绿色元素(对角线上)都不是 0 ,红色元素都是 0 。因而,grid 不是一个 X 矩阵。提醒: ...

June 26, 2022 · 5 min · jiezi

关于python:4个用于构建优秀命令行用户界面的Python库

这是我对于具备优良命令行用户界面的终端应用程序的两局部系列中的第二局部。在第一篇中,我探讨了使命令行应用程序成为一种纯正的应用乐趣的个性。在第二局部,我将看看如何在一些库的帮忙下在Python中实现这些性能。在本文完结时,读者应该对如何应用 Prompt Toolkit、Click (Command Line Interface Creation Kit)、Pygments 和 Fuzzy Finder 来实现一个易于应用的 REPL有了充沛的理解。 我打算在不到20行的Python代码中实现这一指标。让咱们开始吧。 Python Prompt Toolkit我喜爱把这个库看作是命令行应用程序的瑞士军刀--它能够代替readline、curses,以及更多的货色。让咱们来装置这个库并开始应用。 pip install prompt_toolkit咱们将从一个简略的REPL开始。一般来说,REPL会承受用户输出,进行操作,并打印后果。在咱们的例子中,咱们将建设一个 "echo "的 REPL。它只是打印回用户输出的内容。 REPLfrom prompt_toolkit import promptwhile 1: user_input = prompt('>') print(user_input)这就是实现一个REPL的全部内容。它能够读取用户的输出并打印出他们所输出的内容。这个代码片段中应用的prompt函数来自prompt_toolkit库;它是readline库的替代品。 历史为了增强咱们的REPL,咱们能够增加命令历史。 from prompt_toolkit import promptfrom prompt_toolkit.history import FileHistorywhile 1: user_input = prompt( '>', history=FileHistory('history.txt'), ) print(user_input)咱们刚刚在 REPL 中增加了长久化历史。当初咱们能够应用上/下箭头来浏览历史,并应用Ctrl+R来搜寻历史。这满足了命令行的根本礼节。 主动倡议我在第一局部中谈到的可发现性技巧之一是主动倡议历史上的命令。(咱们在fish shell中看到了这个性能。)让咱们把这个性能增加到咱们的REPL中。 from prompt_toolkit import promptfrom prompt_toolkit.history import FileHistoryfrom prompt_toolkit.auto_suggest import AutoSuggestFromHistorywhile 1: user_input = prompt( '>', history=FileHistory('history.txt'), auto_suggest=AutoSuggestFromHistory(), ) print(user_input)咱们所要做的就是在prompt()的API调用中增加一个新参数。当初咱们有了一个REPL,它具备鱼式的从历史中主动倡议的性能。 ...

June 26, 2022 · 2 min · jiezi

关于python:数据清洗工具flashtext效率直接提升了几十倍数

在平时的一些的小规模的数据的过滤、荡涤过程中应用最多的就是正则表达式,然而随着数据规模的增大,正则表达式就显得有些心有余力有余了。 【浏览全文】 正则表达式在一个 10k 的词库中查找 15k 个关键词的工夫差不多是 0.165 秒。然而对于 Flashtext 而言只须要 0.002 秒。因而,在这个问题上 Flashtext的速度大概比正则表达式快 82 倍。 从下面的示例图的性能比照中,能够发现随着咱们须要解决的字符越来越多,正则表达式的处理速度简直都是线性减少的。然而,Flashtext 简直是一个常量。 1、筹备flashtext环境 通过pip的形式来装置flashtext,或是其余的形式也是能够的,这里默认应用的是清华大学的镜像站。 pip install flashtext -i https://pypi.tuna.tsinghua.edu.cn/simple在筹备好flashtext环境当前,来看一下flashtext重要的应用过程,帮忙咱们能更好的实现数据荡涤操作。 2、增加关键词 这里增加关键词时是通过单个关键词的来增加到关键词词库中,应用add_keyword函数来增加。第一次参数示意须要增加的关键词,第二个参数则示意为第一个关键词的别名,如果关键词被找到了则显示为别名的模式,若是没有应用第二个参数作为别名则还是显示原有的名称。 from flashtext import KeywordProcessor# 初始化关键词库处理器processor = KeywordProcessor()# 惯例形式增加关键词processor.add_keyword('Python')# 别名形式增加关键词processor.add_keyword('Scala', 'Java')这样别离应用两种形式曾经将须要的关键词增加到词库处理器中了。 3、提取关键词 通过上一步增加关键词,当初词库处理器中曾经存在有关键词的信息了,再应用extract_keywords将关键词提取进去即可。 # 在一个字符串中提取出关键词信息found = processor.extract_keywords('I like Python and Scala.')# 后果print(found)# ['Python', 'Java']后果进去了,跟咱们料想的是一样的,并Scala也显示为了Java。 4、替换关键词 替换关键词应用的是replace_keywords函数,前提是词库中领有别名的词能力被替换,就像下面的Scala被显示成了的Java一样。 替换一个字符串中的Scala关键词,因为Scala对应的别名是Java,所以一个字符串中的Scala应该被替换为Java。 replaced = processor.replace_keywords('I like Scala.')# 后果print(replaced)# I like Java.# Scala 果然就被替换为了Java。5、获取所有关键词 有些时候,在KeywordProcessor词库处理器中增加了哪些关键词可能本人都记不清楚了,这个时候能够应用get_all_keywords函数来获取以后的所有关键词。 all_keywords = processor.get_all_keywords()# 后果print(all_keywords)# {'python': 'Python', 'scala': 'Java'}6、批量的增加关键词 ...

June 26, 2022 · 1 min · jiezi

关于python:LeetCode解题报告-剑指-Offer-II-091-粉刷房子

一、 题目1. 题目形容剑指 Offer II 091. 粉刷房子 难度:中等 如果有一排房子,共 n 个,每个房子能够被粉刷成红色、蓝色或者绿色这三种色彩中的一种,你须要粉刷所有的房子并且使其相邻的两个房子色彩不能雷同。 当然,因为市场上不同色彩油漆的价格不同,所以房子粉刷成不同色彩的破费老本也是不同的。每个房子粉刷成不同色彩的破费是以一个 n x 3 的正整数矩阵 costs 来示意的。 例如,costs0 示意第 0 号房子粉刷成红色的老本破费;costs1 示意第 1 号房子粉刷成绿色的破费,以此类推。 请计算出粉刷完所有房子起码的破费老本。 示例 1: 输出: costs = [[17,2,17],[16,16,5],[14,3,19]]输入: 10解释: 将 0 号房子粉刷成蓝色,1 号房子粉刷成绿色,2 号房子粉刷成蓝色。 起码破费: 2 + 5 + 3 = 10。示例 2: 输出: costs = [[7,6,2]]输入: 2提醒: costs.length == ncosts[i].length == 31 <= n <= 1001 <= costsi <= 20留神:本题与主站 256 题雷同:https://leetcode-cn.com/probl... 2. 原题链接链接: 剑指 Offer II 091. 粉刷房子 ...

June 25, 2022 · 1 min · jiezi

关于python:Python-中几种属性访问的区别

起步python的提供一系列和属性拜访无关的非凡办法:__get__, __getattr__, __getattribute__, __getitem__。本文论述它们的区别和用法。 属性的拜访机制个别状况下,属性拜访的默认行为是从对象的字典中获取,并当获取不到时会沿着肯定的查找链进行查找。例如 a.x 的查找链就是,从 a.__dict__['x'] ,而后是 type(a).__dict__['x'] ,再通过 type(a) 的基类开始查找。 若查找链都获取不到属性,则抛出 AttributeError 异样。 一、__getattr__ 办法这个办法是当对象的属性不存在是调用。如果通过失常的机制能找到对象属性的话,不会调用 getattr 办法。 class A: a = 1 def __getattr__(self, item): print('__getattr__ call') return itemt = A()print(t.a)print(t.b)# output1__getattr__ callb二、__getattribute__ 办法这个办法会被无条件调用。不论属性存不存在。如果类中还定义了 getattr ,则不会调用 getattr__()办法,除非在 __getattribute 办法中显示调用__getattr__() 或者抛出了 AttributeError 。 class A: a = 1 def __getattribute__(self, item): print('__getattribute__ call') raise AttributeError def __getattr__(self, item): print('__getattr__ call') return itemt = A()print(t.a)print(t.b)所以个别状况下,为了保留 getattr 的作用,__getattribute__() 办法中个别返回父类的同名办法: def __getattribute__(self, item): return object.__getattribute__(self, item)应用基类的办法来获取属性能防止在办法中呈现有限递归的状况。 ...

June 25, 2022 · 2 min · jiezi

关于python:Python-之父新发文将替换现有解析器

几年前,有人问 Python 是否会转换用 PEG 解析器(或者是 PEG 语法,我不记得确切内容、谁说的、什么时候说的)。我略微看过这个主题,但没有脉络,就放弃了。 最近,我学了很多对于 PEG(Parsing Expression Grammars)的常识,现在我认为它是个乏味的替代品,正好替换掉我在 30 年前刚开始发明 Python 时自制的(home-grown)语法分析生成器(parser generator)(那个语法分析生成器,被称为“pgen”,是我为 Python 写下的第一段代码)。 我当初感兴趣于 PEG,起因是对 pgen 的局限性感到有些恼火了。 它应用了我本人写的 LL(1) 解析的变种——我不喜爱能够产生空字符串的语法规定,所以我禁用了它,进而略微地简化了生成解析表的算法。 同时,我还创造了一套相似 EBNF 的语法符号(译注:Extended Backus-Naur Form,BNF 的扩大,是一种形式化符号,用于形容给定语言中的语法),至今仍十分喜爱。 以下是 pgen 令我感到懊恼的一些问题。 LL(1) 名字中的 “1” 表明它只应用繁多的前向标记符(a single token lookahead),而这限度了咱们编写丑陋的语法规定的能力。例如,一个 Python 语句(statement)既能够是表达式(expression),又能够是赋值(assignment)(或者是其它货色,但那些都以 if 或 def 这类专用的关键字结尾)。 咱们心愿应用 pgen 表示法来编写如下的语法。(请留神,这个示例形容了一种玩具语言(toy language),它是 Python 的一个渺小的子集,就像传统中的语言设计一样。) statement: assignment | expr | if_statementexpr: expr '+' term | expr '-' term | termterm: term '*' atom | term '/' atom | atomatom: NAME | NUMBER | '(' expr ')'assignment: target '=' exprtarget: NAMEif_statement: 'if' expr ':' statement对于这些符号,解释几句:NAME 和 NUMBER 是标记符(token),预约义在语法之外。引号中的字符串如 '+' 或 'if' 也是标记符。(我当前会讲讲标记符。)语法规定以其名称结尾,跟在前面的是 : 号,再前面则是一个或多个以 | 符号分隔的可选内容(alternatives)。 ...

June 25, 2022 · 2 min · jiezi

关于python:对比-C-和-Python谈谈指针与引用

0 引言指针(Pointer)是 C、C++ 以及 Java、Go 等语言的一个十分外围且重要的概念,而援用(Reference)是在指针的根底上构建出的一个同样重要的概念。 指针对于任何一个编程语言而言都是必须且重要的,尽管 Python 对指针这一概念进行了刻意的含糊与限度,但指针对于 Python 而言仍然是一个必须进行深刻探讨的话题。 本文基于 C++ 与 Python,探讨了 Python 中与指针及援用相干的一些行为。 1 什么是指针?为什么须要指针?指针有两重含意: (1)指代某种数据类型的指针类型,如整形指针类型、指针指针类型 (2)指代一类寄存有内存地址的变量,即指针变量 指针的这两重含意是紧密联系的:作为一种变量,通过指针能够获取某个内存地址,从而为拜访此地址上的值做好了筹备;作为一种类型,其决定了内存地址的正确偏移长度,其应等于以后类型的单位内存大小。 如果一个指针短少指针类型,即 void *,则显然,其尽管保留了内存地址,但这仅仅是一个终点地址,指针会因为无奈获知从终点向后进行的偏移量,从而回绝解指针操作;而如果一个指针短少地址,即 nullptr,则其根本无法读取特定地位的内存。 指针存在的意义次要有以下几点: 承载通过 malloc、new、allocator 等获取的动态内存使得 pass-by-pointer 成为可能pass-by-pointer 的益处包含但不限于: 防止对实参无意义的值拷贝,大幅提高效率使得对某个变量的批改能力不局限于变量本身的作用域使得 swap、挪动构造函数、挪动赋值运算等操作能够仅针对数据结构外部的指针进行操作,从而防止了对长期对象、移后源等对象的整体内存操作由此可见,与指针相干的各操作对于编程而言都是必须的或非常重要的。 2 C++中的援用在 C++ 中,援用具备与指针类似的性质,但更加隐形与严格。C++ 的援用分为以下两种: 2.1 左值援用左值援用于其初始化阶段绑定到左值,且不存在从新绑定。 左值援用具备与被绑定左值简直一样的性质,其惟一的区别在于 decltype 申明: int numA = 0, &lrefA = numA; // Binding an lvaluecout << ++lrefA << endl; // Use the lvalue reference as lvalue & rvaluedecltype(lrefA) numB = 1; // Error!左值援用罕用于 pass-by-reference: ...

June 25, 2022 · 2 min · jiezi

关于python:编程语言之问何时该借用何时该创造

6 月 22 日,Python 之父 Guido 发了一条推特,说了 Python 的一则历史故事,他说 elif 是从 C 语言中偷过来的elif 是“else if”的简写,用于条件判断。当只有两个分支时,咱们会写成“if…else…”,当呈现更多分支时,咱们会写成如下格局: if 判断条件1: 做事件1elif 判断条件2: 做事件2else: 做其它事简写而成的 elif 不仅是缩小了几个字符,而且因为繁多而清晰的用处,它还不会给咱们带来了解或应用上的困惑。 然而,简写法并不是支流,残缺写法才是支流,C 语言中就是采纳残缺的写法: if(判断条件1){ 做事件1}else if(判断条件2){ 做事件2}else { 做其它事}没错,C 语言应用的是全拼写法,然而在它的预处理/预编译语句中,还有一个 elif 指令,Guido 所说的“偷”,就是从这来的: #if 常量表达式1// 编译1#elif 常量表达式2// 编译2#else// 编译3#endifPython 没有预编译,所以所谓的偷,跟预编译没有关系,只是在比照两种写法后,借用了更简洁的写法而已。 为什么 C 语言不把两种写法对立起来呢?这我不得而知了,而 Guido 在两种写法中,抉择了后一种非主流却更好用的写法。我想对他说,你“偷”得好啊! 实际上,留言区里的人也有同感,纷纷表示:不介意、很 okay、十分喜爱,还有人说“不是偷,而是播种(harvested)”、“不是偷,而是把它晋升了一些高度”…… print 这个词就是从 C 语言中借用来的。除此之外,如果有人认真比拟这两种语言的关键字和习惯命名,必定会发现不少雷同的内容。 编程语言间有一些共享的元素,这很常见,发明一门语言并不意味着要原创每一个词句,毕竟大部分思维是共通的,作为基础设施的词语更是如此。 那么,我忽然好奇了:发明一门编程语言时,什么时候该借用,什么时候该发明呢? 这个问题看起来可能没啥意义,因为终其一生,咱们少数人也不大可能会参加发明一门编程语言。 但我感觉它还是极有意义的,首先,发问精力值得必定,其次,它还提供了一种溯源、甄别、遴选、发明的体系性视角,我认为这是求知的正确思维形式。 带着这个纳闷,我特地想要考查的是 Python 的 for 循环。 如果你有其它语言根底,就晓得 “for 循环”通常指的是这样的三段式构造: for ( init; condition; increment ){ statement(s);}// javafor(int x = 10; x < 20; x = x+1) { System.out.print("value of x : " + x ); System.out.print("\n");}这种 C 格调的写法是很高级的货色,不少语言都借用了。然而,它的写法切实繁琐,为了更不便地遍历汇合中的元素,人们在 for 循环之外又引入了升级版的 foreach 循环: ...

June 25, 2022 · 2 min · jiezi

关于python:Python-强大的信号库-blinker-入门教程

1 信号信号是一种告诉或者说通信的形式,信号分为发送方和接管方。发送方发送一种信号,接管方收到信号的过程会跳入信号处理函数,执行完后再跳回原来的地位继续执行。 常见的 Linux 中的信号,通过键盘输入 Ctrl+C,就是发送给零碎一个信号,通知零碎退出以后过程。 信号的特点就是发送端告诉订阅者产生了什么。应用信号分为 3 步:定义信号,监听信号,发送信号。 Python 中提供了信号概念的通信模块,就是blinker。 Blinker 是一个基于 Python 的弱小的信号库,它既反对简略的点对点通信,也反对点对多点的组播。Flask 的信号机制就是基于它建设的。Blinker 的内核尽管玲珑,然而性能却十分弱小,它反对以下个性: 反对注册全局命名信号反对匿名信号反对自定义命名信号反对与接收者之间的长久连贯与短暂连贯通过弱援用实现与接收者之间的主动断开连接反对发送任意大小的数据反对收集信号接收者的返回值线程平安2 blinker 应用装置办法: pip install blinker2.1 命名信号from blinker import signal# 定义一个信号s = signal('king')def animal(args):    print('我是小钻风,大王回来了,我要去巡山')# 信号注册一个接收者s.connect(animal)if "__main__" == __name__:    # 发送信号    s.send() 2.2 匿名信号blinker 也反对匿名信号,就是不须要指定一个具体的信号值。创立的每一个匿名信号都是相互独立的。 from blinker import Signals = Signal()def animal(sender):    print('我是小钻风,大王回来了,我要去巡山')s.connect(animal)if "__main__" == __name__:    s.send()2.3 组播信号组播信号是比拟能体现出信号长处的特色。多个接收者注册到信号上,发送者只须要发送一次就能传递信息到多个接收者。 from blinker import signals = signal('king')def animal_one(args):    print(f'我是小钻风,明天的口号是: {args}')def animal_two(args):    print(f'我是大钻风,明天的口号是: {args}')s.connect(animal_one)s.connect(animal_two)if "__main__" == __name__:    s.send('大王叫我来巡山,抓个和尚做晚餐!') 2.4 接管方订阅主题接受方反对订阅指定的主题,只有当指定的主题发送音讯时才发送给接管方。这种办法很好的辨别了不同的主题。 from blinker import signals = signal('king')def animal(args):    print(f'我是小钻风,{args} 是我大哥')s.connect(animal, sender='大象')if "__main__" == __name__:    for i in ['狮子', '大象', '大鹏']:        s.send(i) 2.5 装璜器用法除了能够函数注册之外还有更简略的信号注册办法,那就是装璜器。 from blinker import signals = signal('king')@s.connectdef animal_one(args):    print(f'我是小钻风,明天的口号是: {args}')@s.connectdef animal_two(args):    print(f'我是大钻风,明天的口号是: {args}')if "__main__" == __name__:    s.send('大王叫我来巡山,抓个和尚做晚餐!')2.6 可订阅主题的装璜器connect的注册办法用着装璜器时有一个弊病就是不可能订阅主题,所以有更高级的connect_via办法反对订阅主题。 from blinker import signals = signal('king')@s.connect_via('大象')def animal(args):    print(f'我是小钻风,{args} 是我大哥')if "__main__" == __name__:    for i in ['狮子', '大象', '大鹏']:        s.send(i)2.7 查看信号是否有接收者如果对于一个发送者发送音讯前要筹备的耗时很长,为了防止没有接收者导致节约性能的状况,所以能够先查看某一个信号是否有接收者,在确定有接收者的状况下才发送,做到准确。 from blinker import signals = signal('king')q = signal('queue')def animal(sender):    print('我是小钻风,大王回来了,我要去巡山')s.connect(animal)if "__main__" == __name__:        res = s.receivers    print(res)    if res:        s.send()        res = q.receivers    print(res)    if res:        q.send()    else:        print("孩儿们都进来巡山了"){4511880240: <weakref at 0x10d02ae80; to 'function' at 0x10cedd430 (animal)>}我是小钻风,大王回来了,我要去巡山{}孩儿们都进来巡山了2.8 查看订阅者是否订阅了某个信号也能够查看订阅者是否由某一个信号 from blinker import signals = signal('king')q = signal('queue')def animal(sender):    print('我是小钻风,大王回来了,我要去巡山')s.connect(animal)if "__main__" == __name__:        res = s.has_receivers_for(animal)    print(res)    res = q.has_receivers_for(animal)    print(res)TrueFalse3 基于 blinker 的 Flask 信号Flask 集成 blinker 作为解耦利用的解决方案。在 Flask 中,信号的应用场景如:申请到来之前,申请完结之后。同时 Flask 也反对自定义信号。 3.1 简略 Flask demofrom flask import Flaskapp = Flask(__name__)@app.route('/',methods=['GET','POST'],endpoint='index')def index():    return 'hello blinker'if __name__ == '__main__':    app.run()拜访127.0.0.1:5000时,返回给浏览器hello blinker。 3.2 自定义信号因为 Flask 集成了信号,所以在 Flask 中应用信号时从 Flask 中引入。 from flask import Flaskfrom flask.signals import _signalsapp = Flask(__name__)s = _signals.singal('msg')def QQ(args):    print('you have msg from QQ')s.connect(QQ)@app.route('/',methods=['GET','POST'],endpoint='index')def index():    s.send()    return 'hello blinker'if __name__ == '__main__':    app.run() 3.3 Flask自带信号在 Flask 中除了能够自定义信号,还能够应用自带信号。Flask 中自带的信号有很多种,具体如下: ...

June 25, 2022 · 1 min · jiezi

关于python:使用-Python-开发一个-Python-解释器

计算机只能了解机器码。归根结底,编程语言只是一串文字,目标是为了让人类更容易编写他们想让计算机做的事件。真正的魔法是由编译器和解释器实现,它们弥合了两者之间的差距。解释器逐行读取代码并将其转换为机器码。 在本文中,咱们将设计一个能够执行算术运算的解释器。 咱们不会从新造轮子。文章将应用由 David M. Beazley 开发的词法解析器 —— PLY(Python Lex-Yacc。 PLY 能够通过以下形式下载: $ pip install ply咱们将粗略地浏览一下创立解释器所需的基础知识。 标记(Token)标记是为解释器提供有意义信息的最小字符单位。标记蕴含一对名称和属性值。 让咱们从创立标记名称列表开始。这是一个必要的步骤。 tokens = (    # 数据类型    "NUM",    "FLOAT",    # 算术运算    "PLUS",    "MINUS",    "MUL",    "DIV",    # 括号    "LPAREN",    "RPAREN",)词法分析器(Lexer)将语句转换为标记的过程称为标记化或词法剖析。执行词法剖析的程序是词法分析器。 # 标记的正则表白t_PLUS   = r"+"t_MINUS  = r"-"t_MUL    = r"*"t_DIV    = r"/"t_LPAREN = r"("t_RPAREN = r")"t_POW    = r"^"# 疏忽空格和制表符t_ignore = " \t"# 为每个规定增加动作def t_FLOAT(t):    r"""\d+.\d+"""    t.value = float(t.value)    return tdef t_NUM(t):    r"""\d+"""    t.value = int(t.value)    return t# 未定义规定字符的错误处理def t_error(t):    # 此处的 t.value 蕴含未标记的其余输出    print(f"keyword not found: {t.value[0]}\nline {t.lineno}")    t.lexer.skip(1)# 如果遇到 \n 则将其设为新的一行def t_newline(t):    r"""\n+"""    t.lexer.lineno += t.value.count("\n")为导入词法分析器,咱们将应用: import ply.lex as lex t_ 是一个非凡的前缀,示意定义标记的规定。每条词法规定都是用正则表达式制作的,与 Python 中的 re 模块兼容。正则表达式可能依据规定扫描输出并搜寻合乎的符号串。正则表达式定义的文法称为正则文法。正则文法定义的语言则称为正则语言。 定义好了规定,咱们将构建词法分析器。 data = 'a = 2 +(10 -8)/1.0'lexer = lex.lex()lexer.input(data)while tok := lexer.token():    print(tok)为了传递输出字符串,咱们应用 lexer.input(data)。lexer.token() 将返回下一个 LexToken 实例,最初返回 None。根据上述规定,代码 2 + ( 10 -8)/1.0 的标记将是: 紫色字符代表的是标记的名称,其后是标记的具体内容。\ 巴科斯-诺尔范式(Backus-Naur Form,BNF)大多数编程语言都能够用上下文无关文法来编写。它比惯例语言更简单。对于上下文无关文法,咱们用上下文无关语法,它是描述语言中所有可能语法的规定集。BNF 是一种定义语法的形式,它形容了编程语言的语法。让咱们看看例子: symbol : alternative1 | alternative2 … 依据产生式,: 的左侧被替换为右侧的其中一个值替换。右侧的值由 | 分隔(可了解为 symbol 定义为 alternative1 或 alternative2或…… 等等)。对于咱们的这个算术解释器,语法规格如下: expression : expression '+' expression           | expression '-' expression           | expression '/' expression           | expression '*' expression           | expression '^' expression           | +expression           | -expression           | ( expression )           | NUM           | FLOAT输出的标记是诸如 NUM、FLOAT、+、-、*、/ 之类的符号,称作终端(无奈持续合成或产生其余符号的字符)。一个表达式由终端和规定集组成,例如 expression 则称为非终端。 解析器(Parser)咱们将应用 YACC(Yet Another Compiler Compiler) 作为解析器生成器。导入模块:import ply.yacc as yacc。 from operator import (add, sub, mul, truediv, pow)# 咱们的解释器反对的运算符列表ops = {    "+": add,    "-": sub,    "*": mul,    "/": truediv,    "^": pow,}def p_expression(p):    """expression : expression PLUS expression                  | expression MINUS expression                  | expression DIV expression                  | expression MUL expression                  | expression POW expression"""    if (p[2], p[3]) == ("/", 0):        # 如果除以 0,则将“INF”(有限)作为值        p[0] = float("INF")    else:        p[0] = ops[p[2]](p[1], p[3])def p_expression_uplus_or_expr(p):    """expression : PLUS expression %prec UPLUS                  | LPAREN expression RPAREN"""    p[0] = p[2]def p_expression_uminus(p):    """expression : MINUS expression %prec UMINUS"""    p[0] = -p[2]def p_expression_num(p):    """expression : NUM                  | FLOAT"""    p[0] = p[1]# 语法错误时的规定def p_error(p):    print(f"Syntax error in {p.value}")在文档字符串中,咱们将增加适当的语法标准。p 列表中的的元素与语法符号一一对应,如下所示: expression : expression PLUS expressionp[0]         p[1]       p[2] p[3]在上文中,%prec UPLUS 和 %prec UMINUS 是用来示意自定义运算的。%prec 即是 precedence 的缩写。在符号中原本没有 UPLUS 和 UMINUS 这个说法(在本文中这两个自定义运算示意一元正号和符号,其实 UPLUS 和 UMINUS 只是个名字,想取什么就取什么)。之后,咱们能够增加基于表达式的规定。YACC 容许为每个令牌调配优先级。咱们能够应用以下办法设置它: precedence = (    ("left", "PLUS", "MINUS"),    ("left", "MUL", "DIV"),    ("left", "POW"),    ("right", "UPLUS", "UMINUS"))在优先级申明中,标记按优先级从低到高的顺序排列。PLUS 和 MINUS 优先级雷同并且具备左联合性(运算从左至右执行)。MUL 和 DIV 的优先级高于 PLUS 和 MINUS,也具备左联合性。POW 亦是如此,不过优先级更高。UPLUS 和 UMINUS 则是具备右联合性(运算从右至左执行)。 要解析输出咱们将应用: parser = yacc.yacc()result = parser.parse(data)print(result)残缺代码如下: ###################################### 引入模块                           ######################################from logging import (basicConfig, INFO, getLogger)from operator import (add, sub, mul, truediv, pow)import ply.lex as leximport ply.yacc as yacc# 咱们的解释器反对的运算符列表ops = {    "+": add,    "-": sub,    "*": mul,    "/": truediv,    "^": pow,}###################################### 标记集                             ######################################tokens = (    # 数据类型    "NUM",    "FLOAT",    # 算术运算    "PLUS",    "MINUS",    "MUL",    "DIV",    "POW",    # 括号    "LPAREN",    "RPAREN",)###################################### 标记的正则表达式                    ######################################t_PLUS   = r"+"t_MINUS  = r"-"t_MUL    = r"*"t_DIV    = r"/"t_LPAREN = r"("t_RPAREN = r")"t_POW    = r"^"# 疏忽空格和制表符t_ignore = " \t"# 为每个规定增加动作def t_FLOAT(t):    r"""\d+.\d+"""    t.value = float(t.value)    return tdef t_NUM(t):    r"""\d+"""    t.value = int(t.value)    return t# 未定义规定字符的错误处理def t_error(t):    # 此处的 t.value 蕴含未标记的其余输出    print(f"keyword not found: {t.value[0]}\nline {t.lineno}")    t.lexer.skip(1)# 如果看到 \n 则将其设为新的一行def t_newline(t):    r"""\n+"""    t.lexer.lineno += t.value.count("\n")###################################### 设置符号优先级                      ######################################precedence = (    ("left", "PLUS", "MINUS"),    ("left", "MUL", "DIV"),    ("left", "POW"),    ("right", "UPLUS", "UMINUS"))###################################### 书写 BNF 规定                      ######################################def p_expression(p):    """expression : expression PLUS expression                  | expression MINUS expression                  | expression DIV expression                  | expression MUL expression                  | expression POW expression"""    if (p[2], p[3]) == ("/", 0):        # 如果除以 0,则将“INF”(有限)作为值        p[0] = float("INF")    else:        p[0] = ops[p[2]](p[1], p[3])def p_expression_uplus_or_expr(p):    """expression : PLUS expression %prec UPLUS                  | LPAREN expression RPAREN"""    p[0] = p[2]def p_expression_uminus(p):    """expression : MINUS expression %prec UMINUS"""    p[0] = -p[2]def p_expression_num(p):    """expression : NUM                  | FLOAT"""    p[0] = p[1]# 语法错误时的规定def p_error(p):    print(f"Syntax error in {p.value}")###################################### 主程式                             ######################################if __name__ == "__main__":    basicConfig(level=INFO, filename="logs.txt")    lexer = lex.lex()    parser = yacc.yacc()    while True:        try:            result = parser.parse(                input(">>>"),                debug=getLogger())            print(result)        except AttributeError:            print("invalid syntax")论断因为这个话题的体积宏大,这篇文章并不能将事物齐全的解释分明,但我心愿你能很好地了解文中涵盖的表层常识。我很快会公布对于这个话题的其余文章。谢谢你,祝你有个美妙的一天。 以上就是本次分享的所有内容,如果你感觉文章还不错,欢送关注公众号:Python编程学习圈,每日干货分享,发送“J”还可支付大量学习材料。或是返回编程学习网,理解更多编程技术常识。

June 25, 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 将过程代码放在代码块中,这样它们就能够被用于传递。 而后,在each办法中,应用yield与代码块进行交互,将值传递给代码块来做你须要做的事件(对于任何办法,代码块都是一种隐式参数)。 如果咱们重写下面的代码,会成这样: class Stuff  def initialize    @a_list = [1, 2, 3, 4]  end  def each    for item in @a_list      yield item    end  endend应用each进行迭代: Stuff.new().each do |item|  puts itemend不是将数据传给 for 循环(Python),而是将循环代码传给数据(Ruby)。 但区别还远不止于此: Python 构建相似于 for 的构造,用于各种解决;Ruby 将数据处理工作放到办法中。 优良的 Python 代码应用列表和字典解析式来实现map和filter,这些表达式的外围与 for/迭代的语义是雷同的。 In [2]: [item for item in Stuff()]Out[2]: [1, 2, 3, 4]In [3]: [item for item in Stuff() if item % 2 == 0]Out[3]: [2, 4]Ruby 则持续应用办法优先的形式,除了each办法,还有一系列罕用于解决汇合的新办法,如下所示: class Stuff  ...  def select    out = []    each do |e|      # If block returns truthy on e, append to out      if yield(e)        out << e      end    end    out  end  def map    out = []    # One line block syntax, append output of block processed on e to out    each {|e| out << yield(e) }     outendputs Stuff.new().map {|item| item}puts Stuff.new().select{|item| item.even?}Python 说:“你通知咱们如何迭代你的实例,咱们将决定如何解决你的数据。” Python 有一些基于语言的用作迭代和解决的原语,如果要自定义迭代,只需将正确的代码增加到 for 循环体(或表达式)中。 Ruby 反转了剧本,赋予对象更深层的可定制性。是的,在某些状况下,咱们能够在代码块中增加更多的控制流。是的,咱们也能够把 each 办法用来做 map。然而 Ruby 容许对象们实现不同的 map 和 each(如果将“each”的实现用于“map”,可能会十分不现实,甚至不平安)。Ruby 的对象在解决其数据方面,有着更好的办法。 ...

June 25, 2022 · 1 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 ? from functools import wrapsdef decorator1(func):    @wraps(func)    def wrapper(*args, **kwargs):        print('Decorator 1')        return func(*args, **kwargs)    return wrapperdef decorator2(func):    @wraps(func)    def wrapper(*args, **kwargs):        print('Decorator 2')        return func(*args, **kwargs)    return wrapper@decorator1@decorator2def add(x, y):    return x + yadd(1,2)# Decorator 1# Decorator 2答复这个问题之前,我先给你打个形象的比喻,装璜器就像函数在穿衣服,离它最近的最先穿,离得远的最初穿,上例中 decorator1 是外套,decorator2 是内衣。 add = decorator1(decorator2(add))在调用函数的时候,就像脱衣服,先解除最里面的 decorator1,也就是先打印 Decorator1,执行到 return func(*args, **kwargs) 的时候会去解除 decorator2,而后打印 Decorator2,再次执行到 return func(*args, **kwargs) 时会真正执行 add() 函数。 须要留神的是打印的地位,如果打印字符串的代码位于调用函数之后,像上面这样,那输入的后果正好相同: def decorator1(func):    @wraps(func)    def wrapper(*args, **kwargs):        result = func(*args, **kwargs)        print('Decorator 1')        return result    return wrapperdef decorator2(func):    @wraps(func)    def wrapper(*args, **kwargs):        result = func(*args, **kwargs)        print('Decorator 2')        return result    return wrapper装璜器不仅能够定义为函数,也能够定义为类,只有你确保它实现了__call__() 和 __get__() 办法。 元类Python 中所有类(object)的元类,就是 type 类,也就是说 Python 类的创立行为由默认的 type 类管制,打个比喻,type 类是所有类的先人。咱们能够通过编程的形式来实现自定义的一些对象创立行为。 定一个类继承 type 类 A,而后让其余类的元类指向 A,就能够管制 A 的创立行为。典型的就是应用元类实现一个单例: class Singleton(type):    def __init__(self, *args, **kwargs):        self._instance = None        super().__init__(*args, **kwargs)    def __call__(self, *args, **kwargs):        if self._instance is None:            self._instance = super().__call__(*args, **kwargs)            return self._instance        else:            return self._instanceclass Spam(metaclass=Singleton):    def __init__(self):        print("Spam!!!")元类 Singleton 的__init__和__new__ 办法会在定义 Spam 的期间被执行,而 __call__办法会在实例化 Spam 的时候执行。 descriptor 类(描述符类)descriptor 就是任何一个定义了 __get__(),__set__()或 __delete__()的对象,形容器让对象可能自定义属性查找、存储和删除的操作。这里举官网文档[1]一个自定义验证器的例子。 定义验证器类,它是一个描述符类,同时还是一个抽象类: from abc import ABC, abstractmethodclass Validator(ABC):    def __set_name__(self, owner, name):        self.private_name = '_' + name    def __get__(self, obj, objtype=None):        return getattr(obj, self.private_name)    def __set__(self, obj, value):        self.validate(value)        setattr(obj, self.private_name, value)    @abstractmethod    def validate(self, value):        pass自定义验证器须要从 Validator 继承,并且必须提供 validate() 办法以依据须要测试各种束缚。 这是三个实用的数据验证工具: OneOf 验证值是一组受约束的选项之一。 class OneOf(Validator):    def __init__(self, *options):        self.options = set(options)    def validate(self, value):        if value not in self.options:            raise ValueError(f'Expected {value!r} to be one of {self.options!r}')Number 验证值是否为 int 或 float。依据可选参数,它还能够验证值在给定的最小值或最大值之间。 class Number(Validator):    def __init__(self, minvalue=None, maxvalue=None):        self.minvalue = minvalue        self.maxvalue = maxvalue    def validate(self, value):        if not isinstance(value, (int, float)):            raise TypeError(f'Expected {value!r} to be an int or float')        if self.minvalue is not None and value < self.minvalue:            raise ValueError(                f'Expected {value!r} to be at least {self.minvalue!r}'            )        if self.maxvalue is not None and value > self.maxvalue:            raise ValueError(                f'Expected {value!r} to be no more than {self.maxvalue!r}'            )String 验证值是否为 str。依据可选参数,它能够验证给定的最小或最大长度。它还能够验证用户定义的 predicate。 class String(Validator):    def __init__(self, minsize=None, maxsize=None, predicate=None):        self.minsize = minsize        self.maxsize = maxsize        self.predicate = predicate    def validate(self, value):        if not isinstance(value, str):            raise TypeError(f'Expected {value!r} to be an str')        if self.minsize is not None and len(value) < self.minsize:            raise ValueError(                f'Expected {value!r} to be no smaller than {self.minsize!r}'            )        if self.maxsize is not None and len(value) > self.maxsize:            raise ValueError(                f'Expected {value!r} to be no bigger than {self.maxsize!r}'            )        if self.predicate is not None and not self.predicate(value):            raise ValueError(                f'Expected {self.predicate} to be true for {value!r}'            )理论利用时这样写: class Component:    name = String(minsize=3, maxsize=10, predicate=str.isupper)    kind = OneOf('wood', 'metal', 'plastic')    quantity = Number(minvalue=0)    def __init__(self, name, kind, quantity):        self.name = name        self.kind = kind        self.quantity = quantity形容器阻止有效实例的创立: >>> Component('Widget', 'metal', 5)      # Blocked: 'Widget' is not all uppercaseTraceback (most recent call last):    ...ValueError: Expected <method 'isupper' of 'str' objects> to be true for 'Widget'>>> Component('WIDGET', 'metle', 5)      # Blocked: 'metle' is misspelledTraceback (most recent call last):    ...ValueError: Expected 'metle' to be one of {'metal', 'plastic', 'wood'}>>> Component('WIDGET', 'metal', -5)     # Blocked: -5 is negativeTraceback (most recent call last):    ...ValueError: Expected -5 to be at least 0>>> Component('WIDGET', 'metal', 'V')    # Blocked: 'V' isn't a numberTraceback (most recent call last):    ...TypeError: Expected 'V' to be an int or float>>> c = Component('WIDGET', 'metal', 5)  # Allowed:  The inputs are valid最初的话对于 Python 的元编程,总结如下: ...

June 25, 2022 · 1 min · jiezi

关于python:一个help函数解决了python的所有文档信息查看

在python中的交互式命令行中提供了help函数来查问各个模块,或是公共函数,或是模块下的函数接口等都能够应用help函数来查看接口文档。 【浏览全文】 不过要查看这样的文档还是得有些英文功底的,蕴含函数、模块、变量的介绍都是通过英文来介绍的。 1、模块文档查看 关上控制台,这里应用的控制台工具是cmder,看起来比默认的cmd命令行难看的多。 比如说须要查看pandas模块的接口文档,能够应用help("pandas")命令查看。 因为以后页面可能不够显示一个模块的文档,所以能够不停的按下enter键来进行一行一行的查看文档直到查完为止。 2、模块.函数文档查看 同样的还是以pandas模块的函数为例,这次来看一下pandas.read_csv函数的接口文档。 同样应用不停的按下enter键来进行一行一行的查看文档。 3、公共函数文档查看 公共函数的阐明,比方print函数就是罕用的规范公共函数。查看接口文档时同样应用help命令来查看。 一个help命令解决了所有的文档接口查看性能,包含模块接口、模块上面的函数、公共函数都能够应用help函数来查看相干的文档。 【往期精彩】 python 自定义异样/raise关键字抛出异样 python 本地音乐播放器制作过程(附残缺源码) 自动化工具:PyAutoGUI的鼠标与键盘管制,解放双手的利器! 来自程序猿的生日蛋糕你见过吗? 懒人python操作,代码中永远只须要导入一个库...

June 24, 2022 · 1 min · jiezi

关于python:Python高效编程

"Life is short, I use python"这句喜闻乐见的宣传语,在某种程度上表白了应用python开发软件的高效。以笔者目前的能力来说,python开发软件的高效次要体现在两个方面:1. 简略且贴合自然语言的语法设计,这使得python程序的可读性极佳,可能缩小将逻辑转换为程序,查看逻辑谬误的老本。2. (简直)一切都是对象的形象形式,凭此,软件开发者首先能够将物理世界的客观事物都形象为程序中的对象,而后自在组织及操作。本文将从python程序的执行和python程序中所有皆为对象两个话题,具体论述笔者对python高效编程的浅见。 因自己满腹经纶,故行文之间恐有纰漏,望诸君海涵,不吝赐教,若能予以斧正,则感激不尽。 python程序的执行图1 first.py 有一个first.py文件, 内容如图1所示。python解释器执行后,顺次输入the first file和the main function。由此可知,python解释器是“逐行解释”程序的。 图2 second.py 在first.py的同级目录下增加一个second.py文件, 内容如图2所示,first.py的内容更新为图3所示。python解释器执行first.py后,顺次输入the second file,the first file和the main function。这阐明,import语句被最先执行,而且second.py不是主module。此外,同级目录下多了一个__pycache__目录,其内有一个second.cpython-38.pyc文件(笔者应用的是CPython3.8解释器),它是一个binary文件,执行python second.cpython-38.pyc后,打印the second file。由此可知,python解释器是先编译second.py,而后将pyc文件给first.py应用。因而python解释器运行python程序的过程,蕴含了编译与解释两个阶段。 图3 更新后的first.py 从上述内容可知,import的语义是导入pyc文件。那么,python解释器抛出ModuleNotFoundError的本质是,__pycache__的父目录没有被退出到python解释器的搜寻门路中。个别地,python解释器的搜寻门路包含python解释器执行的当前目录,规范库及pip装置目录,环境变量PYTHONPATH以及sys.path.insert/append动静增加的目录。进一步地,python解释器是如何执行”import second“这条语句的呢?python官网文档在importlib中给出了答案[1]。首先调用__init__.py文件中的import_module函数,而后调用_bootstrap.py文件中的_gcd_import函数,最初调用同文件下的_find_and_load函数,其源码如下图4所示。通过源码可知,python将程序运行所需的所有模块都保留在了sys.modules中,它是一个字典。 图4 _find_and_load函数源码 python程序中所有皆为对象批改first.py文件的内容如图5所示,python解释器执行first.py后,输入内容如正文所示,这里,咱们先断言它们都是类的实例化对象。如何验证呢? 图5 first.py python提供了__class__属性来获取对象的类。批改first.py文件内容如图6所示, 拜访它们的__class__后,输入的类如正文所示,由此验证了它们都是对象。而且,输入的这些类与MyClass一样,它们仍是类的实例化对象,能够持续拜访__class__属性,输入的类均为<class 'type'>。此时,咱们发现module,function和int的类都是type,而且type的类仍是type。由此可知,python的对象体系如图7所示,其中type被称作metaclass。 图6 first.py的类 联合python解释器逐行解释的工作原理可知,def myFunc通过编译、解释后会被创立为名为myFunc的function对象,class MyClass通过编译、解释后会被创立为名为MyClass的class对象。查阅python官网文档可知,类function实例化的function对象myFunc只容许被调用以及作为参数传递,MyClass则能够实例化object[2]。而且,Class MyClass等同于MyClass = type('MyClass', (), {}),其中type(className, bases, dict, **kwds)为type的一种构造函数[3]。 图7 python的对象体系 了解了python在宏观层面的对象体系后,咱们将眼光聚焦到对象自身。在python中,object是数据和办法的聚合体, 其中数据与办法的可调用对象, 统称为object的属性(attribute),内置函数dir(object)能够查看object的属性,object调用拜访符"."能够拜访它的属性。例如, 在first.py的同级目录下增加一个third.py文件, 内容如图8所示。python解释器执行third.py后,third.py中的输入内容如图8中正文所示。由此可知,module对象second,class对象MyClass及function对象myFunc,都是module对象first的属性。在third.py中应用first.XXX即可拜访它们。通过属性__module__,对象能够取得它隶属的module的名称。 图8 third.py 除了符号"."以外,python还提供了内置函数getattr(object, name),可能通过字符串映射到object的属性。与之绝对地,内置函数setattr(object, name, value)则用于更新属性的值,这就是python的反射机制。因为python程序中简直所有皆为对象,所以熟练掌握这些内置函数后,软件开发者可能轻松实现基于字符串的事件驱动。 至此,咱们梳理一下上述内容:1. 解释器逐行解释python程序。2. python文件被import后,会被python解释器转换成module对象。3. 所有module对象被演绎在sys.modules字典内,key是moudle对象的名称。4. python文件内的class对象,function对象,根本数值对象,module对象,都是该python文件被转换后的module对象的属性。5. __class__属性能够获取对象的class对象,__module__属性能够获取对象隶属模块的名称。6. 内置函数getattr和setattr实现了以字符串映射到object的属性。 ...

June 24, 2022 · 1 min · jiezi

关于python:为什么-Python-3-把-print-改为函数

摘要题目已阐明了所有——本 PEP 提议应用新的内置函数 print() 来代替 print 语句,并倡议给此新函数应用非凡的签名(signature )。 原理论述print 语句 早就被列在了不牢靠的语言个性列表中,例如 Guido 的“Python 之悔”(Python Regrets)演讲【1】,并打算在 Python 3000 版本移除。因而,本 PEP 的目标并不陈腐,只管它可能会在 Python 开发人员中引起较大争议。 以下对 print() 函数的争议是提取自 Guido 自己的 Python-3000 音讯【2】: print 是惟一的应用程序级性能,并领有专属的语句。在 Python 的世界里,当某些工作在不通过编译器的帮忙就无奈实现的状况下,语法(syntax)通常会被用作最初的伎俩。在这种异常情况下,print 并不适合。在开发应用程序的时候,人们常常须要用更简单的货色来代替 print 输入,例如调用 logging,或者调用其它的 I/O 库。至于 print() 函数,这是个含糊其辞的字符替换,现在它混搭了所有那些括号,还可能会转换 >>stream 款式的语法。为 print 设置非凡的语法只会给进化带来一个更加微小的屏障,例如这有个猜测,一个新的 printf() 函数不必多久就会呈现,跟 print() 函数共存。当须要一个不同的分隔符(不是空格,或者没有分隔符)时,没有简略的办法能够将 print 语句转换成另一个调用。同样地,应用其它一些分隔符而非空格时,根本无法不便地打印对象。如果 print() 是个函数,就能够非常容易地在一个模块内替换它(仅需 def print(*args):…),甚至能够在整个程序内替换(例如放一个不同的办法进 __builtin__.print)。实际上,要做到这点,还能够写一个带 write() 办法的类,而后定向给 sys.stdout ,这想法不错,但无疑是一个十分微小的概念飞跃,而且跟 print 相比,它工作在不同的层级。设计规格print() 的书写形式取自各种邮件,最近公布在 python-3000 列表里的是【3】: def print(*args, sep=' ', end='\n', file=None)调用像: ...

June 24, 2022 · 1 min · jiezi

关于python:Python-高速增长的三次历史机遇

很多对Python不相熟的人,认为Python在最近这些年的衰亡是运气而已。本文帮忙大家回顾一下过来十几年Python的3次增长和对应的历史背景。 Python设计之处的特点,包含易学易用,以及作为胶水语言。易学易用是个难以量化的货色,但至多我接触的绝大多数敌人都认同Python在学习和应用上是比大部分语言简略的。有些人不认同Python通常也不是认为Python绝对其余语言难学,而是认为Python的运行速度慢,或者动静类型语言的通病。至于胶水语言就比拟窄了,面向作为胶水而设计的语言是很少的,印象里只有Lua算得上一个。另一个Python相较其余语言的劣势是字符串解决。 以下介绍Python取得倒退的3次机遇期。 2006年的搜寻/NLP:2006年前后正好是搜索引擎公司倒退的暴发期。那一年Google中国李开复搞了关门弟子打算,百度也做了诸多广告,比方百度更懂中文系列。在那个时代搜索引擎就是IT行业的高科技。之后不久,阿里巴巴也搞了个ASC(阿里巴巴搜寻技术钻研核心),起初屡次追潮流更名,始终作为阿里巴巴外部的前沿研发部门。 而Python用作搜索引擎和NLP是很有历史的。晚期Google在90年代开发搜索引擎爬虫就是应用Python实现的。而即使是当初,开发爬虫,Python也基本上就是第一抉择。很多人学习Python的入门程序也是爬虫。而Python适宜开发爬虫的关键在于Python的字符串解决是很不便的。 也就是从2006年末开始,国内的python-cn邮件列表涌入了大量的新人,并以爬虫为例开始深刻学习Python。 2010年的WEB守业潮:2010年开始,国内外呈现了新一轮的守业潮,大家开发的是各种各样的网站。此时的WEB开发上,Python曾经逐渐成为支流WEB服务器开发选项中的一种。绝对于同时代的Java和PHP等,有着开发效率上的劣势。 正因为晚期守业公司须要迅速的迭代和试错,使得这个时代的Python成为了一个不错的选项。进而让更多工程师开始学习起来Python。 也就是从这个期间开始,才逐步有较多的公司会公开招聘Python工程师。在此前招聘Python工程师的广告是十分十分少见的。 2014年的Deep Learning:从2014年开始火起来的深度学习上,Python的劣势是近乎相对的。深度学习的支流开发语言只有C++和Python两种了,其余语言能够认为基本就没能在这里分到什么像样的空间。所有支流的Deep Learning框架,也是官网间接提供了C++和Python两种接口。而因为C++开发的难度,以后的确有不少从业工程师是间接用Python搞定深度学习的相干步骤。 这次Python的增长期被更多不理解Python的人认为是Python的狗屎运。但其背地的逻辑反倒是十分坚硬的。起因就是Python是个很好的胶水。最后的终点是numpy库。 numpy是封装了BLAS的科学计算库。BLAS是对CPU向量指令集高度优化的数学运算库。通过BLAS进行科学计算能够失去顶级的计算性能,这个计算性能比未经向量指令集优化的C程序还能快上数倍。而numpy的另一个重要特点就是,把buffer做了封装,使得buffer的内容是无需Python解决的,而是理论交给特定的软件库来解决,numpy只是负责保护该buffer的生命周期,形态等元数据。这就使得numpy的计算性能不会受到Python的影响,但同时却能够利用Python的易学易用来治理buffer的生命周期。 numpy对buffer的治理带来的易用性劣势在起初失去了很大的倒退。如以下几点: OpenCV:在opencv-python中就是应用了numpy.array来治理图像数据,却没有像C++接口一样应用Mat。同样的顶级性能。 PyCuda/PyOpenCL:也是利用了numpy.array来通明传递数据给GPU做高性能计算。尤其是集成了JIT,使得能够用字符串的形式传递kernel function,不再像C++一样要独立编译一遍。 Caffe/TensorFlow:同样利用了numpy.array,并利用了PyCuda/PyOpenCL的集成。 所以这样一路发现下来,由Python是个好胶水,就真的把若干很好用的库全流程的粘在了一起。在流程集成上都是顶级的性能,而没有Python的性能损耗,同时带来了十分好的易用性。 相比其余语言,对这些C/C++库的玩法都是先封装一层对象,包准封装的前后对不上。而且因为大部分语言并不是面向胶水设计,开发C接口都很艰难。天然与这些高性能计算库的联合困难重重。累计起来就与Python产生了差距。 以上就是本次分享的所有内容,想要理解更多 python 常识欢送返回公众号:Python 编程学习圈 ,发送 “J” 即可收费获取,每日干货分享

June 24, 2022 · 1 min · jiezi

关于python:当-Python-中混进一只薛定谔的猫……

Python 是一门弱小的动静语言,那动静体现在哪里,弱小又体现在哪里呢? 除了好的方面,Python 的动态性是否还藏着一些应用陷阱呢,有没有方法辨认与防止呢? 沿着它的动静个性话题,有几篇文章顺次探及了:动静批改变量、动静定义函数、动静执行代码等内容,然而,当混合了变量赋值、动静赋值、命名空间、作用域、函数的编译原理等等内容时,问题就可能会变得十分辣手。 因而,这篇文章将后面一些内容融汇起来,再做一次延展的探讨,心愿可能理清一些应用的细节,更深刻地摸索 Python 语言的神秘。 (1)纳闷重重的例子先看看这一个例子: # 例0def foo(): exec('y = 1 + 1') z = locals()['y'] print(z)foo()# 输入:2exec() 函数的代码块中定义了变量 y,这个值能够被随后的 locals() 取到,在赋值后也打印了进去。然而,在这个例子的根底上,只需做出小小的扭转,后果就可能大不相同了。 # 例1def foo(): exec('y = 1 + 1') y = locals()['y'] print(y)foo()# 报错:KeyError: 'y'把前例的 z 改为 y ,就报错了。其中,KeyError 指的是在字典中不存在对应的 key 。为什么会这样呢,新赋值的变量是 y 或者 z,为什么对后果有这么不同的影响? 试试把 exec 去掉,不报错! # 例2def foo(): y = 1 + 1 y = locals()['y'] print(y)foo()# 2问题:间接对 y 赋值,跟动静地在 exec() 中赋值,会对 locals() 取值产生怎么的影响? ...

June 24, 2022 · 2 min · jiezi

关于python:lenx-击败-xlen从内置函数看-Python-的设计思想

内置函数是 Python 的一大特色,用极简的语法实现很多罕用的操作。 它们事后定义在内置命名空间中,开箱即用,所见即所得。Python 被公认是一种老手敌对型的语言,这种说法可能成立,内置函数在其中起到了极要害的作用。 举个例子,求字符串 x 的长度,Python 的写法是 len(x) ,而且这种写法对列表、元组和字典等对象也同样实用,只须要传入对应的参数即可。len() 函数是共用的。 这是一种极简哲学的体现:Simple is better than complex。 然而,有些语言并不是这样,例如在 Java 中,字符串类有一个求长度的办法,其它类也有本人的求长度的办法,它们无奈共用。每次应用时,通过类或实例来调用。 同样是求字符串长度,Python 的写法: saying = "Hello world!"print(len(saying))# 后果:12而在 Java 中,写法可能如下(简化起见): String saying = "Hello world!";System.out.println(saying.length());// 后果:12Python 采纳的是一种前缀表达式 ,而 Java 采纳的则是后缀表达式 。 除了求长度,Python 的某些内置函数也能在 Java 中找到对应的表白。例如,数值型字符串 s 转化为整型数字,Python 能够用int(s)函数,而 Java 能够用 Integer.parseInt(s);整型数字转化为字符串,Python 能够用str(i),而 Java 也有String.valueOf(i)。 Python 的内置函数不与特定的类绑定,它们是一级对象。而 Java 的“函数”则无奈脱离类而存在,它们只是附属品。 从直观角度来看,Python 的表白仿佛是更优的。然而,它们并不具备可比性 ,因为这是两套语言零碎,各有独特的领域背景,并不能轻易地化约。 就好比是,不能因为拉丁字母笔画简略,就说它优于汉字,因为在表意时,字母(表音文字)是远逊于汉字(表意文字)的。同样的,日本借用了汉字的偏旁部首而造出来的文字,尽管更省笔墨,然而也齐全丢失了意蕴。 以此类比,Python 的内置函数虽有简便之美,但却失落了某些表意性能。有些人在质疑/鞭挞 Python 的时候,也喜爱拿这点说事,认为这是 Python 的设计缺点。 这就引出本文最想探讨的一个问题来:为什么 Python 要设计成 len(x) 这种前缀表白,而不是 x.len() 这样的后缀表白呢? ...

June 24, 2022 · 2 min · jiezi

关于python:三行Python代码实现数据库和excel之间的导入导出

之前有小伙伴私信我应用python如何将excel文件与mysql之间进行疾速转换?明天我把这个计划写进去供大家参考。 数据库->Excel应用Python代码实现数据从数据库导入到Excel其实很简略,三行代码就能够搞定! 咱们首先看一下数据库外面有一个 department这个部门表。这个表里有六条数据,别离代表不同的部门。接下来看一下这个Python代码,首先导入须要用到的库SQLAlchemy,这是Python中最有名的ORM工具。 全称Object Relational Mapping(对象关系映射)。 为什么要应用SQLAlchemy? 它能够将你的代码从底层数据库及其相干的SQL个性中形象进去。特点是操纵Python对象而不是SQL查问,也就是在代码层面思考的是对象,而不是SQL,体现的是一种程序化思维,这样使得Python程序更加简洁易读。 具体应用办法如下: from sqlalchemy import create_engineimport pandas as pd# 创立数据库连贯engine = create_engine('mysql+pymysql://root:211314@localhost/hong')# 读取mysql数据db = pd.read_sql(sql='select * from hong.department', con=engine)# 导出数据到exceldb.to_excel('部门数据.xlsx')第一行代码就是首先创立数据库的连贯。我的mysql用户名是root,明码是211314,因为这里我启动是启动的是本地的数据库服务,所以是localhost。斜杠前面跟的是这个数据库的名称hong 第二行代码就是应用pandas的read_sql()查问mysql表department中的数据 第二行代码就是将查问进去的数据通过pandas的to_excel()写到本地 执行后果胜利写入本地excel文件 Excel->数据库接下来咱们再看看如何将本地的xlsx数据写入到mysql文件中。 from sqlalchemy import create_engineimport pandas as pd# 创立数据库连贯engine = create_engine('mysql+pymysql://root:211314@localhost/hong')# 读取xlsx文件df = pd.read_excel('模仿数据.xlsx')# 导入到mysql数据库df.to_sql(name='test_data', con=engine, index=False, if_exists='replace')同样第一行代码就是首先创立数据库的连贯第二行代码应用pandas的read_excel()读取本地文件。如下:这是我用python的faker模仿进去的一百条数据 第三步应用pandas的to_sql()办法将读取到的数据写入到mysql中代码执行实现后返回mysql中我的hong数据库发现多出了一个test_data的表。 关上看一下。那这个数据就跟本地的数据是一样的。所以。这里咱们用到三行代码从数据库向excel导入数据,又用了三行代码从excel向数据库导入数据。 总结一下:双向数据导入,都是3行代码即可实现。 从数据库向excel导入数据: 1、用sqlalchemy创立数据库连贯 2、用pandas的read_sql读取数据库的数据 3、用pandas的to_csv把数据存入csv文件 从excel向数据库导入数据: 1、用sqlalchemy创立数据库连贯 2、用pandas的read_csv读取csv的数据 3、用pandas的to_sql把数据存入数据库 以上就是本次分享的所有内容,如果你感觉文章还不错,欢送关注公众号:Python编程学习圈,每日干货分享,发送“J”还可支付大量学习材料。或是返回编程学习网,理解更多编程技术常识。

June 24, 2022 · 1 min · jiezi

关于python:30-个Python代码实现的常用功能附案例源码

1、冒泡排序 2、计算x的n次方的办法 3、计算aa + bb + c*c + …… 4、计算阶乘 n! 5、列出当前目录下的所有文件和目录名 6、把一个list中所有的字符串变成小写: 7、输入某个门路下的所有文件和文件夹的门路 8、输入某个门路及其子目录下的所有文件门路 9、输入某个门路及其子目录下所有以.html为后缀的文件 10、把原字典的键值对颠倒并生产新的字典 11、打印九九乘法表 通过指定end参数的值,能够勾销在开端输入回车符,实现不换行。 12、替换列表中所有的3为3a 13、打印每个名字 长于应用 range() ,会使问题变得简略 14、合并去重 15、随机生成验证码的两种形式 16、计算平方根 17、判断字符串是否只由数字组成 18、判断奇偶数 19、判断平年 20、获取最大值 21、斐波那契数列斐波那契数列指的是这样一个数列 0, 1, 1, 2, 3, 5, 8, 13;特地指出:第0项是0,第1项是第一个1。从第三项开始,每一项都等于前两项之和。 ...

June 24, 2022 · 1 min · jiezi

关于python:Frida-Hook-Md5加密类

改一下包名即可应用import frida,sysdef on_message(message,data): if message['type'] == 'send': print("[*] {0}".format(message['payload'])) else: print(message)jscode = """//打印调用堆栈function printstack(){ send(Java.use("android.util.Log").getStackTraceString(Java.use("java.lang.Exception").$new()));}//array 转成 stringfunction array2string(array){ var buffer = Java.array('byte',array); var result = ""; for(var i = 0; i< buffer.length; ++i){ result += (String.fromCharCode(buffer[i])); } return result;}Java.perform( function(){ var MessageDigest = Java.use('java.security.MessageDigest'); MessageDigest.update.overload('[B').implementation = function(bytesarray){ send('I am here 0:'); //var String = Java.use('java.lang.String').$new(bytesarray); send("ori:"+array2string(bytesarray)); printstack(); this.update(bytesarray); }, MessageDigest.update.overload('java.nio.ByteBuffer').implementation = function(bytesarray){ send('I am here 1:'); //var String = Java.use('java.lang.String').$new(bytesarray); //send("ori:"+array2string(bytesarray)); //printstack(); this.update(bytesarray); }, MessageDigest.update.overload('byte').implementation = function(bytesarray){ send('I am here 2:'); //var String = Java.use('java.lang.String').$new(bytesarray); //send("ori:"+array2string(bytesarray)); //printstack(); this.update(bytesarray); }, MessageDigest.update.overload('[B', 'int', 'int').implementation = function(bytesarray){ send('I am here 3:'); //var String = Java.use('java.lang.String').$new(bytesarray); //send("ori:"+array2string(bytesarray)); //printstack(); this.update(bytesarray); }, //hook什么加密办法 MessageDigest.getInstance.overloads[0].implementation = function(algorithm){ send("call ->fetInstance for " + algorithm); return this.getInstance.overloads[0].apply(this,arguments); };})"""process = frida.get_usb_device(timeout=1000).attach('包名')script = process.create_script(jscode)script.on('message',on_message)print('[*] Running CTF')script.load()sys.stdin.read()

June 23, 2022 · 1 min · jiezi

关于python:深度辨析-Python-的-eval-与-exec

1、eval 的根本用法语法:eval(expression, globals=None, locals=None) 它有三个参数,其中 expression 是一个字符串类型的表达式或代码对象,用于做运算;globals 与 locals 是可选参数,默认值是 None。 具体而言,expression 只能是单个表达式,不反对简单的代码逻辑,例如赋值操作、循环语句等等。(PS:单个表达式并不意味着“简略有害”,参见下文第 4 节) globals 用于指定运行时的全局命名空间,类型是字典,缺省时应用的是以后模块的内置命名空间。locals 指定运行时的部分命名空间,类型是字典,缺省时应用 globals 的值。两者都缺省时,则遵循 eval 函数执行时的作用域。值得注意的是,这两者不代表真正的命名空间,只在运算时起作用,运算后则销毁。 x = 10def func(): y = 20 a = eval('x + y') print('a: ', a) b = eval('x + y', {'x': 1, 'y': 2}) print('x: ' + str(x) + ' y: ' + str(y)) print('b: ', b) c = eval('x + y', {'x': 1, 'y': 2}, {'y': 3, 'z': 4}) print('x: ' + str(x) + ' y: ' + str(y)) print('c: ', c)func()输入后果: ...

June 23, 2022 · 3 min · jiezi

关于python:Python骚操作动态定义函数

在 Python 中,没有能够在运行时简化函数定义的语法糖。然而,这并不意味着它就不可能,或者是难以实现。 from types import FunctionTypefoo_code = compile('def foo(): return "bar"', "<string>", "exec")foo_func = FunctionType(foo_code.co_consts[0], globals(), "foo")print(foo_func())输入: bar 分析逐行检视代码,你会发现语言/解释器的屏障是如许软弱。 >>> from types import FunctionTypePython 文档通常不会列出那些非用于手动创立的类的特色(这是齐全正当的)。有三种办法能够解决这个问题:help()、inspect(无奈查看内置办法)、以及最初的解决方案,即查看 CPython 源代码。 在本例中,help() 与 inspect 都能够实现工作,然而查看理论的源代码,则会揭示出对于数据类型的更多细节。 >>> from inspect import signature>>> signature(FunctionType)<Signature (code, globals, name=None, argdefs=None, closure=None)>code外部是一个PyCodeobject,作为types.CodeType对外开放。非内置办法领有一个__code__属性,该属性保留了相应的代码对象。利用内置 compile() 办法,能够在运行期创立types.CodeType对象。globals如果一个函数援用的变量不是在部分定义的,而是作为参数转入、由默认参数值提供、或者通过闭包上下文提供,则它会在 globals 字典中查找。内置的 globals() 办法会返回一个对以后模块的全局符号表(global symbol table)的援用 ,因而能被用来提供一个总是与以后表的状态相一致的字典。传入任意其它的字典也是能够的(FunctionType((lambda: bar).__code__, {"bar" : "baz"}, "foo")() == "baz")。 name(可选)管制所返回的函数的__name__ 属性。只真正对 lambdas 有用(因为匿名性,它们通常没有名称),并且重命名函数。argdefs(可选)通过传入一个蕴含任意类型的对象的元组,提供一个形式来供给默认参数值(deffoo(bar="baz"))。(FunctionType((lambda bar: bar).__code__, {}, "foo", (10,))() == 10)。closure(可选)(如果须要在 CPython(PyPy,Jython,…)以外的其它 Python VM 中执行,可能不应该涉及,因为它重大地依赖于实现细节)。一个cell 对象的元组。创立 cell 对象并非齐全是含糊其辞的,因为须要调用 CPython 的外部组件,但有一个库能够令它更加不便:exalt(无耻的广告)。(译注:这个库是作者开发的。) ...

June 23, 2022 · 1 min · jiezi

关于python:如何将字符串常量转为变量

1、如何动静生成变量名?问题如下: 打搅一下大家,求教个问题,已知 list = ['A', 'B', 'C', 'D'] , 如何能力失去以 list 中元素命名的新列表 A = [], B = [], C = [], D = []呢?简略了解,这个问题的意思是,将字符串内容作为其它对象的变量名。 list 中的元素是字符串,此处的 ‘A’-‘D’ 是常量 ,而在要求的后果中,A-D 是变量 。 如果强行间接将常量当做变量应用,它会报错: >>> 'A' = []...SyntaxError: can't assign to literal报错中的literal 指的是字面量 ,这是计算机科学中常见的一个概念,用于表白源代码中的固定值。 例如,整数、浮点数、字符串等根本类型,就是字面量。 字面量指的就是一个量自身,能够了解为一种原子性的实体,当然不能再被赋值了。 所以,取出的字符串内容,并不能间接用作变量名,须要另想办法。 有初学者可能会想,list[0] = [] 行不行?当然不行,因为没有呈现 A 。那 A = list[0] ,接着 A = [] 呢?那也不行,因为这里的 A 是你凭空定义进去的,而不是从已有条件中生成的。 过后,,咱们没想到解决办法。然而,我感觉这个题目很有意思,值得玩味。 因为,如果能解决这个问题,那就意味着能够不作事后定义,而是动静地生成变量名,这不仅能缩小给变量取名的麻烦,还实现了自动编码! 能够构想一下将来,人工智能在编写代码的时候,如果能依据已知条件,动静生成变量名,那编写代码的过程不就顺利多了么?(据说,当初曾经有人工智能能够编写代码了,不知它在取变量名时,是用的什么办法?) 2、方法总是有的 >>> list1 = ['A', 'B', 'C', 'D']>>> for i in list1:>>> globals()[i] = []>>> A[]这个办法通过批改全局命名空间,奇妙地“定义”出了新的变量。globals() 办法取出来的是一个字典,字符串 ‘A’ 是其中一个键值(key),而这个键值恰好是全局命名空间中的一个变量,这就实现了从常量到变量的转化。 ...

June 23, 2022 · 1 min · jiezi

关于python:Python中tuple赋值的四个问题

最近偶然翻看《Fluent Python》,遇到有意思的货色就记下来。上面的是在PyCon2013上提出的一个对于 tuple 的Augmented Assignment也就是增量赋值的一个问题。 并且基于此问题, 又引申出3个变种问题。 问题首先看第一个问题, 如上面的代码段: >>> t = (1,2, [30,40])>>> t[2] += [50,60]会产生什么后果呢? 给出四个选项: 1. `t` 变成 `[1,2, [30,40,50,60]` 2. `TypeError is raised with the message 'tuple' object does not support item assignment` 3. Neither 1 nor 2 4. Both 1 and 2依照之前的了解, tuple外面的元素是不能被批改的,因而会选 2. 如果真是这样的话,这篇笔记就没必要了,《Fluent Python》也就不会拿出一节来讲了。 正确答案是 4 : >>> t = (1,2,[30,40])>>> t[2] += [50,60]Traceback (most recent call last): File "<stdin>", line 1, in <module>TypeError: 'tuple' object does not support item assignment>>> t(1, 2, [30, 40, 50, 60])问题来了,为什么异样都进去了,t 还是变了? ...

June 23, 2022 · 3 min · jiezi

关于python:使用-Numba-让-Python-计算得更快两行代码提速-13-倍

Python 自身是一门运行较慢的语言,因而对于计算场景,最好的优化形式就是优化代码写法。你能够应用现有的科学计算库:比方 Numpy 和 Scipy。但如果想要在不应用低级语言(如 CPython、Rust 等)实现扩大的前提下实现一个新的算法时,该如何做呢? 对于某些特定的、尤其是针对数组的计算场景,Numba 能够显著放慢代码的运行速度。在应用时,咱们有时候须要调整一下原始代码,而有时候却又不须要做任何改变。当它真正起到作用时,成果将会非常明显。 在本篇文章中,咱们谈判及以下几方面: 为什么 有时候独自应用 Numpy 是不够的Numba 的根底应用形式Numba 是如何在很高的档次上来对你的代码运行造成影响的Numpy ”心有余而力不足“的时刻假如你想要将一个十分大的数组转变为按递增程序排序:很好了解,就是将元素按值的大小升序排列,如: [1, 2, 1, 3, 3, 5, 4, 6] → [1, 2, 2, 3, 3, 5, 5, 6]以下是一个简略的就地转换形式: def monotonically_increasing(a):    max_value = 0    for i in range(len(a)):        if a[i] > max_value:            max_value = a[i]        a[i] = max_valueNumpy 运行很快,是因为它能够在不调用 python 本身解释器的前提下实现所有计算。但对于下面这个场景(python 中的循环),就会暴露出一个问题:咱们会失去 Numpy 得天独厚的性能劣势。 对一个含有一千万个元素的 Numpy 数组应用下面的函数进行转换,在我的电脑上须要运行 2.5 秒。那么,还能够优化得更快吗? 应用 Numba 提速Numba 是一款为 python 打造的、专门针对 Numpy 数组循环计算场景的即时编译器。显然,这正是咱们所须要的。让咱们在原有函数的根底上增加两行代码试试: from numba import njit@njitdef monotonically_increasing(a):    max_value = 0    for i in range(len(a)):        if a[i] > max_value:            max_value = a[i]        a[i] = max_value再次运行,发现仅须要 0.19 秒,在齐全重用旧代码逻辑的前提下,感觉成果还不错。 实际上 Numpy 也有一个非凡的函数能够解决这种场景(然而会批改原有函数的代码逻辑):numpy.maximum.accumulate[1] 。通过应用它,函数的运行时长会缩短至 0.03 秒。 RuntimePython for loop2560msNumba for loop190msnp.maximum.accumulate30msNumba 简介在 Numpy 或 Scipy 中找到指标函数,能够很快解决常见的计算问题。然而如果函数不存在呢?(比方刚刚的 numpy.maximum.accumulate)。这种状况下如果想减速代码运行。可能会抉择其余低级的编程语言来实现扩大[2],但这也意味着切换编程语言,会让模块构建和零碎总体变得更简单。 应用 Numba 你能够做到: 应用 python 和领有更快编译速度的解释器运行同一份代码简略疾速地迭代算法Numba 首先会解析代码,而后依据数据的输出类型以即时的形式编译它们。例如,当输出是 u64 数组和浮点型数组时,别离失去的编译后果是不一样的。 Numba 还能够对非 CPU 的计算场景失效:比方你能够 在 GPU 上运行代码[3]。诚然,上文中的示例只是 Numba 的一个最小利用,官网文档[4]中还有很多个性可供选择。 ...

June 23, 2022 · 1 min · jiezi

关于python:只用20行Python代码就攻破了网站登录

明天教大家用Python代码攻破网站登录(在测试靶机上进行试验),原理上是抓包和改包,如果学过的爬虫的话,置信你会快看懂这篇文章 测试靶机为DVWA,适宜DVWA暴力破解模块的Low和Medium等级。 要害代码解释url指定url地址 url = "http://192.168.171.2/dvwa/vulnerabilities/brute/"header设置申请头 header = { 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:46.0) Gecko/20100101 Firefox/46.0', 'Cookie':'security=medium; PHPSESSID=geo7gb3ehf5gfnbhrvuqu545i7'}payload设置申请参数 payload = {'username':username,'password':password,"Login":'Login'}这一行的作用是作一次get申请,响应信息被变量Response接管。  Response = requests.get(url,params=payload,headers=header)这两行代码循环遍历账号和明码字典文件,之后给他们做笛卡尔积循环暴力破解 这种形式和burp的Intruder模块的Cluster bomb攻击方式一样。 for admin in open("C:\Users\admin\Documents\字典\账号.txt"): for line in open("C:\Users\admin\Documents\字典\明码.txt"):而后把循环后果寄存到csv文件里,用逗号宰割数据 Response.status_code是响应的http状态码,len(Response.content)是http响应报文的长度。 result = str(Response.status_code) + ',' + username + ','\ + password + ',' + str(len(Response.content))f.write(result + '\n')残缺代码办法一登陆胜利的和失败返回数据不同,所以数据包长度也不同。包长度与其余不同的数据,可能就是正确的账号密码。 import requestsurl = "http://192.168.171.2/dvwa/vulnerabilities/brute/"#proxies= {"http":"http://127.0.0.1:8080"} #代理设置,不便burp抓包查看header = { 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:46.0) Gecko/20100101 Firefox/46.0', 'Cookie':'security=medium; PHPSESSID=bdi0ak5mqbud69nrnejgf8q00u'}f = open('result.csv','w')f.write('状态码' + ',' + '用户名' + ',' + '明码' + ',' + '包长度' + '\n')for admin in open("C:\Users\admin\Documents\字典\账号.txt"): for line in open("C:\Users\admin\Documents\字典\明码.txt"): username = admin.strip() password = line.strip() payload = {'username':username,'password':password,"Login":'Login'} Response = requests.get(url,params=payload,headers=header) result = str(Response.status_code) + ',' + username + ','\ + password + ',' + str(len(Response.content)) f.write(result + '\n')print('\n实现')运行 ...

June 23, 2022 · 1 min · jiezi

关于python:爱了这18个-Python-高效编程技巧真香

初识Python语言,感觉python满足了我上学时候对编程语言的所有要求。python语言的高效编程技巧让咱们这些大学已经苦逼学了四年c或者c++的人,兴奋的不行不行的,终于解脱了。高级语言,如果做不到这样,还扯啥高级呢? 01 替换变量 >>>a=3>>>b=6这个状况如果要替换变量在c++中,必定须要一个空变量。然而python不须要,只需一行,大家看清楚了 >>>a,b=b,a>>>print(a)>>>6>>>ptint(b)>>>502 字典推导(Dictionary comprehensions)和汇合推导(Set comprehensions) 大多数的Python程序员都晓得且应用过列表推导(list comprehensions)。如果你对list comprehensions概念不是很相熟——一个list comprehension就是一个更简短、简洁的创立一个list的办法。 >>> some_list = [1, 2, 3, 4, 5]>>> another_list = [ x + 1 for x in some_list ]>>> another_list[2, 3, 4, 5, 6]自从python 3.1 起,咱们能够用同样的语法来创立汇合和字典表: >>> # Set Comprehensions>>> some_list = [1, 2, 3, 4, 5, 2, 5, 1, 4, 8]>>> even_set = { x for x in some_list if x % 2 == 0 }>>> even_setset([8, 2, 4])>>> # Dict Comprehensions>>> d = { x: x % 2 == 0 for x in range(1, 11) }>>> d{1: False, 2: True, 3: False, 4: True, 5: False, 6: True, 7: False, 8: True, 9: False, 10: True}在第一个例子里,咱们以some_list为根底,创立了一个具备不反复元素的汇合,而且汇合里只蕴含偶数。而在字典表的例子里,咱们创立了一个key是不反复的1到10之间的整数,value是布尔型,用来批示key是否是偶数。 这里另外一个值得注意的事件是汇合的字面量表示法。咱们能够简略的用这种办法创立一个汇合: >>> my_set = {1, 2, 1, 2, 3, 4}>>> my_setset([1, 2, 3, 4])而不须要应用内置函数set()。 03 计数时应用Counter计数对象 这听起来不言而喻,但常常被人遗记。对于大多数程序员来说,数一个货色是一项很常见的工作,而且在大多数状况下并不是很有挑战性的事件——这里有几种办法能更简略的实现这种工作。 Python的collections类库里有个内置的dict类的子类,是专门来干这种事件的: >>> from collections import Counter>>> c = Counter('hello world')>>> cCounter({'l': 3, 'o': 2, ' ': 1, 'e': 1, 'd': 1, 'h': 1, 'r': 1, 'w': 1})>>> c.most_common(2)[('l', 3), ('o', 2)]04 丑陋的打印出JSON JSON是一种十分好的数据序列化的模式,被现在的各种API和web service大量的应用。应用python内置的json解决,能够使JSON串具备肯定的可读性,但当遇到大型数据时,它体现成一个很长的、间断的一行时,人的肉眼就很难观看了。 为了能让JSON数据体现的更敌对,咱们能够应用indent参数来输入丑陋的JSON。当在控制台交互式编程或做日志时,这尤其有用: >>> import json>>> print(json.dumps(data))  # No indention{"status": "OK", "count": 2, "results": [{"age": 27, "name": "Oz", "lactose_intolerant": true}, {"age": 29, "name": "Joe", "lactose_intolerant": false}]}>>> print(json.dumps(data, indent=2))  # With indention{  "status": "OK",  "count": 2,  "results": [    {      "age": 27,      "name": "Oz",      "lactose_intolerant": true    },    {      "age": 29,      "name": "Joe",      "lactose_intolerant": false    }  ]}同样,应用内置的pprint模块,也能够让其它任何货色打印输出的更丑陋。 05 解决FizzBuzz 前段时间Jeff Atwood 推广了一个简略的编程练习叫FizzBuzz,问题援用如下: 写一个程序,打印数字1到100,3的倍数打印“Fizz”来替换这个数,5的倍数打印“Buzz”,对于既是3的倍数又是5的倍数的数字打印“FizzBuzz”。这里就是一个简短的,有意思的办法解决这个问题: for x in range(1,101):    print"fizz"[x%3*len('fizz')::]+"buzz"[x%5*len('buzz')::] or x06 if 语句在行内 print "Hello" if True else "World">>> Hello07 连贯 上面的最初一种形式在绑定两个不同类型的对象时显得很cool。 nfc = ["Packers", "49ers"]afc = ["Ravens", "Patriots"]print nfc + afc>>> ['Packers', '49ers', 'Ravens', 'Patriots']print str(1) + " world">>> 1 worldprint `1` + " world">>> 1 worldprint 1, "world">>> 1 worldprint nfc, 1>>> ['Packers', '49ers'] 108 数值比拟 这是我见过诸多语言中很少有的如此棒的简便法 x = 2if 3 > x > 1:   print x>>> 2if 1 < x > 0:   print x>>> 209 同时迭代两个列表 nfc = ["Packers", "49ers"]afc = ["Ravens", "Patriots"]for teama, teamb in zip(nfc, afc):     print teama + " vs. " + teamb>>> Packers vs. Ravens>>> 49ers vs. Patriots10 带索引的列表迭代 teams = ["Packers", "49ers", "Ravens", "Patriots"]for index, team in enumerate(teams):    print index, team>>> 0 Packers>>> 1 49ers>>> 2 Ravens>>> 3 Patriots11 列表推导式 已知一个列表,咱们能够刷选出偶数列表办法: numbers = [1,2,3,4,5,6]even = []for number in numbers:    if number%2 == 0:        even.append(number)转变成如下: numbers = [1,2,3,4,5,6]even = [number for number in numbers if number%2 == 0]12 字典推导 和列表推导相似,字典能够做同样的工作: teams = ["Packers", "49ers", "Ravens", "Patriots"]print {key: value for value, key in enumerate(teams)}>>> {'49ers': 1, 'Ravens': 2, 'Patriots': 3, 'Packers': 0}13 初始化列表的值 items = [0]*3print items>>> [0,0,0]14 列表转换为字符串 teams = ["Packers", "49ers", "Ravens", "Patriots"]print ", ".join(teams)>>> 'Packers, 49ers, Ravens, Patriots'15 从字典中获取元素 我抵赖try/except代码并不雅致,不过这里有一种简略办法,尝试在字典中查找key,如果没有找到对应的alue将用第二个参数设为其变量值。 data = {'user': 1, 'name': 'Max', 'three': 4}try:   is_admin = data['admin']except KeyError:   is_admin = False替换成这样 data = {'user': 1, 'name': 'Max', 'three': 4}is_admin = data.get('admin', False)16 获取列表的子集 有时,你只须要列表中的局部元素,这里是一些获取列表子集的办法。 x = [1,2,3,4,5,6]#前3个print x[:3]>>> [1,2,3]#两头4个print x[1:5]>>> [2,3,4,5]#最初3个print x[3:]>>> [4,5,6]#奇数项print x[::2]>>> [1,3,5]#偶数项print x[1::2]>>> [2,4,6]除了python内置的数据类型外,在collection模块同样还包含一些特地的用例,在有些场合Counter十分实用。如果你加入过在这一年的Facebook HackerCup,你甚至也能找到他的实用之处。 from collections import Counterprint Counter("hello")>>> Counter({'l': 2, 'h': 1, 'e': 1, 'o': 1})17 迭代工具 和collections库一样,还有一个库叫itertools,对某些问题真能高效地解决。其中一个用例是查找所有组合,他能通知你在一个组中元素的所有不能的组合形式 ...

June 23, 2022 · 1 min · jiezi

关于python:Python-中有-3-个不可思议的返回功能

明天给大家分享 3 个比拟冷门的常识: 第一个:神奇的字典键some_dict = {}some_dict[5.5] = "Ruby"some_dict[5.0] = "JavaScript"some_dict[5] = "Python"Output: >>> some_dict[5.5]"Ruby">>> some_dict[5.0]"Python">>> some_dict[5]"Python""Python" 打消了 "JavaScript" 的存在? 阐明:Python 字典通过查看键值是否相等和比拟哈希值来确定两个键是否雷同.具备雷同值的不可变对象在Python中始终具备雷同的哈希值.留神: 具备不同值的对象也可能具备雷同的哈希值(哈希抵触). >>> 5 == 5.0True>>> hash(5) == hash(5.0)True当执行 some_dict[5] = "Python" 语句时, 因为Python将 5 和 5.0 辨认为 some_dict 的同一个键, 所以已有值 "JavaScript" 就被 "Python" 笼罩了 第二个:异样解决中的returndef some_func():    try:        return 'from_try'    finally:        return 'from_finally'Output: >>> some_func()'from_finally' 阐明:当在 "try…finally" 语句的 try 中执行 return, break 或 continue 后, finally 子句仍然会执行.函数的返回值由最初执行的 return 语句决定. 因为 finally 子句肯定会执行, 所以 finally 子句中的 return 将始终是最初执行的语句.第三个:雷同对象的判断class WTF:  passOutput: >>> WTF() == WTF() # 两个不同的对象应该不相等False>>> WTF() is WTF() # 也不雷同False>>> hash(WTF()) == hash(WTF()) # 哈希值也应该不同True>>> id(WTF()) == id(WTF())True 阐明:当调用 id 函数时, Python 创立了一个 WTF 类的对象并传给 id 函数. 而后 id 函数获取其id值 (也就是内存地址), 而后抛弃该对象. 该对象就被销毁了.当咱们间断两次进行这个操作时, Python会将雷同的内存地址调配给第二个对象. 因为 (在CPython中) id 函数应用对象的内存地址作为对象的id值, 所以两个对象的id值是雷同的.综上, 对象的id值仅仅在对象的生命周期内惟一. 在对象被销毁之后, 或被创立之前, 其余对象能够具备雷同的id值.那为什么 is 操作的后果为 False 呢? 让咱们看看这段代码.class WTF(object):  def __init__(self): print("I")  def __del__(self): print("D")Output: >>> WTF() is WTF()IIDDFalse>>> id(WTF()) == id(WTF())IDIDTrue正如你所看到的, 对象销毁的程序是造成所有不同之处的起因。 以上就是本次分享的所有内容,如果你感觉文章还不错,欢送关注公众号:Python编程学习圈,每日干货分享,发送“J”还可支付大量学习材料。或是返回编程学习网,理解更多编程技术常识。

June 23, 2022 · 1 min · jiezi

关于python:python-自定义异常raise关键字抛出异常

在编程过程中正当的应用异样能够使得程序失常的执行。有间接抛出异样的模式,也能通过捕捉异样退出异样时的业务逻辑解决。 【浏览全文】 创立自定义异样类案例 class MyException(Exception): def __init__(self, msg): ''' :param msg: 异样信息 ''' self.msg = msg应用raise关键字抛出异样案例raise关键字抛出异样次要是为了在特定的条件。 def throw_exception(num=0): ''' 测试异样抛出函数 :param num: 数值 :return: ''' if num == 10: raise MyException('num不能等于10') else: print('以后num=',num)throw_exception(10)在调用throw_exception函数后,传入值为10时则抛出上面的异样。 # raise MyException('num不能等于10')# __main__.MyException: num不能等于10应用try...except捕捉异样案例 应用try关键字捕捉异样,能够在异样解决时退出本人的业务解决逻辑不至于使异样间接抛出。 def catch_exception(num=0): ''' 测试异样处理函数 :param num: 数值 :return: ''' try: throw_exception(num) except MyException as e: print('进入异样解决:以后num=',num)catch_exception(10)调用catch_exception函数进行异样解决后,不会将异样抛出而是进行失常的业务解决,依照咱们预期的打算进行解决。 # 进入异样解决:以后num= 10 【往期精彩】 python 本地音乐播放器制作过程(附残缺源码) 自动化工具:PyAutoGUI的鼠标与键盘管制,解放双手的利器! 来自程序猿的生日蛋糕你见过吗? 懒人python操作,代码中永远只须要导入一个库... 自动化办公:手机号码提取器,应用正则表达式轻松提取文本文件中的手机号码...

June 22, 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 将过程代码放在代码块中,这样它们就能够被用于传递。 ...

June 22, 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 ? ...

June 22, 2022 · 3 min · jiezi

关于python:Python-实现循环的最快方式forwhile-等速度对比

家喻户晓,Python 不是一种执行效率较高的语言。此外在任何语言中,循环都是一种十分耗费工夫的操作。如果任意一种简略的单步操作消耗的工夫为 1 个单位,将此操作反复执行上万次,最终消耗的工夫也将增长上万倍。 while 和 for 是 Python 中罕用的两种实现循环的关键字,它们的运行效率实际上是有差距的。比方上面的测试代码: import timeitdef while_loop(n=100_000_000): i = 0 s = 0 while i < n: s += i i += 1 return sdef for_loop(n=100_000_000): s = 0 for i in range(n): s += i return sdef main(): print('while loop\t\t', timeit.timeit(while_loop, number=1)) print('for loop\t\t', timeit.timeit(for_loop, number=1))if __name__ == '__main__': main()# => while loop 4.718853999860585# => for loop 3.211570399813354这是一个简略的求和操作,计算从 1 到 n 之间所有自然数的总和。能够看到 for 循环相比 while 要快 1.5 秒。 ...

June 22, 2022 · 3 min · jiezi

关于python:简单聊聊Python在算法后端量化工作中的应用

明天想聊聊Python在算法、后端、量化工作中的利用,该如何去学习呢? 自己是非计算Python业余(天坑之一),大四开始学Python,一路过去摸爬滚打,当初在某行业头部企业做大数据分析,常常用到Python解决数据。 Python当初简直是应用人数最多的编程语言,次要是因为它在各个领域都有利用,十八般武艺尽管说不上样样精通,但至多是有拿得出手的货色。在国内,Python大略从2017年开始,因为AI、大数据的衰亡,逐步网红化,备受非IT从业者的吹捧,当然也催生一大批教育培训。很多人在说Python找不到工作,花钱去学的都是韭菜。其实我置信大部分人学习Python,并不是指望着靠Python去找工作,而是解决问题,造就本人的编程能力,作为加分项。至于哪些岗位须要python,这就是咱们要聊的问题。 可能用到Python的工作有哪些?我以我高中、大学的几个同学的经验为例,别离介绍下他们用Python的场景。 1、同学A:TOP3电商平台 NLP算法工程师 他是校招进去的,做UGC内容的文本开掘,去剖析电商用户的评论、客服、问答等数据,给商品举荐、智能客服等场景做决策。这是属于纯正的算法岗了,在大厂里那是相当吃香,校招打包价都快50。 面试的时候,对用哪门语言其实并没有严格限度,Python、Java、C++都能够,然而须要手写算法,也会考下面几种框架的应用。 同学A说他们组当初用到的技术栈是NLP、深度学习、大数据,像nltk、tensorflow、pytorch、hadoop、spark之类,都是主力工具。组里大部分人都用Python,有少部分大佬用C++,总得来说是能够跑就行。 我问同学A为什么用Python,他笑着说了四个字“人生苦短”啊,Python写脚本、做测试、跑数据切实是太不便,尽管跑算法没有C++快,然而并不会带来很大差别,因为他们不须要实时去出后果。 而且Python第三方库有大量的NLP、机器学习工具,NLP畛域像nltk、Pattern、Gensim等,机器学习像sklearn、keras、tf等,集成得十分好,拿来就用。 2、同学B:某头部自主车企 后端开发工程师 同学B是原来在乙方软件公司工作,次要负责车机软件的开发,起初不想卷去了甲方做web平安后端,但发现活一点没变少,可能这几年汽车电子倒退太快,都在更新迭代。 当初车企招聘比拟青眼计算机背景的候选人,许多在互联网裁员大潮中全身而退的技术人去了车企做开发、做产品,其实也是个不错的抉择,赶上新能源倒退的时机。 他们做的平安相干业务后端开发,平时次要用到Django、Django RESTFramework、docker等框架,还有MySQL、MongoDB、Redis等数据库,基本上都是基于Python去做开发。 说来也奇怪,平安产品始终是C/C++为主,占据绝大部分场景,为什么他们会用到Python?我这样问同学B。 他说你还是不理解,平安畛域C/C++、Java、Python始终是三大支流技术栈,像NTA、防火墙、IDS、IPS都会用到Python,一些小型的后端服务也会采纳Python进行开发。 3、同学C:一家小型基金治理公司 量化分析员 同学C是在英国待过一年,回国前面了好几家大券商、大基金公司,都止步在技术面,起初进了一家上海本地的一家小型基金治理公司,做CTA高频量化模型开发,平时搞搞交易策略的研发、调试、优化、保护及监控。 他说过后进来也是想锤炼下技术能力,为前面去大厂铺路,加上业绩的压力,所以根本每天996,写策略写到麻痹。平时还要做数据的收集和解决、历史数据回测以及危险收益评估等,总之把人用到极致。 因为我不太懂Python在金融行业的利用,于是问他做量化肯定要用Python吗? 他笑了笑说,你能够去招聘网站上搜搜看,金融行业做剖析搞钻研的当初清一色的须要编程能力,其中大部分要求python,国外像摩根、花旗这样的大公司基本上把python当作硬性门槛了。 量化畛域根本是以C++和Python为主,C++个别用来写大型交易框架,稳定性强,而且速度快,Python则用来写策略、跑算法、验证模型,也反对一些小型利用的编写,对C++库进行包装等。 这次要是因为Python生态有大量的金融数据分析工具,像talib、pandas、numpy等,能够疾速援用。 这三位同学是我身边拿Python当主力工具的典型代表,其实能够看到都是须要综合能力的岗位,NLP要求算法、后端开发要求平安教训,量化要求会写策略。所以根本不是说会Python就可能找到适合的工作。 对Python能力的要求是什么样的?Python是用来解决业务问题的,所以不同岗位的要求必然不同,但前提都是要会纯熟应用Python语法,对数据类型、逻辑语句、函数模块、类、过程线程、错误处理、网络编程、正则表达式...这些务必要一目了然。 这里倡议大家去官网文档一一对照着去学习:其次针对不同岗位要学习不同的Python框架,这些框架的难度一点也不用Python自身容易,有些大的框架比方tensorflow其学习老本曾经远远超出Python语法。 爬虫岗:requests、xpath、beautifulsoup、scrapy、selenuim 数据分析岗:pandas、numpy、sklearn、matplotlib、pymysql 算法岗:sklearn、keras、tensorflow、pytorch nlp岗:nltk、Gensim、Pattern 大数据岗:pyspark、pyflink BI岗:superset、dash web岗:Django、Flask、Tornado(知乎用这个写的)、fastapi 测试运维岗:os、sys、selenium、pytest、appium、unittest 前端岗:PyQt、PyGUI、pyecharts、dash、plotly 其余办公用:xlwings、pandas、pptx、docx、email 以上这些是对应岗位须要用到的工具,也就是python的第三方库,大家能够一一对应看看本人须要什么,而后针对性的去学习。 以上就是本次分享的所有内容,想要理解更多 python 常识欢送返回公众号:Python 编程学习圈 ,发送 “J” 即可收费获取,每日干货分享

June 22, 2022 · 1 min · jiezi

关于python:手写一个-Python-病毒

明天的文章来展现一个 Python "病毒",它感化其余 Python 文件来创立一个后门。后门利用 Python 的内置 socket 模块来创立一个监听器,用来连贯到 Python 的内置子过程模块,从而靶机上执行命令,同时还通过创立一个 cronjob 来建设持久性,以在每天固定的工夫运行后门。最终残缺的 Python 脚本蕴含在本文开端。留神:请不要将本文中提供的 Python 脚本用于歹意目标。尽管它不先进,但通过一些批改,它能够让齐全管制某人的计算机。本文的次要目标是通过这些脚本,更好地理解黑客如何获取失常程序并使它们成为恶意程序。 话不多说,让咱们开始吧。  1. 建设通信任何后门最重要的局部都是建设通信。当初,让咱们为后门拜访编写一段代码。通过 TCP 连贯到靶机,咱们应用套接字模块监听黑客的连贯申请。在 socket 模块中,有一个函数也称为 socket,咱们能够应用它来创立 TCP 或 UDP 套接字。应用 socket.socket 函数创立套接字时,咱们须要提供两个参数来指定咱们要应用的 IP 版本和第 4 层协定。在这个 Python 脚本中,咱们将传入以下参数:socket.AF_INET 和 socket.SOCK_STREAM。 AF_INET : 指定 IPv4SOCK_STREAM :指定 TCP 而不是 UDP。socket.socket 函数返回一个对象,该对象由最终确定正在创立的套接字是侦听套接字(服务器)还是连贯套接字(客户端)的办法组成。要创立侦听套接字,须要应用以下办法:bind > 将 IP 地址和端口绑定到网络接口listen > 批示咱们的套接字开始监听传入的连贯accept > 承受传入连贯recv > 从连贯的客户端接收数据send > 向连贯的客户端发送数据然而,最重要的办法是 recv 和 send。recv 办法会接管来自攻击者的命令,应用 subproces.run 函数在受害者的零碎上执行它们,而后将执行命令的规范输入重定向到与攻击者建设的 TCP 连贯。上面是 Python 代码: ...

June 22, 2022 · 1 min · jiezi

关于python:6-个值得玩味的-Python-代码

先选取了 6 个本人认为值得玩味的 python 代码,心愿对正在学习 python 的你有所帮忙。 1、类有两个办法,一个是 __new__,一个是 __init__,有什么区别,哪个会先执行呢? class test(object):    def __init__(self):        print("test -> __init__")    def __new__(cls):        print("test ->__new__")        return super().__new__(cls)a = test()运行后果如下: test ->__new__test -> __init__再来看另一个例子 class test2(object):    def __init__(self):        print("test2 -> __init__")    def __new__(cls):        print("test2 ->__new__")        return object()b = test2()运行后果如下: test2 ->__new__这里给出官网的解释:__init__ 作用是类实例进行初始化,第一个参数为 self,代表对象自身,能够没有返回值。__new__ 则是返回一个新的类的实例,第一个参数是 cls 代表该类自身,必须有返回值。很显著,类先实例化能力产能对象,显然是 new 先执行,而后再 init__,实际上,只有 __new 返回的是类自身的实例,它会主动调用 init 进行初始化。然而有例外,如果 new 返回的是其余类的实例,则它不会调用以后类的 __init__。上面咱们别离输入下对象 a 和对象 b 的类型: print( type(a))#<class '__main__.test'>print( type(b))#<class 'object'>能够看出,a 是 test 类的一个对象,而 b 就是 object 的对象。 参考文档: https://docs.python.org/3/reference/datamodel.html?highlight=__new__#object.__new__2、map 函数返回的对象 map()函数第一个参数是 fun,第二个参数是个别是 list,第三个参数能够写 list,也能够不写,作用就是对列表中 list 的每个元素顺序调用函数 fun 。 >>> b=map(lambda x:x*x,[1,2,3])>>> [i for i in b][1, 4, 9]>>> [i for i in b][]>>>有没有发现,第二次输入 b 中的元素时,发现变成空了。起因是 map() 函数返回的是一个迭代器,并用对返回后果应用了 yield,这样做的目标在于节俭内存。举个例子: #encoding:UTF-8  def yield_test(n):      for i in range(n):          yield call(i)      #做一些其它的事件      def call(i):      return i*2  #应用for循环  x = yield_test(5)print([i for i in x])print([i for i in x])执行后果为:  [0, 2, 4, 6, 8] []这里如果不必 yield,那么在列表中的元素十分大时,将会全副装入内存,这是十分节约内存的,同时也会升高效率。 3、正则表达式中 compile 是否多此一举? 比方当初有个需要,对于文本 中国,用正则匹配出标签外面的“中国”,其中 class 的类名是不确定的。有两种办法,代码如下: >>> import re>>> text = '<div class="nam">中国</div>'>>> #办法一...>>> re.findall('<div class=".*">(.*)</div>',text)['中国']>>> #办法二...>>> regex='<div class=".*">(.*)</div>'>>> pattern = re.compile(regex)>>> re.findall(pattern,text)['中国']>>>这里为什么要用 compile 多写两行代码呢?起因是 compile 将正则表达式编译成一个对象,加快速度,并重复使用。 ...

June 22, 2022 · 1 min · jiezi

关于python:懒人必备神器-一个创意十足的-Python-命令行工具

当听到某些人说 xx 库十分好用的时候,咱们总是忍不住想要去亲自试试。 有一些库,之所以好用,是对一些库做了更高级的关闭,你装了这个库,就会附带装了 n 多依赖库,就前一篇文章介绍的 streamlit 来说,依赖包就达 90 几个之多? 比百度全家桶,还 tm 的全家桶啊… 也正是因为胆怯会净化我的全局 Python 环境,我通常在试用新包的时候,都会应用 venv 创立虚拟环境,再去装置,完事之后,再清理虚拟环境即可。 有没有发现,整个流程,其实还是挺麻烦的。 刚好昨天晚上,Github 上瞎逛,被我发现一个库,能够解决我始终以来的搅扰。 这个库叫 trypackage,为试库而生的库。 当你应用 try xx 命令时,它会做哪些事呢? 装置指定版本的 Python 解释器创立长期的虚拟环境激活虚拟环境在虚拟环境中装置你要试用的 Python 库间接进入 Python Shell 模式主动将你要试用的库导入进来 1. 如何装置一条命令就能够装置它 python3 -m pip install trypackage能够看到 trypackage 只依赖一个 click 命令行库,还是很轻量的 其实不是这样,try 会基于 virtualenv 创立虚拟环境,因而还要装置 virtualenv 和 virtualenvwrapper python3 -m pip install virtualenv virtualenvwrapper 2. 根本应用应用 try requests,try 就会创立一个虚拟环境,而后在该虚拟环境中,装置 requests ,装置实现后,主动进入 Python Shell 的模式,并且主动导入好你要试用的包 最贴心的是,试用完后,退出 Python Shell ,会主动清理掉虚拟环境。  3. 更多用法 指定 python 版本我的环境没有装置 Python 3.8,通过 -p 参数,能够指定 Python 3.8 ,装置的过程太快,快得让我有点狐疑这是不是真正的去装置 Python 3.8 解释器了。 ...

June 22, 2022 · 1 min · jiezi

关于python:Python-炫技操作-创造新语法的黑科技

咱们明天来看一段炫技代码。它能够把任何能接管两个参数的函数定义成一个非凡的运算符。 例如,咱们晓得Python外面的range函数,起码能够接管1个参数,最多可能接管3个参数。当只有两个参数的时候,格局为range(开始, 完结),从开始数字到完结数字逐次加1,左闭右开。应用明天的办法,能够把它的写法改为开始 |到| 完结,如下图所示: 又比方,urllib.parse.urljoin能够把域名和一个相对路径拼接起来: urljoin(域名, 相对路径),咱们也能够改写成如下图所示的格局: 这种炫技无余,实用有余的性能是怎么实现的呢?其实原理非常简单,只有8行代码: from functools import partialclass Change(object):    def __init__(self, func):        self.func = func    def __or__(self, other):        return self.func(other)    def __ror__(self, other):        self.func = partial(self.func, other)        return self这里就波及到一个盲点和两个真正的知识点。这个盲点就是,你可能认为 |到|是一个字符,然而它是3个字符;你可能会把|拼接|看做一个整体,然而它实际上是3个局部:右边的|、拼接和左边的|。 咱们把空格加上,就很显著了: 两个真正的知识点,就是__or__和__ror__这两个魔术办法和偏函数partial。而Change自身就是一个一般的类而已,__or__和__ror__定义了这个类的实例在左侧遇到|时,右侧遇到|时的具体行为。 咱们一个一个来讲。首先是__or__。它定义了实例的右侧遇到|时的具体行为。例如,咱们用一个简略的代码来进行测试: class Test:    def __init__(self, num):        self.num = num    def __or__(self, other):        print(f'我左边有一个货色,它是:{other}')x = Test(100)x | 55运行成果如下图所示: 但如果你把竖线放在右边,他就会报错,如下图所示: 而__ror__就是用来定义|在实例右边的时候,它的行为: 所以,咱们最开始的例子中,2 |到| 10,实际上应该了解为: 到是Change(range)返回的实例2 | 到 生成一个两头对象,咱们假如它是xx | 10 生成后果在咱们演示的例子中,2 | 到首先进入了Change类的__ror__办法中:     def __ror__(self, other):        self.func = partial(self.func, other)        return self其中,一开始的self.func就是咱们在初始化实例Change(range)时传入的参数range。所以partial(self.func, other)等价于partial(range, 2)。简略来说,应用偏函数,能够给一个真正的函数传一部分参数,过一会再补剩下的参数。 可能大家在日常的开发者,很少会让一个实例办法返回self。也就是说,1 | 到返回的,仍然是Change类的一个实例,咱们简称它为x。这个实例的属性self.func的值是partial(range, 2)。 接下来,x | 10,调用的是__or__办法,于是,此时执行的是partial(range, 2)(10)。偏函数的参数补全了,于是它外面的range真正运行了起来,成为了range(2, 10)。 至此,这个Change类咱们就解析透了。大家晓得,在Python外面,魔术办法是有很多的,如果你不想用|,你还能够用其它的,例如: 或者: 或者: 同时,这个Change类,你甚至能够间接当做装璜器来应用。任何可能接管两个参数的函数,都能应用这个装璜器。例如: 最初总结一下。大家都晓得,我是十分拥护在工作代码中炫技的,因为炫技的写法很难读,很难保护。明天这个炫技的办法,尽管我也不举荐大家用在工作中,然而它短短8行代码外面,蕴含了很多个知识点,这就值得大家玩一玩了。 以上就是本次分享的所有内容,如果你感觉文章还不错,欢送关注公众号:Python编程学习圈,每日干货分享,发送“J”还可支付大量学习材料。或是返回编程学习网,理解更多编程技术常识。

June 22, 2022 · 1 min · jiezi

关于python:如何使用-Python-隐藏-API-密钥

你好,我是悦创。 博客首发:https://bornforthis.cn/posts/19.html 有时您须要在代码中存储敏感信息,例如明码或 API 密钥,而在 Python 中最简洁的办法是应用 os 和 dotenv 模块。 为此,您须要装置 dotenv 模块,而 os 模块是规范 Python 模块,无需装置。 在命令行中,输出: pip install python-dotenv或者对于 Python 3 pip3 install python-dotenv假如 .env 文件的内容是: API_KEY="abcd123"一个好的做法是在您的我的项目中蕴含一个 .env 文件,其中蕴含您正在应用的每个机密变量的示例。该文件的内容如下所示: API_KEY="abcd123"要将其加载到您的 python 文件中,您应该: import osfrom dotenv import load_dotenvload_dotenv()API_KEY = os.getenv("API_KEY")Good!当初,您正在正确地暗藏数据! 悦创·编程一对一AI悦创·推出辅导班啦,包含「Python 语言辅导班、C++ 辅导班、java 辅导班、算法/数据结构辅导班、少儿编程、pygame 游戏开发」,全部都是一对一教学:一对一辅导 + 一对一答疑 + 安排作业 + 我的项目实际等。当然,还有线下线上摄影课程、Photoshop、Premiere 一对一教学、QQ、微信在线,随时响应!微信:JiabcdefhC++ 信息奥赛题解,长期更新!长期招收一对一中小学信息奥赛集训,莆田、厦门地区有机会线下上门,其余地区线上。微信:Jiabcdefh

June 21, 2022 · 1 min · jiezi

关于python:只在工作日执行的脚本

有时候咱们会须要定时执行一个脚本,那么能够用cronjob来实现,比方这样: 10 04 * * * /usr/local/bin/somework.sh有时候,只心愿这个脚本在工作日执行,比方这样: 10 04 * * 1-5 /usr/local/bin/somework.sh然而工作日有时候又不是简略的周一到周五,比方赶上个小长假什么的,有时候周六要下班,有时候周一又不下班,这时候这样的设置就容易乱,那咱们怎么设置这个cronjob能力让他预知咱们的放假排班打算,并做到丝毫不乱呢? 只用cron是不行的,咱们须要在脚本里调取一个凋谢接口获知放假安顿,而后就能够按计划执行了。 这个凋谢接口在这里: https://github.com/NateScarle... 咱们简略写一个脚本: #!/usr/local/bin/python"""每天定时执行脚本"""import datetimeimport requestsdef will_work(date): """查看该天是否须要工作""" holiday_data = requests.get( url='https://natescarlet.coding.net/p/github/d/holiday-cn/git/raw/master/2022.json' ).json() # 放入公司规定的非凡考勤日 holiday_data['days'].append({ 'date': '2022-06-21', 'isOffDay': False }) # 查看该日期是否在列表中 days_in_list = [day for day in holiday_data['days'] if day['date'] == datetime.datetime.strftime(date, '%Y-%m-%d')] if days_in_list: # 是否在节假日倒休表里,如果在倒休表里,按倒休表作息 return not (days_in_list[0]["isOffDay"]) else: # 依照周一至周五作息 return True if date.weekday() < 5 else Falsedef main(): """主函数""" if will_work(datetime.datetime(2022, 6, 21, 0, 0, 0, 0)): print("明天要下班") else: print("明天不下班")if __name__ == '__main__': main()赋予它执行权限: ...

June 21, 2022 · 1 min · jiezi

关于python:大名鼎鼎的Requests库用了什么编码风格

Requests 的代码库应用 PEP-8 编码格调。 除了 PEP-8 中列出的规范外,咱们还有一些领导准则: 如果不便的话,行长(Line-length)可超过 79 个字符,达到 100 个字符。 如果换行会导致重大的不不便,则行长能够超过 100 个字符。 除非在字符串中呈现单引号,否则始终应用单引号字符串(例如,'#flatearth')。 此外,PEP-8 举荐的用于间断行的编码格调毫无一点品尝,绝不允许在 Requests 代码库用: # 与开局定界符对齐foo = long_function_name(var_one, var_two, var_three, var_four)No。千万别。请。 文档字符串(docstrings)应遵循以下语法: def the_earth_is_flat(): """NASA divided up the seas into thirty-three degrees.""" passdef fibonacci_spiral_tool(): """With my feet upon the ground I lose myself / between the sounds and open wide to suck it in. / I feel it move across my skin. / I'm reaching up and reaching out. / I'm reaching for the random or whatever will bewilder me. / Whatever will bewilder me. / And following our will and wind we may just go where no one's been. / We'll ride the spiral to the end and may just go where no one's been. Spiral out. Keep going... """ pass所有函数、办法和类都要求蕴含 docstrings 。除了对象数据模型办法(例如,__repr__),这些是此规定的例外。 ...

June 21, 2022 · 1 min · jiezi

关于python:为什么range不是迭代器range到底是什么类型

迭代器是 23 种设计模式中最罕用的一种(之一),在 Python 中随处可见它的身影,咱们常常用到它,然而却不肯定意识到它的存在。在对于迭代器的系列文章中,我至多提到了 23 种生成迭代器的办法。有些办法是专门用于生成迭代器的,还有一些办法则是为了解决别的问题而“暗中”应用到迭代器。 在零碎学习迭代器之前,我始终认为 range() 办法也是用于生成迭代器的,当初却忽然发现,它生成的只是可迭代对象,而并不是迭代器! (PS:Python2 中 range() 生成的是列表,本文基于Python3,生成的是可迭代对象) 于是,我有了这样的疑难:为什么 range() 不生成迭代器呢?在查找答案的过程中,我发现自己对 range 类型的意识存在一些误区。因而,本文将和大家全面地认识一下 range ,期待与你独特学习提高。 1、range() 是什么?它的语法:range(start, stop [,step]) ;start 指的是计数起始值,默认是 0;stop 指的是计数完结值,但不包含 stop ;step 是步长,默认为 1,不能够为 0 。range() 办法生成一段左闭右开的整数范畴。 >>> a = range(5) # 即 range(0,5)>>> arange(0, 5)>>> len(a)5>>> for x in a:>>> print(x,end=" ")0 1 2 3 4对于 range() 函数,有几个留神点:(1)它示意的是左闭右开区间;(2)它接管的参数必须是整数,能够是正数,但不能是浮点数等其它类型;(3)它是不可变的序列类型,能够进行判断元素、查找元素、切片等操作,但不能批改元素;(4)它是可迭代对象,却不是迭代器。 # (1)左闭右开>>> for i in range(3, 6):>>> print(i,end=" ")3 4 5# (2)参数类型>>> for i in range(-8, -2, 2):>>> print(i,end=" ")-8 -6 -4>>> range(2.2)----------------------------TypeError Traceback (most recent call last)...TypeError: 'float' object cannot be interpreted as an integer# (3)序列操作>>> b = range(1,10)>>> b[0]1>>> b[:-3]range(1, 7)>>> b[0] = 2TypeError Traceback (most recent call last)...TypeError: 'range' object does not support item assignment# (4)不是迭代器>>> hasattr(range(3),'__iter__')True>>> hasattr(range(3),'__next__')False>>> hasattr(iter(range(3)),'__next__')True2、 为什么range()不生产迭代器?能够取得迭代器的内置办法很多,例如 zip() 、enumerate()、map()、filter() 和 reversed() 等等,然而像 range() 这样仅仅失去的是可迭代对象的办法就绝无仅有了(若有反例,欢送告知)。这就是我存在常识误区的中央。 ...

June 21, 2022 · 2 min · jiezi

关于python:Python进阶自定义对象实现切片功能

切片是 Python 中最迷人最弱小最 Amazing 的语言个性(简直没有之一),在《Python进阶:切片的误区与高级用法》中,我介绍了切片的根底用法、高级用法以及一些应用误区。这些内容都是基于原生的序列类型(如字符串、列表、元组……),那么,咱们是否能够定义本人的序列类型并让它反对切片语法呢?更进一步,咱们是否能够自定义其它对象(如字典)并让它反对切片呢? 1、魔术办法:__getitem__()想要使自定义对象反对切片语法并不难,只须要在定义类的时候给它实现魔术办法 __getitem__() 即可。所以,这里就先介绍一下这个办法。 语法:object.__getitem__(self, key) 官网文档释义:Called to implement evaluation of self[key]. For sequence types, the accepted keys should be integers and slice objects. Note that the special interpretation of negative indexes (if the class wishes to emulate a sequence type) is up to the __getitem__() method. If key is of an inappropriate type, TypeError may be raised; if of a value outside the set of indexes for the sequence (after any special interpretation of negative values), IndexError should be raised. For mapping types, if key is missing (not in the container), KeyError should be raised. ...

June 21, 2022 · 2 min · jiezi

关于python:Python进阶切片的误区与高级用法

家喻户晓,咱们能够通过索引值(或称下标)来查找序列类型(如字符串、列表、元组…)中的单个元素,那么,如果要获取一个索引区间的元素该怎么办呢? 切片(slice)就是一种截取索引片段的技术,借助切片技术,咱们能够非常灵便地解决序列类型的对象。通常来说,切片的作用就是截取序列对象,然而,它还有一些应用误区与高级用法,都值得咱们留神。所以,本文将次要跟大家一起来探讨这些内容,心愿你能学有所获。 当时申明,切片并非列表的专属操作,但因为列表最具代表性,所以本文仅以列表为例作探讨。 1、切片的根底用法列表是 Python 中极为根底且重要的一种数据结构 切片的书写模式:[i : i+n : m] ;其中,i 是切片的起始索引值,为列表首位时可省略;i+n 是切片的完结地位,为列表末位时可省略;m 能够不提供,默认值是1,不容许为0 ,当m为正数时,列表翻转。留神:这些值都能够大于列表长度,不会报越界。 切片的根本含意是:从序列的第i位索引起,向右取到后n位元素为止,按m距离过滤 。 li = [1, 4, 5, 6, 7, 9, 11, 14, 16]# 以下写法都能够示意整个列表,其中 X >= len(li)li[0:X] == li[0:] == li[:X] == li[:]== li[::] == li[-X:X] == li[-X:]li[1:5] == [4,5,6,7] # 从1起,取5-1位元素li[1:5:2] == [4,6] # 从1起,取5-1位元素,按2距离过滤li[-1:] == [16] # 取倒数第一个元素li[-4:-2] == [9, 11] # 从倒数第四起,取-2-(-4)=2位元素li[:-2] == li[-len(li):-2]== [1,4,5,6,7,9,11] # 从头开始,取-2-(-len(li))=7位元素# 步长为正数时,列表先翻转,再截取li[::-1] == [16,14,11,9,7,6,5,4,1] # 翻转整个列表li[::-2] == [16,11,7,5,1] # 翻转整个列表,再按2距离过滤li[:-5:-1] == [16,14,11,9] # 翻转整个列表,取-5-(-len(li))=4位元素li[:-5:-3] == [16,9] # 翻转整个列表,取-5-(-len(li))=4位元素,再按3距离过滤# 切片的步长不能够为0li[::0] # 报错(ValueError: slice step cannot be zero)上述的某些例子对于初学者(甚至很多新手)来说,可能还不好了解。我集体总结出两条教训: ...

June 21, 2022 · 2 min · jiezi

关于python:赞-一些Python高性能使用技巧

1. 易混同操作本节对一些 Python 易混同的操作进行比照。 1.1 有放回随机采样和无放回随机采样 import randomrandom.choices(seq, k=1) # 长度为k的list,有放回采样random.sample(seq, k) # 长度为k的list,无放回采样1.2 lambda 函数的参数 func = lambda y: x + y # x的值在函数运行时被绑定func = lambda y, x=x: x + y # x的值在函数定义时被绑定1.3 copy 和 deepcopy import copyy = copy.copy(x) # 只复制最顶层y = copy.deepcopy(x) # 复制所有嵌套局部复制和变量别名联合在一起时,容易混同: a = [1, 2, [3, 4]]# Alias.b_alias = a assert b_alias == a and b_alias is a# Shallow copy.b_shallow_copy = a[:] assert b_shallow_copy == a and b_shallow_copy is not a and b_shallow_copy[2] is a[2]# Deep copy.import copyb_deep_copy = copy.deepcopy(a) assert b_deep_copy == a and b_deep_copy is not a and b_deep_copy[2] is not a[2]对别名的批改会影响原变量,(浅)复制中的元素是原列表中元素的别名,而深层复制是递归的进行复制,对深层复制的批改不影响原变量。 ...

June 21, 2022 · 4 min · jiezi

关于python:神器轻松可视化Python程序调用流程

明天咱们来分享一个 Python 畛域的神级第三方库 -- pycallgraph,通过该库并联合 graphviz 工具,就能够十分不便的实现 Python 应用程序调用流程的可视化工作 咱们先来看下效果图 怎么样,很是惊艳吧~ 上面咱们就来一起实现这个可视化过程 装置 graphviz 工具生成图片的过程,是依赖工具 graphviz 的,咱们先进行下载安装 下载地址 http://www.graphviz.org/downl...置信对于 graphviz 工具,大家应该也相熟了,咱们以前通过该工具进行过决策树的可视化工作,这里就不再赘述了 实战接下来咱们还须要装置两个 Python 依赖库 pip install pycallgraph上面咱们先写一个根底的代码 from pycallgraph import PyCallGraphfrom pycallgraph.output import GraphvizOutputclass Banana:    def eat(self):        passclass Person:    def __init__(self):        self.no_bananas()    def no_bananas(self):        self.bananas = []    def add_banana(self, banana):        self.bananas.append(banana)    def eat_bananas(self):        [banana.eat() for banana in self.bananas]        self.no_bananas()def main():    graphviz = GraphvizOutput()    graphviz.output_file = 'basic.png'    with PyCallGraph(output=graphviz):        person = Person()        for a in range(10):            person.add_banana(Banana())        person.eat_bananas()if __name__ == '__main__':    main()代码比较简单,定义了两个简略类,次要 pycallgraph 的外围代码在 main 函数中,在 with 代码块下,把咱们定义的代码执行一遍即可 运行下面的代码,会在当前目录下生成 basic.png 图片文件 从生成的图片能够十分清晰的看出整个代码的运行过程,从 main 代码块到各个类的初始化,能够说高深莫测 咱们再来一个简单一点的例子 import refrom pycallgraph import PyCallGraphfrom pycallgraph import Configfrom pycallgraph.output import GraphvizOutputdef main():    graphviz = GraphvizOutput()    graphviz.output_file = 'regexp.png'    config = Config(include_stdlib=True)    with PyCallGraph(output=graphviz, config=config):        reo = compile()        match(reo)def compile():    return re.compile('^[abetors]*$')def match(reo):    [reo.match(a) for a in words()]def words():    return [        'abbreviation',        'abbreviations',        'abettor',        'abettors',        'abilities',        'ability',        'abrasion',        'abrasions',        'abrasive',        'abrasives',    ]if __name__ == '__main__':    main()代码同样不负责,不过在编译器外部是调用了 re 正则的,咱们来看看最终生成的图片 能够看到整个代码过程简单了很多,因为外部调用了很多正则外部函数等,然而整体还是十分清晰的 能够说这个神级第三方库,相对是泛滥 Python 爱好者,尤其是刚刚入门 Python 畛域的敌人的福音,当咱们遇到某些不相熟的较为简单的代码块时,无妨应用该库来尝试一下可视化,看看能不能从中暴发灵感呢~ 以上就是本次分享的所有内容,如果你感觉文章还不错,欢送关注公众号:Python编程学习圈,每日干货分享,发送“J”还可支付大量学习材料。或是返回编程学习网,理解更多编程技术常识。

June 21, 2022 · 1 min · jiezi

关于python:超全Python读取文件方法

文件是无处不在的,无论咱们应用哪种编程语言,解决文件对于每个程序员都是必不可少的 文件解决是一种用于创立文件、写入数据和从中读取数据的过程,Python 领有丰盛的用于解决不同文件类型的包,从而使得咱们能够更加轻松不便的实现文件解决的工作 本文纲要: 应用上下文管理器关上文件Python 中的文件读取模式读取 text 文件读取 CSV 文件读取 JSON 文件Let's go! 关上文件在拜访文件的内容之前,咱们须要关上文件。Python 提供了一个内置函数能够帮忙咱们以不同的模式关上文件。open() 函数承受两个基本参数:文件名和模式 默认模式是“r”,它以只读形式关上文件。这些模式定义了咱们如何拜访文件以及咱们如何操作其内容。open() 函数提供了几种不同的模式,咱们将在前面逐个探讨 上面咱们通过 ’Python 之禅‘ 文件来进行前面的探讨学习 f = open('zen_of_python.txt', 'r')print(f.read())f.close()Output: The Zen of Python, by Tim PetersBeautiful is better than ugly.Explicit is better than implicit.Simple is better than complex.Complex is better than complicated.Flat is better than nested.Sparse is better than dense.Readability counts....在下面的代码中,open() 函数以只读模式关上文本文件,这容许咱们从文件中获取信息而不能更改它。在第一行,open() 函数的输入被赋值给一个代表文本文件的对象 f,在第二行中,咱们应用 read() 办法读取整个文件并打印其内容,close() 办法在最初一行敞开文件。须要留神,咱们必须始终在解决完关上的文件后敞开它们以开释咱们的计算机资源并防止引发异样 在 Python 中,咱们能够应用 with 上下文管理器来确保程序在文件敞开后开释应用的资源,即便产生异样也是如此 with open('zen_of_python.txt') as f:    print(f.read())Output: The Zen of Python, by Tim PetersBeautiful is better than ugly.Explicit is better than implicit.Simple is better than complex.Complex is better than complicated.Flat is better than nested.Sparse is better than dense.Readability counts....下面的代码应用 with 语句创立了一个上下文,并绑定到变量 f ,所有文件对象办法都能够通过该变量拜访文件对象。read() 办法在第二行读取整个文件,而后应用 print() 函数输入文件内容 ...

June 21, 2022 · 3 min · jiezi

关于python:几行Python代码实现动图倒放太好玩

开始分享明天的技术之前,先来看几个动图(gif) (原图1) (倒放1) (原图2) (倒放2) 上诉两个动图,能够通过几行Python代码就能够实现倒放成果。\ 导入库 from PIL import Image, ImageSequenceImage库用于读取(加载)图片 ImageSequence 用于将GIF拆解为图片(一帧一图) # 加载本地动图image = Image.open("cg.gif")# GIF 动图拆分器list = ImageSequence.Iterator(image)拆分动图 imgs = []# 拆分后的图片进行编号,从1开始k = 1# 遍历图片流的每一帧for frame in list:    # 拆分后的图片,保留到chenge文件夹下,图片命名为img_1.png、img_2.png、...    frame.save("./chenge/img_%d.png" % k)    imgs.append(frame.copy())    k += 1将拆解后的帧图进行反转(倒序排列),并保留成新的动图reverse_cg.gif # 拆分图片流进行反序imgs.reverse()# 将反序后所有帧图保留下来,命名为reverse_cg.gifimgs[0].save("reverse_cg.gif", save_all=True, append_images=imgs[1:])最初生成后果 残缺源码 from PIL import Image, ImageSequence# 加载本地动图image = Image.open("cg.gif")# GIF 动图拆分器list = ImageSequence.Iterator(image)imgs = []# 拆分后的图片进行编号,从1开始k = 1# 遍历图片流的每一帧for frame in list:    # 拆分后的图片,保留到chenge文件夹下,图片命名为img_1.png、img_2.png、...    frame.save("./chenge/img_%d.png" % k)    imgs.append(frame.copy())    k += 1# 拆分图片流进行反序imgs.reverse()# 将反序后所有帧图保留下来,命名为reverse_cg.gifimgs[0].save("reverse_cg.gif", save_all=True, append_images=imgs[1:])以上就是本文的动图倒放技术过程 原理:读取动图,将动图进行拆分(一帧一图),将拆分后的动图进行反转(实现倒放的要害),而后反转后的图片保留新动图(gif)。 以上就是本次分享的所有内容,如果你感觉文章还不错,欢送关注公众号:Python编程学习圈,每日干货分享,发送“J”还可支付大量学习材料。或是返回编程学习网,理解更多编程技术常识。

June 21, 2022 · 1 min · jiezi

关于python:邂逅Django一创建项目

邂逅Django - 目录✅ Part 1:【邂逅Django】—— (一)创立我的项目 ️ Part 2:【邂逅Django】—— (二)数据库配置 ️ Part 3:【邂逅Django】—— (三)视图 ️ Part 4:【邂逅Django】—— (四)表单和通用视图 ️ Part 5:【邂逅Django】—— (五)欠缺界面(自定义界面和款式) ️ Part 6:【邂逅Django】—— (六)自定义治理界面 ️ Part 7:【邂逅Django】—— (七)自动化测试 前言本系列文章,在Django官网文档教程的根底模板下,进行了肯定的改良和删除(对模板相干内容不进行解说),增加了一些本人的见解。 心愿大家看完该系列文章后,对Django可能有一个清晰的意识。 路漫漫兮其修远兮,吾将上下而求索! Django==官网文档==:https://www.djangoproject.com/ ❗ ❗ ❗ 学习过程中,多看官网文档,能够解决很多问题 ❗ ❗ ❗ 本教程应用poetry对我的项目环境进行治理。相干poetry的装置与应用,请参考文章(https://segmentfault.com/a/1190000041944234) 我的项目地址:https://github.com/CoderBerryRabbit/MeetDjango 一、环境阐明开发环境:MacbookPro M1开发工具:PyCharmPython版本:3.9.xDjango版本:3.2.x虚拟环境&包管理工具:poetry二、创立我的项目2.1 装置依赖poetry add django@^3.2.132.2 查看Django版本python -m django --version# 或django-admin --version2.3 Django版本和Python版本对照表Django版本Python版本2.23.5、3.6、3.7、3.8(在 2.2.8 中增加)、3.9(在 2.2.17 中增加)3.03.6、3.7、3.8、3.9(在 3.0.11 中增加)3.13.6、3.7、3.8、3.9(在 3.1.3 中增加)3.23.6、3.7、3.8、3.9、3.10(在 3.2.9 中增加)4.03.8、3.9、3.102.4 创立Django我的项目django-admin startproject mysite阐明: ...

June 21, 2022 · 1 min · jiezi

关于python:Python常用库和小众库推荐

Requests库爬虫必备库,鼎鼎大名,用来发动get、post等申请,能够算是url库在python3的继承者。 BeautifulSoup库爬虫必备库,也是很有名,用来解析html代码,从中提取有用数据。个别举荐搭配lxml解析库应用,有些代码遇到解析问题,能够尝试用html.parser库代替。 tqdm库能够用来作进度条,展现程序执行进度,比方爬虫的日志。然而留神,在windows命令行中,无奈实现同行刷新,每次都会输入一行新的,就不举荐应用了。(powershell下没试过) peewee库用来做数据库模型很好用,当然也能够间接用sqlalchemy库。这个库我集体感觉,比后者学起来要简略一些,而且能够用命令行在模型类和数据库表构造之间一键导入导出。 Arrow库集体感觉最好用的工夫转换库,强烈推荐。反对各种格局,并且api可读性也很好,不便切换前后N天N周等。 PIL库python最佳图形处理库,我只用它做过图像裁切转换拼接等,据说能够实现一一像素批改、检测、计算等,在图像识别畛域也有很多用处。 OpenPyxl我集体比拟喜爱的office文档解决库,用来解决excel很不便。然而貌似不适用于大批量解决数据,大批量还是举荐pandas库,间接加载csv文件。 Jsonlines库微信小程序开发能够用用,微信云开发应用的是json lines格局,算是json的变体,转换起来还是有些麻烦的,要本人写一下,用这个能够略微节俭点工夫精力。 PyPinyin库用来把汉字转换拼音的,须要本人写一个函数,把转换好的拼音拼接起来,否则是一个字一个拼音,是数组格局。

June 20, 2022 · 1 min · jiezi

关于python:Python-面向对象基本语法验证是否是对象的方法dir定义类示例

在学根底语法之前先学习一下python中的一个内置函数dir。在python中对象简直是无处不在的,之前学习的变量、数据、函数都是对象。 一、验证是否是对象:在python中能够应用以下两个办法验证是否是对象: 1、在标识符/数据(或变量名)后输出一个点.,而后按下一个TAB键,iPython会提醒该对象可能调用的罕用办法列表。 2、应用内置函数dir传入标识符/数据(变量名或函数名),能够查看对象内的所有属性及办法。 应用函数中的__doc__ demo.__doc 提醒:__办法名__ (两个下划线结尾和结尾)格局的办法是Python提供的内置办法/属性,接下来会介绍一些罕用的内置办法/属性。 提醒:利用好dir()函数,在学习时很多内容就不须要死记硬背了。 揭示:装置 ipython 之后,查看 PyCharm 设置,确保 Console 的通用设置 Use IPython if available 选项打勾。 二、定义简略的类(只蕴含办法)面向对象是更大的封装,在一个类中封装多个办法,这样通过这个类创立进去的对象就能够间接调用这些办法。 2.1 定义只蕴含办法的类在python中要定义一个只蕴含办法的类,语法格局如下: class 类名: def 办法1(self, 参数列表): pass def 办法1(self, 参数列表): pass办法的定义格局和之前学习过的函数简直一样。区别:在于第一个参数必须是self,能够先记住就是这个格局,之后再介绍这个self。 留神: 类名的命格规定要合乎大驼峰命名法。 2.2 创建对象当一个类定义实现之后,要是用这个类来创建对象,语法格局如下: 对象变量 = 类名() 2.3 第一个面向对象演练需要:小猫爱吃鱼,小猫要喝水 剖析: 定义一个猫类 Cat定义两个办法eat 和 drink依照需要,不须要定义属性示例代码: class Cat: def eat(self): print("小猫爱吃鱼") def drink(self): print("小猫要喝水")# 创立猫对象名字叫tomtom = Cat()# 调用对象的办法tom.eat()tom.drink()执行后果: 在主程序中应用tom这个变量去接管一个Cat猫的对象,而后用tom这个变量来调用吃鱼的和喝水的办法,至于吃鱼的办法和喝水的办法是怎么实现的,主程序中就不关怀了。 面向对象开发中很显著的一个特点,主程序中只负责让对象去工作,而不再关怀具体方法的外部实现,至于办法外部的实现通通被封装到了Cat猫这个类中。 面向对象是学习Python中一个很难的局部,同样也是一个很重要的常识,当前去公司做我的项目必然会用到,心愿在学习这背面的小白不要胆怯,慢慢来,一遍不懂就重复的查找材料了解,千万不要说学到前面感觉太难就放弃了,这个骨头不啃掉还怎么学习前面的常识呢。在python自学网里有几十节面向对象的视频教程,也有文字讲解文章。还包含其余教程比方django教程等等,感兴趣的能够去网里瞅一瞅。 更多python相干文章请关注python自学网:www.wakey.com.cn/ ...

June 20, 2022 · 1 min · jiezi

关于python:Python面向对象编程类和对象的基本概念关系类的设计方法

一、类和对象的概念:类和对象是面向对象编程的两个外围概念。 1.1 类类是对一群具备雷同特色或者行为的事物的一个统称,是形象的,不能间接应用 特色被称为属性行为被称为办法类就相当于制作飞机时的图纸,是一个模板,是负责创建对象的,这张图纸并不能让飞机腾飞,得先制作出飞机有驾驶员条件。 1.2 对象对象是由类创立进去的一个具体的存在,能够间接应用。 由哪一个类创立进去的对象,就领有在哪一个类中定义的属性和办法。 在程序开发中,应该先有类,再有对象。 对象就相当于用图纸制作的飞机。一句话就是能够把类看做是图纸,把对象看做是图纸制作进去的飞机。 二、类和对象的关系类是模板,对象是依据类这个模板创立进去的,应该先有类再有对象。 类只有一个,而对象能够有很多个。 不同的对象之间属性可能会各不相同。 类中定义了什么属性和办法,对象中就有什么属性和办法,不可能多,也不可能少。 以上就是面向对象编程中连个外围的概念,一个是类一个是对象。一句话讲类的职责很繁多就是负责创建对象的,在类中定义一下创立进去的对象具备什么样的属性和办法。当有了类之后咱们就能够用类来创立出很多对象,当对象创立出之后就能够用对象来调用在类中的办法,并且设置在类中的属性。 三、类的设计都晓得面向对象开发进去的程序最终后果是不同的对象调用不同的办法。在面向对象中想要创立出对象,得先有类,那类是怎么样设计进去的?上面开始缓缓阐明。 在应用面向对象开发前,应该首先剖析需要,确定一下程序中须要蕴含哪些类。 比方上面的动物大战僵尸游戏中,要设置向日葵类,豌豆射手类等等很多类。 在程序开发中,要设计一个类,通常须要满足以下三个因素: 类名:这类事物的名字,满足大驼峰命名法属性:这类事物具备什么样的特色办法:这类事物具备什么样的行为大驼峰命名法:CapWords 每一个单词的首字母大写,单词与单词之间没有下划线 3.1 类名的确定名词提炼法,剖析整个业务流程呈现的名词,通常就是要找到的类。 3.2 属性和办法的确定对对象的特征描述,通常能够定义为属性。 对象具备的行为(动词),通常能够定义为办法。 提醒:需要中没有波及的属性或者办法在设计类时,不须要思考 练习1: 需要: 小明往年20岁,身高180cm,每天早上跑完步,会去吃货色 小菜往年18岁,身高165cm,小菜不跑步,小菜喜爱吃货色 解答:设计一个人类,属性蕴含名字、年龄、身高,行为蕴含跑和吃,再创立两个不同的对象。 练习2: 需要: 一只黄色的狗狗叫大黄 见到生人 汪汪叫 见到家人 摇尾巴 解答:设计一个狗的类,属性是名字和讨厌,行为是汪汪叫和摇尾巴。 更多python相干文章请关注python自学网:www.wakey.com.cn/

June 20, 2022 · 1 min · jiezi

关于python:Python是否支持复制字符串呢

本文题目的问题分为两局部:(1)Python 中是否反对复制字符串?(2)如果不反对,为什么不反对? 请读者花几分钟想一下,想分明后,把你的答案记住,而后再往下看。 让咱们做一个约定(被迫恪守):如果看到最初,你颠覆了当初的答案,建设了新的认知,这阐明我写的内容有用,那请你任意赞叹,或者将本文分享给其余应用 Python 的小伙伴。 1. 什么是复制字符串?首先,必须要大家对“复制”这个概念达成共识。复制,也叫拷贝,英文单词是 copy,具体意思是“将某事物通过某种形式制作成雷同的一份或多份的行为”(释义来自维基百科)。复制的后果是,呈现了多份极其类似但却互相独立的事物(正本),举例来说,你有一份文档 X,而后复制一份并重新命名为 Y,这两者是互相独立的,若你删除其中一个,另一个不会一起被删除。 这个词用在 Python 里,咱们想表白的是同样的意思,即复制行为会产生新的独立对象,它与原始对象极其类似,但两者的生命周期没有间接的关联关系。上面先用列表来举例: list1 = [1,2]id(list1) >>> 1981119454856list2 = list1.copy()print(list1 == list2) >>> Trueid(list2)>>> 1981116983752上例中,列表 list2 是 list1 的正本,两者字面量相等,然而内存地址(即 id )不相等,是两个互相独立的对象。如果字符串可能做到同样的成果,那咱们就说,字符串能够被复制,否则,咱们说字符串不能够被复制。 2. 怎么能复制字符串?有了下面的概念和示例,请先思考,你会用什么形式复制字符串呢?(暂停,思考3分钟) 好了,先看看上面的几种办法: s0 = "Python编程学习圈"s1 = s0s2 = str(s0)s3 = s0[:]s4 = s0 + ''s5 = '%s' % s0s6 = s0 * 1s7 = "".join(s0)import copys8 = copy.copy(s0)你想到的复制形式是否在以上8种形式里呢?那么,如果把 s0 至 s8 的 id 打印进去,有哪些会跟 s0 不同呢? ...

June 20, 2022 · 1 min · jiezi

关于python:详解Python拼接字符串的七种方式

忘了在哪看到一位编程大牛调侃,他说程序员每天就做两件事,其中之一就是解决字符串。置信不少同学会有同感。 简直任何一种编程语言,都把字符串列为最根底和不可或缺的数据类型。而拼接字符串是必备的一种技能。明天,我跟大家一起来学习Python拼接字符串的七种形式。 1、来自C语言的%形式 print('%s %s' % ('Hello', 'world'))>>> Hello world%号格式化字符串的形式继承自古老的C语言,这在很多编程语言都有相似的实现。上例的%s是一个占位符,它仅代表一段字符串,并不是拼接的理论内容。理论的拼接内容在一个独自的%号前面,放在一个元组里。 相似的占位符还有:%d(代表一个整数)、%f(代表一个浮点数)、%x(代表一个16进制数),等等。%占位符既是这种拼接形式的特点,同时也是其限度,因为每种占位符都有特定意义,理论应用起来太麻烦了。 2、format()拼接形式 # 简洁版s1 = 'Hello {}! My name is {}.'.format('World', 'Python编程学习圈')print(s1)>>>Hello World! My name is Python编程学习圈.# 对号入座版s2 = 'Hello {0}! My name is {1}.'.format('World', 'Python编程学习圈')s3 = 'Hello {name1}! My name is {name2}.'.format(name1='World', name2='Python编程学习圈')print(s2)>>>Hello World! My name is Python编程学习圈.print(s3)>>>Hello World! My name is Python编程学习圈.这种形式应用花括号{}做占位符,在format办法中再转入理论的拼接值。容易看出,它实际上是对%号拼接形式的改良。这种形式在Python2.6中开始引入。 上例中,简洁版的花括号中无内容,毛病是容易弄错秩序。对号入座版次要有两种,一种传入序列号,一种则应用key-value的形式。实战中,咱们更举荐后一种,既不会数错秩序,又更直观可读。 3、() 相似元组形式 s_tuple = ('Hello', ' ', 'world')s_like_tuple = ('Hello' ' ' 'world')print(s_tuple) >>>('Hello', ' ', 'world')print(s_like_tuple) >>>Hello worldtype(s_like_tuple) >>>str留神,上例中s_like_tuple并不是一个元组,因为元素间没有逗号分隔符,这些元素间能够用空格距离,也能够不要空格。应用type()查看,发现它就是一个str类型。我没查到这是啥起因,猜想或者()括号中的内容是被Python优化解决了。 ...

June 20, 2022 · 1 min · jiezi

关于python:判断文件的几种方法及其优劣对比

咱们晓得当文件不存在的时候,open()办法的写模式与追加模式都会新建文件,然而对文件进行判断的场景还有很多,比方,在爬虫下载图片的时候,可能须要判断文件是否存在,免得反复下载;又比方,创立新文件的时候,可能须要判断文件是否存在,存在就先做个备份……所以,学习判断文件是否存在,还是很有必要的。 学习是循序渐进的过程,若能建设知识点间的分割,进行系统性的学习,那将更有助于成果。浏览这篇文章,你将读到如下内容: 1、判断文件的办法(try语句、os模块、pathlib模块)2、以上几种办法的优劣比照 懒人的try语句咱们之前学过,要用with语句来解决文件读写,但with语句也不是万能的,所以还得关注一些异常情况。 例如,当应用open()办法的时候,如果文件不存在,程序会抛出FileNotFoundError异样,而如果权限有余的话,就会抛出PersmissionError异样。 with open("python.log", "r") as f: ...: f.read()-----------------------...(略)FileNotFoundError: [Errno 2] No such file or directory: 'python.log'为了防止这些异样导致程序中断,咱们能够用try…except…语句来捕获异样,而后在except子句进行异样的解决。 不过,在猫猫看来,这个办法不值得举荐。起因有二,一是这种办法很被动,程序的衰弱受制于不可预测的异样;二是当文件不存在的时候,咱们可能须要去创立文件,这些逻辑如果写在except子句里,可读性太差了。 传统的os模块顾名思义,Python内置的os模块是用来与OS(操作系统)进行交互的模块,它能够实现很多在命令行下做的操作,例如,获取操作系统信息、获取/批改环境变量、进行目录操作(创立、删除、遍历)和各种文件操作等等。上面,咱们要学习的是跟文件判断密切相关的几个办法。 1、os.path.exists()用于判断文件及文件夹是否存在(留神:因为两者都能判断,为了无效辨别文件和文件夹,最好保障文件名是带后缀的): import os# 文件存在 VS 不存在os.path.exists("test.txt") >>>Trueos.path.exists("cat.txt") >>>False# 文件夹存在 VS 不存在os.path.exists("cat/images") >>>Trueos.path.exists("cat/image") >>>False2、os.path.isfile()、os.path.isdir() 判断给定的门路是文件还是文件夹: os.path.isfile("cat/images") >>>Falseos.path.isdir("cat/images") >>>Trueos.path.isfile("test.txt") >>>True3、os.access()检测文件门路的拜访权限,语法:os.access(path, mode);其中path指的是文件或者文件夹,mode指的是要检测的模式: os.access("cat/images", os.F_OK) >>>True # path存在os.access("cat/images", os.R_OK) >>>True # path可读os.access("cat/images", os.W_OK) >>>True # path可写os.access("cat/images", os.X_OK) >>>True # path可执行4、os模块中其它罕用办法:os.mkdir()创立目录、os.rmdir()删除目录、os.rename()重命名、os.remove()删除文件、os.path.join()连贯目录与文件名、os.path.split()宰割目录与文件名……(不一一举例了,今后有机会再作介绍) 时尚的pathlib模块pathlib模块是python3.4才退出的模块,官网介绍它是面向对象的文件系统门路(Object-oriented filesystem paths),这是一个很弱小的模块,文末附录了官网文档地址。 这里次要介绍几个根本的用法: import pathlibfile_obj = pathlib.Path("test.txt")file_obj.name >>>'test.txt' # 文件名file_obj.exists() >>> True # 是否存在file_obj.is_dir() >>>False # 是否文件夹file_obj.is_file() >>>True # 是否文件几种办法优劣比照围绕文件操作的常识很多,限于篇幅,本文次要对判断文件作了介绍,今后兴许还会对其它具体话题进行学习。 ...

June 20, 2022 · 1 min · jiezi

关于python:给Python学习者的文件读写指南含基础与进阶建议收藏

对于初学者来说,一份详尽又清晰明确的指南很重要。明天,猫猫跟大家一起,好好学习Python文件读写的内容,这部分内容特地罕用,把握后对工作和实战都大有益处。学习是循序渐进的过程,欲速则不达。文章较长,倡议大家珍藏,以备温习查阅哦。 1、如何将列表数据写入文件?2、如何从文件中读取内容?3、多样需要的读写工作4、从with语句到上下文管理器 如何将列表数据写入文件?首先,咱们来看看上面这段代码,并思考:这段代码有没有问题,如果有问题的话,要怎么改? li = ['python',' is',' a',' cat']with open('test.txt','w') as f: f.write(li)当初颁布答案,这段代码会报错: TypeError Traceback (most recent call last)<ipython-input-6-57e0c2f5a453> in <module>() 1 with open('test.txt','w') as f:----> 2 f.write(li)TypeError: write() argument must be str, not list以上代码的想法是将list列表内容写入txt文件中,然而报错 TypeError: write() argument must be str。就是说,write()办法必须承受字符串(str)类型的参数。 Python中内置了str()办法,能够返回字符串版本的对象(Return a string version of object)。所以,下面的例子中,咱们试试把 f.write(li) 改为 f.write(str(li)) ,先做一下字符串类型的转化看看。代码略。 这次没有报错了,然而关上文件就傻眼了吧,写入的内容是“['python',' is',' a',' cat']”。怎么能力写成“python is a cat”呢? 文件写操作还有一个writelines()办法,它接管的参数是由字符串组成的序列(sequence),理论写入的成果是将全副字符串拼接在一起。字符串自身也是一种序列,所以当参数是字符串的时候,writelines()办法等价于write()。 # 以下3种写法等价,都是写入字符串“python is a cat”In [20]: with open('test.txt','w') as f: ...: f.writelines(['python',' is',' a',' cat']) ...: f.writelines('python is a cat') ...: f.write('python is a cat')# 以下2种写法等价,都是写入列表的字符串版本“['python',' is',' a',' cat']”In [21]: with open('test.txt','w') as f: ...: f.write(str(['python',' is',' a',' cat'])) ...: f.writelines(str(['python',' is',' a',' cat']))# 作为反例,以下写法都是谬误的:In [22]: with open('test.txt','w') as f: ...: f.writelines([2018,'is','a','cat']) # 含非字符串 ...: f.write(['python','is','a','cat']) # 非字符串由上可知,当多段扩散的字符串存在于列表中的时候,要用writelines()办法,如果字符串是一整段,那间接应用write()办法。如果要以整个列表的模式写入文件,就应用str()办法做下转化。 ...

June 20, 2022 · 3 min · jiezi

关于python:Python爬取高校就业职位向电脑微信发通知

明天介绍的我的项目核心内容有两个,一个是抓取内容,另一个是发消息告诉。上面咱们一一来解说。 1 爬取职位信息确定爬取的思路该我的项目里爬取的都是江苏省高校,并且不止一个。爬取数据的入口是江苏省的某待业平台(http://www.91job.org.cn/defau...) 该页面收录了江苏省各市 160 多所高校的待业网站。从这里点进去每个站点里的内容,跟各高校官网的待业信息站点的内容是一样的,以南京师范大学为例: 能够看到,除了url不同外,内容是一样的。这就带来了一个益处是,咱们想爬取多个高校的待业信息,不必去每个高校官网找内容,间接到这个网站找就能够了,并且url格局也是固定的 “高校英文.91job.org.cn”。\这还不是最牛的,最牛的是每个高校的职位列表页的 HTML 代码标签是一样的,上面比照下南京师范大学和东南大学的职位列表: 能够看到,二者的 HTML 标签和属性取值都是一样的,这带来的另外一个益处是,咱们能够写一份代码来爬取多个高校的待业列表。 另外,我找了山东的两个高校网站,职位列表页的HTML跟下面也是统一的,但找了北京两个网站发现齐全不同。既然有很多高校能做到统一,阐明背地有人在推动这件事,不管是谁都为他们的行为点个赞。 其实,企业里也常常遇到这样的问题,常常一个部门或者多个部门之间的数据格式不统一,往往须要花大量工夫在数据买通上做很多事件,十分费时费力,并且很难保护。 爬取数据有了 url 和 网页格局,咱们就很容易爬数据了,首先须要一个待爬的高校列表 咱们须要的就是第一列,用它来拼接高校就业网的 url。有了 url 咱们就能够发申请获取网页源码了 外围的爬虫代码就这点,很简略。 51行拼接各高校职位列表url52行 get_url 函数里应用 requests.get 来获取网页源代码53行用 BeatifulSoup 解析网页 HTML 代码54行获取 HTML class=‘infoList’ 的内容,这个属性值在下面 HTML 源码截图里能够看到56行遍历职位列表,从中获取职位链接发送告诉爬取职位后,就能够发送告诉了,该我的项目反对三种告诉形式:print打印控制台、windows 气泡告诉 和 微信告诉。 须要减少一个逻辑是判断是否要告诉,如果曾经告诉过了就无须再告诉。 59~61行用来判断是否须要告诉的逻辑,告诉过的内容会写入 url_list.txt 中,并且程序启动时会将文件内容读入 url_list 变量。 65~72行依据配置发送不同模式的告诉。print告诉没啥说的,咱们简略介绍微信好友和windows气泡告诉。 微信好友告诉微信告诉次要用到 wxpy 模块,它在 itchat 的根底上,通过大量易用的接口。 首先须要初始化 106~107行初始化 Bot 对象,启动程序时会弹出一个二维码,须要扫码登录。 109~102行确定将数据发给谁,能够发给文件助手、本人、或者任意好友。 调用 send 函数,就能够把内容发给好友了,很简略。 wxpy 文档提醒大家尽量用小号,因为应用该模块可能会导致 web微信无奈登录。 ...

June 20, 2022 · 1 min · jiezi

关于python:Django入门教程做个疫情数据报告

Django 是 Python web框架,发音 [dæŋo] ,翻译成中文叫“姜狗”。为什么要学框架?其实咱们本人齐全能够用 Python 代码从0到1写一个web网站,但那样就要写网络服务、数据库读写等底层代码。而框架的作用是把这些底层基建曾经搭建好了,咱们只写业务逻辑即可。 举个例子,楼房就是框架,咱们不关怀底层的脚手架、钢筋水泥是如何搭建的,只有有了这样的框架咱们就能够住进去,而外面的房间要怎么设计、装璜才是咱们关怀的。 1 初识Django我应用的 Python 版本是 3.8,先执行上面语句先装置 Django  pip install Django装置实现后,执行上面语句创立 Django 我的项目\ django-admin startproject duma我的项目的名称能够自定义,我创立的我的项目名是 duma。 命令执行结束后,在当前目录会生成 duma 目录,该目录蕴含以下源文件。 duma/    manage.py    duma/        __init__.py        settings.py        urls.py        asgi.py        wsgi.py简略介绍下这几个文件的作用: manage.py: 治理 Django 我的项目的命令行工具,就像一个工具箱,前面会常常用到mysite/settings.py:Django 我的项目的配置文件,如:配置该我的项目应用什么数据库、蕴含哪些利用等mysite/urls.py:Django 我的项目的 URL 申明mysite/asgi.py:作为你的我的项目的运行在 ASGI 兼容的 Web 服务器上的入口。临时用不到mysite/wsgi.py:作为你的我的项目的运行在 WSGI 兼容的Web服务器上的入口。临时用不到前面的学习中,咱们会应用、批改这下面的文件,那时候对他们的作用会有更深的领会。 运行上面命令,启动web服务,验证 duma 我的项目是否创立胜利。 python manage.py runserver执行命令,会看到有以下信息输入 Starting development server at http://127.0.0.1:8000/在浏览器拜访 http://127.0.0.1:8000/  看到下面的页面,阐明我的项目创立胜利。 接下来咱们要在 duma 我的项目中创立一个利用(app)。一个我的项目里能够有多个利用,如电商我的项目里能够有商城利用、领取利用和会员利用等等。 执行这行命令,创立一个利用 python manage.py startapp ncov这里创立了一个名为 ncov 的利用,用它来做一个疫情数据报告。我的项目根目录会发现有个 ncov 目录,蕴含以下文件 ncov/    __init__.py    admin.py    apps.py    migrations/        __init__.py    models.py    tests.py    views.py先不介绍它们的作用,这些文件前面根本都会用到,到时候会具体介绍。 2 Hello, World“Hello, World” 是学习任何编程语言的演示程序,当初咱们用 Django 实现一个“Hello, World” web利用。首先,在 “nocv/views.py” 文件中创立 index 函数 ...

June 20, 2022 · 2 min · jiezi

关于python:一详解Python装饰器真香

明天写篇文章,详解 Python 装璜器。文末有我的微信二维码,打算建个读者群,想交换 Python 的敌人能够加一下。 装璜器(decorator)是一种高级Python语法,也是 Python 函数式编程的一部分。写法是 @xxx,在 Pandas、Django 框架源码里常常能见到,利用十分宽泛。 尽管不必装璜器也不影响开发,但用了装璜器能够让你的代码“秀”起来,当然装璜器的作用不仅仅是“秀”,更重要的是它能够让你的代码更简洁,可读性更高;业务逻辑解耦,保护更容易。 1 函数根底学习装璜器之前,咱们先学习下 Python 函数的两个个性,函数体内能够定义函数 和 函数能够被援用。有根底的敌人能够略过,间接看下一大节。 例1.  函数体内定义函数 def func1():    def func2():        return "in func2"    res = func2()    return res在 func1 函数体内, 定义了一个 func2 函数并调用, 而后返回调用的后果。其实很多动态编程语言,如 C、Java,不反对在函数体内定义函数。但在 Python 中是反对的。 例2. 函数能够被援用 new_func = func1print(new_func())func1 是个函数,定义跟 例1 是一样的。能够看到函数名能够像变量那样应用。赋值后,new_func 就援用了 func1,就能够间接通过 new_func() 形式来调用函数。\既然函数名能够向变量一样赋值,那天然就能够被 return 返回。 def func1():    def func2():        return "in func2"    print(func2)    return func2new_func = func1()print(new_func)print(new_func())输入: <function func1.<locals>.func2 at 0x102499b80><function func1.<locals>.func2 at 0x102499b80>in func2print(func1) 和 print(new_func) 输入后果一样,阐明他们是同一个函数。\ 2 装璜器有了下面的根底,再学习装璜器就很容易了。上面通过一个 “炒土豆丝” 的例子来学习装璜器。 例3.  “炒土豆丝”根底版 def tu_dou_si():    """    "清炒土豆丝" 流程    """    print('荡涤土豆')    print('去皮,切丝')    print('清炒')    print('出锅')这是最根底的版本。为了跟国内接轨, 例子中应用中文拼音定义函数名或变量名。 上面咱们革新 例3,将其变成装璜器版本。 例4.  “炒土豆丝”装璜器版 ...

June 20, 2022 · 1 min · jiezi

关于python:年终奖扣税变了用Python写个工资计算器APP竟少拿了这么多

自2022年1月1日起,居民集体获得全年一次性奖金,应并入当年综合所得计算缴纳个人所得税。这次调整会影响年终奖到手的金额,打算用Streamlit 框架做个工资计算器 web app,岂但能晓得年终奖少了多少,也能看到每月到手工资以及变动。对代码不感兴趣的敌人能够间接跳到文末看论断,那里列举对不同月薪群体的影响。 19年个税改为累计预扣法计算后,大家会发现年初到手的工资高一些,年底就低一些了。 这是累计带来的效应,19年之前是每个月独立算个税,互不影响,所以每月到手工资变动不大。19年之后是每个月工资须要跟前几个月累计到一起来算个税。从年初到年底,累计金额越来越大,税率就会越高,缴纳的个税也就会 越高。到手的工资天然就是前高后低。每月累计的工资就叫当年综合所得。调整前年终奖有独自的税率表,独自计算个税。调整后,并入当年综合所得,就会导致税率比之前更高,到手的金额会变少。 1 计算公式依照个税累计预扣法,看下到手工资的计算方法。 咱们每月到手的工资须要从月薪里扣除个人所得税和缴纳的五险一金,所以第一个公式是:到手工资 = 月薪 - 当月个税 - 当月缴纳五险一金当月个税又波及 2 个公式: 应税金额 = 累计月薪 - 累计缴纳五险一金 - 累计6项附加扣除 - 累计个税起征点 当月个税 = 应税金额 税率(查表)- 速算扣除 - 前几月累计个税五险一金波及1个公式:每月缴纳五险一金 = 缴纳基数 缴纳比例 个税起征点是常量 5000,6项附加扣除是本人填报的,也能够看做是常量。 有了公式,计算到手工资就很简略了 2 计算五险一金五险一金包含养老保险、医疗保险、就业保险、工伤保险、生养保险和住房公积金,其中养老保险、医疗保险和公积金缴纳得多一些,对工资计算影响大,其余三个保险要么不须要集体缴纳,要么缴纳比例极低,能够疏忽。 所以,代码里用养老保险、医疗保险和住房公积金代替五险一金。 缴纳基数是个范畴,月薪落在该范畴就依照 月薪 缴纳比例 来算,如果超过下限依照 下限 缴纳比例 来算。 缴纳比例在不同城市、不同企业是不一样的,这里,我依照北京市最高比例作为默认值。别离是 2%、8%、12%。定义两个函数,一个用来获取缴纳基数,另一个依据基数和比例计算单月缴纳的五险一金。\ def get_cardinal_number(salary, low, high):    """    依据月薪获取社保缴费基数    :param salary: 月薪    :param low: 上限基数    :param high: 下限基数    :return: 理论缴费基数    """    if salary <= low:        return low    elif low < salary <= high:        return salary    else:        return highdef get_five_insurances(salary, yi_liao_rate=0.02, yang_lao_rate=0.08, gong_ji_jin_rate=0.12):    """    计算集体五险一金的缴纳金额    :param salary: 月薪    :param yi_liao_rate: 医疗保险缴纳比例    :param yang_lao_rate: 养老保险缴纳比例    :param gong_ji_jin_rate: 公积金缴纳比例    :return: 缴纳金额    """    yi_liao_cn = get_cardinal_number(salary, 5360, 29732)    yang_lao_cn = get_cardinal_number(salary, 3613, 26541)    gong_ji_jin_cn = get_cardinal_number(salary, 2320, 27786)    five_insurances = yi_liao_cn * yi_liao_rate + yang_lao_cn * yang_lao_rate + round(gong_ji_jin_cn * gong_ji_jin_rate)    return five_insurances3 计算个税首先,须要定义一张个人所得税税率表 ...

June 20, 2022 · 2 min · jiezi

关于python:peewee-获取-crud-操作对应的-sql-语句

peewee 有两种获取 crud 操作对应的 sql 语句的形式: 应用 logging,代理 peewee,以输入日志的形式打印 sql拜访 modelinsert 等类实例的 __str__ 办法我当初要讲的是后者: 获取插入操作的 sql def save_record(user_id: int, long_url: str, short_uuid: str) -> InsertResult: insert_obj = TinyUrl.insert( user_id=user_id, long_url=long_url, long_url_hash=md5_helper.get_string_md5(long_url), short_uuid=short_uuid ) sql = str(insert_obj) started_at = time.time() row_id = insert_obj.execute() ended_at = time.time() return InsertResult( tracks=[ DBCrudTrack( sql=sql, pay_time=ended_at - started_at ) ], row_id=row_id )获取查问操作的 sql def get_row_by_user_id_long_url_hash(user_id: int, long_url_hash: str) -> SelectResult: query: ModelSelect = TinyUrl.select().where( (TinyUrl.user_id == user_id) & (TinyUrl.long_url_hash == long_url_hash) ) sql = str(query) start_at = time.time() rows: list[dict] = list( query.dicts() ) end_at = time.time() return SelectResult( tracks=[ DBCrudTrack( sql=sql, pay_time=end_at - start_at ) ], rows=[ Row(**row) for row in rows ] )

June 19, 2022 · 1 min · jiezi

关于python:python-的线程池如何获取-work-队列中的消息数量

python 的线程池应用的是一种生产者消费者的模型 from concurrent.futures import ThreadPoolExecutorfrom loguru import loggerimport requestsimport timepool = ThreadPoolExecutor(max_workers=10)def func_get(): response = requests.get('http://127.0.0.1:5002') time.sleep(10)def func_callback(): passfor i in range(100): feature = pool.submit(func_get) feature.add_done_callback(func_callback)在其余线程中调用 pool 的 queue 的 submit 接口的时候,task 会被提交给 pool 中的 queue work thread 会从 queue 中去工作做,如果队列为空,则阻塞挂起 from concurrent.futures import ThreadPoolExecutorpool = ThreadPoolExecutor(max_workers=10)pool._work_queue.qsize()能够应用 _work_queue 拜访到这个外部队列

June 19, 2022 · 1 min · jiezi

关于python:python37-在pycharm中打包成单个exe文件

简要阐明:Step1:装置pyinstallerStep2:在Terminal中执行pyinstaller -F -w pyRun.py 详情如下: (venv) D:\development\python_test_proj_2022\venv>pyinstaller -F -w pyRun.py136 INFO: PyInstaller: 5.1137 INFO: Python: 3.7.3138 INFO: Platform: Windows-10-10.0.19041-SP0139 INFO: wrote D:\development\python_test_proj_2022\venv\pyRun.spec142 INFO: UPX is not available.144 INFO: Extending PYTHONPATH with paths['D:\development\python_test_proj_2022\venv']503 INFO: checking Analysis503 INFO: Building Analysis because Analysis-00.toc is non existent503 INFO: Initializing module dependency graph...505 INFO: Caching module graph hooks...519 INFO: Analyzing base_library.zip ...3447 INFO: Caching module dependency graph...3667 INFO: running Analysis Analysis-00.toc3679 INFO: Adding Microsoft.Windows.Common-Controls to dependent assemblies of final executable required by D:\Program Files\Python\Python37-32\python.exe3938 INFO: Analyzing D:\development\python_test_proj_2022\venv\pyRun.py3984 INFO: Processing module hooks...3985 INFO: Loading module hook 'hook-difflib.py' from 'd:\development\python_test_proj_2022\venv\lib\site-packages\PyInstaller\hooks'...3988 INFO: Loading module hook 'hook-encodings.py' from 'd:\development\python_test_proj_2022\venv\lib\site-packages\PyInstaller\hooks'...4080 INFO: Loading module hook 'hook-heapq.py' from 'd:\development\python_test_proj_2022\venv\lib\site-packages\PyInstaller\hooks'...4082 INFO: Loading module hook 'hook-pickle.py' from 'd:\development\python_test_proj_2022\venv\lib\site-packages\PyInstaller\hooks'...4083 INFO: Loading module hook 'hook-platform.py' from 'd:\development\python_test_proj_2022\venv\lib\site-packages\PyInstaller\hooks'...4084 INFO: Loading module hook 'hook-xml.py' from 'd:\development\python_test_proj_2022\venv\lib\site-packages\PyInstaller\hooks'...4309 INFO: Looking for ctypes DLLs4310 INFO: Analyzing run-time hooks ...4312 INFO: Including run-time hook 'd:\development\python_test_proj_2022\venv\lib\site-packages\PyInstaller\hooks\rthooks\pyi_rth_subprocess.py'4315 INFO: Looking for dynamic libraries5031 INFO: Looking for eggs5031 INFO: Using Python library D:\Program Files\Python\Python37-32\python37.dll5032 INFO: Found binding redirects:[]5034 INFO: Warnings written to D:\development\python_test_proj_2022\venv\build\pyRun\warn-pyRun.txt5063 INFO: Graph cross-reference written to D:\development\python_test_proj_2022\venv\build\pyRun\xref-pyRun.html5081 INFO: checking PYZ5081 INFO: Building PYZ because PYZ-00.toc is non existent5081 INFO: Building PYZ (ZlibArchive) D:\development\python_test_proj_2022\venv\build\pyRun\PYZ-00.pyz5446 INFO: Building PYZ (ZlibArchive) D:\development\python_test_proj_2022\venv\build\pyRun\PYZ-00.pyz completed successfully.5454 INFO: checking PKG5454 INFO: Building PKG because PKG-00.toc is non existent5454 INFO: Building PKG (CArchive) pyRun.pkg7164 INFO: Building PKG (CArchive) pyRun.pkg completed successfully.7167 INFO: Bootloader d:\development\python_test_proj_2022\venv\lib\site-packages\PyInstaller\bootloader\Windows-32bit\runw.exe7167 INFO: checking EXE7168 INFO: Building EXE because EXE-00.toc is non existent7168 INFO: Building EXE from EXE-00.toc7168 INFO: Copying bootloader EXE to D:\development\python_test_proj_2022\venv\dist\pyRun.exe.notanexecutable7176 INFO: Copying icon to EXE7179 INFO: Copying icons from ['d:\development\python_test_proj_2022\venv\lib\site-packages\PyInstaller\bootloader\images\icon-windowed.ico']7180 INFO: Writing RT_GROUP_ICON 0 resource with 104 bytes7180 INFO: Writing RT_ICON 1 resource with 3752 bytes7181 INFO: Writing RT_ICON 2 resource with 2216 bytes7181 INFO: Writing RT_ICON 3 resource with 1384 bytes7181 INFO: Writing RT_ICON 4 resource with 38188 bytes7181 INFO: Writing RT_ICON 5 resource with 9640 bytes7181 INFO: Writing RT_ICON 6 resource with 4264 bytes7182 INFO: Writing RT_ICON 7 resource with 1128 bytes7185 INFO: Copying 0 resources to EXE7185 INFO: Embedding manifest in EXE7187 INFO: Updating manifest in D:\development\python_test_proj_2022\venv\dist\pyRun.exe.notanexecutable7189 INFO: Updating resource type 24 name 1 language 07192 INFO: Appending PKG archive to EXE9509 INFO: Building EXE from EXE-00.toc completed successfully. ...

June 18, 2022 · 2 min · jiezi

关于python:asposewordsdocx实现docx合并以及去除aspose的印记

aspose.words+docx实现docx合并以及去除aspose的印记起因因工作须要实现多个word文档的合并,并尽量保障original style的形式将word转化成html用于端上进行展现。本文实现次要解决问题: word的多个文档的合并[次要是实现append的形式合并]将合并文档转化成html文件,波及英文,日文的字体word原样展现,合并中图片的base64d的转化因为aspose是商业利用,为了实现完满白嫖,不通过破解的形式去掉转化后后果中aspose的印记装置次要工具aspose.words.python@6.22python-docxdocxcomposebs4次要代码利用宝导入#! /usr/bin/env python3# -*- coding: utf-8 -*-# DESC: 1. 基于docx实现多个docx的合并# 2. 基于aspose的实现docx到html的转化# 3. 基于bs4的html的元素和内容的增删改等操作import osimport reimport pandas as pdimport aspose.words as awimport aspose.words.saving as savingfrom bs4 import BeautifulSoupfrom docx import Documentfrom docxcompose.composer import Composer合并word文档def merge_docx(docx_list: list, docx_merge_tar: str, docx_list_src: str) -> str: """ 合并word文档 目前只是将word进行拼装,不进行分页等操作 """ if len(docx_list) == 0: raise Exception("input is empty.") if len(docx_list) == 1: return os.path.join(docx_list_src, docx_list[0]) # 将第一个word作为基word base_docx = Document(os.path.join(docx_list_src, docx_list[0])) base_docx_composer = Composer(base_docx) # composer.append的形式合并到基word for next_docx in docx_list[1:]: next_docx_path = os.path.join(docx_list_src, next_docx) base_docx_composer.append(Document(next_docx_path)) base_docx_composer.save(docx_merge_tar) print("merge docx list ok.") return docx_merge_tar将word转成htmldef aspose_convert_docx_html(docx_file_path: str, html_file_path: str) -> str: """ 应用aspose.words-python将word转化成html """ docx = aw.Document(docx_file_path) # 设置转化选项 save_options = saving.HtmlSaveOptions(aw.SaveFormat.HTML) # 将图片存成base64模式 save_options.export_images_as_base64 = True docx.save(html_file_path, save_options) return html_file_path去掉aspose的印记def del_aspose_elemet(html_tar_file: str, to_tar_file: str): """ 去除aspose的信息 """ html_content = open(html_tar_file, "r", encoding="utf-8") soup = BeautifulSoup(html_content, features="lxml") # 删除指定的aspose的内容 for tag in soup.find_all(style=re.compile("-aw-headerfooter-type:")): tag.extract() word_key_tag = soup.find("p", text=re.compile("Evaluation Only")) word_key_tag.extract() f = open(to_tar_file, "w", encoding="utf-8") f.write(soup.prettify()) f.close()测试if __name__ == '__main__': docx_file_path = r"D:\merge_tar\demo.docx" html_file_path = r"D:\merge_tar\demo.html" aspose_convert_docx_html(docx_file_path, html_file_path) process_file_path = r"D:\merge_tar\demo_d.html" del_aspose_elemet(html_file_path, process_file_path)测试后果demo.docx ...

June 18, 2022 · 1 min · jiezi

关于python:学习Python操作JSON网络数据交换不用愁

学学Python中操纵JSON的常识。学完本文,你能够学到如下内容: 1、JSON是什么?2、JSON与XML的优劣差别?3、将Python对象编码成JSON字符串4、将JSON字符串解码为Python对象5、解决JSON中文乱码问题 JSON是什么? JSON的全称是 JavaScript Object Notation,是一种轻量级的数据交换格局。最后,JSON 只是 JavaScript 的子集,但因为其简略易用而迅速走红。 现今大部分编程语言都反对对JSON的解析与生成,而近些年异军突起的NoSQL数据库也多参照JSON来设计数据存储格局,例如Mongodb的BSON(Binary JSON)。 JSON有以下六种数据类型:number、boolean、string、null、array、object。前三种很好了解,第四个null对应Python的None,最初两种,对应Python的列表和字典。 1{ 2 "name": "小明", 3 "age": 14, 4 "gender": true, 5 "grade": null, 6 "skills": [ 7 "JavaScript", 8 "Java", 9 "Python"10 ]11}JSON与XML的优劣差别? 在JSON呈现之前,人们用XML在网络上替换数据,在JSON呈现后,它基本上就取代了XML的地位。两者的共同之处不言而喻,它们都是结构化的语言,都能够用于网络数据的替换。 两者最大的差别在于它们的“出身”不同,也就是它们被发明的目标不同。 XML是W3C(万维网联盟)公布的可扩大标记语言(Extensible Markup Language),最后设计来补救HTML的有余,以弱小的扩展性满足网络信息公布的须要,与它“同级”的有:XHTML\CSS\ECMAScript等。它蕴含DTD、XSD、XPath、XSL等一大堆简单的标准,在数据存储、扩大及高级检索等方面都有作用。起初被用于网络数据交换,颇有点大材小用的意思,尽管可胜任,却也有点简单和冗余。 而JSON是ECMAScript规范的子集,设计之初就是为了克服XML在数据交换上的劣势,所以一方面,它像XML一样具备简洁而清晰的层次结构,另一方面,它比XML玲珑粗劣,更加实用于网络数据的传输。 JSON也不是没有毛病,当构造层级很多的时候,它会让人陷入繁琐简单的数据节点查找中,在可读性上要比XML差。 将Python对象编码成JSON字符串 将python的对象转化为字符串,这个过程也称为序列化,与之绝对,将JSON字符串转化为python对象,这个过程被称为反序列化。 序列化格局如下,json.dumps()把python对象序列化,json.dump() 先序列化,而后将内容存入文件: json.dumps(obj, , skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, *kw) json.dump(obj, fp, , skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False,*kw) ...

June 18, 2022 · 2 min · jiezi

关于python:学习Python列表只需这篇文章就够了

千里之行,始于足下。要练成一双洞悉所有的眼睛,还是得先把基本功扎扎实实地学好。明天,带大家认真复习一下Python的列表。温故而知新,不亦说乎。 当然,复习的同时也要发散思考,因为有些看似无关紧要的、约定俗成的语言习惯,例如数组索引为何从0开始,其背地可能大有来历。知其然,亦需知其所以然 最初,在基础知识之上,更要摸索进阶,例如学习生成器表达式,这样既能更扎实地把握根底,又能死记硬背,取得更全面的认知降级。 Python的列表是怎么滴?列表(list)是一种有序的汇合,能够随时增加、查找和删除元素。 列表反对退出不同数据类型的元素:数字、字符串、列表、元组等。 列表通过有序的索引可遍历所有的元素,从前往后数,索引是[0,n-1],从后往前数,索引是[-1, -n],其中n是列表的长度。 列表能够是不含元素的空列表,也能够蕴含超级多的元素(在内存大小反对的状况下)。 list_a = [] # 空列表,即len(list_a) == 0list_b = [2018, 10, '2018-10-1', ['hi', 1, 2], (33, 44)]# list_b 长度为5,蕴含2个数字元素、1个字符串元素、1个列表元素和1个元组元素len(list_b) == 5list_b[0] == list_b[-5] == 2018lits_b[3] == list_b[-2] == ['hi', 1, 2] lits_b[4] == list_b[-1] == (33, 44)Python中怎么操作列表?1)创立列表: 用中括号[]包裹元素,元素应用逗号分隔。 用list()办法,转化生成列表。 列表生成式/列表解析式/列表推导式,生成列表。 list_a = [1, 2, 3]list_b = list("abc") # list_b == ['a', 'b', 'c']list_c = list((4, 5, 6)) # list_c == [4, 5, 6]list_d = [i for i in list_a] # list_d == [1, 2, 3]list_e = [i*j for i in list_a for j in list_c] # list_e == [4,5,6,10,12,12,15,18]list_f = [i*j for i,j in zip(list_a,list_c)] # list_f == [4, 10, 18]list_g = [i for i in list_a if i%2 == 0] # list_g == [2]# 联合range()函数,range(start, stop[, step])list_h = list(range(3)) # list_h == [0, 1, 2]list_i = list(range(3,7)) # list_i == [3, 4, 5, 6]list_j = list(range(3,9,2)) # list_j == [3, 5, 7]# 找出100以内的可能被3整除的正整数list_k = list(range(3,100,3)) # list_k == [3, 6, 9, ..., 96, 99]2)裁减列表: ...

June 18, 2022 · 3 min · jiezi

关于python:Python37-发送邮件完整版和简单版

指标:126/163邮箱 import smtplibimport timefrom email.header import Headerfrom email import encodersfrom email.mime.base import MIMEBasefrom email.mime.image import MIMEImagefrom email.mime.multipart import MIMEMultipartfrom email.mime.text import MIMETextfrom email.utils import parseaddr, formataddrdef SendMailSimple(sender, receivers, mail_pass, content, file, image): mail_host = "smtp.126.com" # 设置服务器 # message = MIMEText(content, 'plain', 'utf-8')#注释内容 plain代表纯文本 message = MIMEMultipart() message.attach(MIMEText(content)) # 邮件注释 message['From'] = sender message['To'] = ','.join(receivers) subject = 'Python主动简略邮件-%s' % time.ctime() message['Subject'] = subject # 邮件题目 try: # 增加文件到附件 with open(file, 'rb') as f: # MIMEBase示意附件的对象 mime = MIMEBase('text', 'txt', filename=file) # filename是显示附件名字 mime.add_header('Content-Disposition', 'attachment', filename=file) # 获取附件内容 mime.set_payload(f.read()) encoders.encode_base64(mime) # 作为附件增加到邮件 message.attach(mime) except FileNotFoundError as e: print(e) try: with open(image, 'rb') as f: # 图片增加到附件 mime = MIMEBase('image', 'image', filename=image) mime.add_header('Content-Disposition', 'attachment', filename=image) mime.set_payload(f.read()) encoders.encode_base64(mime) message.attach(mime) except FileNotFoundError as e: print(e) try: smtpObj = smtplib.SMTP_SSL(mail_host, 465) smtpObj.login(sender, mail_pass) smtpObj.sendmail(sender, receivers , str(message)) # message.as_string() smtpObj.quit() print("邮件发送胜利") except smtplib.SMTPException as e: print(e)def SendMail(sender, receivers, cc_mail, mail_pass, content, file, image): # 第三方 SMTP 服务 mail_host = "smtp.126.com" # 设置服务器 # 结构一个MIMEMultipart对象代表邮件自身 message = MIMEMultipart() message.attach(MIMEText(content, 'html', 'utf-8')) # 注释内容 plain代表纯文本,html代表反对html文本 message['From'] = sender message['To'] = ','.join(receivers) # 与真正的收件人的邮箱不是一回事 message['Cc'] = ','.join(cc_mail) subject = 'Python主动邮件-%s' % time.ctime() message['Subject'] = subject # 邮件题目 # 增加文件到附件 with open(file, 'rb') as f: # MIMEBase示意附件的对象 mime = MIMEBase('text', 'txt', filename=file) # filename是显示附件名字 mime.add_header('Content-Disposition', 'attachment', filename=file) # 获取附件内容 mime.set_payload(f.read()) encoders.encode_base64(mime) # 作为附件增加到邮件 message.attach(mime) with open(image, 'rb') as f: # 图片增加到附件 mime = MIMEBase('image', 'image', filename=image) mime.add_header('Content-Disposition', 'attachment', filename=image) mime.set_payload(f.read()) encoders.encode_base64(mime) message.attach(mime) # 将图片显示在注释 with open(image, 'rb') as f: # 图片增加到注释 msgImage = MIMEImage(f.read()) # 定义图片ID msgImage.add_header('Content-ID', '<image1>') message.attach(msgImage) try: smtpObj = smtplib.SMTP_SSL(mail_host, 465) smtpObj.login(sender, mail_pass) smtpObj.sendmail(sender, receivers + cc_mail, str(message)) # message.as_string() smtpObj.quit() print("邮件发送胜利") except smtplib.SMTPException as e: print(e)if __name__ == "__main__": sender = 'aaaaaa@126.com' # 邮件发送方 receivers = ['aaaaaa@126.com', 'ZZZZZZ@139.com'] # 接管邮件的邮箱 receivers_single = ['aaaaaa@126.com'] # 接管邮件的邮箱 cc_mail = ['PPPPPP@qq.com'] # 抄送人 # 口令受权码,不含空格 mail_pass = "xxxxxxxxxx" content_text = "邮件注释测试" content = '''连忙加油往前冲 <h1>测试test</h1> <h2 style="color:red">看看这里显示什么</h1> <a href="http://www.runoob.com/python/python-email.html">测试超链接</a><br> <p>图片显示测试:</p> <p><img src="cid:image1"></p> ''' file = 'Fx12.txt' image = 'language2.jpg' #SendMail(sender, receivers, cc_mail, mail_pass, content, file, image) SendMailSimple(sender, receivers_single, mail_pass, content_text, file, image)本机运行后果:D:\development\python_test_proj_2022\venv\Scripts\python.exe D:/development/python_test_proj_2022/venv/pyRun.py[Errno 2] No such file or directory: 'Fx12.txt'[Errno 2] No such file or directory: 'language2.jpg'邮件发送胜利 ...

June 18, 2022 · 2 min · jiezi

关于python:37个Python入门小程序

有不少同学学完Python后依然很难将其灵活运用。我整顿 37 个Python入门的小程序。在实践中利用Python会有事倍功半的成果。 例子1:华氏温度转换为摄氏温度华氏温度转摄氏温度的公式:C = (F - 32) / 1.8。本例考查Python的加减乘除运算符。 """将华氏温度转换为摄氏温度"""f = float(input('输出华氏温度: '))c = (f - 32) / 1.8print('%.1f 华氏度 = %.1f 摄氏度' % (f, c))例子2:计算圆的周长和面积输出半径,计算圆的半径和面积,圆周长公式:2r,面试公式:*r^2 """半径计算圆的周长和面积"""radius = float(input('输出圆的半径: '))perimeter = 2 * 3.1416 * radiusarea = 3.1416 * radius * radiusprint('周长: %.2f' % perimeter)print('面积: %.2f' % area)例子3:实现一元一次函数实现数学里的一元一次函数:f(x) = 2x + 1 """一元一次函数"""x = int(input('输出x:'))y = 2 * x + 1print('f(%d) = %d' % (x, y))例子4:实现二元二次函数实现数学里的二元二次函数:f(x, y) = 2x^2 + 3y^2 + 4xy,须要用到指数运算符** ...

June 18, 2022 · 6 min · jiezi

关于python:10个有趣的-Python-高级脚本建议收藏

在日常的工作中,咱们总会面临到各式各样的问题。 其中不少的问题,应用一些简略的Python代码就能解决。 比方不久前的复旦大佬,用130行Python代码硬核搞定核酸统计,大大晋升了效率,节俭了不少工夫。 明天就带大家学习一下10个Python脚本程序。 尽管简略,不过还是蛮有用的。 有趣味的能够本人去实现,找到对本人有帮忙的技巧。 ▍1、Jpg转Png 图片格式转换,以前小F可能第一工夫想到的是【格局工厂】这个软件。 现在编写一个Python脚本就能实现各种图片格式的转换,此处以jpg转成png为例。 有两种解决办法,都分享给大家。 # 图片格式转换, Jpg转Png# 办法①from PIL import Imageimg = Image.open('test.jpg')img.save('test1.png')# 办法②from cv2 import imread, imwriteimage = imread("test.jpg", 1)imwrite("test2.png", image)▍2、PDF加密和解密 如果你有100个或更多的PDF文件须要加密,手动进行加密必定是不可行的,极其浪费时间。 应用Python的pikepdf模块,即可对文件进行加密,写一个循环就能进行批量加密文档。 # PDF加密import pikepdfpdf = pikepdf.open("test.pdf")pdf.save('encrypt.pdf', encryption=pikepdf.Encryption(owner="your_password", user="your_password", R=4))pdf.close()有加密那么便会有解密,代码如下。 # PDF解密import pikepdfpdf = pikepdf.open("encrypt.pdf",  password='your_password')pdf.save("decrypt.pdf")pdf.close()▍3、获取电脑的配置信息 很多小伙伴可能会应用鲁巨匠来看本人的电脑配置,这样还须要下载一个软件。 应用Python的WMI模块,便能够轻松查看你的电脑信息。 # 获取计算机信息import wmidef System_spec():    Pc = wmi.WMI()    os_info = Pc.Win32_OperatingSystem()[0]    processor = Pc.Win32_Processor()[0]    Gpu = Pc.Win32_VideoController()[0]    os_name = os_info.Name.encode('utf-8').split(b'|')[0]    ram = float(os_info.TotalVisibleMemorySize) / 1048576    print(f'操作系统: {os_name}')    print(f'CPU: {processor.Name}')    print(f'内存: {ram} GB')    print(f'显卡: {Gpu.Name}')    print("\n计算机信息如上 ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑")System_spec()就以小F本人的电脑为例,运行代码就能看到配置。 ▍4、解压文件 应用zipfile模块进行文件解压,同理也能够对文件进行压缩。 # 解压文件from zipfile import ZipFileunzip = ZipFile("file.zip", "r")unzip.extractall("output Folder")▍5、Excel工作表合并 帮忙你将Excel工作表合并到一张表上,表内容如下图。 6张表,其余表的内容和第一张表都一样。 设置表格数量为5,将会合并前5张表的内容。 import pandas as pd# 文件名filename = "test.xlsx"# 表格数量T_sheets = 5df = []for i in range(1, T_sheets+1):    sheet_data = pd.read_excel(filename, sheet_name=i, header=None)    df.append(sheet_data)# 合并表格output = "merged.xlsx"df = pd.concat(df)df.to_excel(output)后果如下。 ▍6、将图像转换为素描图 和之前的图片格式转换有点相似,就是对图像进行解决。 以前大家可能会应用到美图秀秀,当初可能就是抖音的滤镜了。\ 其实应用Python的OpenCV,就可能疾速实现很多你想要的成果。 # 图像转换import cv2# 读取图片img = cv2.imread("img.jpg")# 灰度grey = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)invert = cv2.bitwise_not(grey)# 高斯滤波blur_img = cv2.GaussianBlur(invert, (7, 7), 0)inverse_blur = cv2.bitwise_not(blur_img)sketch_img = cv2.divide(grey, inverse_blur, scale=256.0)# 保留cv2.imwrite('sketch.jpg', sketch_img)cv2.waitKey(0)cv2.destroyAllWindows()原图如下。 素描图如下,还挺难看的。 ▍7、获取CPU温度 有了这个Python脚本,你将不须要任何软件来理解CPU的温度。 # 获取CPU温度from time import sleepfrom pyspectator.processor import Cpucpu = Cpu(monitoring_latency=1)with cpu:    while True:        print(f'Temp: {cpu.temperature} °C')        sleep(2)▍8、提取PDF表格 有的时候,咱们须要从PDF中提取表格数据。 第一工夫你可能会先想到手工整理,然而当工作量特地大,手工可能就比拟吃力。\ 而后你可能会想到一些软件和网络工具来提取 PDF 表格。 上面这个简略的脚本将帮忙你在一秒钟内实现雷同的操作。 # 办法①import camelottables = camelot.read_pdf("tables.pdf")print(tables)tables.export("extracted.csv", f="csv", compress=True)# 办法②, 须要装置Java8import tabulatabula.read_pdf("tables.pdf", pages="all")tabula.convert_into("table.pdf", "output.csv", output_format="csv", pages="all")PDF文档的内容如下,蕴含了一个表格。 提取到的CSV文件内容如下。 ▍9、截图 该脚本将简略地截取屏幕截图,而无需应用任何屏幕截图软件。 在上面的代码中,给大家展现了两种Python截取屏幕截图的办法。 # 办法①from mss import msswith mss() as screenshot:    screenshot.shot(output='scr.png')# 办法②import PIL.ImageGrabscr = PIL.ImageGrab.grab()scr.save("scr.png")▍10、拼写查看器 这个Python脚本能够进行拼写查看,当然只对英文无效,毕竟中文博大精深呐。 # 拼写查看# 办法①import textblobtext = "mussage"print("original text: " + str(text))checked = textblob.TextBlob(text)print("corrected text: " + str(checked.correct()))# 办法②import autocorrectspell = autocorrect.Speller(lang='en')# 以英语为例print(spell('cmputr'))print(spell('watr'))print(spell('survice'))以上就是本次分享的所有内容,如果你感觉文章还不错,欢送关注公众号:Python编程学习圈,每日干货分享,发送“J”还可支付大量学习材料。或是返回编程学习网,理解更多编程技术常识。

June 18, 2022 · 1 min · jiezi

关于python:Python-的八个实用的无代码特性

注:在命令行中应用 Python 时,“-m”选项参数能够实现十分弱小的性能。能够说,善用“-m”参数,这是一个优良的 Python 技术人的必备技能。 明天分享的文章介绍了 8 种十分实用的小性能,心愿能给大家带来帮忙! 近几年 Python 语言之所以风行,是因为咱们能够应用它编写更少的代码来实现简单的性能。Python 开发者十分欢送那些封装了简单实现然而对使用者非常敌对的工具包。 然而,Python 的简便性不止如此。你能置信咱们能够在不写任何代码的状况下应用 Python 吗?在接下来的文章中,咱们会介绍 8 个无需编写任何代码即可应用 Python 内置性能的例子。 0. Python CLI “-m”参数咱们首先从 Python CLI(命令行界面)开始谈起。尽管咱们不用编写代码来应用稍后介绍的性能,然而为了让 Python 晓得咱们要执行的内容,咱们须要应用 Python 命令行来进行操作。 只有咱们的电脑上装置了 Python 环境,咱们就能够在 Python 命令行界面输出python --help显示所有反对的参数。 因为命令输入的内容太长,上图仅显示了局部内容。这里最想强调的是-m mod参数,它会将 Python 模块以脚本的模式运行。因而,如果该模块的实现反对命令行操作,咱们就能够在命令行间接应用它。接下来就让咱们体验一下:) 1. 服务端口测试有时候,咱们想测试 ip 端口的出站网络流量,通常 telnet 命令是一个不错的抉择。在 Windows 平台上默认没有装置 telnet 软件,应用前须要手动装置。如果只是进行简略的测试,将来应用场景也不多,装置它可能是一种资源节约。 然而,如果装置了 Python,那就不用下载安装 telnet,因为 Python 内置了 telnet 对应的模块。咱们能够对 Google 搜寻网站的 443 端口进行测试。 python -m telnetlib -d 142.250.70.174 443 如上图所示,网络流量显示失常,咱们甚至收到了来自 Google 空字符的响应。如果咱们尝试拜访 ip 的随机一个端口,则会抛出谬误,如下图所示。 python -m telnetlib -d 142.250.70.174 999 ...

June 18, 2022 · 2 min · jiezi

关于python:一文详解Python装饰器真香

装璜器(decorator)是一种高级Python语法,也是 Python 函数式编程的一部分。写法是 @xxx,在 Pandas、Django 框架源码里常常能见到,利用十分宽泛。尽管不必装璜器也不影响开发,但用了装璜器能够让你的代码“秀”起来,当然装璜器的作用不仅仅是“秀”,更重要的是它能够让你的代码更简洁,可读性更高;业务逻辑解耦,保护更容易。 函数根底学习装璜器之前,咱们先学习下 Python 函数的两个个性,函数体内能够定义函数 和 函数能够被援用。有根底的敌人能够略过,间接看下一大节。 例1. 函数体内定义函数 def func1(): def func2(): return "in func2" res = func2() return res在 func1 函数体内, 定义了一个 func2 函数并调用, 而后返回调用的后果。其实很多动态编程语言,如 C、Java,不反对在函数体内定义函数。但在 Python 中是反对的。 例2.函数能够被援用 new_func = func1print(new_func())func1 是个函数,定义跟 例1 是一样的。能够看到函数名能够像变量那样应用。赋值后,new_func 就援用了 func1,就能够间接通过 new_func() 形式来调用函数。 既然函数名能够向变量一样赋值,那天然就能够被 return 返回。 def func1(): def func2(): return "in func2" print(func2) return func2new_func = func1()print(new_func)print(new_func())输入: <function func1.<locals>.func2 at 0x102499b80><function func1.<locals>.func2 at 0x102499b80>in func2print(func1) 和 print(new_func) 输入后果一样,阐明他们是同一个函数。 ...

June 18, 2022 · 2 min · jiezi

关于python:Python-实现虚拟世界物品拖拽

用opencv读取人手须要大家装置opencv-python,装置后执行以下代码,启动摄像头cap = cv2.VideoCapture(0) 0代表零碎默认摄像头。 用 opencv 在视频流中创立方块 cv2.rectangle(overlay, (x, y), (x + self.rect_width, y + self.rect_width), (255, 0, 0), -1)获取食指坐标应用medialpipe辨认人手import mediapipe as mpself.mp_drawing = mp.solutions.drawing_utils# 辨认手掌results = hands.process(self.image)for hand_landmarks in results.multi_hand_landmarks: landmark_list = [] # 存储手掌关键点坐标 for landmark_id, finger_axis in enumerate(hand_landmarks.landmark): landmark_list.append([landmark_id, finger_axis.x, finger_axis.y,finger_axis.z])获取食指x、y、z坐标。 # 食指坐标index_finger_tip = landmark_list[8]index_finger_tip_x = ratio_x_to_pixel(index_finger_tip[1])index_finger_tip_y = ratio_y_to_pixel(index_finger_tip[2])index_finger_tip_z = index_finger_tip[3]判断人手是否在方框内 def check_overlay(self, check_x, check_y, check_z): x = self.rect_left_x # 方框的左上角x坐标 y = self.rect_left_y # 方框的左上角y坐标 if (x < check_x < (x + self.rect_width)) and (y < check_y < (y + self.rect_width))\ and check_z < -0.10: return True return False如果手指位于方框内,并且间隔摄像头的间隔小于 -0.1,则代表手指按下方框,此时手指挪动后,更新方框的坐标,就能够实现方框追随手指挪动。 ...

June 17, 2022 · 1 min · jiezi

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

明天给大家介绍两个 Python 好用的小工具。 尽管用法简略,却能大大提高开发效率。 tqdm当程序中for循环须要耗费大量工夫来执行的时候,往往咱们会增加一个计数器输入程序执行的进度。这种形式的毛病在于须要写一些与业务无关的代码,并且打印的信息过多。 如果咱们用tqdm能够用进度条的形式显示程序的执行进度,能够无效地防止上述毛病。 应用形式非常简单 import timefrom tqdm import tqdmfor i in tqdm(range(100)): time.sleep(1)这个小工具还有其余好用的性能,感兴趣的能够自行摸索。 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 常识欢送返回公众号:Python 编程学习圈 ,发送 “J” 即可收费获取,每日干货分享

June 17, 2022 · 1 min · jiezi

关于python:PythonAI给老照片上色

明天咱们分享用NoGAN的图像增强技术给老照片着色。 NoGAN是一种新型GAN,它能破费起码的工夫进行GAN训练。 明天分享的这个我的项目已在GitHub开源我的项目,上面咱们来运行一下。 筹备工作首先,用git clone命令下载源码git clone https://github.com/jantic/DeOldify.git进入我的项目根目录,装置Python依赖包 pip3 install -r requirements.txt 编写代码运行我的项目之前,须要下载预训练好的模型。 ColorizeArtistic_gen.pthColorizeStable_gen.pthColorizeVideo_gen.pth区别如下 ColorizeArtistic_gen.pth:在乏味的细节和生机方面实现了最高品质的图像着色成果,该模型在 UNet 上应用 resnet34 为主干,通过 NoGAN 进行了 5 次评论家预训练/GAN 循环反复训练 ColorizeStable_gen.pth:在风光和肖像方面获得了最佳成果,该模型在 UNet 上应用 resnet101 为主干,通过 NoGAN 进行了 3 次评论家预训练/GAN 循环反复训练 ColorizeVideo_gen.pth:针对晦涩的视频进行了优化,它仅应用初始生成器/评论家预训练/GAN NoGAN 训练。因为谋求晦涩的速度,它的色调比前两者少。 将下载好的模型文件放在我的项目根目录的models目录下即可。 编写代码在我的项目根目录同级目录下创立Python文件,编写代码加载刚刚下载好的模型文件。from DeOldify.deoldify.generators import gen_inference_widefrom DeOldify.deoldify.filters import MasterFilter, ColorizerFilter# 指定模型文件learn = gen_inference_wide(root_folder=Path('./DeOldify'), weights_name='ColorizeVideo_gen')# 加载模型deoldfly_model = MasterFilter([ColorizerFilter(learn=learn)], render_factor=10)root_folder指定我的项目根目录,weights_name指定接下来应用哪个模型为照片上色。 读取老照片,进行上色 import cv2import numpy as npfrom PIL import Imageimg = cv2.imread('./images/origin.jpg')img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)pil_img = Image.fromarray(img)filtered_image = deoldfly_model.filter( pil_img, pil_img, render_factor=35, post_process=True)result_img = np.asarray(filtered_image)result_img = cv2.cvtColor(result_img, cv2.COLOR_RGB2BGR)cv2.imwrite('deoldify.jpg', result_img)用cv2读取老照片,并用PIL.Image模块将图片转换成模型输出所须要的格局,送入模型进行上色,实现后保留。 ...

June 17, 2022 · 1 min · jiezi

关于python:Cython-是什么为什么会有-Cython

楔子Cython 预计很多人都据说过,它是用来对 Python 进行减速的。如果你在应用 Python 编程时,有过如下想法,那么 Cython 非常适合你。 1)因为某些需要导致不得不编写一些多重嵌套的循环,而这些循环如果用 C 语言来实现会快上百倍,然而不相熟 C 或者不晓得 Python 如何与 C 进行交互;2)因为 Python 解释器的性能起因,如果将 CPython 解释器换成 PyPy,或者罗唆换一门语言,比方 Rust,将会失去显著的性能晋升,可是换不得。因为你的项目组规定只能应用 Python 语言,解释器只能是 CPython;3)Python 是一门动静语言,但你心愿至多在数字计算方面,可能退出可选的动态类型,这样能够极大地减速运算成果。因为单纯的数字相加不太须要所谓的动态性,尤其是当你的程序中呈现了大量的计算逻辑时;4)对于一些计算密集型的局部,你心愿可能写出一些媲美 Numpy, Scipy, Pandas 的算法;5)你有一些曾经用 C、C++ 实现的库,你想间接在 Python 外部更好地调用它们,并且不应用 ctypes、cffi 等模块;6)兴许你据说过 Python 和 C 能够无缝联合,通过 C 来为 Python 编写扩大模块,将 Python 代码中性能要害的局部应用 C 进行重写,来达到晋升性能的成果。然而这须要你对 Python 解释器有很深的理解,相熟底层的 Python/C API,而这是一件十分苦楚的事件; 如果你有过下面的一些想法,那么证实你的 Python 程度是很优良的,然而这些问题总归是要解决的,于是 Cython 便闪亮退场了。留神:Cython 并不是一个什么实验性的我的项目,它呈现的工夫曾经不短了,并且在生产环境中久经考验,咱们齐全是有理由学习它的。 上面让咱们开始 Cython 的学习之旅吧,轻轻说一句,我集体十分喜爱 Cython 的语法。 Cython 是什么? 对于 Cython,咱们必须要分明两件事: 1)Cython 是一门编程语言,它将 C 和 C++ 的动态类型零碎交融在了 Python 身上。Cython 源文件的后缀是 .pyx,它是 Python 的一个超集,语法是 Python 语法和 C 语法的混血。当然咱们说它是 Python 的一个超集,因而你写纯 Python 代码也是能够的。2)当咱们编写完 Cython 代码时,须要先将 Cython 代码翻译成高效的 C 代码,而后再将 C 代码编译成 Python 的扩大模块。 ...

June 17, 2022 · 2 min · jiezi