关于python:Python模块化编程模块包导入运行

什么叫模块模块的英文为Modules。在Python中一个扩大名为.py的文件就是一个模块。 模块与函数的关系:一个模块能够蕴含多个函数、类、语句。 应用模块的长处:不便其余程序和脚本的导入并应用防止函数名和变量名抵触进步代码的可维护性进步代码的可重用性自定义模块创立一个.py的文件,名称尽量不要与Python自带的规范模块名称雷同。导入模块 # 导入整个指定模块import 模块名称 [as 别名]# 导入指定模块的指定函数/变量/类form 模块名称 import 函数/变量/类代码示例: import math as mtprint(mt) # <module 'math' (built-in)>print(mt.pi) # 3.141592653589793print(mt.pow(2, 3)) # 8.0print(mt.ceil(9.001)) # 10print(mt.floor(9.001)) # 9导入指定函数/变量/类 from math import piprint(pi) # 3.141592653589793以主程序模式运行每个模块的定义中都包含一个记录模块名称的变量__name__,程序能够查看该变量,以确定他们在哪个模块中执行。如果一个模块不是被导入到其余程序中执行,那么它可能在解释器的顶级模块中执行。顶级模块的__name__变量的值为__main__。 新建a.py def add(a, b): return a + bprint(add(10, 20))新建b.py import aprint(a.add(100, 200))运行b.py 输入后果为:30300批改a.py def add(a, b): return a + bif __name__ == '__main__': # 当a.py以主程序运行时才执行 print(add(10, 20))运行b.py(此时b.py为主程序) 输入后果为:300运行a.py(此时a.py为主程序) 输入后果为:30Python中的包包是一个分档次的目录构造,将一组性能相近的模块组织在一个目录下作用:代码标准、防止模块名称抵触包与目录的区别 蕴含__init__.py文件的目录称为包;目录里通常不包含__init__.py文件;编辑器中的图标也有差别。包的导入 import 包名.模块名[.函数/变量/类] [as 别名]Python中罕用的内置模块 模块名 形容 sys 与Python解释器及其环境操作相干的规范库 time 提供与工夫相干的各种函数的规范库 os 提供了拜访操作系统拜访性能的规范库 calendar 提供与日期相干的各种函数的规范库 urllib 用于读取来自网上(服务器)的数据规范库 json 用于应用Json序列化和反序列化对象 re 用于在字符串中执行正则表达式匹配和替换 math 提供规范算数运算函数的规范库 decimal 用于进行准确管制运算精度、有效位数和四舍五入操作的十进制运算 logging 提供了灵便的记录事件、谬误、正告和调试信息等日志信息的性能 sys代码示例 ...

August 16, 2022 · 1 min · jiezi

关于python:最新pycharm-pro-2022激活码

Python是一款mac的Python编辑开发,如果你开发过 Android 或者 JAVA, 那么你应答 Android Studio和Intellij IDEA不生疏,它们都是基于jetbrains的编辑器。不得不说,各种快捷键和插件真的是牛的一批。同时也是最智能的PythonIDE。应用PyCharm(一种提供独特编码体验的智能PythonIDE)享受高效的Python、Django和Web开发。 最新pycharm pro 2022激活码 智能编码辅助PyCharm提供智能代码实现,代码查看,动态错误突出显示和疾速修复,以及主动代码重构和丰盛的导航性能。智能代码编辑器PyCharm的智能代码编辑器为Python,JavaScript,CoffeeScript,TypeScript,CSS,风行的模板语言等提供一流的反对。利用语言感知代码实现,谬误检测和即时代码修复!智能代码导航应用智能搜寻跳转到任何类,文件或符号,甚至任何IDE操作或工具窗口。只需单击一下即可切换到申明,超级办法,测试,用法,实现等。疾速平安的重构以智能形式重构代码,应用平安重命名和删除,提取办法,引入变量,内联变量或办法以及其余重构。特定于语言和框架的重构可帮忙您执行我的项目范畴的更改。内置开发人员工具PyCharm开箱即用的大量工具包含一个集成的调试器和测试运行器; Python探查器; 内置终端; 与次要VCS和内置数据库工具集成; 近程口译人员的近程开发能力; 一个集成的ssh终端; 并与Docker和Vagrant集成。调试,测试和剖析应用功能强大的调试器和Python和JavaScript的图形UI。应用编码帮忙和基于GUI的测试运行器创立和运行测试。应用Python Profiler集成齐全管制您的代码。VCS,部署和近程开发应用对立的UI节省时间,以便与Git,SVN,Mercurial或其余版本控制系统配合应用。在近程计算机上运行和调试应用程序。轻松配置主动部署到近程主机或VM,并应用Vagrant和Docker治理您的基础架构。数据库工具间接从IDE拜访Oracle,SQL Server,PostgreSQL,MySQL和其余数据库。在编辑SQL代码,运行查问,浏览数据和更改模式时,依附PyCharm的帮忙。迷信工具PyCharm与IPython Notebook集成,具备交互式Python控制台,反对Anaconda以及Matplotlib和NumPy等多种迷信软件包。交互式Python控制台你能够在PyCharm中运行一个REPL Python控制台,它提供了许多优于规范的控制台:应用查看,大括号和引号匹配进行动静语法查看,当然还有代码实现。迷信堆栈反对PyCharm内置了对迷信图书馆的反对。它反对Pandas,Numpy,Matplotlib和其余迷信库,为您提供一流的代码智能,图形,数组查看器等等。Conda整合通过在每个我的项目中应用独自的Conda环境来放弃您的依赖关系,PyCharm使您能够轻松创立和抉择正确的环境。可定制和跨平台的IDE应用单个许可证密钥在Windows,Mac OS和Linux上应用PyCharm。享受精心调整的工作空间,可自定义色彩计划和键绑定,并提供VIM仿真。可定制的UI是否有任何软件开发人员不喜爱调整他们的工具?咱们还没有遇到一个,所以咱们使PyCharm UI定制变得轻而易举。享受微调工作区,可定制的配色计划和键绑定。插件超过10年的IntelliJ平台开发为PyCharm提供了50多种不同性质的IDE插件,包含对其余VCS的反对,与不同工具和框架的集成,以及Vim仿真等编辑器加强性能。跨平台IDEPyCharm实用于Windows,Mac OS或Linux。您能够在尽可能多的计算机上安装和运行PyCharm,并在所有计算机上应用雷同的环境和性能。

August 16, 2022 · 1 min · jiezi

关于python:Python类对象的赋值深拷贝浅拷贝

赋值操作只是造成两个变量,实际上还是指向同一个对象,变量存储的是对象的援用。 class CPU: pass # 变量的赋值cpu1 = CPU()cpu2 = cpu1print(cpu1) # <__main__.CPU object at 0x0000017B21356460>print(cpu2) # <__main__.CPU object at 0x0000017B21356460>浅拷贝Python拷贝个别都是浅拷贝,拷贝时,对象包含的子对象内容不拷贝,因而,源对象与拷贝对象会援用同一个子对象。(只拷贝主对象,子对象还是援用同一个。) import copy as cpclass CPU: passclass Disk: passclass Computer: def __init__(self, cpu, disk): self.cpu = cpu self.disk = disk# 类对象的浅拷贝cpu1 = CPU()disk = Disk()computer = Computer(cpu1, disk)computer2 = cp.copy(computer)print(computer, computer.cpu, computer.disk)# <__main__.Computer object at 0x000002365C8ACBB0> <__main__.CPU object at 0x000002365C8ACD90> <__main__.Disk object at 0x000002365C8AC430>print(computer2, computer2.cpu, computer2.disk)# <__main__.Computer object at 0x000002365C9D65E0> <__main__.CPU object at 0x000002365C8ACD90> <__main__.Disk object at 0x000002365C8AC430>深拷贝应用copy模块的deepcopy函数,递归拷贝对象及其中包含的子对象,源对象和拷贝对象以及所有子对象都不雷同。 ...

August 16, 2022 · 1 min · jiezi

关于python:pytest使用ABC

pytest 是什么?pytest 是一个 python 的单元测试框架。能够用来为函数、类等写单元测试文件。 疾速开始装置:pip install pytest # content of test_sample.pydef inc(x): return x + 1def test_answer(): assert inc(3) == 5执行: $ pytest后果: =========================== test session starts ============================platform linux -- Python 3.x.y, pytest-7.x.y, pluggy-1.x.yrootdir: /home/sweet/projectcollected 1 itemtest_sample.py F [100%]================================= FAILURES =================================_______________________________ test_answer ________________________________ def test_answer():> assert inc(3) == 5E assert 4 == 5E + where 4 = inc(3)test_sample.py:6: AssertionError========================= short test summary info ==========================FAILED test_sample.py::test_answer - assert 4 == 5============================ 1 failed in 0.12s =============================留神: 测试文件和测试函数都应该以 test_ 结尾。FAQ1. 如何只对一部分函数进行测试?两种办法: ...

August 15, 2022 · 1 min · jiezi

关于python:python自动化测试课程学费一般多少-线上学费是线下的2倍差

 进阶python自动化有必要报班吗?课程学费个别多少?置信这不是不少要进阶自动化工程师的测试人员都想晓得的话题了吧。明天作者君,就这两个问题来给大家解答一下! 一、进阶python自动化有没有必要报班 报班学习python的益处还是很多的,能从根底的常识学起,直到把握这门语言,在学习的过程中有业余的老师给予学生领导,让你从浅到深进行学习,在培训班学习的过程中,老师还会采纳实践与实际相结合的教学方式,让你更加粗浅的了解python的精华,因而相比拟自学来说,作者君还是更倡议报班一些的。  二、python自动化测试课程学费个别多少 目前市面上的python自动化测试培训机构有很多,学费因课程、地区、班型、机构、上课形式的不同都是会有所差异的,并没有一个对立的规范。 就比方作者君理解到的软件测试培训机构,分有线下和线上;其中线下python自动化测试课程的费用大多在1万~2万左右;而线上因为是网络授课的模式,所以价格广泛会便宜很多,像作者君查看过的一个线上测试培训机构柠檬班的python自动化测试课程学费,就是在6千9百元左右。  这两方的价格一比照,其实差异还是挺大的,而线下在之所以会产生这么高差额的费用,次要还是因为线下会产生场地、设施、水电等等费用,这些必定不会是培训机构全出的,因而他们要发出这些钱,那么必定就会在学员的学费上下手,这也是为啥线下和线上的学习费用差异这么大的起因。 不过不论学费多少,只有是适宜本人的,那就必定是值得的,所以大家在抉择python培训班的时候,记得肯定从价格、口碑、师资、课程试听等方面去多比照几家,而后再从中抉择适宜本人的。      

August 15, 2022 · 1 min · jiezi

关于python:Command-python-setuppy-egginfo-failed-with-error-code-1

原文链接 windows下应用pip装置torch模块,呈现谬误: ERROR: Command "python setup.py egg_info" failed with error code 1 in C:\Users\xxx\AppData\Local\Temp\pip-install-yqzlud5w\torch\办法一尝试参考文章:https://mp.weixin.qq.com/s/u5... 指定安装包的办法,指定安装包进行装置。 办法二创立一个环境关上Anaconda prompt,输出: conda create -n myroot python=3.5myroot为本人定义的环境名称,对应的python3.5版本。 而后输出: activate myroot激活环境。 通过: python --versionnvcc --version别离查看python和cuda版本。 装置 pytorch依据python和cuda的版本抉择装置GPU或CPU版本: #应用conda装置 'conda,cuda8,python3.5': conda install pytorch -c pytorch 'conda,cuda9.0,python3.5': conda install pytorch cuda90 -c pytorch 'conda,cuda9.1,python3.5': conda install pytorch cuda91 'conda,cudanone,python3.5': conda install pytorch-cpu -c pytorch 'conda,cuda8,python3.6': conda install pytorch -c pytorch 'conda,cuda9.0,python3.6': conda install pytorch cuda90 -c pytorch 'conda,cuda9.1,python3.6': conda install pytorch cuda91 -c pytorch 'conda,cudanone,python3.6': conda install pytorch-cpu -c pytorch #应用pip装置'pip,cudanone,python3.5': pip3 install http://download.pytorch.org/whl/cpu/torch-0.4.0-cp35-cp35m-win_amd64.whl 'pip,cuda8,python3.5': pip3 install http://download.pytorch.org/whl/cu80/torch-0.4.0-cp35-cp35m-win_amd64.whl 'pip,cuda9.0,python3.5': pip3 install http://download.pytorch.org/whl/cu90/torch-0.4.0-cp35-cp35m-win_amd64.whl 'pip,cuda9.1,python3.5': pip3 install http://download.pytorch.org/whl/cu91/torch-0.4.0-cp35-cp35m-win_amd64.whl 'pip,cudanone,python3.6': pip3 install http://download.pytorch.org/whl/cpu/torch-0.4.0-cp36-cp36m-win_amd64.whl 'pip,cuda8,python3.6': pip3 install http://download.pytorch.org/whl/cu80/torch-0.4.0-cp36-cp36m-win_amd64.whl 'pip,cuda9.0,python3.6': pip3 install http://download.pytorch.org/whl/cu90/torch-0.4.0-cp36-cp36m-win_amd64.whl 'pip,cuda9.1,python3.6': pip3 install http://download.pytorch.org/whl/cu91/torch-0.4.0-cp36-cp36m-win_amd64.whl装置胜利: ...

August 14, 2022 · 1 min · jiezi

关于python:Linux下OpenCV出现错误ASSERT-false-in-file-qasciikeycpp-line-501

原文链接 Linux下OpenCV,呈现谬误: ASSERT false in file qasciikey.cpp, line 501 可能是OpenCV的版本有问题,须要重新安装一下: pip install -i https://pypi.tuna.tsinghua.edu.cn/simple opencv-pythonpip install -i https://pypi.tuna.tsinghua.edu.cn/simple opencv-contrib-python如果呈现提醒: Could not install packages due to an EnvironmentError: [Errno 13] Permission denied: '/anaconda3/lib/python3.7/site-packages/opencv_contrib_python-4.1.0.25.dist-info' Consider using the --user option or check the permissions. 示意须要应用--user: pip install --user -i https://pypi.tuna.tsinghua.edu.cn/simple opencv-contrib-python   学习更多编程常识,请关注我的公众号: 代码的路 本文由mdnice多平台公布

August 14, 2022 · 1 min · jiezi

关于python:PyQt5-实现状态栏statusBar显示和隐藏功能

首先,讲述要解决的两个问题以及解决问题的代码: 1、将鼠标搁置于菜单栏上状态栏永恒隐没的问题(这个问题须要仔细观察能力留神到) # 此笼罩父类函数: 笼罩办法; 为了克服 将鼠标搁置于菜单栏上 状态栏就隐没的问题; def event(self, QEvent): if QEvent.type() == QEvent.StatusTip: if QEvent.tip() == "": QEvent = QStatusTipEvent("ready!") # 此处为要始终显示的内容 return super().event(QEvent)2、管制状态栏显示和暗藏的问题 def toggleMenu(self, state): # 自定义事件函数 print(state) # if state: # self.statusBar().showMessage("ready!") # else: # self.statusBar().showMessage("") # if state: # 管制状态栏是否显示, # self.statusbar().show() # 此处是谬误示例 # else: # self.statusbar().hide() if state: # 应该应用statusBar() 而不是 statusbar self.statusBar().show() else: self.statusBar().hide()最近学习pyqt5教程,也是他人翻译的,总的也是谬误多多,应该间接看原版的,充沛表明英语很重要啊…… 贴上全副代码: import sysfrom PyQt5.QtWidgets import QMainWindow, QApplication, QAction, qApp, QMenufrom PyQt5.QtGui import QIcon, QStatusTipEvent class main_window(QMainWindow): def __init__(self): super().__init__() self.initUI() def initUI(self): # 能够设置 动作的图标, 文字显示; 弱小 exitAct = QAction(QIcon("/Users/zuozhe/PycharmProjects/Soft-Video/images/m4.png"), "&退出", self) exitAct.setShortcut("Ctrl+Q") # 设置快捷键 exitAct.setToolTip("Exit Application") # 提醒 exitAct.triggered.connect(qApp.exit) # 绑定退出事件 status = self.statusBar() # 创立状态栏 status.showMessage("ready!") # 显示音讯 # 菜单栏 # 文件菜单栏 menubar = self.menuBar() menubar.setNativeMenuBar(False) # MAC OS 下须要设置此句话 fileMenu = menubar.addMenu("&File") # 主菜单File impMenu = QMenu("Import", self) # 创立菜单项 impAct = QAction("Import Email", self) # Import菜单下有子菜单 Import Email impMenu.addAction(impAct) newAct = QAction("New", self) # 就差 给 Action(动作)绑定触发事件了 fileMenu.addAction(newAct) # 将两个菜单项退出到 File主菜单栏下 fileMenu.addMenu(impMenu) fileMenu.addAction(exitAct) # 绑定 File下的菜单项 # 编辑菜单栏 editMenu = menubar.addMenu("&Edit") # 视图菜单栏 viewMenu = menubar.addMenu("&View") # 勾选菜单 viewstatAct = QAction("是否显示状态栏", self, checkable=True) viewstatAct.setToolTip("View statusbar") viewstatAct.setChecked(True) viewstatAct.triggered.connect(self.toggleMenu) # 触发链接事件; toggleMenu是自定义函数 viewMenu.addAction(viewstatAct) # 设置窗口的 地位和大小 self.setGeometry(300, 300, 500, 600) self.setWindowTitle("主窗口的菜单栏和工具栏") self.show() # 此笼罩父类函数: 笼罩办法; 为了克服 将鼠标搁置于菜单栏上 状态栏就隐没的问题; def event(self, QEvent): if QEvent.type() == QEvent.StatusTip: if QEvent.tip() == "": QEvent = QStatusTipEvent("ready!") # 此处为要始终显示的内容 return super().event(QEvent) def toggleMenu(self, state): # 自定义事件函数 print(state) # if state: # self.statusBar().showMessage("ready!") # else: # self.statusBar().showMessage("") # if state: # 管制状态栏是否显示, # self.statusbar().show() # else: # self.statusbar().hide() if state: # 应该应用statusBar() 而不是 statusbar self.statusBar().show() else: self.statusBar().hide() if __name__ == "__main__": app = QApplication(sys.argv) window = main_window() sys.exit(app.exec_())

August 14, 2022 · 2 min · jiezi

关于python:使用QWebEngineView打造一款简单浏览器

应用PyQt5的QWebEngineView组件打造一款简略的浏览器QWebEngineView是PyQt中的一个能够显示网页的组件,该组件封装了谷歌浏览器内核,功能强大。老手试着实现一下,锤炼本人的编码能力。 成品图片1界面图片2界面图片 首先重写一下QWebEngineView类的createWindow函数这个函数在QWebEngineView中点击跳转关上新页面的时候会被调用,如果不重写的话,页面链接跳转到新页面的时候就会没有反馈。 class MyWebView(QWebEngineView): def __init__(self, my, *args): super(MyWebView, self).__init__(*args) self.my = my # self.view = None def createWindow(self, QWebEnginePage_WebWindowType): #如果是要在本页面显示的页面则return self return self.my.create_view() #创立一个新的容器显示新的页面 写一个用来装页面以及后退和后退刷新的界面 class Webbox(QWidget): def __init__(self, my, *args): super(Webbox, self).__init__(*args) self.my = my self.setGUI() def setGUI(self): self.webview = MyWebView(self.my, self) self.buttons = [] self.url_input = QLineEdit(self) self.function_group = QButtonGroup(self) self.function_group.setExclusive(True) self.url_input.setStyleSheet(MyStyle.getInputStyle()) self.homepage() self.webview.loadFinished.connect(self.update_view) icon = ['back.png', 'forward.png', 'reload.png', 'home.png'] for i in icon: button = QPushButton(self) button.setIcon(QIcon(QPixmap(self.get_resource_path('static/' + i)))) button.setStyleSheet(MyStyle.getIconButtonStyle()) self.buttons.append(button) self.buttons[1].clicked.connect(lambda: self.webview.forward()) self.buttons[0].clicked.connect(lambda: self.webview.back()) self.buttons[2].clicked.connect(lambda: self.webview.reload()) self.buttons[3].clicked.connect(self.homepage) self.url_input.returnPressed.connect(self.init) def homepage(self): self.webview.load(QUrl('https://www.baidu.com')) self.url_input.setText('https://www.baidu.com') def resizeEvent(self, a0: QtGui.QResizeEvent) -> None: self.buttons[0].setGeometry(5, 5, 45, 30) self.buttons[1].setGeometry(50 * 1 + 5, 5, 45, 30) self.buttons[2].setGeometry(50 * 2 + 5, 5, 45, 30) self.buttons[3].setGeometry(50 * 3 + 5, 5, 45, 30) self.url_input.setGeometry(50 * 4 + 5, 5, self.width() - 4 * 50 + 10 - 3 * 35 - 80, 30) self.webview.setGeometry(0, 40, self.width(), self.height() - 35) def init(self): if 'http' in self.url_input.text(): self.webview.load(QUrl(self.url_input.text())) elif self.url_input.text() == '': self.zhuye() else: self.webview.load(QUrl(r'http://' + self.url_input.text())) self.url_input.setText(self.webview.url().toString()) def update_view(self): self.url_input.setText(self.webview.url().toString()) self.url_input.setCursorPosition(0) self.my.update_title(self) def get_resource_path(self, relative_path): if hasattr(sys, '_MEIPASS'): return os.path.join(sys._MEIPASS, relative_path) return os.path.join(os.path.abspath("."), relative_path)创立一个装整个界面的窗口 ...

August 14, 2022 · 5 min · jiezi

关于python:QT5设定QWebEngineView大小

最近在一个小我的项目外头须要用到QWebEngineView,查问了网上各位大佬的用法,发现都是塞满整个窗口或者是用布局器和其余元素排列实现“非全屏”,相似这种但这都不是我想要的,能不能让它,就是变成我想要的形态,你懂我意思吧比方这样 间接贴代码ui文件转的ui.py文件 # -*- coding: utf-8 -*-# Form implementation generated from reading ui file '.\TBLive_mainWindow.ui'## Created by: PyQt5 UI code generator 5.15.6## WARNING: Any manual changes made to this file will be lost when pyuic5 is# run again. Do not edit this file unless you know what you are doing.from PyQt5 import QtCore, QtGui, QtWidgetsclass Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(1397, 1046) font = QtGui.QFont() font.setPointSize(9) MainWindow.setFont(font) MainWindow.setStyleSheet("") self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.widget = QtWidgets.QWidget(self.centralwidget) self.widget.setGeometry(QtCore.QRect(310, 10, 1071, 931)) self.widget.setObjectName("widget") MainWindow.setCentralWidget(self.centralwidget) self.menubar = QtWidgets.QMenuBar(MainWindow) self.menubar.setGeometry(QtCore.QRect(0, 0, 1397, 26)) self.menubar.setObjectName("menubar") MainWindow.setMenuBar(self.menubar) self.statusbar = QtWidgets.QStatusBar(MainWindow) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))demo.py ...

August 14, 2022 · 1 min · jiezi

关于python:PyQt5-内嵌浏览器注入-Javascript-脚本实现自动化操作

概要应同学邀请,演示如何应用 PyQt5 内嵌浏览器浏览网页,并注入 Javascript 脚本实现自动化操作。 sg 原贴地址: 如何在Python利用runJavaScript模仿鼠标挪动页面的某个元素https://segmentfault.com/q/10... 上面测试的是一个便宜机票预订网站(http://www.flyscoot.com/),关键点如下 1.应用 QWebEngineView 加载网页,并显示进度。2.在默认配置(QWebEngineProfile)中植入 Javascript 内容,这样脚本会在所有关上的网页中执行,不管跳转到哪个网址。3.Javascript 脚本应用网址中的路径名,判断以后网页地位,从而决定执行哪种操作。 python 代码示例 #!/usr/bin/env python3# -*- coding: utf-8 -*-'''应用 PyQt5 内嵌浏览器浏览网页,并注入 Javascript 脚本实现自动化操作。'''import osimport sysfrom datetime import datetimefrom PyQt5.QtWidgets import ( QWidget, QApplication, QVBoxLayout, QHBoxLayout, QDesktopWidget, QTextEdit, QLabel, QLineEdit, QPushButton, QFileDialog, QProgressBar,)from PyQt5.QtCore import QUrl, pyqtSlotfrom PyQt5.QtWebEngineWidgets import QWebEngineView, QWebEngineProfile, QWebEngineScript, QWebEnginePageclass Browser(QWidget): def __init__(self): super().__init__() self.init_ui() # 脚本 self.profile = QWebEngineProfile.defaultProfile() self.script = QWebEngineScript() self.prepare_script() def init_ui(self): self.webView = QWebEngineView() self.logEdit = QTextEdit() self.logEdit.setFixedHeight(100) self.addrEdit = QLineEdit() self.addrEdit.returnPressed.connect(self.load_url) self.webView.urlChanged.connect( lambda i: self.addrEdit.setText(i.toDisplayString())) self.jsEdit = QLineEdit() self.jsEdit.setText('inject.js') loadUrlBtn = QPushButton('加载') loadUrlBtn.clicked.connect(self.load_url) chooseJsBtn = QPushButton('抉择脚本文件') chooseJsBtn.clicked.connect(self.choose_js_file) # 导航/工具 top = QWidget() top.setFixedHeight(80) topBox = QVBoxLayout(top) topBox.setSpacing(0) topBox.setContentsMargins(5, 0, 0, 5) progBar = QProgressBar() progBox = QHBoxLayout() progBox.addWidget(progBar) topBox.addLayout(progBox) naviBox = QHBoxLayout() naviBox.addWidget(QLabel('网址')) naviBox.addWidget(self.addrEdit) naviBox.addWidget(loadUrlBtn) topBox.addLayout(naviBox) naviBox = QHBoxLayout() naviBox.addWidget(QLabel('注入脚本文件')) naviBox.addWidget(self.jsEdit) naviBox.addWidget(chooseJsBtn) topBox.addLayout(naviBox) self.webView.loadProgress.connect(progBar.setValue) # 主界面 layout = QVBoxLayout(self) layout.addWidget(self.webView) layout.addWidget(top) layout.addWidget(self.logEdit) self.show() self.resize(1024, 900) self.center() def center(self): qr = self.frameGeometry() cp = QDesktopWidget().availableGeometry().center() qr.moveCenter(cp) self.move(qr.topLeft()) @pyqtSlot() def load_url(self): url = self.addrEdit.text().strip() if not url.lower().startswith('http://') \ and not url.lower().startswith('https://'): url = 'http://{}'.format(url) self.load(url) @pyqtSlot() def choose_js_file(self): f, _ = QFileDialog.getOpenFileName(filter="Javascript files(*.js)") if os.path.isfile(f): self.jsEdit.setText(f) self.prepare_script() def prepare_script(self): path = self.jsEdit.text().strip() if not os.path.isfile(path): self.log('invalid js path') return self.profile.scripts().remove(self.script) with open(path, 'r') as f: self.script.setSourceCode(f.read()) self.profile.scripts().insert(self.script) self.log('injected js ready') def log(self, msg, *args, **kwargs): m = msg.format(*args, **kwargs) self.logEdit.append('{} {}'.format( datetime.now().strftime('%H:%M:%S'), m)) def load(self, url): self.log(f'loading {url}') self.addrEdit.setText(url) self.webView.load(QUrl(url))if __name__ == '__main__': app = QApplication(sys.argv) b = Browser() b.load('http://www.flyscoot.com/') sys.exit(app.exec_())Javascript 脚本示例 ...

August 13, 2022 · 2 min · jiezi

关于python:pyqt5的runJavaScript-使用模板

runJavaScript 的阐明QWebEnginePage 有一个 runJavaScript 办法,反对回调函数。 应用办法1只运行JavaScript,没有回调 def run_js(self): js_string = ''' alert("hello,world!"); ''' self.webview.page().runJavaScript(js_string)应用办法2运行JavaScript,并存在回调 def run_js2(self): js_string = ''' function myFunction() { return document.body.scrollWidth; } myFunction(); ''' self.webview.page().runJavaScript(js_string , self.js_callback) # 回调函数 def js_callback(self,result): print(result) QMessageBox.information(self, "提醒", str(result))残缺代码,如下所示。【如下代码,齐全复制,间接运行,即可应用】 import sysfrom PyQt5.QtWidgets import *from PyQt5.QtCore import *from PyQt5.QtWebEngineWidgets import QWebEngineView#######################################################创立主窗口################################################class MainWindow(QMainWindow): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.setWindowTitle('My Browser') self.showMaximized() #####放入WebEngineView self.webview = WebEngineView() self.webview.load(QUrl("https://www.baidu.com")) self.setCentralWidget(self.webview) #####web页面加载结束,调用函数 self.webview.page().loadFinished.connect(self.run_js) self.webview.page().loadFinished.connect(self.run_js2) ########运行js脚本,没有回调######## def run_js(self): js_string = ''' alert("hello,world!"); ''' self.webview.page().runJavaScript(js_string) ########运行js脚本,有回调######## def run_js2(self): js_string = ''' function myFunction() { return document.body.scrollWidth; } myFunction(); ''' self.webview.page().runJavaScript(js_string , self.js_callback) # 回调函数 def js_callback(self,result): print(result) QMessageBox.information(self, "提醒", str(result))#######################################################创立浏览器################################################class WebEngineView(QWebEngineView): windowList = [] # 重写createwindow() def createWindow(self, QWebEnginePage_WebWindowType): new_webview = WebEngineView() new_window = MainWindow() new_window.setCentralWidget(new_webview) #new_window.show() self.windowList.append(new_window) #注:没有这句会解体 return new_webview#######################################################程序入门################################################if __name__ == "__main__": app = QApplication(sys.argv) w = MainWindow() w.show() sys.exit(app.exec_())

August 13, 2022 · 1 min · jiezi

关于python:Python在线编译器iPad使用体验

如果只是学习Python算法的话,在iPad上其实是能够应用Python在线编译器的。尽管在笔记本电脑甚至台式机上编程至今依然是最优抉择,但对于想在iPad上搭配键盘学习编程的搭档来说的确多了一个抉择。 在iPad上学习编程其实能够尝试云端IDE或在线编辑器,很多相似的利用学习起来其实没有那么难,甚至都不须要配置环境或者装置APP,间接在浏览器中关上就能应用,而且不仅是Python,其余相似C/C++、Java、HTML、Go等编程语言都实用。 Lightly IDE(https://lightly.teamcode.com/) 依靠云原生诞生的Lightly IDE可能比你设想中弱小。这款编译器无需自行购买服务器,更不须要SSH等部署工作。因为整个利用都在云端上,开发环境会依据用户的编程语言甚至需要文件主动配置,基本上只须要建设我的项目就能够开始编程。 写好代码后也不用放心编译器的问题,Lightly自带的Python在线编译器只需轻点右上角的“运行”按键就能够开始编译代码了。 如果我的项目须要装置第三方库,用户也能够在“终端”面板中通过 pip install 命令装置。相似iPad mini等小屏的平板可能在应用屏幕键盘时挡住局部显示,配合蓝牙键盘应用成果更佳,即使不是苹果的妙控键盘也能够完满适配。 即使用户在学习Python的过程中须要用到Tkinter、Matplotlib、Pygame等须要GUI的我的项目,大家也只须要点击“运行”键即可调用。 免费版的Lightly IDE已齐全反对代码高亮、主动补全、跨设施云端同步、团队合作、代码分享等性能,而在最新版本的Lightly IDE中,付费用户还能够应用MySQL、PostgreSQL、Redis等中间件的云端服务,让整个编码体验更加晦涩欠缺。 随着iPad端的利用越来越欠缺,无论是苹果或安卓平板都在致力扭转爱奇艺播放器、大屏吃鸡游戏机甚至泡面盖等名称,让平板电脑逐步具备更强的生产力。诚然当初的平板电脑还没有达到代替笔记本电脑的境界,但无论是文本编辑、视频剪辑、图像处理甚至编写代码都有了更多抉择,让平板轻办公变得不再遥不可及。 Lightly Python在线编译器由TeamCode研发。TeamCode专一于云原生合作开发畛域,简化开发流程,帮忙开发者与企业高效合作开发。

August 13, 2022 · 1 min · jiezi

关于python:PyCharm-20222-发布了支持最新-Python-311-和-PyScript-框架

起源:Jet Brains官网;翻译:Python猫 原文:https://blog.jetbrains.com/py... 通常而言,应用新潮的或者疾速倒退的技术,可能会挺有挑战性,你可能得常常浏览文档,能力相熟新的语法、API 和协定。 PyCharm 2022.2 通过提供对 Python 3.11 的语言个性和新的 PyScript 框架的反对,可能帮忙你实现这一过程。 让咱们来看看它外面有什么吧! Python 3.11PyCharm 2022.2 曾经为 Python 3.11 中一些次要的性能提供了代码洞察(code insight),例如异样组和 except * 运算符(PEP 654): 以及新的用于 TypedDict 个别键的 Required[] 和 NotRequired[] 标记符号(PEP 655)。 HTTP ClientPyCharm 2022.2 反对 WebSocket 连贯。有了这个 API,你能够在给服务端发送音讯后,接管由事件驱动的响应,而不需轮询服务器来获取后果。 PyCharm 现在能够基于开箱即用的 HTTP 和 WebSocket 协定来发送申请。ws:// 与 wss://  示意的是应用 WebSocket 申请协定。 此外,PyCharm 2022.2 还提供了一种更简略的办法来抉择运行环境——应用代码侧边栏上的图标。原文 若要启用此性能,请从“Run with”下拉框中抉择“Select Environment Before Run”选项。 用于设置近程解释器的新 UIPyCharm 2022.2 引入了一个新的向导,用于在远程目标上设置解释器(如 WSL、SSH、Docker、Docker Compose 或 Vagrant)。它使得设置的过程更加结构化且易于操作。 ...

August 13, 2022 · 1 min · jiezi

关于python:Python类与对象的特殊方法和特殊属性

类型 名称 形容 非凡属性 __dict__ 获取类对象所有属性和办法或获取实例对象所有属性的字典 __class__ 获取实例对象的类 __bases__ 输入父类类型的元组 __base__ 输入基类,第一个继承的父类 __mro__ 类的档次后果 非凡办法 __len__() 重写此办法,让内置函数len()的参数能够是自定义类型 __add__() 重写此办法,可应用自定义对象具备“+”性能 __new__() 创建对象 __init__() 对创立的对象进行初始化 __subclasses__() 获取子类的列表 代码示例: class A: passclass B: passclass C(A): passclass Human(A, B): def __init__(self, name, age): self.name = name self.age = age def eat(self): print('人吃各种')x = Human('a', 22)print(x.__dict__) # 实例对象的属性字典;{'name': 'a', 'age': 22}print(Human.__dict__) # 类对象的属性和办法字典;{'__module__': '__main__', '__init__': <function Human.__init__ at 0x0000022F9EF6FEE0>, 'eat': <function Human.eat at 0x0000022F9EF6FF70>, '__doc__': None}print(x.__class__) # 输入对象所属的类;<class '__main__.Human'>print(Human.__bases__) # 输入父类类型的元组; (<class '__main__.A'>, <class '__main__.B'>)print(Human.__base__) # 输入基类,第一个继承的父类;<class '__main__.A'>print(Human.__mro__) # 类的档次后果;(<class '__main__.Human'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>)print(A.__subclasses__()) # 获取子类的列表;[<class '__main__.C'>, <class '__main__.Human'>]__add__()代替 +: ...

August 12, 2022 · 2 min · jiezi

关于python:Python面向对象的三大特征封装继承多态

面向对象的三大特色:特色简述封装进步程序的安全性继承进步代码的复用性多态进步程序的可扩展性和可维护性封装:将数据(属性)和行为(办法)包装到类对象中。在办法外部对其属性进行操作,在类对象内部调用办法。这样,无需关系外部办法的实现细节,隔离了复杂性。在Python中没有专门的修饰符用于属性的公有,如果该属性不心愿被类对象内部被拜访,属性名前应用两个“_”。class Student: def __init__(self, name, age): self.name = name self.__age = age # 暗藏属性 def get_age(self): print(self.__age)stu = Student('Alen', 20)stu.get_age() # 20# print(stu.__age) # AttributeError: 'Student' object has no attribute '__age'print(stu._Student__age) # 20,非凡办法能够获取,不倡议应用继承语法:class 子类类名(父类1,父类2...): 一个类没有继承任何类,则默认继承object。Python反对多继承。定义子类时,必须在其构造函数中调用父类的构造函数。代码示例: class Person: def __init__(self, name, age): self.name = name self.age = age def info(self): print(self.name, self.age)class Student(Person): def __init__(self, name, age, score): super().__init__(name, age) self.score = scoreclass Teacher(Person): def __init__(self, name, age, job_title): super().__init__(name, age) self.job_title = job_titlestu1 = Student('张三', 15, 55)stu1.info() # 张三 15tec1 = Teacher('李老师', 42, '班主任')tec1.info() # 李老师 42办法重写父类的某个属性或者形式不满足子类的应用要求时,子类能够在其办法体内进行重写。 ...

August 12, 2022 · 2 min · jiezi

关于python:QT之QWebEngineView

从webkit到webengine自从Qt5.6后引入了QWebEngine,摒弃了原先的QWebkit,这是一款基于chrome浏览器内核引擎,Qt webenginewidgets模块中提供了QWebEngineView这个视图控件来很不便的加载和显示网页,仅需如下几行: QWebEngineView* webview = new QWebEngineView;webview->load(QUrl("https://www.baidu.com/"));webview->show();QWebEngineView跳转问题这段代码很容易运行起来,然而别快乐早了,接下来你会发现点页面上的链接或者百度到其它页面时无奈跳转,这是为什么呢? 因为咱们只是一个浏览器引擎,不是像firefox、chrome那样的浏览器,浏览器曾经提供了tab页去显示一个新的链接,所以这里咱们须要本人决定如何去显示新关上的链接。 有两种办法能够实现1、咱们发现点击链接时时会收到urlChanged信号的,它附带的参数就是url地址,所以如果你想在本webview视图上显示这个页面就间接在绑定的槽函数里调用load(url)就ok了,如果你想实现向浏览器用另一tab来显示也是能够的,只需另外创立一个QWebEngineView,加载显示就好了,当然你也能够跳出一个对话框来显示,就想新关上一个浏览器窗口一样; 2、第二种办法就是重写createWindow办法,默认返回的是NULL,所以咱们看到的成果是无奈显示新的链接,因为你没有提供一个QWebEngineView给它嘛,在这个办法里有一个WebWindowType类型参数, enum WebWindowType { WebBrowserWindow, WebBrowserTab, WebDialog };能够看到就是第一种办法中咱们提到的三种显示,本浏览器窗口视图显示,另一tab页显示,跳出新的对话框显示,别离给你想实现的成果就好啦,简略而灵便。实际上js外面的window.open就会触发这个动作,调用到这个办法。示例代码: class HWebView : public QWebEngineView{ Q_OBJECTpublic: HWebView::HWebView(QWidget *parent) : QWebEngineView(parent){ }protected: virtual QWebEngineView *createWindow(QWebEnginePage::WebWindowType type){ HWebView* view = new HWebView; view->setAttribute(Qt::WA_DeleteOnClose); view->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum); return view; }};c++和JS交互因为Qt自带的元对象模型Meta Object Model,信号与槽机制,使得c++和JS的交互异样简略而优雅,能够说比微软的com组件更加好用。这里隆重退场的就是QWebChannel了,它应用了QWebSocket了,在C++端开了一个服务器端口,在JS客户端去连贯这个端口,而后利用qt的元对象模式,信号与槽机制进行替换,说的很简单,理论请看代码,很简略 class HWebContext : public QObject{ Q_OBJECTsignals: void sigClicked();public slots: void setAction(int action);};QWebChannel* webchannel = new QWebChannel(m_webview);m_webview->page()->setWebChannel(webchannel);m_webContext = new HWebContext;webchannel->registerObject(QStringLiteral("content"), (QObject*)m_webContext);首先咱们定义一个c++和JS进行交互的对象类,这个类须要继承自QObject,加上Q_OBJECT宏,定义一些信号和槽,这样就能够应用qt的信号与槽机制了.而后new一个QWebChannel,与QWebEngineView外面的QWebEnginePage绑定起来,用registerObject去注册咱们定义的c++和JS进行交互的对象。这样c++端的工作就实现了,c++端实际上开了一个端口去监听,提供了一个对象供js去应用。在JS端须要做的工作如下: <script type="text/javascript" src="./qwebchannel.js"></script>var g_context;function onClicked(){}window.onload=function(){ new QWebChannel(qt.webChannelTransport, function(channel) { g_context= channel.objects.content; g_context.sigClicked.connect(onClicked()) }); }g_context.setAction(0);加载qwebchannel.js,这个文件在qt装置目录下搜寻能够找到,而后在窗口加载时利用QWebChannel,实际上是链接到了c++服务器端,获取到咱们在c++端注册的对象,content是c++端注册时为对象设置的字符串标识,为这个对象的信号连贯一个槽函数(js函数),这样c++端发出信号时就会去调用这个js函数,而js端调用c++槽函数更加简略,间接相似g_context.setAction(0)就能够了。 ...

August 12, 2022 · 1 min · jiezi

关于python:PyQt5的QWebEngineView使用示例

这篇文章次要介绍了PyQt5的QWebEngineView应用示例,帮忙大家更好的学习和应用python,感兴趣的敌人能够理解下一.反对视频播放 self.settings().setAttribute(QWebEngineSettings.PluginsEnabled, True) #反对视频播放self.settings().setAttribute(QWebEngineSettings.PluginsEnabled, True) #反对视频播放二.反对页面敞开申请 self.page().windowCloseRequested.connect(self.on_windowCloseRequested) #页面敞开申请三.反对页面下载申请 self.page().profile().downloadRequested.connect(self.on_downloadRequested) #页面下载申请【如下代码,齐全复制,间接运行,即可应用】 import sysimport osimport datetimefrom PyQt5.QtWidgets import *from PyQt5.QtCore import *from PyQt5.QtWebEngineWidgets import QWebEngineView,QWebEngineSettings # 调试窗口配置# 如果不想本人创立调试窗口,能够应用Chrome连贯这个地址进行调试DEBUG_PORT = '5588'DEBUG_URL = 'http://127.0.0.1:%s' % DEBUG_PORTos.environ['QTWEBENGINE_REMOTE_DEBUGGING'] = DEBUG_PORT #######################################################创立主窗口################################################class MainWindow(QMainWindow): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.setWindowTitle('My Browser') #self.showMaximized() self.setWindowFlags(Qt.FramelessWindowHint) #####创立tabwidget self.tabWidget = QTabWidget() self.tabWidget.setTabShape(QTabWidget.Triangular) self.tabWidget.setDocumentMode(True) self.tabWidget.setMovable(True) self.tabWidget.setTabsClosable(True) self.tabWidget.tabCloseRequested.connect(self.close_Tab) self.setCentralWidget(self.tabWidget) ####第一个tab self.webview = WebEngineView(self) #self必须要有,是将主窗口作为参数,传给浏览器 self.webview.load(QUrl("https://www.baidu.com")) self.create_tab(self.webview) #网页调试窗口 self.inspector = QWebEngineView() self.inspector.setWindowTitle('Web Inspector') self.inspector.load(QUrl(DEBUG_URL)) self.webview.loadFinished.connect(self.handleHtmlLoaded) # 加载实现后显示调试网页 def handleHtmlLoaded(self, ok): if ok: self.webview.page().setDevToolsPage(self.inspector.page()) self.inspector.show() #创立tab def create_tab(self,webview): self.tab = QWidget() self.tabWidget.addTab(self.tab, "新标签页") self.tabWidget.setCurrentWidget(self.tab) ##### self.Layout = QHBoxLayout(self.tab) self.Layout.setContentsMargins(0, 0, 0, 0) self.Layout.addWidget(webview) #敞开tab def close_Tab(self,index): if self.tabWidget.count()>1: self.tabWidget.removeTab(index) else: self.close() # 当只有1个tab时,敞开主窗口 #######################################################创立浏览器################################################class WebEngineView(QWebEngineView): def __init__(self,mainwindow,parent=None): super(WebEngineView, self).__init__(parent) self.mainwindow = mainwindow ############## self.settings().setAttribute(QWebEngineSettings.PluginsEnabled, True) #反对视频播放 self.page().windowCloseRequested.connect(self.on_windowCloseRequested) #页面敞开申请 self.page().profile().downloadRequested.connect(self.on_downloadRequested) #页面下载申请 # 反对页面敞开申请 def on_windowCloseRequested(self): the_index = self.mainwindow.tabWidget.currentIndex() self.mainwindow.tabWidget.removeTab(the_index) # 反对页面下载按钮 def on_downloadRequested(self,downloadItem): if downloadItem.isFinished()==False and downloadItem.state()==0: ###生成文件存储地址 the_filename = downloadItem.url().fileName() if len(the_filename) == 0 or "." not in the_filename: cur_time = datetime.datetime.now().strftime('%Y%m%d%H%M%S') the_filename = "下载文件" + cur_time + ".xls" the_sourceFile = os.path.join(os.getcwd(), the_filename) ###下载文件 # downloadItem.setSavePageFormat(QWebEngineDownloadItem.CompleteHtmlSaveFormat) downloadItem.setPath(the_sourceFile) downloadItem.accept() downloadItem.finished.connect(self.on_downloadfinished) # 下载完结触发函数 def on_downloadfinished(self): js_string = ''' alert("下载胜利,请到软件同目录下,查找下载文件!"); ''' self.page().runJavaScript(js_string) # 重写createwindow() def createWindow(self, QWebEnginePage_WebWindowType): new_webview = WebEngineView(self.mainwindow) self.mainwindow.create_tab(new_webview) return new_webview #######################################################程序入门################################################if __name__ == "__main__": app = QApplication(sys.argv) the_mainwindow = MainWindow() the_mainwindow.show() sys.exit(app.exec())

August 12, 2022 · 1 min · jiezi

关于python:pyqt5-QWebEngineView如何获取网页源代码

应用pyqt5的QWebEngineView视图组件能够关上网址(或加载本地的html网页),加载网页后能够通过运行javascript代码获取网页源代码或者通过toHtml函数来获取网页源代码。上面就展现了如何通过toHtml函数获取源代码。 首先创立一个垂直布局,一个QWebEngineView组件和一个QPushButton组件,并将两个组件增加到垂直布局中,同时将layout垂直布局设置给self窗口。 其次,而后通过load办法加载百度地图,而后给button按钮增加一个点击的槽函数add_script。 最初,在槽函数外面实现打印源代码的性能,次要应用到的是 self.web_browser.page().toHtml函数,因为该函数须要一个函数作为其参数,同时会将网页源代码传递进来,于是给其中传递了一个匿名函数lambda,并打印了参数x 即是toHtml传递进来的源代码。这样就实现了获取网页源代码的性能,toHtml有点相似一个信号。 在实现过程中能够进行优化调整,如给self.web_browser.loadFinished信号绑定一个本人定义的槽函数,当网页加载实现后再实现获取网页源代码。槽函数外面能够任意解决,如通过实例变量承受,或者保留为本地网页,或者进一步的解析网页源代码,获取指定的元素或文本内容。 另外,QWebEngineView也有执行javascript的性能runJavaScript函数,能够将其当成selenium来进行自动化操作。 import sysfrom PyQt5.Qt import *class MainWindow(QWidget): def __init__(self): super(MainWindow, self).__init__() self.setupUI() def setupUI(self): layout = QVBoxLayout() self.web_browser = QWebEngineView() # self.web_browser.load(QUrl('https://pan.baidu.com/s/17XlMuMzfQhwJ5R1Bn7yuiA#list/path=%2F')) btn = QPushButton('加载脚本') layout.addWidget(btn) layout.addWidget(self.web_browser) self.setLayout(layout) self.web_browser.load(QUrl('https://map.baidu.com')) btn.clicked.connect(self.add_script) # self.web_browser.loadFinished.connect(self.add_script) def add_script(self): print('按钮已被点击') # self.web_browser.page().toPlainText(lambda x: print(x)) self.web_browser.page().toHtml(lambda x: print(x)) # self.web_browser.page().runJavaScript('''function getname(){ # var elem = document.getElementById("user-center"); # elem.remove(); # var elem2 = document.getElementById("message-center"); # elem2.remove(); # var elem3 = document.querySelector('.BMap_cpyCtrl'); # elem3.remove(); # var elem4 = document.querySelector('.BMap_scaleCtrl'); # elem4.remove(); # var elem5 = document.querySelector('#newuilogo'); # elem5.remove();}; # getname(); # ''')if __name__ == '__main__': app = QApplication(sys.argv) window = MainWindow() window.show() sys.exit(app.exec_())

August 12, 2022 · 1 min · jiezi

关于python:Python类与对象

两大编程思维 类型 面向过程 面向对象 区别 事物比较简单,可用线性思维解决 事物比较复杂,简略的线性思维无奈解决 共同点 面向对象和面向过程都是解决理论问题的一种思维形式 总结 两者相辅相成,并不是对抗的。解决简单问题,通过面向对象形式便于咱们从宏观上把握事物之间的简单关系、不便咱们剖析整个零碎;具体到宏观操作,依然应用面向过程的形式来解决。 类与对象类类的定义多个相似事物组成的群体的统称。可能帮忙咱们疾速了解和判断事物的性质。 数据类型不同的数据类型属于不同的类。 类的创立创立语法类名:由一个或多个单词组成,每个单词首字母大写,其余小写。class 类名: 属性 办法类的组成类属性实例办法静态方法类办法代码示例: class Student: native_place = '北京' # 类属性 def __init__(self, name, age): # name,age为实例属性 self.name = name self.age = age # 实例办法 def info(self): print('我的名字是', self.name, ',年龄是', self.age) # 类办法 @classmethod def cm(cls): print('类办法') # 静态方法 @staticmethod def sm(): print('静态方法')对象100、66、555都是int类蕴含的不同个例,这些个例的专业术语称为实例或对象。 Python中所有皆对象对象的创立对象的创立又称为类的实例化。语法:实例名 = 类名() stu = Student('allin', 20)print(stu.name) # allinstu.info() # 我的名字是 allin ,年龄是 20Student.cm() # 类办法Student.sm() # 静态方法Student.info(stu) # 我的名字是 allin ,年龄是 20有了实例,能力调用类中的内容。调用类中的办法:对象.办法名();类名.办法名(对象实例)。 ...

August 12, 2022 · 1 min · jiezi

关于python:k哥爬虫普法程序员183并发爬取官方网站直接获刑3年

我国目前并未出台专门针对网络爬虫技术的法律标准,但在司法实际中,相干裁决已不足为奇,K 哥特设了“K哥爬虫普法”专栏,本栏目通过对实在案例的剖析,旨在进步宽广爬虫工程师的法律意识,通晓如何非法合规利用爬虫技术,警钟长鸣,做一个违法、护法、有准则的技术人员。案情介绍深圳市快鸽互联网科技有限公司 2014 年成立,晚期做互联网金融,2017 年转型做互联网科技公司,主营业务是“助贷”,也就为按揭贷款购房的客户提供赎楼及债权置换贷款等服务。 公司的业务须要经常性地拜访深圳市政府居住证网站,查问房产地址、屋宇编码和学区房的应用状况,用于做房产的市场评估和客户危险评估。因为手动查问效率低下,公司产品组经探讨后提出了一个倡议——用爬虫技术主动查问。 2017 年 12 月,CTO 安顿新入职的程序员负责这个我的项目,要求他研发一个主动定时抓取的小程序,次要用来查问、下载网上的数据。 2018 年 1 月,项目经理给程序员一个抓取数据的小程序源代码,程序员开始批改。 2018 年 3 月,程序被部署在阿某云服务器上主动运行,其内置的“网络爬虫”对接了深圳市公安局人口管理处的居住证零碎,能够在深圳市居住证网站上查问到房产地址、屋宇编码等对应的材料,软件对网站访问量能达到每小时数十万次,查问的信息都被下载保留到公司购买的阿某云服务器上。 2018 年 4 月 27 日 10:43-12:00 左右,居住证零碎的承建单位发现零碎呈现宕机景象,追踪到申请应用服务器端口编号,但因日志缺失而无奈定位 IP 起源,过后狐疑是人为攻打。 2018 年 5 月 2 日 10:00-12:00 左右,零碎再次遭逢攻打,这次管理人员胜利地截取了 IP 地址并报案。 2018 年 5 月 17 日早晨 11 点,服务器保护人员接到了阿某云客服的电话。阿某云说他们公司的服务器 IP 被网警锁定了,因有攻击行为,让他们连忙分割网警。 2018 年 8 月,CTO、程序员被捕。 案发时,深圳市居住证服务平台的注册用户超过 530 万,服务面包含:所有市民的网上自助受理零碎、151个派出所、街道办居住证受理点的现场受理零碎、后盾接口为市网格办、市交警局、市民政局,市交委等多个政府部门提供居住证、寓居注销条件查问和审核。 居住证零碎受攻打瘫痪期间,软件对深圳市居住证零碎查问访问量为每秒 183 次,共计查问信息约 151 万条次,抓取了大量建筑物编码数据,造成政府信息透露;所有居住证办理、寓居注销申报、信息查问、对外服务性能均无奈失常工作,影响面极广,市民无奈办理居住证和寓居注销,相干生产生存秩序受到重大影响。除了此次攻打,还有一些派出所出具证实证实 5 月期间经常出现零碎无奈登陆,录入过程频繁呈现掉线、零碎数据异样等状况。居住证零碎无奈失常应用、出现异常状况的工夫长达一个多月。 供述状况CTO 的局部供述和辩解:我司查问并下载深圳市居住证网上的数据信息没有进行市场交易,没有跟其余公司进行资源置换,也没有通过查问信息行为获利。我不分明这款爬虫软件对深圳市居住证网站及零碎造成的影响、深圳市居住证网站及零碎的承载能力、爬虫软件的具体的启动和部署状况,但我晓得从技术上来讲如果超过服务器承载能力的查问必定会引起零碎卡顿或瘫痪,所以我口头要求留神查问工夫、管制查问频率,我司并无任何歹意去主观进行攻打。 程序员的局部供述和辩解:抓取数据的原程序是谁研发的我不晓得,过后我接到这个工作时,是公司领导把源代码给我后让我批改的。这个程序查问信息的频率我不分明,共查问多少条信息我也不分明,我没有因查问深圳市居住证网站的信息而获利,这是我的工作工作。 裁决状况法院认为,被告人杨杰明、张国栋违反国家规定,对计算机信息零碎性能进行烦扰,造成为 5 万以上用户提供服务的计算机信息零碎不能失常运行累计 1 小时以上,结果特地重大,其行为已形成毁坏计算机信息零碎罪。 ...

August 12, 2022 · 1 min · jiezi

关于python:PythonPyCharm开发环境的调试

断点:程序运行到此处,临时挂起、进行执行。能够按代码执行步骤具体察看程序的运行状况,不便对代码进行进一步判断。 调试:进入调试模式的形式:点击工具栏的调试按钮图标鼠标置于代码编辑区域,右键关上对话框,点击“debug XXX ”快捷键:shift + F9简略阐明:

August 12, 2022 · 1 min · jiezi

关于python:Python异常处理机制和常见异常类型

Python的异样解决机制解决异样的几种代码构造: try...except...else构造如果try代码块内没有抛出异样,执行else代码块,否则执行except代码块。 graph TD A(try) -->|程序产生异样|B(except) A(try) -->|程序没有异样|C(else)try: n1 = int(input('请输出一个整数:')) n2 = int(input('请输出另一个整数:')) result = n1 / n2except BaseException as e: print('代码出错') print(e)else: print('后果为:', result)try...except...else...finally构造如果try代码块内没有抛出异样,执行else代码块,否则执行except代码块。finally代码块无论是否产生异样都会执行,罕用来开释try块中申请的资源。 graph TD A(try) -->|程序产生异样|B(except) A(try) -->|程序没有异样|C(else) B --> D{finally} C -->D{finally}try: n1 = int(input('请输出一个整数:')) n2 = int(input('请输出另一个整数:')) result = n1 / n2except BaseException as e: print('代码出错') print(e)else: print('后果为:', result)finally: print('任何状况都会执行')print('程序完结')运行后果: 请输出一个整数:1请输出另一个整数:4后果为: 0.25任何状况都会执行程序完结traceback模块应用traceback模块打印异样信息 import tracebacktry: print('1.------------------') num = 10/0except: traceback.print_exc()输入后果: Traceback (most recent call last): File "D:\study\python-study\chap8\traceback.py", line 5, in <module>num = 10/0ZeroDivisionError: division by zeroPython中常见的异样类型异样类型简述ZeroDivisionError除(或取模)0(所有数据类型)IndexError序列中找不到该索引KeyError映射中找不到该键NameError未声明/初始化对象(没有属性)SyntaxError语法错误ValueError传入有效的参数

August 12, 2022 · 1 min · jiezi

关于python:ModuleNotFoundError-No-module-named-PIL问题解决

原文链接 Python应用时呈现报错: ModuleNotFoundError No module named 'PIL'该提醒示意短少pillow模块,能够用以下命令装置: pip install pillow如果提醒: Could not install packages due to an EnvironmentError: [Errno 13] Permission denied: '/anaconda3/lib/python3.7/site-packages/Pillow-6.0.0.dist-info' Consider using the --user option or check the permissions.则应用命令: pip install --user pillow实现装置    学习更多编程常识,请关注我的公众号: 代码的路

August 12, 2022 · 1 min · jiezi

关于python:PythonBug

Bug的由来及分类程序呈现谬误,称为Bug。排除程序谬误,称为Debug。 俗话说:一包烟,一壶茶,一个bug调一天Bug的常见类型大意导致的语法错误 SyntaxError: 漏了开端的冒号,如if语句、循环语句等缩进谬误英文符号写错为中文符号字符串拼接数字未定义变量间接应用==和=的混用...知识点不相熟导致的谬误 索引越界append(1,2,3) 一次插入多个报错;办法的应用不纯熟...解决方案:多练习思路不清导致的问题 解决方案: 应用print(),查看输入应用“#”正文局部代码被动掉坑因为用户的输出不合乎规定,导致程序谬误。 解决方案:应用异样解决机制捕捉,而后解决异样,让程序持续运行。try: n1 = int(input('请输出一个整数:')) n2 = int(input('请输出另一个整数:')) result = n1 / n2 print('后果为:', result)except ZeroDivisionError: print('除数不能为0哦!!')except ValueError: print('不能将字符串转为数字')except BaseException as e: print(e)捕捉异样依照先子类后父类的程序,为了防止脱漏可能呈现的异样,能够在最初减少BaseException。

August 11, 2022 · 1 min · jiezi

关于python:Python递归函数

递归函数如果一个函数的函数体内调用了函数自身,这个函数称为递归函数。 递归的根本信息递归函数组成部分: 递归调用递归终止条件递归的调用过程: 每递归调用一次函数,都会在栈内存调配一个栈帧每执行完一次函数,都会开释对应的空间递归的优缺点: 长处毛病思路、代码简略占用内存多、效率低代码示例: 计算数字的阶乘def fac(n): if n == 1: return 1 else: return n*fac(n-1)print(fac(6)) # 720斐波那契数列def fin(n): if n == 1 or n == 2: return 1 else: return fin(n-1) + fin(n-2)print(fin(6)) # 8# 遍历输入斐波那契数列for item in range(1, 7): print(fin(item), end='\t') # 1 1 2 3 5 8

August 11, 2022 · 1 min · jiezi

关于python:Python变量的作用域

变量的作用域程序能拜访该变量的区域,称为变量的作用域。 依据变量的无效范畴划分: 变量类型定义局部变量在函数外部定义并应用的变量,只在函数外部无效;局部变量应用global申明时,在函数调用后会变成全局变量。全局变量函数体外定义的变量,可作用于函数体外。代码示例: def fun(a, b): c = a + b global dd dd = 100 print(a, b, c)print(dd) # NameError: name 'dd' is not definedfun(10, 20)print(dd)# print(a) # NameError: name 'a' is not defined# print(c) # NameError: name 'c' is not defined

August 11, 2022 · 1 min · jiezi

关于python:Python函数

函数执行特定工作以实现特定性能的一段代码 函数的意义代码复用异样实现细节进步可维护性进步可读性、便于调试函数的创立调用创立办法def 函数名 ([入参]): 函数体 [return xxx]调用办法函数名([理论参数])示例def add(a, b): return a + bres = add(10, 20)print(res) # 30函数的参数传递地位实参依据形参的地位进行实参传递,地位对应def add(a, b): # a,b为形参,在函数的定义处 return a + bres = add(10, 20) # 10,20为实参,在函数的调用处print(res) # 30关键字实参依据形参的名称进行实参传递def add(a, b): # a,b为形参,在函数的定义处 return a + bres = add(b=10, a=20) # 10,20为实参,在函数的调用处print(res) # 30函数调用对参数的影响def fun_demo(a, b): print('arg1:', a) # arg1: 11 print('arg2:', b) # arg2: [1, 2, 3] a = 100 b.append(10) print('arg1:', a) # arg1: 100 print('arg2:', b) # arg2: [1, 2, 3, 10]n1 = 11n2 = [1, 2, 3]print('n1:', n1) # n1: 11print('n2:', n2) # n2: [1, 2, 3]fun_demo(n1, n2)print('n1:', n1) # n1: 11print('n2:', n2) # n2: [1, 2, 3, 10]可变对象受函数外部批改操作的影响。不可变对象不受函数体内操作的影响。 ...

August 10, 2022 · 1 min · jiezi

关于python:Python字符串

字符串在Python中是根本数据类型,是不可变的字符序列字符串的驻留机制仅保留一份雷同且不可变字符串的办法,不同的值被寄存在字符串的驻留池中,Python的驻留机制对雷同的字符串只保留一份拷贝,后续创立雷同的字符串时,不会开拓新空间,而且把该字符串的地址赋给新创建的变量。 字符串的驻留机制产生的几种状况:# 1.字符串的长度为0或1s1 = ''s2 = ''print(s1 is s2) # True# 2.合乎标识符的字符串(合乎命名标准:字母、数字、下划线)s1 = 'ab_'s2 = 'ab_'print(s1 is s2) # True# 3.字符串只在编译时驻留,而非运行时a = 'abc'b = 'ab' + 'c'c = ''.join(['ab', 'c'])print(a is b) # Trueprint(a is c) # False# 4.[-5, 256]间接的整数数字a = '-5'b = '-5'print(a is b) # True驻留机制的优缺点:须要值雷同的字符串,能够间接从字符串池拿来应用,防止频繁的创立和销毁,晋升效率、节约内存,因而拼接字符串和批改字符串是比拟影响性能的。在须要进行字符串拼接时倡议应用str类型的join办法,而非“+”,因为join()办法是先计算所有字符的长度,再拷贝,至新建一次对象,效率更高。 字符串的罕用操作查问子串地位# 1.index():子串首次呈现的地位,不存在,抛出# 2.rindex():子串末次呈现的地位,不存在,抛出# 3.find():子串首次呈现的地位,不存在,返回-1# 4.rfind():子串末次呈现的地位,不存在,返回-1s = 'hello hello'print(s.index('h')) # 0# print(s.index('j')) # ValueError: substring not foundprint(s.rindex('h')) # 6print(s.find('h')) # 0print(s.find('j')) # -1print(s.rfind('h')) # 6大小写转换操作# 1.upper: 把所有字符转成大写,产生新的字符串对象# 2.lower: 把所有字符转成小写,产生新的字符串对象# 3.swapcase: 把所有字符小写变大写,大写变小写,产生新的字符串对象# 4.capitalize: 把第一个字符转成大写,其余转小写,产生新的字符串对象# 4.title: 把每一个单词的首字符转成大写,其余转小写,产生新的字符串对象s = 'hello world'print(s.upper()) # HELLO WORLDprint(s.lower()) # hello worldprint(s.swapcase()) # HELLO WORLDprint(s.capitalize()) # Hello worldprint(s.title()) # Hello World字符串内容的对齐操作# 1.center(): 居中对齐,第一个参数指定宽度,第二个参数指定填充符,第二个参数可选,默认空格,设置宽度小于理论宽度则返回原字符串# 2.ljust(): 左对齐,第一个参数指定宽度,第二个参数指定填充符,第二个参数可选,默认空格,设置宽度小于理论宽度则返回原字符串# 3.rjust(): 右对齐,第一个参数指定宽度,第二个参数指定填充符,第二个参数可选,默认空格,设置宽度小于理论宽度则返回原字符串# 4.zfill(): 右对齐,右边用0填充,只有一个参数指定宽度,设置宽度小于理论宽度则返回原字符串s1 = 'hello Python'print(s.center(20))print(s.center(20, '-')) # ----hello world-----print(s.ljust(20, '-')) # hello world---------print(s.rjust(20, '-')) # ---------hello worldprint(s.zfill(20)) # 000000000hello worldprint('-8911'.zfill(8)) # -0008911字符串的劈分操作# 1.split(): 从左开始劈分,默认的劈分字符是空格,返回一个列表;# 通过sep参数指定劈分的字符;参数maxsplit指定最大劈分次数,超出次数后,残余的子串会独自做为一部分# 2.rsplit(): 从右开始劈分,默认的劈分字符是空格,返回一个列表;# 通过sep参数指定劈分的字符;参数maxsplit指定最大劈分次数,超出次数后,残余的子串会独自做为一部分s3 = 'hello my name is Alin's4 = 'hello-my-name-is-Bill'print(s3.split()) # ['hello', 'my', 'name', 'is', 'Alin']print(s4.split(sep='-')) # ['hello', 'my', 'name', 'is', 'Bill']print(s4.split('-', maxsplit=3)) # ['hello', 'my', 'name', 'is-Bill']print(s4.rsplit('-', maxsplit=3)) # ['hello-my', 'name', 'is', 'Bill']print(s3.rsplit()) # ['hello', 'my', 'name', 'is', 'Alin']判断字符串的操作方法# 1.isidentifier(): 判断是否是非法的标识符# 2.isspace(): 判断是否由空白字符组成(回车、换行、制表符)# 3.isalpha(): 判断是否由字母字符组成# 3.isdecimal(): 判断是否由十进制数字组成# 3.isnumeric(): 判断是否由数字组成(包含汉字、罗马数字等)# 3.isalnum(): 判断是否由字母和数字组成s5 = 'hello'print(s5.isidentifier()) # Trueprint(s5.isspace()) # Falseprint(s5.isalpha()) # Trueprint(s5.isdecimal()) # Falseprint(s5.isnumeric()) # Falseprint(s5.isalnum()) # True字符串的替换# replace(): 返回替换后失去的新字符串对象,原字符串不发生变化# 参数1:被替换的子串# 参数2:用来替换的子串# 参数3:最大替换的次数s6 = 'hello 1 1 1'print(s6.replace('1', '2', 2)) # hello 2 2 1字符串的合并# join():将列表或元组中的字符串合并成一个字符串l1 = ['1', 2, '2']l2 = ['1', '2', '3']# print(''.join(l1)) # TypeError: sequence item 1: expected str instance, int foundprint('-'.join(l2)) # 1-2-3字符串的比拟操作# 运算符:>,>=,<,<=,==,!=# 比拟规定:从第一个开始,若相等,持续比拟下一个,顺次比拟,首次不相等时的比拟后果# 为两个字符串的比拟后果,后续的字符将不再进行比拟# 比拟原理:两个字符比拟的是其ordinal value,调用内置函数ord()能够失去字符的ordinal value;# 内置函数chr():指定ordinal value获取对应的字符。print('apple' > 'appml') # Falseprint('apple' > 'app') # Trueprint('apple' > 'b') # Falseprint(ord('l')) # 108print(ord('m')) # 109print(chr(109)) # m==和is的区别?==判断value是否相等,is比拟的是id是否相等字符串的切片操作(与列表相似)# 不可变类型,不反对增删改操作,切片操作将产生新的对象# 语法:[start:end:step]s = 'hello,Python's11 = s[:5]s22 = s[6:]s33 = '!'ns = s11 + s33 + s22print(s11) # helloprint(s22) # Pythonprint(s33) # !print(ns) # hello!Pythonprint(s[-6::]) # Pythonprint(s[6::-1]) # P,olleh格式化字符串# 1.应用%作占位符(%s:字符串;%i或%d:整数;%f:浮点型数)name = 'all'age = 22print('我的名字是%s,往年%d岁' % (name, age)) # 我的名字是all,往年22岁# 2.{}作占位符print('我的名字是{0},往年{1}岁'.format(name, age)) # 我的名字是all,往年22岁# 3.f-stringprint(f'我的名字是{name},往年{age}岁') # 我的名字是all,往年22岁宽度与精度的设置print('%10d' % 99) # 10标识宽度print('%.3f' % 3.1415926) # .3标识小数点后保留位数,输入3.142print('%10.3f' % 3.1415926) # 可同时应用,输入 3.142print('{0:.3}'.format(3.1415926)) # 输入3.14,限度总位数print('{0:.3f}'.format(3.1415926)) # 输入3.142,限度小数点后保留位数print('{0:10.3f}'.format(3.1415926)) # 输入 3.142,限度小数点后保留位数字符串的编码转换# 编码:将字符串转换为二进制数据(bytes)# 解码:将bytes类型的数据转成字符串类型s = '好天气'print(s.encode(encoding='GBK')) # b'\xba\xc3\xcc\xec\xc6\xf8'print(s.encode(encoding='UTF-8')) # b'\xe5\xa5\xbd\xe5\xa4\xa9\xe6\xb0\x94'b = s.encode(encoding='GBK')print(b.decode(encoding='GBK')) # 好天气# print(b.decode(encoding='UTF-8'))# 编码格局不同,报错UnicodeDecodeError: 'utf-8' codec can't decode byte 0xba in position 0: invalid start byte

August 10, 2022 · 2 min · jiezi

关于python:终结-Python-原生字典这个库要逆天改命了

字典是 Python 中根底的数据结构之一,字典的应用,能够说是十分的简略粗犷,但即使是这样一个与世无争的数据结构,依然有很多人 "看不惯它" 。 兴许你并不感觉,但我置信,你看了这篇文章后,肯定会和我一样,对原生字典开始有了偏见。 我举个简略的例子吧 当你想拜访字典中的某个 key 时,你须要应用字典特定的拜访形式,而这种形式须要你键入 一对中括号 还有 一对引号 >>> profile = dict(name="iswbm")>>> profile{'name': 'iswbm'}>>> profile["name"]'iswbm'是不是开始感觉忍气吞声了? 如果能够像调用对象属性一样应用 . 去拜访 key 就好了,能够省去很多多余的键盘击入,就像这样子 >>> profile.name'iswbm'是的,明天这篇文章就是跟大家分享一种能够间接应用 . 拜访和操作字典的一个黑魔法库 -- munch。 1. 装置办法应用如下命令进行装置$ python -m pip install munch 2. 简略示例munch 有一个 Munch 类,它继承自原生字典,应用 isinstance 能够验证 >>> from munch import Munch>>> profile = Munch()>>> isinstance(profile, dict)True>>>并实现了点式赋值与拜访,profile.name 与 profile['name'] 是等价的 >>> profile.name = "iswbm">>> profile.age = 18>>> profileMunch({'name': 'iswbm', 'age': 18})>>>>>> profile.name'iswbm'>>> profile["name"]'iswbm'3. 兼容字典的所有操作自身 Munch 继承自 dict,dict 的操作也同样实用于 Munch 对象,无妨再来验证下首先是:增删改查 ...

August 10, 2022 · 2 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" 笼罩了 第二个:异样解决中的return def 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 将始终是最初执行的语句.第三个:雷同对象的判断 ...

August 10, 2022 · 1 min · jiezi

关于python:使用VScode的几点感受对比PycharmJupyter优劣势

之前始终是PyCharm+Jupyter的组合,能满足简直所有的Python开发需要。最近我开始用vscode,发现很香。 PyCharm适宜做我的项目开发,或者平时写写脚本,算是全能型IDE。但PyCharm体积大,对硬件耗费厉害,不够轻便。 Jupyter是近年流行起来的开发工具,基于IPython,次要利用于数据分析、机器学习。 它本质是一个web利用,让你在浏览器上写python,即写即运行,所以适宜做数据摸索剖析。 尽管Jupyter数据开发模式很不便,但它的开发场景毕竟无限,不适宜脚本编写和我的项目开发,debug等性能也处在改善阶段。 如果要为PyCharm和Jupyter找一个代替IDE,能笼罩两者大部分性能,那可能非vscode莫属了。 vscode是微软主推的轻量级代码编辑器,装置Python插件后能够编译代码。之所以说vscode能代替PyCharm和Jupyter,因为它既能够写Python脚本我的项目,也能够运行Jupyter notebook,还反对各种文档浏览编辑,以及有大量的插件。 所以说vscode 写Python次要有以下五个长处。 1、反对IDE开发 2、反对Jupyter notebook 3、领有Python和Jupyter的各类插件 4、轻量、简略、易上手 5、自定义水平高 当然,vscode也有有余的中央,它加插件有时候会呈现延缓和谬误。而且因为插件过多,须要使用者有很好的技术能力去配置,能力达到PyCharm的性能。 因为PyCharm是业余的python 开发工具,所以开发性能上必定比vscode 更强,但vscode 胜在拓展强。前者像是ios ,后者像是安卓。 最近整顿了几百 G 的 Python 学习材料,蕴含新手入门电子书、教程、源码等等,收费分享给大家!想要的返回 “Python 编程学习圈”,发送 “J” 即可收费取得

August 10, 2022 · 1 min · jiezi

关于python:pip安装时fatal-error-C1083-无法打开包括文件ioh-No-such-file-or-directory

原文链接 报错应用pip装置模块,呈现谬误: c:\users\anaconda3\include\pyconfig.h(68): fatal error C1083: 无奈关上包含文件: “io.h”: No such file or directory error: command 'C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\BIN\x86_amd64\cl.exe' failed with exit status 2Command "C:\Users\Anaconda3\python.exe -u -c "import setuptools, tokenize;__file__='C:\Users\AppData\Local\Temp\pip-build-4u1qzucg\lmdb\setup.py';exec(compile(getattr(tokenize, 'open', open)(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))" install --record C:\Users\AppData\Local\Temp\pip-bcivjbyw-record\install-record.txt --single-version-externally-managed --compile" failed with error code 1 inC:\Users\AppData\Local\Temp\pip-build-4u1qzucg\lmdb\ 起因:无奈找到io.h文件。 解决办法首先装置Windows 10 SDK SDK下载地址:https://developer.microsoft.c... 默认装置即可。 而后配置门路:右键我的电脑——属性——高级零碎设置——环境变量——零碎变量(s),在PATH中增加: C:\Program Files (x86)\Windows Kits\10\Include\<version>\ucrt即可解决该问题。    学习更多编程常识,请关注我的公众号: 代码的路

August 10, 2022 · 1 min · jiezi

关于python:数据专家最常使用的-10-大类-Pandas-函数-⛵

作者:韩信子@ShowMeAI 数据分析实战系列:http://www.showmeai.tech/tutorials/40 本文地址:http://www.showmeai.tech/article-detail/304 申明:版权所有,转载请分割平台与作者并注明出处 珍藏ShowMeAI查看更多精彩内容Python具备极其沉闷的社区和笼罩全畛域的第三方库工具库,近年来始终位居编程语言热度头部地位,而数据迷信畛域最受欢迎的python工具库之一是 Pandas。随着这么多年来的社区高速倒退和海量的开源贡献者,使得 pandas 简直能够胜任任何数据处理工作。 Pandas的性能与函数极其丰富,要齐全记住和把握是不事实的(也没有必要),资深数据分析师和数据科学家最常应用的大略有二三十个函数。在本篇内容中,ShowMeAI 把这些性能函数总结为10类。熟练掌握它们,你就能够轻松解决80% 以上的数据处理问题。 也举荐大家浏览ShowMeAI针对数据分析编写的教程和速查表,疾速成为数据洞察高手! 图解数据分析:从入门到精通系列教程数据迷信工具库速查表 | Pandas 速查表 1.读取数据咱们常常要从内部源读取数据,基于不同的源数据格式,咱们能够应用对应的 read_*性能: read_csv:咱们读取CSV格局数据时应用它。这个函数的应用留神点包含 header(是否有表头以及哪一行是表头), sep(分隔符),和 usecols(要应用的列/字段的子集)。read_excel:读取Excel格式文件时应用它。这个函数的应用留神点包含 sheet_name(哪个表)和题目。read_pickle:读取pickle格局存储的文件时应用,这个格局的劣势是比 CSV 和 Excel快很多。read_sas: 我常常应用这个性能,因为我已经应用 SAS 来解决数据。 2.写入数据解决完数据后,咱们可能会把解决后的DataFrame保留下来,最罕用的文件写入函数如下: to_csv: 写入 CSV 文件。 留神:它不保留某些数据类型(例如日期)。 很多状况下咱们会将参数索引设置为False,这样就不必额定的列来显示数据文件中的索引。to_excel: 写入 Excel 文件。to_pickle:写入pickle文件。这是倡议的写入格局,读写的速度都十分快。 3.数据概览将数据成 DataFrame 格局后,咱们最好对数据有一个初步的理解,以下是最罕用到的几个数据概览函数,能提供数据的根本信息。 head:返回前几行,通常用于检查数据是否正确读取,以及理解数据字段和状态等根本信息。tail:查看最初几行。在解决大文件时,读取可能不残缺,能够通过它查看是否残缺读取数据。info:数据集的总体摘要:包含列的数据类型和内存应用状况等信息。describe:提供数据集的描述性摘要(比方间断值的统计信息、类别型字段的频次信息等)。shape: 行数和列数(留神,这是Dataframe的属性,而非函数)。 4.数据排序咱们常常须要对数据进行排序,Dataframe有一个重要的排序函数。 sort_values:通过指定列名对数据进行排序,能够调整升序或者降序规定。 5.解决反复咱们手上的数据集很可能存在重复记录,某些数据意外两次输出到数据源中,荡涤数据时删除反复项很重要。 以下函数很罕用: duplicated: 辨认DataFrame中是否有反复,能够指定应用哪些列来标识反复项。drop_duplicates:从 DataFrame 中删除反复项。个别倡议大家先应用 duplicated查看反复项,确定业务上须要删除反复项,再应用这个函数。 6.解决缺失值事实数据集中根本都会存在缺失值的状况,上面这些函数常被用作检查和解决缺失值。 isnull:查看您的 DataFrame 是否缺失。dropna: 对数据做删除解决。留神它有很重要的参数how(如何确定察看是否被抛弃)和 thred(int类型,保留缺失值的数量)。fillna: 用指定的办法填充缺失值,例如向前填充 ( ffill)。 ...

August 9, 2022 · 1 min · jiezi

关于python:掌握这9个单行代码技巧你也能写出『高端』Python代码-⛵

作者:韩信子@ShowMeAI Python3◉技能晋升系列:https://www.showmeai.tech/tutorials/56 本文地址:https://www.showmeai.tech/article-detail/303 申明:版权所有,转载请分割平台与作者并注明出处 珍藏ShowMeAI查看更多精彩内容Python 是一个简略易上手可读性强且功能强大的编程语言,它有一些独特的技巧和写法,能够在不影响可读性的状况下大大缩短咱们的 Python 代码,让它看起来更加紧凑和高级。 在本篇内容中ShowMeAI 给大家总结最罕用的『单行代码(one-liner )』技巧,让你的代码加分更加『高级』! 举荐入门的小伙伴浏览ShowMeAI的 图解Python编程:从入门到精通系列教程 系列教程,学习全套 Python 常识! 以下所有的代码都能够在 在线 Python 编译器 中运行,快试起来! 1.单行 if - else 语句if-else 语句是咱们在 Python 中学习的根底逻辑判断语法之一。 咱们通常会以分支的模式来书写这个语句,但 Python 其实能反对 if 和 else 语句在同一行,简略快捷实现判断。 如下为代码示例: age = 18valid = "你是成年人"invalid = "你是未成年人"# 单行代码print(valid) if age >= 18 else print(invalid) 2.列表推导式列表推导式是 Python 独有且十分弱小的语法,它提供了一种简短的语法来依据现有列表的值创立列表。 相比函数和循环更紧凑,甚至还能够退出条件判断。 列表推导式的根本语法如下: [expression for item in list]以下是一个代码利用示例: countries = ['united states', 'brazil', 'united kingdom', 'japan']# 带条件判断的列表推导式capitalized = [country.title() for country in countries if country.startswith('u')]print(capitalized)['United States', 'United Kingdom'] ...

August 9, 2022 · 2 min · jiezi

关于python:羡慕-Excel-的高级选择与文本框颜色呈现Pandas-也可以拥有-⛵

作者:韩信子@ShowMeAI 数据分析◉技能晋升系列:https://www.showmeai.tech/tutorials/33 数据分析实战系列:https://www.showmeai.tech/tutorials/40 本文地址:https://www.showmeai.tech/article-detail/293 申明:版权所有,转载请分割平台与作者并注明出处 珍藏ShowMeAI查看更多精彩内容用过 Excel 的数据分析师,对 Excel 的『条件抉择』与『格局出现』性能大都印象粗浅。下方动图演示了 Excel『数据抉择&底色填充高亮』性能。如果咱们须要『抉择大于100的所有产品取值并对单元格填充红色』,间接如下图所示,在『条件格局』中抉择『突出显示单元格规定』即可进行设置。 习惯用 Python 进行数据分析开掘的咱们,是否能够实现雷同的高级显示呢?答案是,能够的!! 在本文中 ShowMeAI 将带大家在 Pandas Dataframe 中实现多条件数据抉择及各种出现款式的设置。 案例&背景咱们从一个电商销售的案例背景讲起,下图的数据透视表(pandas pivot table)显示了 2016 年至 2022 年不同产品的总销售额。数据能够在ShowMeAI的百度网盘获取,数据读取与解决代码如下: 实战数据集下载(百度网盘):公众号『ShowMeAI钻研核心』回复『实战』,或者点击 这里 获取本文 [[6] Pandas 应用 Styler API 设置多条件数据抉择&丰盛的出现款式](https://www.showmeai.tech/art...) 『conditional formatting in pandas 数据集』 ⭐ ShowMeAI官网GitHub:https://github.com/ShowMeAI-Hub import pandas as pddata = pd.read_excel('data.xlsx')df_pivoted = pd.pivot_table(data, index='Year') 你能找出 2016 年最滞销的产品吗? 你可能很快能找到答案 Product_B,总销售额为 169,但咱们仅通过透视表去定位后果十分不不便。Pandas 能够很便捷地用条件语句去找到后果,但在原表对应还是不容易。 如果咱们为每年最滞销的产品上色呢,如下图所示用底色突出显示之后,答复下面的问题是不是容易多了? 接下来演示在 Pandas 中实现这个操作的具体步骤! ...

August 9, 2022 · 1 min · jiezi

关于python:Python元组与集合

元组Python内置的数据结构之一,不可变序列不可变序列:字符串、元组(没有增删改的操作)可变序列:列表、字典(对序列执行增删改操作,对象地址不产生更改)创立形式# 1.应用()t = ('12', 'mi', '123')t1 = '12', 'mi', '123' # 能够省略()# 2.应用内置函数tuplet2 = tuple(('12', 'mi', '123'))print(t2, type(t2)) # ('12', 'mi', '123') <class 'tuple'># 3.元组中只有一个元素时,须要加,.否则类型会为元素的类型t3 = (1,)# 空元组t4 = ()t5 = tuple()为什么将元组设计为不可变序列?多任务执行中,同时操作对象时不须要加锁,因而在程序中尽量应用不可变序列 注意事项:元组中存储的是对象的援用 a.如果元组中元素自身是不可变对象,则不能再援用其余对象,即不可批改 b.如果元组中的对象是可变对象,则可变对象的援用不容许扭转,但数据可扭转 元组的遍历# 获取元组的元素,能够应用索引t6 = ('12', 'mi', '123')print(t6[1]) # mi# 遍历for item in t6: print(item)汇合Python内置的数据结构之一,可变序列,是没有value的字典汇合中的元素是无序的,不容许反复元素,会主动删除反复元素创立办法# 1.应用{}s = {'12', 'mi', '123', '5', '5'}print(s) # {'12', 'mi', '123', '5'},不容许反复,会主动删除反复元素# 2.内置函数set()s1 = set(range(6))s2 = set([1, 2, 3]) # 列表转汇合s3 = set((1, 2, 3)) # 元组转汇合s4 = set('hello')s5 = set({'12', 'mi', '123', '5', '5'})# 空集合s7 = set()汇合的罕用操作in/not in 判断元素是否存在于汇合中# in/not in 判断元素是否存在于汇合中s8 = {'12', 'mi', '123', '5', '5'}print(10 in s8) # Falseprint(10 not in s8) # True新增操作# 单次新增一个s8.add(80)print(s8) # {'12', 'mi', '5', '123', 80}# 单次新增多个元素s8.update({1, 2, 3})print(s8) # {1, 2, 3, '123', 80, '12', 'mi', '5'}删除操作# 单次删除一个指定元素s8.remove(1) # 指定元素不存在时,报错keyErrorprint(s8) # {'12', 2, 3, 80, '123', 'mi', '5'}s8.discard('12') # 指定元素不存在时,不会报错print(s8) # {'123', 2, 3, 80, '5', 'mi'}# 删除随机一个s8.pop()print(s8) # {3, '123', 'mi', 80, '5'}# 清空集合s8.clear()print(s8) # set()汇合间的关系# 两个汇合的元素雷同即相等ss2 = {20, 10, 30, 40}ss1 = {10, 20, 30, 40}print(ss1 == ss2) # True# 一个汇合是否为另一个汇合的子集ss1 = {10, 20, 30, 40}ss2 = {20, 10, 30, 40, 50, 60}ss3 = {10, 20, 90}ss4 = {100, 200}print(ss3.issubset(ss2)) # Falseprint(ss1.issubset(ss2)) # True# 一个汇合是否是另一个汇合的超集print(ss2.issuperset(ss1)) # Trueprint(ss2.issuperset(ss3)) # False# 两个汇合是否有交加print(ss3.isdisjoint(ss2)) # False (有交加)print(ss4.isdisjoint(ss2)) # True (无交加)汇合的数据操作(数学操作)# 交加操作:不影响原汇合s11 = {10, 20, 30, 40}s22 = {30, 40, 50, 60}print(s11.intersection(s22)) # {40, 30}print(s11 & s22) # 代替符号# 并集操作:不影响原汇合print(s11.union(s22)) # {40, 10, 50, 20, 60, 30}print(s11 | s22) # 代替符号# 差集操作:不影响原汇合print(s11.difference(s22)) # {10, 20}print(s11 - s22) # 代替符号# 对称差集:不影响原汇合print(s11.symmetric_difference(s22)) # {10, 50, 20, 60}print(s11 ^ s22) # 代替符号汇合生成式语法:{i * i for i in range(1, 10)},与列表生成式相似sss = {i * i for i in range(1, 10)}print(sss) # {64, 1, 4, 36, 9, 16, 49, 81, 25}

August 9, 2022 · 2 min · jiezi

关于python:Python字典学习记录

字典Python内置的数据结构之一,与列表一样是一个可变序列# 以键值对形式存储数据,无序序列students = { 'a': 100, 'b': 90, 'c': 75}students: 字典名;冒号前为键key,后为值value。依据key查找value地位,通过hash(key)计算;hash(key)为不可变序列(不反对增删改,如字符串和数字)字典的特点所有元素都是键值对,key不可反复,value无限度字典中元素是无序的key必须是不可变对象(如字符串、数字)可动静的伸缩节约较大的内存,查问速度快,应用空间换工夫的数据结构创立形式# 1.应用{}s = {'1': 1, '2': 2, '3': 3}# 2.应用内置函数x = dict(name='1', age=22)# 空字典y = {}字典的罕用操作# 1.获取字典中的元素,应用[]/get()print(s['1']) # 1# print(s['11']) # key不存在时,抛出KeyError: '11'print(s.get('2')) # 2print(s.get('22')) # key不存在时,输入Noneprint(s.get('22', 222)) # key不存在时,222为提供的默认值,后果输入222# 2.判断key是否存在在字典中,in/not inx1 = dict(name='1', age=22)print('name' in x1) # Trueprint('name' not in x1) # False# 3.删除字典中指定的键值对del x1['name']# 4.清空字典x1.clear()# 5.减少键值对x1['333'] = 222print(x1) # {'333': 222}# 6.批改键值对x1['333'] = 333print(x1) # {'333': 333}字典的视图操作# 1.keys(): 获取字典所有的keys1 = {'1': 1, '2': 2, '3': 3}print(s1.keys()) # dict_keys(['1', '2', '3'])print(list(s1.keys())) # ['1', '2', '3'];将key的视图转成列表# 2.values(): 获取字典所有的valuesprint(s1.values()) # dict_values([1, 2, 3])print(list(s1.values())) # [1, 2, 3];将values的视图转成列表# 3.items(): 获取字典所有的键值对print(s1.items()) # dict_items([('1', 1), ('2', 2), ('3', 3)])print(list(s1.items())) # [('1', 1), ('2', 2), ('3', 3)];将items的视图转成列表,由元组组成字典元素的遍历s2 = {'one': 1, 'two': 2, 'three': 3}for item in s2: print(item)字典生成式应用内置函数zip(): 将对象中对应的元素打包成一个元组,返回由这些元组组成的列表a = ['张三', '李四', '王五']b = [21, 22, 23]print(list(zip(a, b))) # [('张三', 21), ('李四', 22), ('王五', 23)]# 语法: {key.upper():value for key,value in zip(keys, values)}print({key.upper(): value for key, value in zip(a, b)}) # {'张三': 21, '李四': 22, '王五': 23}

August 9, 2022 · 1 min · jiezi

关于python:Python模拟人手操作微信调用Win32Api控制微信Python给微信发消息加好友获取聊天记录

需要始终以来,都有很多人通过各种方法去实现微信机器人,或者是管制微信电脑版去实现微信的API,例如Hook微信、iPad协定、web微信协定、Android微信协定、以及基于浏览器的puppet,办法很多,然而各种办法都有各自的一些毛病。 本文应用的办法是通过Python去调用Windows API实现模仿人工操作的形式去实现管制微信电脑版,这也是一种不错的方法,然而也有一些不确定因素及稳定性。 代码本文所波及到的模块会比拟多,其中PIL是用于图片辨认来实现一些读取聊天记录的性能,win32clipboard次要实现是模仿输出,win32api、win32con、win32gui、pyautogui就是外围的库,次要用于调用API去模仿人手操作微信电脑版。 import pyautoguiimport timeimport win32apiimport win32conimport win32guiimport win32clipboard as wfrom PIL import ImageGrabimport requestsimport base64winwxpy.py import pyautoguiimport timeimport win32apiimport win32conimport win32guiimport win32clipboard as wfrom PIL import ImageGrabimport requestsimport base64def FindWindow(chatroom): win = win32gui.FindWindow('WeChatMainWndForPC',chatroom) print("找到窗口句柄:%x" % win) if win != 0: win32gui.ShowWindow(win, win32con.SW_SHOWMINIMIZED) win32gui.ShowWindow(win, win32con.SW_SHOWNORMAL) win32gui.ShowWindow(win, win32con.SW_SHOW) win32gui.SetWindowPos(win, win32con.HWND_TOP, 0, 0, 500, 700, win32con.SWP_SHOWWINDOW) win32gui.SetForegroundWindow(win) # 获取管制 time.sleep(1) tit = win32gui.GetWindowText(win) print('已启动【'+str(tit)+'】窗口') else: print('找不到【%s】窗口' % chatroom) exit()# 设置和粘贴剪贴板def ClipboardText(ClipboardText): w.OpenClipboard() w.EmptyClipboard() w.SetClipboardData(win32con.CF_UNICODETEXT, ClipboardText) w.CloseClipboard() time.sleep(1) win32api.keybd_event(17,0,0,0) win32api.keybd_event(86,0,0,0) win32api.keybd_event(86,0,win32con.KEYEVENTF_KEYUP,0) win32api.keybd_event(17,0,win32con.KEYEVENTF_KEYUP,0)# 模仿发送动作def SendMsg(): win32api.keybd_event(18, 0, 0, 0) win32api.keybd_event(83,0,0,0) win32api.keybd_event(18,0,win32con.KEYEVENTF_KEYUP,0) win32api.keybd_event(83,0,win32con.KEYEVENTF_KEYUP,0)# 模仿发送微信文本音讯def SendWxMsg(wxid,sendtext): # 先启动微信 FindWindow('微信') time.sleep(1) # 定位到搜寻框 pyautogui.moveTo(143, 39) pyautogui.click() # 搜寻微信 ClipboardText(wxid) time.sleep(1) # 进入聊天窗口 pyautogui.moveTo(155, 120) pyautogui.click() # 粘贴文本内容 ClipboardText(sendtext) # 发送 SendMsg() print('已发送') # 敞开微信窗口 time.sleep(1) pyautogui.moveTo(683, 16) pyautogui.click()# 模仿发送文件音讯(图片、文档、压缩包等)def SendWxFileMsg(wxid,imgpath): # 先启动微信 FindWindow('微信') time.sleep(1) # 定位到搜寻框 pyautogui.moveTo(143, 39) pyautogui.click() # 搜寻微信 ClipboardText(wxid) time.sleep(1) # 进入聊天窗口 pyautogui.moveTo(155, 120) pyautogui.click() # 抉择文件 pyautogui.moveTo(373, 570) pyautogui.click() ClipboardText(imgpath) time.sleep(1) pyautogui.moveTo(784, 509) pyautogui.click() # 发送 SendMsg() print('已发送') # 敞开微信窗口 time.sleep(1) pyautogui.moveTo(683, 16) pyautogui.click()# 转发群里最新的一条音讯def ZhuanfaMsg(wxid,groupname): # 先启动微信 FindWindow('微信') time.sleep(1) # 定位到搜寻框 pyautogui.moveTo(143, 39) pyautogui.click() # 搜寻群 ClipboardText(groupname) time.sleep(1) # 进入群窗口 pyautogui.moveTo(155, 120) pyautogui.click() # 开始转发 pyautogui.moveTo(484, 439) time.sleep(1) pyautogui.rightClick() pyautogui.moveTo(543, 454) time.sleep(1) pyautogui.click() # 搜寻用户 ClipboardText(wxid) time.sleep(1) pyautogui.moveTo(828, 406) pyautogui.click() time.sleep(1) # 确定转发 pyautogui.moveTo(1108, 755) pyautogui.click()# 获取你的个人信息(昵称、微信号)def GetYourInfo(): # 先启动微信 FindWindow('微信') time.sleep(1) # 点击你的头像 pyautogui.moveTo(28, 56) pyautogui.click() time.sleep(1) # 用户信息截图 userinfo = (20, 60, 319, 284) userinfo_img = ImageGrab.grab(userinfo) userinfo_img.save('userinfo.png') # 辨认用户信息截图 request_url = "https://aip.baidubce.com/rest/2.0/ocr/v1/accurate_basic" f = open('userinfo.png', 'rb') img = base64.b64encode(f.read()) params = {"image":img} access_token = '24.21008e8b243c5b2864a7cf0583d907e1.2592000.1661322017.282335-24796078' request_url = request_url + "?access_token=" + access_token headers = {'content-type': 'application/x-www-form-urlencoded'} response = requests.post(request_url, data=params, headers=headers) if response: print (response.json()) time.sleep(1) # 敞开微信窗口 time.sleep(1) pyautogui.moveTo(683, 16) pyautogui.click()# 获取好友微信的个人信息(昵称、微信号)def GetFriendInfo(wxid): # 先启动微信 FindWindow('微信') time.sleep(1) # 定位到搜寻框 pyautogui.moveTo(143, 39) pyautogui.click() # 搜寻微信 ClipboardText(wxid) time.sleep(1) # 进入聊天窗口 pyautogui.moveTo(160, 93) pyautogui.click() time.sleep(1) # 点击右上角··· pyautogui.moveTo(678, 43) pyautogui.click() time.sleep(1) pyautogui.moveTo(801, 51) pyautogui.click() # 用户信息截图 userinfo = (802, 54, 1085, 331) userinfo_img = ImageGrab.grab(userinfo) userinfo_img.save('userinfo.png') # 辨认用户信息截图 request_url = "https://aip.baidubce.com/rest/2.0/ocr/v1/accurate_basic" f = open('userinfo.png', 'rb') img = base64.b64encode(f.read()) params = {"image":img} access_token = '24.21008e8b243c5b2864a7cf0583d907e1.2592000.1661322017.282335-24796078' request_url = request_url + "?access_token=" + access_token headers = {'content-type': 'application/x-www-form-urlencoded'} response = requests.post(request_url, data=params, headers=headers) if response: print (response.json()) time.sleep(1) # 敞开微信窗口 time.sleep(1) pyautogui.moveTo(683, 16) pyautogui.click() pyautogui.click()# 获取群人数def GetCharRoomUserNum(groupname): # 先启动微信 FindWindow('微信') time.sleep(1) # 定位到搜寻框 pyautogui.moveTo(143, 39) pyautogui.click() # 搜寻群 ClipboardText(groupname) time.sleep(1) # 进入群窗口 pyautogui.moveTo(155, 120) pyautogui.click() # 群人数区域截图 userinfo = (310, 0, 659, 47) userinfo_img = ImageGrab.grab(userinfo) userinfo_img.save('chatroom.png') # 辨认群人数截图 # 开发文档:https://cloud.baidu.com/doc/OCR/s/Ck3h7y2ia request_url = "https://aip.baidubce.com/rest/2.0/ocr/v1/accurate_basic" f = open('chatroom.png', 'rb') img = base64.b64encode(f.read()) params = {"image":img} access_token = '24.21008e8b243c5b2864a7cf0583d907e1.2592000.1661322017.282335-24796078' request_url = request_url + "?access_token=" + access_token headers = {'content-type': 'application/x-www-form-urlencoded'} response = requests.post(request_url, data=params, headers=headers) if response: print (response.json()) time.sleep(1) # 敞开微信窗口 time.sleep(1) pyautogui.moveTo(683, 16) pyautogui.click()# 公布群布告def AddGorupNotice(groupname,NoticeText): # 先启动微信 FindWindow('微信') time.sleep(1) # 定位到搜寻框 pyautogui.moveTo(143, 39) pyautogui.click() # 搜寻群 ClipboardText(groupname) time.sleep(1) # 进入群窗口 pyautogui.moveTo(155, 120) pyautogui.click() # 定位到群名称 pyautogui.moveTo(363, 33) pyautogui.click() # 定位到群布告 time.sleep(1) pyautogui.moveTo(731, 509) pyautogui.click() # 粘贴群布告内容 ClipboardText(NoticeText) # 确认公布群布告 time.sleep(1) pyautogui.moveTo(288, 500) pyautogui.click() pyautogui.moveTo(312, 297) pyautogui.click()# 邀请好友进群def ReqFriendsToGroup(groupname,wxid): # 先启动微信 FindWindow('微信') time.sleep(1) # 定位到搜寻框 pyautogui.moveTo(143, 39) pyautogui.click() # 搜寻群 ClipboardText(groupname) time.sleep(1) # 进入群窗口 pyautogui.moveTo(155, 120) pyautogui.click() # 定位到群名称 pyautogui.moveTo(363, 33) pyautogui.click() # 定位到邀请 time.sleep(1) pyautogui.moveTo(852, 300) pyautogui.click() # 搜寻好友 ClipboardText(wxid) # 收回邀请 time.sleep(1) pyautogui.moveTo(232, 197) pyautogui.click() time.sleep(1) pyautogui.moveTo(493, 561) pyautogui.click() time.sleep(1) pyautogui.moveTo(395, 427) pyautogui.click()# 获取好友最新的聊天记录def GetChatRecord(wxid): # 先启动微信 FindWindow('微信') time.sleep(1) # 搜寻微信号 pyautogui.moveTo(166, 38) pyautogui.click() ClipboardText(wxid) time.sleep(1) pyautogui.moveTo(197, 123) pyautogui.click() # 聊天内容区域截图 userinfo = (314, 68, 683, 549) userinfo_img = ImageGrab.grab(userinfo) userinfo_img.save('chatrecord.png') # 辨认以后聊天窗口截图 # 开发文档:https://cloud.baidu.com/doc/OCR/s/Ck3h7y2ia request_url = "https://aip.baidubce.com/rest/2.0/ocr/v1/accurate_basic" f = open('chatrecord.png', 'rb') img = base64.b64encode(f.read()) params = {"image":img} access_token = '24.21008e8b243c5b2864a7cf0583d907e1.2592000.1661322017.282335-24796078' request_url = request_url + "?access_token=" + access_token headers = {'content-type': 'application/x-www-form-urlencoded'} response = requests.post(request_url, data=params, headers=headers) if response: print (response.json())# 置顶群或好友def SetTop(groupname_wxid): # 先启动微信 FindWindow('微信') time.sleep(1) # 定位到搜寻框 pyautogui.moveTo(143, 39) pyautogui.click() # 搜寻群或好友 ClipboardText(groupname_wxid) time.sleep(1) # 进入窗口 pyautogui.moveTo(155, 120) pyautogui.click() # 关上设置 pyautogui.moveTo(684, 38) pyautogui.click() time.sleep(1) # 置顶 pyautogui.moveTo(914, 227) pyautogui.click() time.sleep(1) pyautogui.moveTo(682, 18) pyautogui.click() print('已将'+str(groupname_wxid)+'置顶')# 增加微信def AddWx(wxid): # 先启动微信 FindWindow('微信') time.sleep(1) # 定位到增加微信地位 pyautogui.moveTo(25, 151) pyautogui.click() time.sleep(1) pyautogui.moveTo(278, 39) pyautogui.click() time.sleep(1) pyautogui.moveTo(153, 39) pyautogui.click() time.sleep(1) # 搜寻微信号 ClipboardText(wxid) time.sleep(1) pyautogui.moveTo(183, 91) pyautogui.click() time.sleep(2) # 对搜寻微信号后果进行截图 userinfo = (306, 68, 565, 240) userinfo_img = ImageGrab.grab(userinfo) userinfo_img.save('addwx.png') # 对搜寻微信号后果进行辨认 # 开发文档:https://cloud.baidu.com/doc/OCR/s/Ck3h7y2ia request_url = "https://aip.baidubce.com/rest/2.0/ocr/v1/accurate_basic" f = open('addwx.png', 'rb') img = base64.b64encode(f.read()) params = {"image":img} access_token = '24.21008e8b243c5b2864a7cf0583d907e1.2592000.1661322017.282335-24796078' request_url = request_url + "?access_token=" + access_token headers = {'content-type': 'application/x-www-form-urlencoded'} response = requests.post(request_url, data=params, headers=headers) if response: print (response.json()) # 增加 time.sleep(1) pyautogui.moveTo(435, 203) pyautogui.click() time.sleep(1) pyautogui.moveTo(300, 621) pyautogui.click() time.sleep(1) pyautogui.moveTo(278, 37) pyautogui.click() print('已向'+str(wxid)+'发送增加好友申请') pyautogui.moveTo(682, 18) pyautogui.click()# 发送文本音讯(微信号或微信昵称或备注,须要发送的文本音讯)# SendWxMsg('微信号','Python发送微信音讯')# 发送文件音讯(图片、文档、压缩包等)# SendWxFileMsg('微信号',r"文件门路")# 转发群里最新的一条音讯(微信号或微信昵称或备注,群名称)# ZhuanfaMsg('微信号','群名称')# 获取你的个人信息(昵称、微信号)# GetYourInfo('微信号')# 获取好友微信的个人信息(昵称、微信号)# GetFriendInfo('微信号')# 获取微信群人数# GetCharRoomUserNum('群名称')# 公布群布告# AddGorupNotice('群名称','Python公布群布告')# 邀请好友进群# ReqFriendsToGroup('群名称','cbzqx88')# 获取好友最新的聊天记录# GetChatRecord('微信号')# 置顶群或好友# SetTop('微信号')# 增加微信# AddWx('微信号')运行以上的winwxpy.py曾经将罕用的一些操作写成了函数,只须要调用对应的函数,传入微信号、内容、群名称等参数进去即可调用其中的性能,目前已实现的性能如下: ...

August 9, 2022 · 4 min · jiezi

关于python:手把手教你搭建一个-Python-连接数据库快速取数工具

在数据生产利用部门,取数剖析是一个很常见的需要,实际上业务人员需要时刻变动,最高效的形式是让业务部门本人来取,缩小不必要的重复劳动,个别状况下,业务部门数据库表构造个别是固定的,依据理论业务将取数需要做成sql 脚本,疾速实现数据获取---授人以渔的形式,提供平台或工具 那如何实现一个自助取数查问工具? 基于底层数据来开发不难,无非是将用户输出变量作为筛选条件,将参数映射到 sql 语句,并生成一个 sql 语句而后再去数据库执行 最初再利用 QT 开发一个 GUI 界面,用户界面的点击和筛选条件,信号触发对应按钮与绑定的传参槽函数执行 具体思路: 一、数据库连贯类 此处利用 pandas 读写操作 oracle 数据库 二、主函数模块 1)输出参数模块,内部输出条件参数,建设数据库关键字段映射 --注:读取内部 txt 文件,将筛选字段可能须要进行键值对转换 2)sql 语句汇合模块,将待执行的业务 sql 语句对立寄存到这里 3)数据处理函数工厂 4)应用多线程提取数据 一、数据库连贯类 cx_Oracle 是一个 Python 扩大模块,相当于 python 的 Oracle 数据库的驱动,通过应用所有数据库拜访模块通用的数据库 API 来实现 Oracle 数据库的查问和更新 Pandas 是基于 NumPy 开发,为了解决数据分析工作的模块,Pandas 引入了大量库和一些规范的数据模型,提供了高效地操作大型数据集所需的办法类和函数 pandas 调用数据库次要有 read_sql_table,read_sql_query,read_sql 三种形式 本文次要介绍一下 Pandas 中 read_sql_query 办法的应用 1:pd.read_sql_query()读取自定义数据,返还DataFrame格局,通过SQL查问脚本包含增删改查。pd.read_sql_query(sql, con, index_col=None,coerce_float=True, params=None, parse_dates=None,chunksize=None)sql:要执行的sql脚本,文本类型con:数据库连贯index_col:抉择返回后果集索引的列,文本/文本列表coerce_float:十分有用,将数字模式的字符串间接以float型读入parse_dates:将某一列日期型字符串转换为datetime型数据,与pd.to_datetime函数性能相似。params:向sql脚本中传入的参数,官网类型有列表,元组和字典。用于传递参数的语法是数据库驱动程序相干的。chunksize:如果提供了一个整数值,那么就会返回一个generator,每次输入的行数就是提供的值的大小read_sql_query()中能够承受SQL语句,DELETE,INSERT INTO、UPDATE操作没有返回值(然而会在数据库中执行),程序会抛出SourceCodeCloseError,并终止程序。SELECT会返回后果。如果想持续运行,能够try捕获此异样。 2:pd.read_sql_table()读取数据库中的表,返还DataFrame格局(通过表名)import pandas as pdpd.read_sql_table(table_name, con, schema=None,index_col=None, coerce_float=True, parse_dates=None, columns=None,chunksize=None) 3:pd.read_sql()读数据库通过SQL脚本或者表名import pandas as pdpd.read_sql(sql, con, index_col=None,coerce_float=True, params=None, parse_dates=None, columns=None, chunksize=None)以下创立连贯 oracel 数据库的连贯类 Oracle_DB ...

August 9, 2022 · 3 min · jiezi

关于python:Python-终结者-装饰器也叫-Decorator

对于Python学习者,一旦过了入门阶段,你简直肯定会用到Python的装璜器。 它常常应用在很多中央,比方Web开发,日志解决,性能收集,权限管制等。 还有一个极其重要的中央,那就是面试的时候。对,装璜器是面试中最常见的问题之一! 实战入门抛出问题看这段代码: def step1(): print('step1.......')def step2(): print('step2......')def step3(): print('step3......')step1()step2()step3()代码中定义了3个函数,而后别离调用这3个函数。假如,咱们发现代码运行很慢,咱们想晓得每个函数运行别离花了多少工夫。 笨办法解决咱们能够在每个函数中增加计时的代码: 第一行记录开始工夫执行完业务逻辑记录完结工夫完结工夫减去开始工夫,算出函数执行用时上面的例子只在step1中增加了相干代码作为示例,你能够自行给step2和step3增加相干代码。 import timedef step1(): start = time.time() print('step1.......') end = time.time() used = end - start print(used)def step2(): print('step2......')def step3(): print('step3......')step1()step2()step3()这个办法可行!但用你的脚指头想想也会感觉,这个办法很繁琐,很蠢笨,很危险! 这里只有3个函数,如果有30个函数,那不是要死人啦。万一批改的时候不小心,把原来的函数给改坏了,体面都丢光了,就要被人BS了! 肯定有一个更好的解决办法! 用装璜器解决更好的解决办法是应用装璜器。 装璜器并没有什么浅近的语法,它就是一个实现了给现有函数增加装璜性能的函数,仅此而已! import timedef timer(func): '''统计函数运行工夫的装璜器''' def wrapper(): start = time.time() func() end = time.time() used = end - start print(f'{func.__name__} used {used}') return wrapperdef step1(): print('step1.......')def step2(): print('step2......')def step3(): print('step3......')timed_step1 = timer(step1)timed_step2 = timer(step2)timed_step3 = timer(step3)timed_step1()timed_step2()timed_step3()下面的timer函数就是个装璜器。 ...

August 9, 2022 · 3 min · jiezi

关于python:Python中更好用的函数运算缓存

函数运算缓存,顾名思义就是咱们能够针对指定的函数,让其记住过往参数输出和返回后果,使得后续接管到雷同的参数时跳过函数运算,间接返回已缓存的后果值。 很多敌人应该晓得Python规范库里functools.lru_cache能够做函数运算缓存,然而它的性能切实是太简陋了,像过期工夫设置之类的性能都没有。 而咱们能够应用第三方库cachier来代替,它的根本应用形式非常简单,应用pip install cachier实现装置后,咱们来看一个简略的示例: 这里咱们定义一个具备肯定运算耗时的函数,利用cachier.cachier()装璜,并利用参数stale_after设置缓存到期工夫为10秒: import timefrom cachier import cachierfrom datetime import timedelta@cachier(stale_after=timedelta(seconds=10))def demo(x: int, y: int): time.sleep(2) return x * yfor i in range(10): print('-'*50) print(f'第{i+1}次执行') start = time.time() demo(1, 1) print(f'耗时{round(time.time() - start, 2)}秒') time.sleep(2)过程打印记录如下: 能够察看到,咱们的函数依照设定好的过期工夫进行着缓存。除此之外,cachier还有很多其余实用个性,譬如基于mongodb实现分布式存储等 最近整顿了几百 G 的 Python 学习材料,蕴含新手入门电子书、教程、源码等等,收费分享给大家!想要的返回 “Python 编程学习圈”,发送 “J” 即可收费取得

August 9, 2022 · 1 min · jiezi

关于python:深度比较Python对象之间的差异

很多状况下咱们须要对两条数据之间的差别进行比拟,如果仅仅是针对数值型对象,那么两者的差值就是所谓的差别,然而如果要比拟两条JSON数据间的差别呢? 因为JSON数据具备可嵌套可分层的特点,想要明确找出两条JSON数据间的差别并加以形容,如果本人书写办法还是有些麻烦。这种状况咱们就能够应用到第三方库deepdiff中的DeepDiff()办法,它基于递归对不同对象进行深度比拟。 应用pip install deepdiff实现装置之后,通过from deepdiff import DeepDiff导入所需性能,就能够间接对两个JSON对象之间的差别进行比拟,上面是一个简略的例子: from deepdiff import DeepDiffobj1 = { 'level1': [ { 'level1-1': 1, 'level1-2': 1, 'level1-3': [ { 'level1-3-1': [1, 2, 3] } ] } ], 'level2': 'a'}obj2 = { 'level1': [ { 'level1-1': 1, 'level1-2': 1, 'level1-3': [ { 'level1-3-1': [1, 2, 1] } ] } ], 'level2': 'b'}DeepDiff(obj1, obj2)能够看到打印的检测后果中具体申明了差别内容及具体位置,能够帮忙咱们发展后续其余解决。 除此之外,deepdiff还具备十分丰盛的额定性能,譬如疏忽对指定类型数据的比拟查看: 亦或是通过定义档次规定,令DeepDiff()跳过对指定地位元素的差别查看: 还反对利用正则表达式定义要疏忽的含糊档次规定,譬如上面的例子中咱们应用正则批量疏忽了多个键值对:限度针对浮点数的查看精度,譬如上面的例子中限定significant_digits=2后,小数点后第二位当前的差别便被疏忽: 最近整顿了几百 G 的 Python 学习材料,蕴含新手入门电子书、教程、源码等等,收费分享给大家!想要的返回 “Python 编程学习圈”,发送 “J” 即可收费取得 ...

August 9, 2022 · 1 min · jiezi

关于python:POND高效的-Python-通用对象池库

PondPond 是一个用于 Python 的高性能对象池库,它的内存占用更小、命中率更高。 更多细节能够参阅咱们的用户指南或我的博客(https://qin.news)。 English | 中文版 GitHub 地址: https://github.com/t-baby/pondpond/ Pond 是一个 Python 中高效的通用对象池,具备性能好、内存占用小、命中率高的特点。基于近似统计的依据频率主动回收的能力,可能主动调整每个对象池的闲暇对象数量。 因为目前 Python 目前没有比拟好的、测试用例齐备、代码正文齐备、文档欠缺的对象池化库,同时目前的支流对象池库也没有比拟智能的主动回收机制。Pond 可能是 Python 中第一个社区公开的测试用例残缺,覆盖率 90% 以上、代码正文齐备、文档欠缺的对象池化库。 Pond 灵感来自于 Apache Commons Pool、Netty Recycler、HikariCP、Caffeine,汇合了多家的长处。其次 Pond 通过应用近似计数的形式以极小的内存空间统计每个对象池的应用频率,并且主动回收。 流量较为随机均匀的状况下,默认策略和权重能够升高 48.85% 内存占用,借取命中率 100%。 流量较为合乎 2/8 定律的状况下,默认策略和权重能够升高 45.7% 内存占用, 借取命中率 100%。 设计概述Pond 次要由 FactoryDict、Counter、PooledObjectTree 三局部以及一个独自的回收线程形成。 FactoryDict应用 Pond 须要实现对象工厂 PooledObjectFactory,PooledObjectFactory 提供对象的创立、初始化、销毁、验证等操作,由 Pond 调用。所以为了让对象池反对寄存齐全不同的对象,Pond 应用了一个字典来记录每个工厂类的名称和本人实现的工厂类的实例化对象。 每个 PooledObjectFactory 应该具备创建对象、销毁对象、验证对象是否还可用、重置对象四个性能。 比拟特地的是 Pond 反对主动重置对象,因为某些场景下可能会存在对象中要先赋值进行传递,传递完又被回收的状况,为了防止净化倡议这种场景下无比实现这个性能。 CounterCounter 中保留了一个近似计数器。 PooledObjectTreePooleedObjectTree 是个字典,每个 key 对应着一个先进先出的队列,这些队列都是线程平安的。每个队列中保留着多个 PooleedObject。PooledObejct 保留了创立工夫、最初借出的工夫以及理论须要的对象。 线程平安Pond 的借用和回收都是线程平安的。Python 的 queue 模块提供了一个实用于多线程编程的先进先出(FIFO)数据结构。它能够用来平安地在生产者和消费者线程之间传递音讯或其余数据。锁是调用者来解决的,所有多个线程可能平安且容易的应用同样的 Queue 实例工作。而 Pond 的借用和回收都是在操作 queue,所以根本能够认为是线程平安的。 ...

August 8, 2022 · 2 min · jiezi

关于python:python中的list学习记录

列表list列表能够存储多个不同类型的数据,存储的是每一个数据对象的援用,相似于其余语言的数组概念创立列表,两种形式应用[]lst = ['1', '2']应用内置函数list()lst2 = list(['1', '2'])列表的特点列表数据有序排列索引映射惟一一个数据,索引从左到右,是从0开始,索引从右到左,是从-1开始能够存储反复的数据任意类型数据混存依据须要动态分配和回收内存index(): 获取某列表元素在列表中的索引list1 = ['hello1', 'hello2', 'hello3', 'hello']print(list1.index('hello')) # 只返回找到的第一个元素的索引# print(list1.index('hell')) # 若元素不存在,抛出ValueErrorprint(list1.index('hello', 1, 4)) # 可指定查找范畴,不包含end依据索引获取列表中某个元素print(list1[-2]) # 输入‘hello3’print(list1[3]) # 输入‘hello’# print(list1[-7]) # 索引超出范围,抛出异样IndexError获取列表中的多个元素:切片操作语法:列表名[start: stop: step] start:默认为0 stop:不包含stop索引元素,不写截到开端 step:默认为1list2 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]# 对原列表的拷贝,生成新列表和原列表援用id不一样print(list2[1:5:1]) # 输入[2, 3, 4, 5]print(list2[:2]) # 输入[1, 2]print(list2[::]) # 输入[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]print(list2[1::]) # 输入[2, 3, 4, 5, 6, 7, 8, 9, 10]# 步长为正数,倒序切片输入print(list2[::-1]) # 输入[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]print(list2[10::-1]) # 输入[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]print(list2[5::-1]) # 输入[6, 5, 4, 3, 2, 1]print(list2[::-2]) # 输入[10, 8, 6, 4, 2]判断某元素是否存在在列表中,in / not inprint(1 in list2) # Trueprint(1 not in list2) # False遍历列表的元素for item in list2: print(item, end='\t') # 输入[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]列表元素的增删改操作减少操作1. append():列表开端追加一个元素list2.append(11)print(list2)# 输入[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]2. extend():列表开端追加一个或多个元素list2.extend(list1)print(list2)# 输入[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 'hello1', 'hello2', 'hello3', 'hello']3. insert():在任意地位插入一个元素,之后的元素程序后移list2.insert(1, 122)print(list2)# 输入[1, 122, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 'hello1', 'hello2', 'hello3', 'hello']4. 切片操作:在任意地位增加多个元素,先切片后替换被切掉的局部list2[:5:] = list1print(list2)# 输入:['hello1', 'hello2', 'hello3', 'hello', 5, 6, 7, 8, 9, 10, 11, 'hello1', 'hello2', 'hello3', 'hello']删除操作1.remove():删除一个指定元素list2.remove('hello') # 只删除第一个,不存在则报错ValueErrorprint(list2) # 输入['hello1', 'hello2', 'hello3', 5, 6, 7, 8, 9, 10, 11, 'hello1', 'hello2', 'hello3', 'hello']2.pop():依据索引删除元素,不写索引默认删除末位元素,指定索引不存在,抛出异样IndexErrorlist2.pop(1)print(list2)# 输入['hello1', 'hello3', 5, 6, 7, 8, 9, 10, 11, 'hello1', 'hello2', 'hello3', 'hello']3.切片操作:一次至多删除1个元素,产生新的列表对象newList = list2[1:3]print(newList) # 输入['hello3', 5]# 不生成新对象,操作原数组list2[1:3] = []print(list2) # 输入['hello1', 6, 7, 8, 9, 10, 11, 'hello1', 'hello2', 'hello3', 'hello']4.clear():清空列表list2.clear()print(list2) # 输入[]5.del:删除列表del list2# print(list2) # NameError: name 'list2' is not defined批改操作1. 批改指定索引的元素list2 = [1, 2, 3, 4, 5]list2[2] = 100print(list2) # 输入[1, 2, 100, 4, 5]2. 切片替换list2[1:2] = [10, 20, 30]print(list2) # 输入[1, 10, 20, 30, 100, 4, 5]排序操作1.sort(): 默认从小到大排序,指定reverse=True,降序,操作的是原列表list3 = [11, 15, 2, 8, 5, 4, 6, 3]list3.sort()print(list3) # [2, 3, 4, 5, 6, 8, 11, 15]list3.sort(reverse=True)print(list3) # [15, 11, 8, 6, 5, 4, 3, 2]2.sorted():内置函数;默认从小到大排序,指定reverse=True,降序;原列表不变,生成新列表list4 = [11, 15, 2, 8, 5, 4, 6, 3]nl = sorted(list4)print(nl) # [2, 3, 4, 5, 6, 8, 11, 15]nl = sorted(list4, reverse=True)print(nl) # [15, 11, 8, 6, 5, 4, 3, 2]列表生成式(列表元素有规定)语法:[i*i for i in range(1, 10)]i*i:列表元素的表达式,通常包含自定义变量i:自定义变量range(1, 10):可迭代的对象list5 = [i*i for i in range(1, 10)]print(list5) # [1, 4, 9, 16, 25, 36, 49, 64, 81]list6 = [i*2 for i in range(1, 6)]print(list6) # [2, 4, 6, 8, 10]

August 8, 2022 · 2 min · jiezi

关于python:pycharm-pro-for-macPython编辑开发

Python 出自 jetbrains,如果你开发过 Android 或者 JAVA, 那么你应答 Android Studio和Intellij IDEA不生疏,它们都是基于jetbrains的编辑器。不得不说,各种快捷键和插件真的是牛的一批。同时也是最智能的PythonIDE。应用PyCharm(一种提供独特编码体验的智能PythonIDE)享受高效的Python、Django和Web开发。 下载:pycharm pro for mac(Python编辑开发)

August 8, 2022 · 1 min · jiezi

关于python:最好用的-Python-虚拟环境没有之一

个别咱们创立 Python 我的项目的时候都会创立一个虚拟环境,这样做的益处就是会把我的项目环境和操作系统环境辨别开来,防止把操作系统环境弄乱。 还有一个痛点就是咱们在开发环境开发实现之后,须要把代码复制到生产环境上线,这时候我不想将开发环境的所有包从新在 pip install 一次了,怎么办? 于是 pipenv 应运而生。见名识意,pipenv 就是 pip 和 virtualenv 的结合体。 装置间接应用 pip3 进行装置即可。 pip3 install pipenv创立虚拟环境 $ mkdir demo$ cd demo$ pipenv install 装置实现之后会在你的我的项目目录主动生成 Pipfile 和 Pipfile.lock 两个文件,他们次要是用来治理包的。不信,咱们用 pipenv 装置下 requests 库试一下。 $ pipenv install requests咱们来看下 Pipfile 和 Pipfile.lock 的内容。 # Pipfile[[source]]url = "https://pypi.org/simple"verify_ssl = truename = "pypi"[packages]requests = "*"[dev-packages][requires]python_version = "3.8"# Pipfile.lock{省略局部信息"default": { "requests": { "hashes": [ "sha256:27973dd4a...", "sha256:c210084e3..." ], "index": "pypi", "version": "==2.25.1" },省略局部信息},"develop": {}}Pipfile 列出了 requests 库的信息和 Python 版本信息,仔细的你可能发现了,该文件中还有一个 dev-packages 的信息,装置时如果指定 -dev 参数,那么就会记录在 dev-packages 上面。而 Pipfile.lock 则保留了库的哈希值,这是确保生产环境和开发环境库信息统一的要害。 ...

August 8, 2022 · 1 min · jiezi

关于python:Python3-操作MySQL

import pymysql# 关上数据库连贯db = pymysql.connect(host='localhost', user='root', password='root', database='test')# 查问SQL 版本# 像if、while、def和class这样的复合语句,首行以关键字开始,以冒号( : )完结,该行之后的一行或多行代码形成代码组。def searchVersion(): # 应用 cursor() 办法创立一个游标对象 cursor cursor = db.cursor() # 应用 execute() 办法执行 SQL 查问 cursor.execute("SELECT VERSION()") # 应用 fetchone() 办法获取单条数据. data = cursor.fetchone() print("Database version : %s " % data) # 敞开数据库连贯 db.close()# SQL 插入语句# Python 通常是一行写完一条语句,但如果语句很长,咱们能够应用反斜杠 \ 来实现多行语句def InsertSql(sql): # sql = """INSERT INTO EMPLOYEE(FIRST_NAME, # LAST_NAME, AGE, SEX, INCOME) # VALUES ('Mac', 'Mohan', 20, 'M', 2000)""" try: # 应用 cursor() 办法创立一个游标对象 cursor cursor = db.cursor() # 执行sql语句 cursor.execute(sql) # 提交到数据库执行 db.commit() except: # 如果产生谬误则回滚 db.rollback() # 敞开数据库连贯 db.close()# SQL 查问语句def SearchSql(sql): # sql = "SELECT * FROM EMPLOYEE \ # WHERE INCOME >100" try: # 应用 cursor() 办法创立一个游标对象 cursor cursor = db.cursor() # 执行SQL语句 cursor.execute(sql) # 获取所有记录列表 results = cursor.fetchall() for row in results: fname = row[0] lname = row[1] age = row[2] sex = row[3] income = row[4] # 打印后果 print("fname=%s,lname=%s,age=%s,sex=%s,income=%s" % \ (fname, lname, age, sex, income)) except: print("Error: unable to fetch data") # 敞开数据库连贯 db.close()# SQL 更新语句def updateSql(sql): # sql = "UPDATE EMPLOYEE SET AGE = AGE + 1 WHERE SEX = '%c'" % ('M') try: cursor = db.cursor() # 执行SQL语句 cursor.execute(sql) # 提交到数据库执行 db.commit() except: # 产生谬误时回滚 db.rollback() # 敞开数据库连贯 db.close()# SQL 删除语句def DeleteSql(sql): # sql = "DELETE FROM EMPLOYEE WHERE AGE > %s" % (20) try: cursor = db.cursor() # 执行SQL语句 cursor.execute(sql) # 提交批改 db.commit() except: # 产生谬误时回滚 db.rollback() # 敞开连贯 db.close()# 查问sqlsqlStr = "SELECT * FROM EMPLOYEE WHERE INCOME >100"SearchSql(sqlStr)

August 7, 2022 · 2 min · jiezi

关于python:一天学会python3

Python是一种弱类型的脚本语言,跟PHP一样,学习起来非常简单,看看根本的一些语法,数据类型, 抉择语句,函数的定义以及面向对象的根本语法算入门了,python Mysql数据库的基本操作,后续碰到不会的货色,间接google搜寻查问就行了。我花了一天工夫看看语法就学会了。https://www.runoob.com/python... # print("hello world")# print("你好啊,世界")# list = [1, 2, 3, 4, 5] # 定义列表## for x in list:# print(x)def sum(a, b): ### 定义函数 return a + ba = sum(5, 6) ###函数的调用print(a)cc = (1, 2, 3, 4, 5, 6) ###元组应用小括号 ( ),列表应用方括号 [ ], 元组是不可变的for x in cc: print(x)dd = {"a", "b", "c"} ### 定义汇合for x in dd: print(x)mm = {"a": 6, "b": 7, "d": 9} ###定义 map 字典for key, value in mm.items(): print(key, value)Go是一种强类型的语言,跟C#一样,学习起来跟php python略微有一点学习的老本,不过学习起来也很简略, 看根本的语法,数据类型,还有一些抉择语句, 把握 goroutine chan sync slice map struct ,还有函数的定义根本就能够了。 更深刻的就是 GPM 调度, 内存的调配以及 垃圾回收机制等等。https://www.runoob.com/go/go-...《Go语言圣经》Go语言中文文档Go by exampleGo指南《Go语言规范库》Go 入门指南Go 语言上手-根底语法Go语言101Go 语言中文开源图书、材料或文档https://tomcode.xyz/language/...Golang学习路线:https://tomcode.xyzGolang:https://github.com/hwholiday/...7天用Go从零实现系列 GolangGolang第二语言指南: 学习门路、最佳实际以及工程化 GolangGo 学习之路:Go 开发者博客、Go 微信公众号、Go 学习材料(文档、书籍、视频) GolangGo 学习材料索引 GolangGo 程序员面试口试宝典 GolangGo 常识图谱 Golang ...

August 6, 2022 · 1 min · jiezi

关于python:抖音-滑块验证方案-svwebid-参数分析

本文所有教程及源码、软件仅为技术钻研。不波及计算机信息零碎性能的删除、批改、减少、烦扰,更不会影响计算机信息零碎的失常运行。不得将代码用于非法用处,如侵立删!**## 抖音web端 s_v_web_id 参数生成剖析与实现### 操作环境- win10- Python3.9### 剖析 s_v_web_id 作用:web端应用滑块后的s_v_web_id 参数能够实现免signature验证s_v_web_id 生成:在验证码两头页的html中的fp参数就是s_v_web_id 具体介绍这边就不在赘述,能够参考下玺佬的文章:s_v_web_id介绍生成计划:- Python + selenium 自动化过滑块- RPC近程调用主动,验证滑块这两种计划有个前提是页面必须呈现滑块才能够(之前搜素视频会强制滑块效验),具体过滑块的办法玺佬都曾经分享过。 当初应该是web端有更新,当初搜寻页面只有综合会出点选验证,视频和用户页面都没有强制滑块验证了,清cookie和开无痕都没方法触发滑块,通过几天的剖析钻研出以下计划最新解决方案:- 通过js生成滑块s_v_web_id - 辨认滑块- 生成验证参数并验证- 验证通过后就可失常应用了 **### 2022-8-6 更新:报错以后网络不稳固,请稍后再试问题:下载验证码图片报错:以后网络不稳固,请稍后再试解决:在申请参数中减少参数 "app_name": "" **### 通过js生成滑块s_v_web_id `javascriptfunction create_s_v_web_id() { var e = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split("") , t = e.length , n = (new Date).getTime().toString(36) , r = []; r[8] = r[13] = r[18] = r[23] = "_", r[14] = "4"; for (var o, i = 0; i < 36; i++) r[i] || (o = 0 | Math.random() * t, r[i] = e[19 == i ? 3 & o | 8 : o]); return "verify_" + n + "_" + r.join("")}`此办法生成的s_v_web_id是不能够用来采集评论的,评论验证应用的s_v_web_id须要从页面取下来,而后在拿着过滑块,此处再次感激玺佬@李玺**### 辨认滑块`pythondef calculate_distance(self, pic1_path, pic2_path): """ 计算滑块到缺口的间隔 """ img1 = self.clear_white(pic1_path) img1 = cv2.cvtColor(img1, cv2.COLOR_RGB2GRAY) slide = cv2.Canny(img1, 100, 200) img2 = cv2.imread(pic2_path, 0) back = cv2.Canny(img2, 100, 200) slide_pic = cv2.cvtColor(slide, cv2.COLOR_GRAY2RGB) back_pic = cv2.cvtColor(back, cv2.COLOR_GRAY2RGB) x, y = self.template_match(slide_pic, back_pic) dis_x = int((x + 5) * (340 / 552)) dis_y = int(y * (340 / 552)) return dis_x, dis_ydef get_tracks(self, distance, _y): """ 获取轨迹参数 """ tracks = list() y, v, t, current = 0, 0, 1, 0 mid = distance * 3 / 4 exceed = random.randint(40, 90) z = random.randint(30, 150) while current < (distance + exceed): if current < mid / 2: a = 2 elif current < mid: a = 3 else: a = -3 a /= 2 v0 = v s = v0 t + 0.5 a (t t) current += int(s) v = v0 + a * t y += random.randint(-3, 3) z = z + random.randint(5, 10) tracks.append([min(current, (distance + exceed)), y, z]) while exceed > 0: exceed -= random.randint(0, 5) y += random.randint(-3, 3) z = z + random.randint(5, 9) tracks.append([min(current, (distance + exceed)), y, z]) tr = [] for i, x in enumerate(tracks): tr.append({ 'x': x[0], 'y': _y, 'relative_time': x[2] }) return tr`**### 生成验证参数并验证captchaBody须要js生成`pythondef captcha_verify(self, s_v_web_id, captchaBody): url = "aHR0cHM6Ly92ZXJpZnkuc25zc2RrLmNvbS9jYXB0Y2hhL3ZlcmlmeQ==" params = { "os_type": "2", "fp": s_v_web_id, "subtype": "slide", } data = { 'captchaBody': captchaBody } r = self._parse_url(url=url, params=params, data=json.dumps(data)) return r.json()`### 成果识别率成功率还是能够的**本文仅供学习交换应用,如侵立删!**

August 6, 2022 · 2 min · jiezi

关于python:11个案例讲透-Python-函数参数

明天给大家分享一下本人整顿的一篇 Python 参数的内容,内容十分的干,全文通过案例的模式来了解知识点,自认为比网上 80% 的文章讲的都要明确,如果你是入门不久的 python 老手,置信本篇文章应该对你会有不小的帮忙。 接下来是注释。 1. 参数分类函数,在定义的时候,能够有参数的,也能够没有参数。 从函数定义的角度来看,参数能够分为两种: 必选参数:调用函数时必须要指定的参数,在定义时没有等号可选参数:也叫默认参数,调用函数时能够指定也能够不指定,不指定就默认的参数值来。例如上面的代码中,a 和 b 属于必选参数, c 和 d 属于可选参数 def func(a,b,c=0, d=1): pass从函数调用的角度来看,参数能够分为两种: 关键字参数:调用时,应用 key=value 模式传参的,这样传递参数就能够不按定义程序来。地位参数:调用时,不应用关键字参数的 key-value 模式传参,这样传参要留神依照函数定义时参数的程序来。def func(a,b,c=0, d=1): pass # 关键字参数传参办法func(a=10, c=30, b=20, d=40) # 地位参数传参办法func(10, 20, 30, 40)最初还有一种十分非凡的参数,叫做可变参数。 意思是参数个数可变,能够是 0 个或者任意个,然而传参时不能指定参数名,通常应用 args 和 *kw 来示意: *args:接管到的所有依照地位参数形式传递进来的参数,是一个元组类型**kw :接管到的所有依照关键字参数形式传递进来的参数,是一个字典类型def func(*args, **kw): print(args) print(kw)func(10, 20, c=20, d=40)输入如下 (10, 20){'c': 20, 'd': 40}2. 十一个案例案例一:在上面这个函数中, a 是必选参数,是必须要指定的 >>> def demo_func(a):... print(a)... >>> demo_func(10) 10>>> demo_func() # 不指定会报错Traceback (most recent call last): File "<stdin>", line 1, in <module>TypeError: demo_func() missing 1 required positional argument: 'a'案例二:在上面这个函数中,b 是可选参数(默认参数),能够指定也能够不指定,不指定的话,默认为10 ...

August 6, 2022 · 2 min · jiezi

关于python:失败了n次以后我总结了5种爬虫伪装技巧

爬虫假装的最高境界就是用代码模仿人的实在操作,因为网站设计进去就是为了让他人拜访的,把握爬虫的假装技巧,可能让大大提高咱们爬虫的成功率。 联合本身的教训,给大家介绍5种爬虫假装的技巧,并把代码模板奉上,心愿可能对你有所帮忙。 1.浏览器假装因为网站服务器可能很轻易的辨认出拜访的起源浏览器,以requests申请为例,默认header头数据中没有浏览器信息,在与浏览器交互时几乎就是“裸奔”,所以咱们能够退出“User-Agent”信息伪装成实在浏览器,代码如下: import requests headers={'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:88.0) Gecko/20100101 Firefox/88.0'} #模仿成火狐浏览器response = requests.get("http://www.baidu.com",headers=headers) #模仿申请url2.拜访地址假装拜访地址指的是headers头部中的reffer信息,那么它有什么作用呢?举个例子解释一下: 我在https://bj.meituan.com/里有一个https://waimai.meituan.com/链接,那么点击这个https://waimai.meituan.com/,它的header信息里就有:Referer=https://bj.meituan.com/ 那么能够利用这个来避免盗链,比方我只容许我本人的网站拜访我本人的图片服务器 咱们能够退出“reffer”信息假装拜访地址,代码如下: import requests headers={ 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:88.0) Gecko/20100101 Firefox/88.0', 'reffer':'https://bj.meituan.com/'}response = requests.get("https://waimai.meituan.com/",headers=headers) #模仿申请url3.ip地址假装对于网络中的反爬虫策略来说,大多数都是依据单个IP的行为来判断是不是网络爬虫的,例如,反爬虫检测到某个IP的拜访次数很多,或者是拜访的频率很快,就会封禁这个IP。这时咱们就要抉择代理IP来冲破反爬虫的机制,更稳固的及逆行数据的爬取。python增加代理IP的代码如下: import requests proxies={'https':'101.236.54.97:8866'} headers={ 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:88.0) Gecko/20100101 Firefox/88.0', 'reffer':'https://bj.meituan.com/'}response = requests.get("https://waimai.meituan.com/",headers=headers,proxies=proxies) #模仿申请url代理IP能够本人去网上找收费的,但不太稳固,也可去花钱买一些比较稳定的。 4.假装拜访速率实在用户的拜访次数以及拜访法则是很稳固的,并不会屡次的拜访,所以咱们要伪装成实在的用户来爬取数据,这样反爬虫机制就不会觉察,能够采纳管制拜访频率的形式,次要是随机设置拜访工夫,代码如下: import requests import time,randomproxies={'https':'101.236.54.97:8866'} headers={ 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:88.0) Gecko/20100101 Firefox/88.0', 'reffer':'https://bj.meituan.com/'}for i in range(10): response = requests.get("https://waimai.meituan.com/",headers=headers,proxies=proxies) #模仿申请url time.sleep(random.uniform(1.1,5.4))5.假装用户实在信息有些网页是须要登录后才会显示数据,而cookie值会携带集体的登录信息,在爬虫中退出cookie值就能防止登录的麻烦,例如知乎、京东等网站,退出办法如下: ...

August 6, 2022 · 1 min · jiezi

关于python:聊聊-Python-数据处理全家桶

1. 前言 PgSQL,全称为 PostgreSQL,是一款收费开源的关系型数据库 相比最风行的 Mysql 数据库,PgSQL 在可靠性、数据完整性、扩展性方面具备相对的劣势 本篇文章将聊聊如何应用 Python 操作 PgSQL 数据库 2. PgSQL 应用Python 操作 PgSQL,须要先装置依赖包「 psycopg2 」 # 装置依赖包pip3 install psycopg2接下来,就能够应用 Python 来操作数据库了 2-1 数据库连贯及游标对象 应用 psycopg2 中的「 connect() 」办法连贯数据库,创立数据库连贯对象及游标对象 import psycopg2# 取得连贯对象# database:数据库名称# user:用户名# password:明码# host:数据库ip地址# port:端口号,默认为5432conn = psycopg2.connect(database="db_name", user="postgres", password="pwd", host="127.0.0.1", port="5432")# 获取游标对象cursor = conn.cursor()获取游标对象后,就能够执行 SQL,进而操作数据库了 2-2 插入数据 首先,编写插入数据的 SQL 语句及参数( 可选 ) # 构建SQL语句# 形式一:直带参数 sql = "INSERT INTO student (name,age) \ VALUES (%s, '%s')" % \ ('xag',23)# 形式二:参数拆散sql = """INSERT INTO student (name,age) VALUES (%s, %s)"""# 参数params = ('xag',23)而后,应用游标对象执行 SQL ...

August 6, 2022 · 2 min · jiezi

关于python:硬肝一次-Python-微服务是一种什么体验

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

August 6, 2022 · 2 min · jiezi

关于python:nameko-投递不同大小消息的速率对比

能够先浏览:nameko 投递信息不长久化 小体积投递 1000 bytes 的 message(不开长久化 NON_PERSISTENT) 速率在 2000+ 投递 1000 bytes 的 message(开长久化 PERSISTENT) 速率在 200- 中等体积投递 100 KB 的 message(不开长久化 NON_PERSISTENT) 速率在 1500 左右 投递 100 KB 的 message(开长久化 PERSISTENT) 速率在 125 左右 大体积投递 10MB 的 message(不开长久化 NON_PERSISTENT) 速率在 35 左右 投递 10MB 的 message(开长久化 PERSISTENT) 速率在 15 左右 参考代码: from loguru import loggerimport settingsfrom nameko.standalone.events import event_dispatcherfrom nameko.constants import NON_PERSISTENTimport timeconfig = { 'AMQP_URI': f'amqp://{settings.RABBITMQ_CONFIG.username}:' f'{settings.RABBITMQ_CONFIG.password}@{settings.RABBITMQ_CONFIG.host}:' f'{settings.RABBITMQ_CONFIG.port}/{settings.RABBITMQ_CONFIG.vhost}'}data='1234567890'*1000*1000dispatch = event_dispatcher(config,delivery_mode=NON_PERSISTENT)for _ in range(100000): dispatch( 'test_publishe', 'to_publish', data )测试环境: ...

August 5, 2022 · 1 min · jiezi

关于python:Python-数据分析师的基本修养

数据分析师通常都须要借助编程工具整顿数量大而简单的数据,在这些数据中开掘有用的材料。简而言之,数据分析师就是从凌乱的数据中整顿出规定的人,而这样的工作要求数据分析师把握这些技巧: 业界常识 - 数据分析的根底就是为行业服务,足够的业界常识能让数据分析师理解到底哪些数据能力为行业提供更深刻的洞察编程技巧 - 数据分析师须要分明应该应用哪些库来简化和解决数据,进而从中找到所需的材料数据分析 - 除了自身的数据分析能力,数据分析师也须要懂得借助工具来提取数据中的价值可视化技能 - 只是提取数据是不够的,数据分析师须要把这些数据整顿好后进行可视化,总结并出现给别人 这篇文章将应用Python在线运行一系列经典的数据分析案例,让你对数据分析工具与编程有肯定的理解,通过这些数据进行可视化并出现咱们所整顿的数据。 文章中所应用的数据和范例代码已整顿到我的项目文件中,大家只有关上就能够开始应用Python在线运行并查看数据:https://e2f35f8cd0-share.lightly.teamcode.com 剖析数据首先,咱们须要应用Python中的Pandas库来读取 .csv 文件的数据。如果你的我的项目文件中还未装置pandas,能够参考装置教程通过 pip install pandas 或Quick Fix一键装置。 读取数据装置好Pandas库后,咱们还须要在编辑区应用Python代码 import pandas 导入,而后再通过上面的代码读取数据文件。 import pandas as pdfrom tabulate import tabulatedf = pd.read_csv('diabetes.csv')大家能够应用以下代码,在编辑器中应用Python在线运行并查看数据成果: print(tabulate(df, headers = 'keys', tablefmt = 'psql')) 作为数据分析师,大家应该要晓得数值(Numerical)和分类(Categorical)数据之间的区别。 数值数据顾名思义,指的是具备数值意义的数据。这种数据具备理论测量的物理意义,比方血糖、血压、年龄等。 分类数据则形容对象的性质,比性别、婚姻状况、他乡等。咱们这次应用的数据中,其实只有“后果”属于分类数据。在示意分类数据时,咱们同样能应用数字来进行形容,但这些数据并没有数学意义,你不能拿他来做运算。 数据可视化在这个教程中,咱们会展现一系列应用Python在线运行的数据可视化成果,大家能够依据本人的数据类型抉择适合的图表来出现。 饼图 应用Python在线运行代码:SimplePie.py 散点图 应用Python在线运行代码:scatterplot.py 折线图 应用Python在线运行代码:linechart.py 柱状图 应用Python在线运行代码:multibar.py 当咱们实现数据分析和可视化图表后,咱们能够依据数据和图标内容,简要阐明数据故事。例如:购买飞驰的人显著比宝马更多、中老年人患糖尿病的比例更高、一月份的冰箱购买量远比其余月份低等,从而依据其余数据和理论状况持续剖析。 数据分析师也是人,咱们在剖析数据的时候有时也会带有一些陷入为主的观点。然而,数据的意义就是为了破除这些迷思。剖析数据的过程中,咱们须要放弃凋谢的态度,不要让偏见影响咱们的数据后果。

August 5, 2022 · 1 min · jiezi

关于python:NumPy-获取唯一元素出现次数展平数组

1 如何取得惟一元素和呈现次数应用np.unique能够很容易地找到数组中惟一的元素。 例如,如果从这个数组开始: >>> a = np.array([11, 11, 12, 13, 14, 15, 16, 17, 12, 13, 11, 14, 18, 19, 20])能够应用np.unique打印数组中的惟一值: >>> unique_values = np.unique(a)>>> print(unique_values)[11 12 13 14 15 16 17 18 19 20]要获取NumPy数组中惟一值的索引(数组中惟一值的第一个索引地位的数组),只需在np.unique()中传递return_index参数: >>> unique_values, indices_list = np.unique(a, return_index=True)>>> print(indices_list)[ 0 2 3 4 5 6 7 12 13 14]能够将np.unique()中的return_counts参数与数组一起传递,以获取NumPy数组中惟一值的频率计数。 >>> unique_values, occurrence_count = np.unique(a, return_counts=True)>>> print(occurrence_count)[3 2 2 2 1 1 1 1 1 1]这也实用于二维数组!如果从这个数组开始: a_2d = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [1, 2, 3, 4]])能够通过以下形式找到惟一的值:>>> unique_values = np.unique(a_2d)>>> print(unique_values)[ 1 2 3 4 5 6 7 8 9 10 11 12]如果未传递axis参数,则二维数组将被展平。 ...

August 5, 2022 · 2 min · jiezi

关于python:我用这个操作代码可读性提升一个档次

背景假如有一个课程学习管理系统,其中有个表的字段叫status,用来标记学员某个课程的学习状态, 它在数据库中的类型是int。 当初咱们的业务零碎中充斥着大量诸如status==xxx这样的代码: if status==0: passelif status==1: pass...if finished: status =2问题置信你看到问题所在了,作为一个刚接手我的项目的人来说,你必定会纳闷这里的0、1、2、3这些值到底代表什么状态,你不得不去代码中查找status是怎么定义的,有哪些值,别离代表什么意思? 如果文档中没有写分明这些值对应的含意,那你还要去找最开始写这个代码的人(心田你必定会骂这是哪个傻瓜写的) 所以这段代码最大的问题就是可读性差,甚至即便作者本人也难说隔一段时间再来看不会懵逼。 重构那么咱们如何来重构这段代码来晋升可读性呢?,有几种重构计划,接下来我会把这几种办法都列出来 第一种:应用枚举枚举(Enum)是Python自带的个性,用来定义有多个无限值时是绝佳的利用场景。先定义了状态枚举类 import enumclass StudyStatusEnum(enum.Enum): no_start = 0 # 未开始 learning = 1 # 学习中 finish = 2 # 已学完 expired = 3 # 过期而后将后面的逻辑批改成: if status==StudyStatusEnum.no_start: passelif status==StudyStatusEnum.leanring: passif finished: status = StudyStatusEnum.finish如果你的零碎中用的ORM框架是SQLAlchemy,那么要同时批改status属性的定义 class Study(Models): # status = db.Column(db.SmallInteger, default=0, comment="学习状态 0 未开始 1 学习中 2 已实现") status = db.Column(Enum(StudyStatusEnum), default=StudyStatusEnum.no_start)这样批改其实有个问题是,枚举类型在数据库中对应的是字符串类型,而实际上咱们心愿存一个int类型,对应枚举的value值,而不是枚举的name属性。 所以,这时候咱们能够基于SQLAlchemy提供的TypeDecorator来自定义Enum类型叫做IntEnum。 from sqlalchemy import TypeDecorator, Integerclass IntEnum(TypeDecorator): """ 整数枚举类型 次要用于状态等场景 """ impl = Integer def __init__(self, enumtype, *args, **kwargs): super().__init__(*args, **kwargs) self._enumtype = enumtype def process_bind_param(self, value, dialect): # 入库时调用此办法,返回的是枚举的value return value.value def process_result_value(self, value, dialect): # 从数据库加载到内存时的值,返回的一个枚举实例 return self._enumtype(value)咱们只须要重写这三个办法,即可已实现一个能够保留int类型的枚举。 ...

August 5, 2022 · 1 min · jiezi

关于python:Python中常用最神秘的函数-lambda-函数深度总结

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

August 5, 2022 · 3 min · jiezi

关于python:Python生成图文并茂的PDF报告

reportlab是Python的一个规范库,能够画图、画表格、编辑文字,最初能够输入PDF格局。它的逻辑和编辑一个word文档或者PPT很像。有两种办法: 1)建设一个空白文档,而后在下面写文字、画图等;2)建设一个空白list,以填充表格的模式插入各种文本框、图片等,最初生成PDF文档。因为须要产生一份给用户看的报告,外面须要插入图片、表格等,所以采纳的是第二种办法。 装置第三方库reportlab输出Python的第三方库,应用前须要先装置:pip install reportlab 模块导入提前导入相干内容,并且注册字体。(注册字体前须要先筹备好字体文件) from reportlab.pdfbase import pdfmetrics # 注册字体from reportlab.pdfbase.ttfonts import TTFont # 字体类from reportlab.platypus import Table, SimpleDocTemplate, Paragraph, Image # 报告内容相干类from reportlab.lib.pagesizes import letter # 页面的标记尺寸(8.5*inch, 11*inch)from reportlab.lib.styles import getSampleStyleSheet # 文本款式from reportlab.lib import colors # 色彩模块from reportlab.graphics.charts.barcharts import VerticalBarChart # 图表类from reportlab.graphics.charts.legends import Legend # 图例类from reportlab.graphics.shapes import Drawing # 绘图工具from reportlab.lib.units import cm # 单位:cm# 注册字体(提前准备好字体文件, 如果同一个文件须要多种字体能够注册多个)pdfmetrics.registerFont(TTFont('SimSun', 'SimSun.ttf'))封装不同内容对应的函数 创立一个Graphs类,通过不同的静态方法提供不同的报告内容,包含:题目、一般段落、图片、表格和图表。函数中的相干数据目前绝大多数都是固定值,能够依据状况自行设置成相干参数。 class Graphs: # 绘制题目 @staticmethod def draw_title(title: str): # 获取所有样式表 style = getSampleStyleSheet() # 拿到题目款式 ct = style['Heading1'] # 独自设置款式相干属性 ct.fontName = 'SimSun' # 字体名 ct.fontSize = 18 # 字体大小 ct.leading = 50 # 行间距 ct.textColor = colors.green # 字体色彩 ct.alignment = 1 # 居中 ct.bold = True # 创立题目对应的段落,并且返回 return Paragraph(title, ct) # 绘制小标题 @staticmethod def draw_little_title(title: str): # 获取所有样式表 style = getSampleStyleSheet() # 拿到题目款式 ct = style['Normal'] # 独自设置款式相干属性 ct.fontName = 'SimSun' # 字体名 ct.fontSize = 15 # 字体大小 ct.leading = 30 # 行间距 ct.textColor = colors.red # 字体色彩 # 创立题目对应的段落,并且返回 return Paragraph(title, ct) # 绘制一般段落内容 @staticmethod def draw_text(text: str): # 获取所有样式表 style = getSampleStyleSheet() # 获取一般款式 ct = style['Normal'] ct.fontName = 'SimSun' ct.fontSize = 12 ct.wordWrap = 'CJK' # 设置主动换行 ct.alignment = 0 # 左对齐 ct.firstLineIndent = 32 # 第一行结尾空格 ct.leading = 25 return Paragraph(text, ct) # 绘制表格 @staticmethod def draw_table(*args): # 列宽度 col_width = 120 style = [ ('FONTNAME', (0, 0), (-1, -1), 'SimSun'), # 字体 ('FONTSIZE', (0, 0), (-1, 0), 12), # 第一行的字体大小 ('FONTSIZE', (0, 1), (-1, -1), 10), # 第二行到最初一行的字体大小 ('BACKGROUND', (0, 0), (-1, 0), '#d5dae6'), # 设置第一行背景色彩 ('ALIGN', (0, 0), (-1, -1), 'CENTER'), # 第一行程度居中 ('ALIGN', (0, 1), (-1, -1), 'LEFT'), # 第二行到最初一行左右左对齐 ('VALIGN', (0, 0), (-1, -1), 'MIDDLE'), # 所有表格高低居中对齐 ('TEXTCOLOR', (0, 0), (-1, -1), colors.darkslategray), # 设置表格内文字色彩 ('GRID', (0, 0), (-1, -1), 0.5, colors.grey), # 设置表格框线为grey色,线宽为0.5 # ('SPAN', (0, 1), (0, 2)), # 合并第一列二三行 # ('SPAN', (0, 3), (0, 4)), # 合并第一列三四行 # ('SPAN', (0, 5), (0, 6)), # 合并第一列五六行 # ('SPAN', (0, 7), (0, 8)), # 合并第一列五六行 ] table = Table(args, colWidths=col_width, style=style) return table # 创立图表 @staticmethod def draw_bar(bar_data: list, ax: list, items: list): drawing = Drawing(500, 250) bc = VerticalBarChart() bc.x = 45 # 整个图表的x坐标 bc.y = 45 # 整个图表的y坐标 bc.height = 200 # 图表的高度 bc.width = 350 # 图表的宽度 bc.data = bar_data bc.strokeColor = colors.black # 顶部和左边轴线的色彩 bc.valueAxis.valueMin = 5000 # 设置y坐标的最小值 bc.valueAxis.valueMax = 26000 # 设置y坐标的最大值 bc.valueAxis.valueStep = 2000 # 设置y坐标的步长 bc.categoryAxis.labels.dx = 2 bc.categoryAxis.labels.dy = -8 bc.categoryAxis.labels.angle = 20 bc.categoryAxis.categoryNames = ax # 图示 leg = Legend() leg.fontName = 'SimSun' leg.alignment = 'right' leg.boxAnchor = 'ne' leg.x = 475 # 图例的x坐标 leg.y = 240 leg.dxTextSpace = 10 leg.columnMaximum = 3 leg.colorNamePairs = items drawing.add(leg) drawing.add(bc) return drawing # 绘制图片 @staticmethod def draw_img(path): img = Image(path) # 读取指定门路下的图片 img.drawWidth = 5*cm # 设置图片的宽度 img.drawHeight = 8*cm # 设置图片的高度 return img生成报告 ...

August 5, 2022 · 3 min · jiezi

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

download:Python全能工程师2022版完结无密Java线程池Executor详解咱们最常使用的Executors实现创建线程池使用线程次要是用上述类图中提供的类。在上边的类图中,蕴含了一个Executor框架,它是一个根据一组执行策略的调用调度执行和管制异步工作的框架,目标是提供一种将工作提交与工作如何运行别来到的机制。它蕴含了三个executor接口: Executor:运行新工作的简略接口ExecutorService:扩大了Executor,增加了用来治理执行器生命周期和工作生命周期的方法ScheduleExcutorService:扩大了ExecutorService,反对Future和定期执行工作 线程池的好处 升高资源消耗-重用存在的线程,缩小对象创建、沦亡的开销,性能好提高响应速度 -可无效管制最大并发线程数,提高系统资源应用率,同时可能避免过多资源竞争,避免阻塞。当工作到达时,工作可不必等待线程创建就能立即执行提高线程的可管理性-提供定时执行、定期执行、单线程、并发数管制等功能。 new Thread的弊病 每次new Thread 新建对象,性能差线程不足对立治理,可能无限度的新建线程,相互竞争,可能占用过多的系统资源导致死机或者OOM(out of memory 内存溢出),这种问题的原因不是因为单纯的new一个Thread,而是可能因为程序的bug或者设计上的缺点导致不断new Thread造成的。缺少更多功能,如更多执行、定期执行、线程中断。 线程池核心类-ThreadPoolExecutor参数说明:ThreadPoolExecutor一共有七个参数,这七个参数配合起来,形成了线程池弱小的功能。 corePoolSize:核心线程数量maximumPoolSize:线程最大线程数workQueue:阻塞队列,存储等待执行的工作,很重要,会对线程池运行过程产生重大影响 当咱们提交一个新的工作到线程池,线程池会根据以后池中正在运行的线程数量来决定该工作的处理形式。处理形式有三种:1、间接切换(SynchronusQueue)2、无界队列(LinkedBlockingQueue)能够创建的最大线程数为corePoolSize,这时maximumPoolSize就不会起作用了。当线程池中所有的核心线程都是运行状态的时候,新的工作提交就会放入等待队列中。3、有界队列(ArrayBlockingQueue)最大maximumPoolSize,能够升高资源消耗,然而这种形式使得线程池对线程调度变的更艰巨。因为线程池与队列容量都是无限的。所以想让线程池的吞吐率和处理工作达到一个正当的范畴,又想使咱们的线程调度绝对简略,并且还尽可能升高资源的消耗,咱们就需要正当的限度这两个数量调配技巧: [如果想升高资源的消耗包含升高cpu使用率、操作系统资源的消耗、上下文切换的开销等等,可能设置一个较大的队列容量和较小的线程池容量,这样会升高线程池的吞吐量。如果咱们提交的工作常常发生阻塞,咱们可能调整maximumPoolSize。如果咱们的队列容量较小,咱们需要把线程池大小设置的大一些,这样cpu的使用率相对来说会高一些。然而如果线程池的容量设置的过大,提高工作的数量过多的时候,并发量会减少,那么线程之间的调度就是一个需要考虑的问题。这样反而可能会升高处理工作的吞吐量。] keepAliveTime:线程没有工作执行时最多保持多久工夫终止(当线程中的线程数量大于corePoolSize的时候,如果这时没有新的工作提交核心线程外的线程不会立即销毁,而是等待,直到超过keepAliveTime)unit:keepAliveTime的工夫单位threadFactory:线程工厂,用来创建线程,有一个默认的工场来创建线程,这样新创建进去的线程有雷同的优先级,是非守护线程、设置好了名称)rejectHandler:当拒绝处理工作时(阻塞队列满)的策略(AbortPolicy默认策略间接抛出异样、CallerRunsPolicy用调用者所在的线程执行工作、DiscardOldestPolicy抛弃队列中最靠前的工作并执行当前任务、DiscardPolicy间接抛弃当前任务)corePoolSize、maximumPoolSize、workQueue 三者关系:如果运行的线程数小于corePoolSize的时候,间接创建新线程来处理工作。即使线程池中的其余线程是空闲的。如果运行中的线程数大于corePoolSize且小于maximumPoolSize时,那么只有当workQueue满的时候才创建新的线程去处理工作。如果corePoolSize与maximumPoolSize是雷同的,那么创建的线程池大小是固定的。这时有新工作提交,当workQueue未满时,就把请求放入workQueue中。等待空线程从workQueue取出工作。如果workQueue此时也满了,那么就使用另外的拒绝策略参数去执行拒绝策略。

August 4, 2022 · 1 min · jiezi

关于python:深入理解Python-5个硬核函数

刚好前些天有人提到eval()与exec()这两个函数,所以就翻了下Python的文档。这里就来简略说一下这两个函数以及与它们相干的几个函数,如globals()、locals()和compile(): 1. eval函数 函数的作用: 计算指定表达式的值。也就是说它要执行的Python代码只能是单个运算表达式(留神eval不反对任意模式的赋值操作),而不能是简单的代码逻辑,这一点和lambda表达式比拟类似。 函数定义: eval(expression, globals=None, locals=None) 参数阐明: expression:必选参数,能够是字符串,也能够是一个任意的code对象实例(能够通过compile函数创立)。如果它是一个字符串,它会被当作一个(应用globals和locals参数作为全局和本地命名空间的)Python表达式进行剖析和解释。globals:可选参数,示意全局命名空间(寄存全局变量),如果被提供,则必须是一个字典对象。locals:可选参数,示意以后部分命名空间(寄存局部变量),如果被提供,能够是任何映射对象。如果该参数被疏忽,那么它将会取与globals雷同的值。如果globals与locals都被疏忽,那么它们将取eval()函数被调用环境下的全局命名空间和部分命名空间。返回值: 如果expression是一个code对象,且创立该code对象时,compile函数的mode参数是'exec',那么eval()函数的返回值是None;否则,如果expression是一个输入语句,如print(),则eval()返回后果为None;否则,expression表达式的后果就是eval()函数的返回值;实例: x = 10def func(): y = 20 a = eval('x + y') print('a: ', a) b = eval('x + y', {'x': 1, 'y': 2}) print('b: ', b) c = eval('x + y', {'x': 1, 'y': 2}, {'y': 3, 'z': 4}) print('c: ', c) d = eval('print(x, y)') print('d: ', d)func()输入后果: a: 30b: 3c: 410 20d: None对输入后果的解释: 对于变量a,eval函数的globals和locals参数都被忽略了,因而变量x和变量y都获得的是eval函数被调用环境下的作用域中的变量值,即:x = 10, y = 20,a = x + y = 30对于变量b,eval函数只提供了globals参数而疏忽了locals参数,因而locals会取globals参数的值,即:x = 1, y = 2,b = x + y = 3对于变量c,eval函数的globals参数和locals都被提供了,那么eval函数会先从全副作用域globals中找到变量x, 从部分作用域locals中找到变量y,即:x = 1, y = 3, c = x + y = 4对于变量d,因为print()函数不是一个计算表达式,没有计算结果,因而返回值为None2. exec函数 ...

August 4, 2022 · 3 min · jiezi

关于python:这10个Python性能调优的小技巧你知道几个

1 多多应用列表生成式替换上面代码: cube_numbers = []  for n in range(0,10):    if n % 2 == 1:      cube_numbers.append(n**3)为列表生成式写法: cube_numbers = [n**3 for n in range(1,10) if n%2 == 1]2 内置函数尽可能多应用上面这些内置函数: 3 尽可能应用生成器单机解决较大数据量时,生成器往往很有用,因为它是分小片逐次读取,最大水平节俭内存,如下网页爬取时应用yield import requestsimport redef get_pages(link): pages_to_visit = [] pages_to_visit.append(link) pattern = re.compile('https?') while pages_to_visit: current_page = pages_to_visit.pop(0) page = requests.get(current_page) for url in re.findall('<a href="([^"]+)">', str(page.content)): if url[0] == '/': url = current_page + url[1:] if pattern.match(url): pages_to_visit.append(url) # yield yield current_pagewebpage = get_pages('http://www.example.com')for result in webpage: print(result)4 判断成员所属关系最快的办法应用 in for name in member_list: print('{} is a member'.format(name))5 应用汇合求交加 替换上面代码: a = [1,2,3,4,5]b = [2,3,4,5,6]overlaps = []for x in a: for y in b: if x==y: overlaps.append(x)print(overlaps)批改为set和求交加: ...

August 4, 2022 · 1 min · jiezi

关于python:Python-一行代码的神奇之处

你们晓得明天聊聊对于 Python 一行代码的神奇之处!!! 十六进制转十进制decimal = int('1010', 5)print(decimal)   #130输入: 130转换大小写字母转换大写字母# 转换大小写字母str = "hi Python".upper()print(str) #HI PYTHON输入: HI PYTHON转换小写字母# 转换小写字母str_lower1 = "HI PYTHON".lower()print(str_lower1)str_lower2 = "HI PYTHON".casefold()print(str_lower2)输入: hi pythonhi python求一个数字的因数import mathfact_5 = math.factorial(5)print(fact_5)输入: 120从列表中失去一个最长的字符串words = ['Hello', 'Python', 'Hello', 'world']print(max(words, key=len))输入: Python用 print()写入文件print("Hello, World!", file=open('test.txt', 'w'))获取日期import time;print(time.ctime())输入: Sun Oct 30 22:52:41 2021从字符串中删除数字test_str = ''.join(list(filter(lambda x: x.isalpha(), 'abc4532def4fg56vcg2')))print(test_str)输入: abcdeffgvcg一行代码求 n 个间断数之和# 第一种形式n = 50sum_n1 = sum(range(0, n+1))print(sum_n1)#第二种形式sum_n2 = n*(n+1)//2print(sum_n2)求某字符串中某个字符呈现的频率print("hello python".count('l')) # 2从列表中删除反复元素list(set['p','y','t','h','o','n'])按"键"对字典进行排序# d = {'five': 5, 'one': 1, 'four': 4, 'eight': 8}  {key:d[key] for key in sorted(d.keys())}  # {'eight': 8, 'five': 5, 'four': 4, 'one': 1}按值对字典进行排序# x = {1: 2, 3: 4, 4: 3, 2: 1, 0: 0}  {k: v for k, v in sorted(x.items(), key=lambda item: item[1])}  # {0: 0, 2: 1, 1: 2, 4: 3, 3: 4}过滤列表中的偶数list(filter(lambda x: x%2 == 0, [1, 2, 3, 4, 5, 6] ))  # [2, 4, 6]总结对于 Python 小技巧-一行代码的操作还很多,前面咱们缓缓摸索,心愿大家一起提高。 以上就是本次分享的所有内容,如果你感觉文章还不错,欢送关注公众号:Python编程学习圈,每日干货分享,发送“J”还可支付大量学习材料,内容笼罩Python电子书、教程、数据库编程、Django,爬虫,云计算等等。或是返回编程学习网,理解更多编程技术常识。

August 4, 2022 · 1 min · jiezi

关于python:妙不可言写出优雅的-Python-代码的七条重要技巧

写出能实现性能的程序每个程序员都能够搞定,但能写出优雅的程序的程序员却寥寥无几,因而程序写的优雅与否则是辨别顶级程序员与个别程序员的终极指标所在。 那身为一名 Pythoner,有哪些技巧能让咱们写出优雅的 Python 代码呢,明天派森酱就给大家介绍七个能疾速晋升代码逼格的重要技巧。 0x00 标准命名没有哪个程序员会抗拒一段命名标准的代码! 命名作为编程界的一大难题,实属难倒了很多人。不晓得你是否还记得本人那些已经很沙雕的命名呢。 a,b,c  x,y,z a1,a2 4_s,4s... def do_something():def fun():...置信你看到下面的命名也是一头雾水,好的命名不肯定要写的多优雅,最起码要做到见名识意。对立的命名格调能够让代码看起来更简洁,格调更对立,这样阅读者一看就晓得这个变量或者函数是用来干嘛的,不至于猜半天节约过多的精力在不必要的事件上。 0x01 面向对象Python 是一门面向对象语言,因而咱们有必要相熟面向对象的一些设计准则。 繁多职责准则是指一个函数只做一件事,不要将多个性能集中在同一个函数中,不要大而全,要小而精。这样,当有需要变动时,咱们只须要批改对应的局部即可,程序应答变动的能力显著晋升。 凋谢关闭准则是指对扩大凋谢,对批改敞开。 写程序的都晓得,甲方是善变的,明天说用这种形式实现,今天可能就变更了,这太失常了。所以咱们写程序时肯定要留神程序的可扩展性,当甲方改变需要时,咱们尽可能的少改变或者不改变原有代码,而是通过增加新的实现类来扩大性能,这意味着你零碎的原有性能是不会受到毁坏的,则稳定性有极大晋升。 接口隔离准则是指调用方不应该依赖其不须要的接口,接口间的依赖关系该当建设在最小性能接口准则之上。 繁多职责和接口隔离都是为了进步类的内聚性,升高他们之间的耦合性。这是面向对象封装思维的完满体现。 0x02 应用 with平时写代码难免会遇到操作文件的需要,个别都是用 open() 函数来关上一个文件,最初等操作实现之后通过 close() 函数来敞开文件,但有时候写多了难免会感觉很麻烦,难道不能够在我操作完主动敞开文件么,能够的。应用 with 来操作文件无需思考敞开问题,咱们只须要关怀外围的业务逻辑即可。 with open('tmp.txt', 'w') as f:    f.write('xxx')    ...0x03 应用 get 当咱们从字典中获取一个不存在的 key 时,如果是用中括号的形式来获取的话程序会返回 KeyError。这时候倡议通过 get() 函数来获取。 同时通过 get() 函数来获取 value 时还能够设置默认值 default_value,当 key 不存在时则会返回 default_value。 0x04 提前返回平时写的代码中少不了 if else 等管制语句,但有时候有的小伙伴喜爱将 if else 嵌套好多层,过几个月之后本人都看不明确过后写的啥。 比方上面这个程序,依据考试成绩来做评级。 score = 100if score >= 60: # 及格    if score >= 70: # 中等        if score >= 80: # 良好             if score >= 90: # 优良                if score >= 100: # 满分                    print("满分")                else:                    print("优良")            else:                print("良好")        else:            print("中等")    else:        print("及格")else:    print("不及格")print("程序完结")这种代码一看就想打人有木有,可读性极差。 代码的逻辑就是判断分数是否在一个区间,而后给出与之相匹配的评级,既然如此,则能够改写如下: def get_score_level(score):    if score >= 100: # 满分        print("满分")        return    if score >= 90: # 优良        print("优良")        return    if score >= 80: # 良好        print("良好")        return        if score >= 70: # 中等        print("中等")        return    if score >= 60: # 及格        print("及格")        return    print("不及格")    print("程序完结")这种解决形式是极其优雅的,从上往下清晰明了,大大增加了代码的可读性和可维护性。 0x05 生成器咱们都晓得通过列表生成式能够间接创立一个新的列表,但受机器内存限度,列表的容量必定是无限的。如果列表外面的数据是通过某种法则推导计算出来的,那是否能够在迭代过程中一直的推算出前面的元素呢,这样就不用一次性创立残缺个列表,按需应用即可,这时候生成器就派上用场了。 0x06 装璜器试想一下如下的场景,当后端接管到用户申请后,须要对用户进行鉴权,总不能将鉴权的代码复制来复制去吧;还有咱们的我的项目都是须要记录日志的,这两种状况最适宜应用装璜器。事实上 Flask 框架中就大量应用装璜器来进行鉴权操作。 所有皆对象! 在 Python 中咱们能够在函数中定义函数,也能够从函数中返回函数,还能够将函数作为参数传给另一个函数。 def hi(name="yasoob"):    print("now you are inside the hi() function")     def greet():        return "now you are in the greet() function"     def welcome():        return "now you are in the welcome() function"     print(greet())    print(welcome())    print("now you are back in the hi() function")hi()# output# now you are inside the hi() function# now you are in the greet() function# now you are in the welcome() function# now you are back in the hi() function在下面的代码中,咱们在 hi() 函数外部定义了两个新的函数,无论何时调用 hi() 其外部的函数都将会被调用。 def hi(name="yasoob"):    def greet():        return "now you are in the greet() function"     def welcome():        return "now you are in the welcome() function"     if name == "yasoob":        return greet    else:        return welcome a = hi()print(a)print(a())# output# <function hi.<locals>.greet at 0x7fe3e547a0e0># now you are in the greet() function在这个例子中,因为默认参数 name = yasoob 因而 a = hi() 返回的是 greet 函数。a 也就指向了 hi() 函数外部的 greet() 函数。 def hi():    return "hi yasoob!" def doSomethingBeforeHi(func):    print("I am doing some boring work before executing hi()")    print(func()) doSomethingBeforeHi(hi)# output# I am doing some boring work before executing hi()# hi yasoob!在最初这个例子中,咱们将 hi() 函数传递给了另外一个函数,并且他们还很欢快的执行了。 当初,让咱们来看看 Python 中的装璜器吧。 ...

August 4, 2022 · 1 min · jiezi

关于python:疫情下如何通过华为云会议提升工作效率华为云至简致远

【摘要】 华为云会议能为客户提供全场景端云协同视频会议解决方案,满足跨地区、跨企业、跨终端的智能沟通合作需要。特地在目前疫情环境下,可通过华为云会议晋升团队工作效率。1、 简介华为云会议是华为公司自主研发的一款会议产品,能为客户提供全场景端云协同视频会议解决方案,满足跨地区、跨企业、跨终端的智能沟通合作需要。特地在目前疫情环境下,可通过华为云会议晋升团队工作效率。2、性能个性2.1、 多终端接入反对华为云会议软硬件终端、第三方硬件终端多种会议终端接入,满足各类会议场景。 2.2、极简入会流程会议发起人能够通过微信、短信、邮件、链接、二维码多种形式分享会议。为满足各种场景,不同与会者的需要,提供多种形式灵便入会。 受邀入会当软终端处于登录状态,在会议开始时,软终端会接管到来电邀请入会。 会议列表入会如果会议发起人在预约会议时增加了与会者,相应的与会者能够从会议列表中提前进入会议。 会议ID入会已知会议ID和明码,能够间接输出会议ID和明码入会。 扫码入会挪动客户端反对通过扫描二维码退出会议。 链接入会当收到其余与会者分享的会议链接、微信链接、短信链接时,点击链接能够立刻入会(需装置客户端)。 匿名入会与会者没有华为云会议帐号时,下载软终端,从会议发起人或其余与会者获取会议ID后,输出会议ID(和会议明码),即可匿名入会。 2.3、共享标注会议过程中能够同步共享数据,还能够软硬件终端多方同时标注,实时互动。 数据共享:反对桌面屏幕共享(多个屏幕时,可抉择任一屏幕进行共享),程序共享和白板共享。程序能够是计算机中的PowerPoint文档、音视频文件及其他可在桌面显示的内容,或者正在运行的某个利用程序界面。白板标注:反对协同标注,观看共享桌面/白板/程序时,可进行标注,实时双向互动。近程帮助:反对近程连贯参会者计算机,提供反对和在线合作。2.4、聊天反对会中成员文字聊天,主持人能够设置是否容许聊天,沟通更便捷 2.5、字幕/字幕翻译桌面端(Windows、MAC),在主持人、与会者进入会议时,可开启字幕/字幕翻译性能,带来更好的观看体验 开启字幕:将主持人、与会者的语音(普通话)转为实时中文字幕并显示,帮忙会中成员加深了解会议内容 字幕翻译:反对中文字幕实时翻译成英文,对英文与会者敌对 会中字幕记录:记录所有与会者谈话的记录,可查阅会中记录,防止重点内容脱漏 2.6、会议录播/直播会议录播/直播,让企业参会者扩大至万人规模。 录播服务1080P高清录制,高效转码。视频、音频、辅流多流录制,会议细节不脱漏。会议录制文件网上存储,随时随地下载。直播平台微信、微博、网页等平台间接观看,零门槛接入。短信、邮件等便捷告诉形式。直播过程可IM音讯和语音高效互动。多维数据统计,业务后果量化。2.7、智能会议室智能会议室,业余音视频和AI加持,更智能的会议体验。 端云协同会议:会议室与挪动会议完满交融,内外部会议无缝连接;IdeaHub、手机、电脑,多端随时接入会议,顺畅沟通。业余音视频:独创专有硬件加速,265编解码,高清视频,性能更优;独创智能音幕,自定义拾音区,AI打造的专属会议空间。无线投屏:多种无线投屏形式;反对反向管制,更优投屏体验。近程合作:屏幕/白板共享,多方同时标注,近程合作如同本地。智能助手:语音操控,开释双手。2.8、网络研讨会网络研讨会是会议+直播的交融体验,比一般会议反对更大容量,比企业级直播具备更低无感知时延和更强的音视频互动能力。 网络研讨会在会议根底上,新增一种仅观看权限的观众角色,观众角色在主持人管制下观看音视频、语音谈话和文字聊天。2.9、会议管制Web端、PC桌面端、挪动客户端,多端超强会控能力。 2.10、治理平台资源管理、业务发放、会议治理融为一体,企业管理员轻松把握企业资源应用状况。资源管理:并发资源、云会议室资源、硬终端接入帐号、电子白板接入帐号、智慧屏接入帐号、IdeaHub接入帐号、录播空间、直播端口。业务发放:用户治理、硬终端治理、电子白板、智慧屏、云会议室、内部联系人。会议治理:正在召开、行将召开、历史会议、录制文件、会议设置。3、华为云会议可靠性保障华为云会议打造高可靠性集群资源,反对双机互为热备,同时在接入侧、媒体承载实现流量管制,保障会议业务的可靠性。3.1、 双机和集群双机是指当主机产生故障时,由备机接管业务;集群是指某个业务节点通过多台集群分担负荷,能够进步零碎反对的容量、性能以及可靠性。华为云会议次要零碎部件的HA(High Availability)计划如下图所示。3.2、流量管制华为云会议反对流量管制(简称流控),在零碎产生过载的状况下,通过回绝新呼叫的伎俩,也能保障局部正在运行的业务失常运行,并促使整个零碎逐步恢复正常。3.3、QoS保障华为云会议采纳了翻新的超强纠错(SEC)技术、智能调速(IRC)技术和丢包重传(ARQ)计划实现了QoS的保障。4、华为云会议劣势华为云会议,让沟通合作更高效。4.1、视频会议清晰度高智能合作屏幕共享、白板共享、投屏共享等多种数据分享形式。4K超高清数据共享,多人在线实时标注。近程操控电脑,随时随地实现电脑演示和操作。4.2、端云协同电脑、手机、平板、会议室终端、智慧大屏,信息在各个终端间无缝流转。PC或手机4K超清投大屏,大屏亦可反向管制小屏。大屏反向投屏到PC或手机,近程观看更不便。4.3、简略易用高清视频会议4K超高清数据共享,1080p高清视频。业界首家挪动端720p,手机可开高清视频会议。端到端时延<200ms,业界当先,实时晦涩。超强网络适应能力,30%视频抗丢包,80%音频抗丢包。4.4、智能合作简略易用、便捷分享一键发动会议,按日、周、月预约会议。短信、邮件、微信疾速分享会议告诉,日历会议告诉,自定义会议揭示工夫。会议ID、会议链接、二维码疾速入会,多种硬件终端疾速入会。通讯录、二维码、微信、短信、邮件等形式邀请与会者。5、利用场景5.1、企业办公典型利用场景批发/餐饮企业日常治理会商以及培训赋能、近程设计参谋征询、企业新品在线发布会、车企4S店专家近程技术支持、近程招聘面试。满足各种规模企业的各类会议需要。能够通过会议室终端,以及PC桌面端和挪动客户端交融组网,实现会议室、集体桌面、挪动办公等多地区多种接入形式的灵便利用场景。能够应用一套云视频会议零碎,在不同国家、不同地区建设会议室,或通过客户端退出会议,实现跨国会议合作随时随地开启,晦涩沟通合作,缩小出差老本。劣势简略易用,高清稳固,高效协同,平安可信。5.2、近程医疗典型利用场景近程会诊、家庭医生视频基层首诊、近程手术示教。针对医疗现场空间狭小和升高手术感化危险,手术现场无奈多人观摩的状况,通过华为提供的高清视频会议云服务,让手术影像能够实时传送到远程教室的显示屏上,让在远程教室的学生能够观摩到一场纤毫毕现的示教手术。针对重点常识和疑难,学生还能够与现场医生进行近程互动。劣势超高清,业余终端,全能力凋谢,易集成。5.3、智慧教育典型利用场景家校互动、近程名师课堂、高校培训、优良课程录制、校企联结科研。华为会议云服务搭建学习平台,能够联合第三方教育平台,提供精品课程、直播课堂等内容。学生只须要通过PC、平板、手机即可近程接入教学课堂听课以及师生互动。同时教育平台还能够应用会议平台组织教学研究、经验交流、对新上岗老师听课评课等。劣势无需专线接入,多终端协同,第三方平台集成,高效合作。5.4、金融行业典型利用场景基金/期货/证券公司新品讨论会、新业务全员培训、近程金融专家参谋征询、偏僻中小企业及集体放贷征询。华为会议云服务能够实现跨企业交换、跨国交换,无需账号登录即可疾速入会。当先的音视频解决技术,仅需1~2M一般互联网带宽即可实现1080p高清视频交换,让用户享受“面对面”的交换体验。劣势高清低带宽,寰球笼罩,反对混合云部署,AI加持,平安可信,反对支流终端利旧。5.5、制作、交通、建筑行业典型利用场景总部/分公司/站点间日常行政和工作会议、总部/分公司/站点间的视频调度指挥、现场连线专家进行技术领导、制作设计协同。通过多方1080p高清视频会议,以及电脑屏幕和数据共享能力,为总部/分公司/站点搭建一个随时能够面对面交换探讨的信息化平台。独有的VME专利技术提供优质的视频图像处理能力和超强的互联网抗丢包能力,让各地能够不便地接入视频会议,通过高清实时的视频画面,专家能够间接查看现场状况,实时给出领导。劣势全场景笼罩,高效合作。5.6、政府基层组织建设典型利用场景政府基层党建、精准扶贫领导、税务常识遍及培训、近程司法支援。针对党建工作须要深刻到各级市、县、乡、村镇,地区散布广途程远的特点,提供端到端1080p云化视频会议解决方案。市级洽购CloudLink BOX系列终端建设大中型会议室。乡级、村级洽购IdeaHub和PC软终端,构建小型会议室或桌面接入。确保各级各地都能取得如临现场般的沟通体验。劣势5线BGP线路、免专线接入,AI加持,混合云,反对支流终端利旧,平安可信。6、华为云会议操作领导6.1、疾速入门6.2、收费注册体验通过Web端、桌面客户端或挪动客户端三种形式注册免费版集体帐号。注册胜利后,可立刻创立会议。通过Web端收费注册体验在华为云会议产品首页单击“收费体验”,进入注册页面。依据界面提醒实现注册。   2. 登录华为云会议治理平台,能够体验创立立刻会议、预约会议等性能。通过桌面客户端收费注册体验进入下载页面,单击“立刻下载”,下载并装置桌面客户端。单击“登录/注册”,依据界面提醒实现注册。单击“立刻应用”,即可登录桌面客户端。     3.点击“发动会议”、“预约会议”,即可体验创立立刻会议、预约会议等性能。通过挪动客户端收费注册体验下载挪动客户端,有以下三种形式:请扫描以下二维码下载安装挪动客户端。返回华为云会议官网下载并装置挪动客户端。返回利用商店或APP Store,搜寻“华为云会议”。   3. 点击“注册帐号”,依据界面提醒实现注册。点击“立刻应用”,即可登录挪动客户端。   4.   点击“发动会议”、“预约会议”,即可体验创立立刻会议、预约会议等性能。6.3、创立企业/组织创立企业/组织后,您将成为该企业/组织的管理员,能够增加或治理成员。通过Web端创立企业/组织进入华为云会议治理平台。在页面右上角单击“创立企业/组织”。在“企业治理”、“终端治理”或“会议治理”页面单击“创立企业/组织”。  4. 填写企业/组织信息,点击“实现并创立”。通过桌面客户端创立企业/组织在“通讯录”界面单击“创立企业”。   2. 填写企业/组织信息,点击“实现并创立”。通过挪动客户端创立企业/组织在“联系人”界面单击“立刻创立”。  2.  填写企业/组织信息,点击“创立”。6.4、体验会议性能用户能够创立会议,体验收费会议性能。创立会议在桌面客户端创立立刻会议点击“发动会议”即可马上召开会议。在挪动客户端创立立刻会议在“发动会议”界面,点击“立刻开始”即可马上召开会议。更多创立会议形式请参见桌面客户端创立会议、挪动客户端创立会议、Web端创立会议。进入会议立刻会议创立胜利后,被邀请的与会者将收到会议复电。桌面客户端挪动客户端6.5、云会议室模式企业购买了云会议室资源,云会议室管理员能够应用云会议室召开会议,其余用户只能退出会议,不能创立会议。若企业同时购买了多个云会议室资源,各云会议室资源互相独立,同一个会议中不能同时用多个云会议室资源。应用流程登录华为云会议治理平台您能够应用IE11及以上版本、Chrome46及以上版本、FireFox41及以上版本浏览器拜访华为云会议治理平台。您能够通过以下两种形式登录。应用企业管理员帐号登录华为云会议治理平台。企业管理员帐号及明码请从华为云会议开明邮件或短信中获取,此帐号仅用于登录治理平台。企业管理员如果须要登录华为云会议客户端,请为本人增加普通用户帐号。应用华为云账号通过华为云会议产品首页进入治理平台。在华为云会议产品首页单击“治理后盾”,输出华为云账号和明码并点击“登录”,在华为云会议控制台单击“返回治理平台”。创立用户帐号您须要为企业用户创立用户帐号,企业用户能力应用该帐号玩转会议。抉择“企业治理 > 会议用户”,单击“增加”。   2. 依照文本框中的提醒填写用户信息,单击“保留”。增加实现后,在“企业治理 > 会议用户”页面能够看到增加的用户。用户帐号和明码将通过短信或邮件的形式告诉会议用户。如何批量导入创立用户帐号请参见用户治理。调配云会议室您须要将云会议室调配给某个用户,使其成为该会议室的会议管理员。进入“企业治理 > 云会议室”页面,点击云会议室右侧“软终端用户”列中的“调配”按钮。     2. 在“云会议室调配”窗口,抉择指定的用户。     3. 点击“确定”为其调配云会议室。7、 总结目前随着疫情重复多发,全国各城市随时面临着居家办公危险。通过华为云会议,能进步团队之间沟通效率,晋升团队的工作效率。【华为云至简致远】有奖征文炽热进行中:https://bbs.huaweicloud.com/b... 想理解更多的华为云产品相干信息,请分割咱们:电话:950808按0转1

August 3, 2022 · 1 min · jiezi

关于python:云硬盘EVS详解以及如何用与避坑华为云至简致远

【摘要】 传统固态盘可能你相熟它,然而在云原生时代背景如何助力企业从存储上降本增效,是一个很广泛重要话题值得切磋,满满地技术干货,各位衣食父母记得点赞激励下本文的次要内容有:一 啥是EVS及劣势是啥二 各项技术指标详解三 与其余服务关系是什么四 怎么不同所需场景五 试验各项筹备工作六 咋用云硬盘EVS一  啥是EVS及劣势是啥1 如何定义呢简略来说云硬盘是一种给ECS、BMS等计算服务提供规格丰盛,性能优越,安全可靠并且可弹性扩大的持久性块存储服务,通过数据冗余和缓存减速等多项技术,提供高可用性和持久性,以及稳固的低时延性能;并且您还能够对云硬盘做格式化、创立文件系统等常见操作;满足不同场景的业务需要,实用于分布式系统,开发测试,数据仓库及高性能计算等场景,几乎屌爆了(狗头)。2 劣势是啥二 各项技术指标详解2.1 规格丰盛啊EVS有高IO,通用型SSD,超高IO,极速型SSD,可满足不同业务场景的需要,更加深刻了解参数区别请看下图它们的不同;针对不同参数具体地比照,大家不难看到不论是哪种类型它的零碎以及数据盘最大容量竟然是雷同的哦,所以咱们重点看咱们的场景来选,极速型SSD典型用在数据库是比拟好,超高IO用在企业关键性业务,适宜高吞吐,低时延的工作负载;同时能够看到不同盘的IOPS是有差距并且是递加的,依据本人理论须要选;2.2 性能指标优越IOPS:云硬盘每秒读写的操作次数;吞吐量:云硬盘每秒胜利传送的数据量,即读取与写入的数据量;IO读写时延:云硬盘间断两次进行读写操作所须要的最小工夫距离;云硬盘的性能与数据块大小密切相关。当最大IOPS或最大吞吐量中有一项指标达到最大值时,此时云硬盘性能达到最大,另一项指标无奈再持续回升。对于小数据块,例如4 KB和8 KB,性能可达到最大IOPS。对于≥ 16 KB的大数据块,性能可达到最大吞吐量。以超高IO云硬盘为例,依据公式推算,超高IO云硬盘容量≥ 964 GB时,IOPS最大可达50000,吞吐量最大可达350 MB/s。但理论状况并非如此哦;2.3 技术安全可靠能够对新创建的云硬盘进行加密,采纳行业标准的XTS-AES-256加密算法,利用密钥加密云硬盘。加密云硬盘应用的密钥由数据加密服务(DEW,Data Encryption Workshop)中的密钥治理(KMS,Key Management Service)性能提供,无需您自行构建和保护密钥治理基础设施,平安便捷。KMS应用合乎FIPS 140-2第3等级认证的硬件安全模块(HSM,Hardware Security Module),从而爱护密钥的平安。所有的用户密钥都由HSM中的根密钥爱护,防止密钥泄露,然而你买了那就不能改加密了哦。2.3.1 加密应用场景对于一个租户而言,区域以及我的项目下的用户关系示意图看上面,以区域B为例,依据首次应用加密性能的用户是否领有“Security Administrator”权限分为以下两个场景: 如果平安管理员首次用加密性能,则操作流程是这样:受权EVS拜访KMS受权胜利后,零碎会为您创立默认主密钥“evs/default”,此密钥用来加密云硬盘敲黑板啦:云硬盘的加密依赖KMS,首次应用加密性能时,须要受权EVS拜访KMS。当受权胜利后,用户组中的所有用户应用加密性能均无需再次进行受权操作抉择密钥。您能够抉择应用的密钥如下:默认主密钥“evs/default”。用户主密钥,即您在应用云硬盘加密性能前曾经创立的密钥,或者新创建密钥,创立办法;平安管理员胜利应用加密性能后,则区域B中的所有用户都能够间接应用加密性能如果是用户E(普通用户)首次应用加密性能,则操作流程如下:用户E应用加密性能,零碎提醒权限有余,无奈受权EVS拜访KMS分割平安管理员,让平安管理员受权EVS拜访KMS受权胜利后,用户E以及区域B中的所有用户都能够间接应用加密性能,无需再分割平安管理员进行受权啦另外备份及快照的区别可能还傻傻分不清楚,然而目标都是一样的都是给存储在云硬盘中的数据提供冗余备份,确保高可靠性2.3.2 什么是磁盘模式依据是否反对高级SCSI命令来划分磁盘的一种模式,分成VBD(虚构块存储设备)和SCSI(小型计算机系统接口)类型,咱们云硬盘的默认是VBD类型的哈,如果应用SCSI磁盘还是举荐大家配合虚拟化类型为KVM ECS来用更加好,具体请看上面; 2.3.3 EVS权限治理默认下,管理员创立的IAM用户没有任何权限,须要将其退出用户组,并给用户组授予策略或角色,能力使得用户组中的用户取得对应的权限,这一过程称为受权 受权后,用户就能够基于被授予的权限对云服务进行操作;特地留神的是,EVS部署是通过物理区域来划分,为我的项目级服务,须要各区域(如华北-北京四)对应的我的项目(cn-north-4)设置策略,并且该策略仅对此我的项目失效,如果须要所有区域都失效,则须要在所有我的项目都设置策略。这样拜访EVS,就须要先切换至受权区域;2.3.4 快照与备份 备份就是一个备份对象执行一次备份工作产生的备份数据,包含备份对象复原所须要的全副数据。云备份产生的备份分为上面几种类型:云硬盘备份:云硬盘备份提供对云硬盘的基于快照技术的数据保护;云服务器备份:云服务器备份提供对弹性云服务器和裸金属服务器的基于多云硬盘一致性快照技术的数据保护。同时,未部署数据库等利用的服务器产生的备份为服务器备份,部署数据库等利用的服务器产生的备份为数据库服务器备份;SFS Turbo备份:SFS Turbo备份提供对SFS Turbo文件系统的数据保护;混合云备份:混合云备份提供对线下备份存储OceanStor Dorado阵列中的备份数据以及VMware服务器备份的数据保护;敲黑板啦:备份数据反对用户间的共享,您能够通过其余用户共享的备份数据创立新的云硬盘三 与其余服务关系是什么 3.1 共享云盘须要留神的点:能够创立VBD类型的共享云硬盘和SCSI类型的共享云硬盘。倡议你把共享云硬盘挂载至位于同一个反亲和性云服务器组内的ECS,这样能进步业务牢靠VBD类型的共享云硬盘:创立的共享云硬盘默认为VBD类型,该类型云硬盘可提供虚构块存储设备,不反对SCSI锁。当您部署的利用须要应用SCSI锁时,则须要创立SCSI类型的共享云硬盘;SCSI类型的共享云硬盘:SCSI类型的共享云硬盘反对SCSI锁;四 ⛳ 不同场景如何用数据仓库场景是针对大数据等进行数据长久化存储;ECS通过大带宽低时延网络连接EVS进行数据交换性能,在Oracle RAC数据库当中通过EVS与BMS裸金属服务器相结合能达到低延时,另外是SAP HANA数据库采纳EVS是一个不错抉择,如果大家部署EVS遇到问题有对应专家团队进行技术支持; 还用于NoSQL/关系型数据库来用;还用于高性能计算场景比方HPC;高性能场景的劣势超高IO云硬盘具备单盘最高50000IOPS,吞吐量每秒350MB,拜访时延低至1ms等,能满足HPC场景的高要求,共享云硬盘的个性使得EVS成为业界惟一能撑持Lustre,GPFS等并行零碎部署的云硬盘大家生产与业务迁徙过程遇到问题,征询华为云官网会进行解答;专属存储的劣势在于存储资源独享,保障数据安全与合规性;还有其余劣势比方保障读写性能稳固,免运维以及按需购买;采纳专属存储DSS对接专属云中的ECS,BMS等计算服务,以满足政府,金融以及大型企业对高性能,稳定性以及数据安全和监管诉求,专属存储对接专属云场景五 试验各项筹备工作5.1.首先买云硬盘EVS登录治理控制台,鼠标挪动到试验操作桌面浏览器页面中左侧菜单栏,抉择“服务列表>存储 > 云硬盘EVS”。进入云硬盘EVS官网页面;而后单击“购买磁盘”,下图这样操作如下:①【计费模式】:按需计费②【区域】:华北-北京四③【可用区】:可用区1④【磁盘规格】:通用型SSD(若无此规格,可选界面存在的规格)⑤【磁盘大小】:20G⑥【云备份】:暂不购买⑦【更多】:暂不配置⑧【磁盘名称】:volume-windows⑨【购买量】:1 而后单击“立刻购买”,在“详情”页面,您能够再次核查云硬盘EVS信息。确认无误后,单击“提交”,开始创立云硬盘EVS。如果还须要批改,单击“上一步”,批改参数就行啊返回“磁盘列表”。在“云硬盘EVS”主页面,就能查看云硬盘EVS状态,待云硬盘EVS状态变为“可用”时,表明创立胜利,并且能够进行挂载及扩容操作;5.2.挂载非共享云硬盘EVS独自购买的云硬盘EVS为数据盘,能够在云硬盘EVS列表中看到磁盘属性为“数据盘”,磁盘状态为“可用”。此时须要将该数据盘挂载给弹性云服务器ECS应用。系统盘必须随弹性云服务器ECS一起购买,并且会主动挂载,能够在云硬盘EVS列表中看到磁盘属性为“系统盘”,磁盘状态为“正在应用”。当系统盘从弹性云服务器ECS上卸载后,此时系统盘的磁盘属性变为“启动盘”,磁盘状态变为“可用”(非共享云硬盘EVS可了解为电脑购买的SSD硬盘或SATA盘,挂载后就对应电脑中C、D、E硬盘);在云硬盘EVS列表,找到咱们所创立的云硬盘,而后点击右侧操作中的【挂载】,弹出挂载磁盘配置窗口实现配置就行抉择云硬盘EVS待挂载的弹性云服务器ECS,此处咱们抉择ecs-windows,该弹性云服务器ECS必须与云硬盘EVS位于同一个可用分区哈这个后面我曾经讲过的,通过下拉列表抉择“挂载点”,挂载点是数据盘,单击“确认”;返回云硬盘EVS列表页面,此时云硬盘EVS状态为“正在挂载”,示意云硬盘EVS处于正在挂载至弹性云服务器ECS的过程中,当云硬盘EVS状态为“正在应用”时,示意挂载至弹性云服务器ECS胜利,下一步进行初始化就能失常应用啦; 5.3.初始化Windows云硬盘EVS云硬盘EVS挂载至弹性云服务器ECS后,须要登录弹性云服务器ECS初始化云硬盘EVS,即格式化云硬盘EVS,之后云硬盘EVS才能够失常应用,抉择“服务列表>弹性云服务器ECS”。进入弹性云服务器ECS页面;而后抉择相应的windows弹性云服务器ECS,最初点击近程登录就行应用其余形式(VNC)登录,点击“立刻登录”这个简略,第一种要下RDP文件麻烦一点,要绑定弹性公网EIP 放弃哈哈点击左上角“Ctrl+Alt+Del”按钮进入登录页面,输出明码登录Windows弹性云服务器ECS:【明码】是沙县李用预置环境信息中云服务器名称为ecs-windows的用户明码哈在弹性云服务器ECS桌面,页面下滑抉择“开始”,而后在菜单列表外面选“服务器管理器”,而后文件和存储服务->磁盘->工具 -> 计算机管理页面;在左侧导航树外面,抉择 存储 –> 磁盘治理,进入“磁盘治理”页面,如果新挂载磁盘显示为“没有初始化”,则右键单击在菜单列表中抉择“初始化磁盘”。在“初始化磁盘”对话框中显示须要初始化的磁盘,选中“MBR(主启动记录)”或者“GPT (GUID 分区表)”,单击“确定”实现设置若新挂载磁盘为“脱机”状态,那么在磁盘1区域,右键单击后在菜单列表中抉择“联机”,进行联机即可啦右键单击磁盘上未调配的区域,抉择“新建简略卷”弹出“新建简略卷向导”对话框,依据界面提醒,单击“下一步”,这刚买电脑预计大家都本人扩过盘符依据须要指定卷大小,默认为最大值,单击“下一步”调配驱动器号,单击“下一步”勾选“按下列设置格式化这个卷”,并依据理论状况设置参数,格式化新分区,单击“下一步”实现分区创立单击“实现”实现向导。须要期待片刻让零碎实现初始化操作,当卷状态为“状态良好”时,示意初始化磁盘胜利进入弹性云服务器ECS的计算机,能够看到呈现了新的磁盘,阐明已挂载胜利,是不是很简略;登录治理控制台,鼠标挪动到试验操作桌面浏览器页面中左侧菜单栏,抉择“服务列表>存储 > 云硬盘EVS”。进入云硬盘EVS页面单击“购买磁盘”依据界面提醒,配置云硬盘的根本信息①【计费模式】:按需计费②【区域】:华北-北京四③【可用区】:可用区1④【磁盘规格】:通用型SSD(若无此规格,可选界面存在的规格)⑤【磁盘大小】:20G⑥【云备份】:暂不购买⑦【更多】:暂不配置⑧【磁盘名称】:volume-linux⑨【购买量】:1 单击“立刻购买” 在“详情”页面,您能够再次核查云硬盘EVS信息。确认无误后,单击“提交”,开始创立云硬盘EVS。如果还须要批改,单击“上一步”,批改参数;而后返回“磁盘列表”,在“云硬盘EVS”主页面,查看云硬盘EVS状态。待云硬盘EVS状态变为“可用”时,示意创立胜利啦,用起来在云硬盘EVS列表,找到咱们所创立的云硬盘volume-linux,点击右侧操作中的【挂载】,弹出挂载磁盘配置窗口而后选云硬盘EVS待挂载的弹性云服务器ECS,此处咱们抉择ecs-linux,该弹性云服务器ECS必须与云硬盘EVS位于同一个可用分区,通过下拉列表抉择“挂载点”,挂载点为数据盘,单击“确认”最初返回云硬盘EVS列表页面,此时云硬盘EVS状态为“正在挂载”,示意云硬盘EVS处于正在挂载至弹性云服务器ECS的过程中。当云硬盘EVS状态为“正在应用”时,示意挂载至弹性云服务器ECS胜利,下一步进行初始化能力失常应用 5.3 近程登录linux弹性云服务器ECS抉择“服务列表>弹性云服务器ECS”。进入弹性云服务器ECS页面复制名称为“ecs-linux”的弹性云服务器ECS的弹性公网IP回到【试验操作桌面】,双击“Xfce终端”关上Terminal,执行如下命令(应用弹性公网IP地址替换命令中的EIP),登录弹性云服务器ECSLANG=en_us.UTF-8 ssh root@EIP①承受秘钥:输出“yes”回车;②输出明码:应用预置环境信息中云服务器名称为ecs-linux的用户明码(输出明码时,命令行窗口不会显示明码,输完之后间接回车);登录胜利如下图所示:六  咋用云硬盘EVS执行上面命令,查看新增数据盘有哪些fdisk -l示意以后的弹性云服务器ECS有两块磁盘,“/dev/vda”是系统盘,“/dev/vdb”是新增数据盘6.1 初始化Linux云硬盘EVS执行上面命令,进入fdisk分区工具,开始对新增数据盘执行分区操作,fdisk新增数据盘,以新挂载的数据盘“/dev/vdb”为例:fdisk /dev/vdb而后输出“n”,按回车键“Enter”,就开始新建分区这里以创立一个次要分区为例,输出“p”,按回车键“Enter”,开始创立一个主分区,用分区编号抉择“1”为例,而后输出主分区编号“1”,按回车键“Enter”“First sector”示意初始磁柱区域,咱们能够抉择2048-20971519这个范畴,默认为2048;还是以抉择默认初始磁柱编号2048为例,不输出命令,间接按回车键“Enter”即可啦;另外“Last sector”示意截止磁柱区域,能够抉择2048-20971519,默认为20971519,这里我抉择默认截止磁柱编号20971519为例,不输出命令,间接按回车键“Enter”即可;下面示意分区实现,即为10GB的数据盘新建了1个分区,而后输出“p”,按回车键“Enter”,就能查看新建分区的详细信息;示意新建分区“/dev/vdb1”的详细信息,输出“w”,按回车键“Enter”,能够把分区后果写入分区表外面去啦;敲黑板啊:如果之前分区操作有误,那么请输出“q”,否则会退出fdisk分区工具,之前的分区后果将不会被保留的哦执行以下命令,将新的分区表变更同步至操作系统外面partprobe执行以下命令,把新建分区文件系统设为零碎所需格局,mkfs -t 文件系统格局 /dev/vdb1,这里来设置文件系统为“ext4”为例:mkfs -t ext4 /dev/vdb1格式化须要期待一段时间,不要退出,而后期待工作状态为done,执行以下命令,新建挂载点,还是以新建挂载点“/mnt/sdc”为例:mkdir /mnt/sdc执行以下命令,把新建分区挂载到上步新建的挂载点下,这里还是挂载新建分区至“/mnt/sdc”为例:mount /dev/vdb1 /mnt/sdc执行以下命令,就能查看挂载后果df -TH上图示意新建分区“/dev/xvdb1”曾经挂载到“/mnt/sdc”了,而后在默认浏览器中新建标签页,复制以下链接,以查看扩容“正在应用”状态的云硬盘EVS容量【https://support.huaweicloud.c...】默认浏览器外面新建标签页,复制以下链接,以查看扩容“可用”状态的云硬盘EVS容量就行【https://support.huaweicloud.c...】【华为云至简致远】有奖征文炽热进行中:https://bbs.huaweicloud.com/b...想理解更多的华为云产品相干信息,请分割咱们:电话:950808按0转1 ...

August 3, 2022 · 1 min · jiezi

关于python:手摸手带你完成智慧路灯构建及避坑华为云至简致远

本文的次要内容有:一 先实现筹备工作二 而后构建并归档软件包三 实现音讯告诉服务(SMN)四 云服务器部署初步上线五 设施接入及模拟器连贯一 ️ 先实现筹备工作后面登录,账号密码哪些略过,间接下载要用到资源先,回到桌面双击“Xfce终端”关上Terminal,输出以下命令下载保留“HubSimulator.jar”到本人的云桌面下面cd Desktop/wget https://sandbox-experiment-re...而后输以下命令保留“SmartStreetLight.zip”压缩包wget https://sandbox-experiment-re...新建我的项目而后抉择“服务列表”->“开发与运维”->“项目管理”,进入软件开发云,如下图这样敲黑板啊:不过先晓得什软件开发平台是啥?它是集华为近30年研发实际、前沿研发理念、先进研发工具为一体的一站式云端DevOps平台,面向开发者提供的云服务,即开即用,随时随地在云端进行项目管理、代码托管、流水线、代码查看、编译构建、部署、测试、公布等,从而给开发者疾速而又轻松地开启云端开发之旅。点击“立刻应用”按钮,跳转到DevCloud操作界面,它是企业级软件合作一体化DevOps平台,如下图这样DevCloud操作界面如下图:点击上图红圈标注“新建我的项目”按钮,开始创立我的项目,如下图所示:点击标注的“Scrum”区域,创立“Scrum”类型我的项目,参数如下:我的项目设置模板:Scrum项目名称:QuickStart参数填写结束,点击确定按钮即可实现我的项目创立。1.2创立代码仓库1.2.1新建仓库抉择导航栏“代码 > 代码托管”,进入治理页面,开展右上角“一般新建”下拉菜单,点击“按模板新建”1.2.2抉择模板在搜寻框中输出“IoT_Streetlight_New_Demo”,如下图所示抉择“华北-北京四”,选中该模板,单击“下一步”。1.2.3而后填仓库根本信息根本信息参数如下:①代码仓库名称:自定义,如:IoT_Streetlight_New_Demo ②抉择gitignore:Java 其余选项放弃默认单击“确定”,实现仓库创立。创立胜利后,可单击仓库名称进入仓库,查看仓库文件二 ⛳ 而后构建并归档软件包2.1新建编译构建工作点击导航栏“构建&公布 > 编译构建”,进入治理页面,点击“新建工作”,参数如下①源码源:CodeHub;②源码仓库:默认抉择1.2步创立的代码仓库;③分支:master;点击“下一步”进入“抉择构建模板”2.2抉择构建模板本我的项目是一个Java Maven我的项目,所以搜寻抉择“Maven”模板, 单击“确定”,进入“构建步骤”页面2.3而后构建步骤应用零碎模板中提供的两个默认步骤、以及每个步骤中的默认配置,即可实现本例的构建。点击“新建并执行”即可实现步骤的配置并启动构建工作,如下图所示敲黑板:构建须要2-3分钟,请急躁期待...............当呈现下面图片示意的页面时,示意构建工作执行胜利。若执行失败,就查看日志信息排查问题,或通过编译构建-常见问题查找解决办法。2.4验证构建工作执行后果点击导航栏“公布”,进入“软件公布库”页面,点击进入“IoT_Streetlight...”下的“202…”日期命名的文件夹,即可看到生成的软件包“huawei-0.0.1-SNAPSHOT.jar”2.5创立主题并订阅 SMN在华为云控制台,开展左侧目录,抉择【服务列表】->【治理与监管】 -> 【音讯告诉服务SMN】,或在服务列表搜寻框中搜寻“SMN”。什么是音讯告诉服务?留神:若提醒无权限,请确认左上角区域是否在“华北-北京四”即可在左侧导航栏,抉择“主题治理 > 主题”,单击“创立主题”,输出“主题名称”(自定义,例如:StreetLight)后单击“确定”实现主题创立三 实现音讯告诉服务(SMN)主题创立胜利后,零碎会主动生成主题URN,主题URN是主题的惟一资源标识,不可批改,后续步骤将会用到该URN点击主题“StreetLight”右侧操作“增加订阅”,可采纳短信或者邮件任意一种协定实现订阅。“短信协定”参数如下:①协定:短信②订阅终端:用户手机号码(需填写您的手机号实现此步)单击“确定”后,请查看手机接管短信,点击短信中的链接进行订阅确认“邮件协定”参数如下:①协定:邮件②订阅终端:用户邮箱地址(需填写您的邮箱实现此步)单击“确定”后,请查收邮件,点击邮件中的链接进行订阅确认四 云服务器部署初步上线4.1网络配置点击“返回控制台创立”,就能跳转到虚构公有云控制台页面在虚构公有云控制台,点击“创立虚构公有云”,区域抉择“华北-北京四”,名称自定义(如:vpc-iot),默认子网名称自定义(如:subnet-iot),其余参数均可默认,点击“立刻创立”实现后,即可返回网络配置页面;返回网络配置页面,刷新后,抉择刚创立的虚构公有云VPC(如:vpc-iot)和子网(如:subnet-iot),主动调配IP地址,如下图所示②扩大网卡:默认配置③平安组:默认配置④弹性公网IP:当初购买⑤线路:默认配置⑥公网带宽:按带宽计费⑦带宽大小:1Mbit/s4.2 高级配置实现网络配置后单击“下一步:高级配置”,参数如下:①云服务器名称:自定义,如:ecs-iot②登录凭证:明码③明码/确认明码:自定义,如:SM1$b9Zs1#⑥其余参数:默认配置实现高级配置后点击“下一步:确认配置”,浏览并勾选批准协定,单击“立刻购买”后,点击返回云服务器列表。当状态为“运行中”示意已创立实现;4.3 主机授信配置创立的弹性云服务器ECS的“弹性公网IP”信息将在后续步骤4.1增加授信主机的配置中用到;4.4 增加平安组入方向规定点击新创建的弹性云服务器ECS的名称进入详情页,抉择“平安组”页签,点击Sys-WebServer平安组右侧的【配置规定】进入规定配置页面。在新关上的平安组管制界面,抉择“入方向规定”,单击“增加规定”,如下图所示:① 优先级:1② 策略:容许③ 协定端口:8080;④ IP地址设为0.0.0.0/0。点击“确定”。敲黑板:SSH协定端口(22)的入方向TCP协定默认凋谢,无需批改。将智慧路灯利用端口(8080)的入方向放开限度,用于后续拜访智慧路灯利用。出方向规定默认不做限度,无需批改;4.5 配置零碎防火墙规定返回试验桌面双击“Xfce终端”关上Terminal,输出以下命令,并依照操作阐明执行,登录云服务器:操作阐明:①应用弹性云服务器ECS的弹性公网IP替换命令中的[EIP]阐明:云服务器的弹性公网IP地址能够通过点击“控制台”->“服务列表”->“计算”->“弹性云服务器ECS”进入服务器列表,进行查看并复制ssh root@EIP②承受秘钥输出“yes”,回车;③输出明码:SM1$b9Zs1#(输出明码时,命令行窗口不会显示明码,输完之后间接键入回车)。胜利登录云服务器之后如下图所示④执行sudo ufw enable开启ufw服务,输出“y”确认。sudo ufw enable⑤执行sudo ufw allow 22/tcp启用22端口。sudo ufw allow 22/tcp⑥执行sudo ufw allow 8080/tcp启用8080端口。sudo ufw allow 8080/tcp4.6 部署智慧路灯利用增加授信主机“智慧路灯”是一个Web我的项目,须要部署到服务器上才能够运行,本例采纳部署服务器是华为云弹性云服务器DevCloud在应用弹性云服务器之前须要先对其授信回到软件开发平台DevCloud,这个结尾我介绍过 若不晓得到结尾相熟先,点击已创立的我的项目,如QuickStart,如下图所示 单击导航栏“更多 > 设置 > 通用设置”,抉择左侧栏“主机组治理”,而后点击“新建主机组”,参数如下:①主机组名:自定义,如:iot②操作系统:Linux点击“保留”实现主机组的创立,并进入该主机组。在创立的主机组内,点击“增加主机”,参数如下:①主机名:自定义,可与创立的ECS名称保持一致,如:ecs-iot②IP:创立弹性云服务器ECS的弹性公网IP(见步骤3.2)③认证形式:明码④用户名:root⑤明码:填创立弹性云服务器ECS的用户明码;如:SM1$b9Zs1#⑥ssh端口:22勾选浏览并批准申明,点击“增加”实现主机的增加。当主机连通性验证显示“验证胜利”时,阐明主机胜利增加 新建部署工作点击导航栏“构建&公布 > 部署”进入,而后点击“新建工作”,输出工作名称(可应用默认值),单击“下一步”进入“抉择部署模板”。抉择模板“SpringBoot利用部署”,单击“下一步”,进入“部署步骤”页面4.3配置部署步骤并执行SpringBoot利用部署模板默认蕴含以下步骤:装置JDK、进行SpringBoot服务、抉择部署起源、启动SpringBoot服务、URL衰弱测试4.3.1删除“进行SpringBoot服务”和“URL衰弱测试”;4.3.2选中“装置JDK”,主机组:抉择增加授信主机是创立的主机组(如:iot),弹框提醒点击“确定”,jdk版本:openjdk-1.8.0;敲黑板啊:部署失败怎么办?答案:请依据试验步骤逐渐查看: 1、主机是否增加胜利并实现了连通性验证 2、所有步骤的参数是否配置正确,手动输出的参数是否多了个空格,少了个符号等等。 3、不必的步骤和参数是否都已删除。选中“抉择部署起源”,参数如下:①抉择源类型:软件包;②抉择软件包:点击右侧“…”,抉择构建包,门路如下图所示;③下载到主机的部署目录:按需填写,如/usr/local选中“启动SpringBoot服务”,参数如下:①服务操作类型:放弃默认值②服务对应的绝对路径:由“下载到主机的部署目录”和软件包包名组成,如/usr/local/huawei-0.0.1-SNAPSHOT.jar③组件监控:去掉勾选 切换到“参数设置”页签,逐个删除全副参数点击“保留并执行”,实现部署工作的配置,并执行部署工作;页面显示“部署胜利”,示意工作执行结束。若工作执行失败,可通过页面中的起因提醒及链接来排查解决;五 设施接入及模拟器连贯5.1创立产品在华为云控制台,开展左侧导航,抉择“服务列表”-> “物联网”->“设施接入IoTDA”,如下图所示敲黑板啊:设施接入服务是什么?它是华为云的物联网平台,提供海量设施连贯上云、设施和云端双向音讯通信、批量设施治理、近程管制和监控、OTA降级、设施联动规定等能力,并可将设施数据灵便流转到华为云其余服务。物联网平台中,某一类具备雷同能力或特色的设施的合集被称为一款产品。您可为产品定义产品模型,产品模型用于形容设施具备的能力和个性。定义产品模型,即在物联网平台构建一款设施的形象模型,使平台了解该款设施反对的服务、属性、命令等信息;在左侧栏中抉择“产品”,点击“创立产品”,参数如下①所属资源空间:Default_APP_Sandbox_user_iot②产品名称:自定义,如:StreetLight③协定类型:MQTT④数据格式:JSON⑤厂商名称:自定义,如:Huawei_IoT⑥设施类型:自定义,如:StreetLight填写实现,点击“立刻创立”,产品创立胜利,请记录“产品ID”信息,并查看“详情”5.2 上传模型文件点击创立的产品进入详情,而后点击“上传模型文件”,抉择SmartStreetLight.zip文件,点击“确认”实现上传5.3 拜访智慧路灯Web界面新建浏览器标签页,输出http://EIP:8080/index.html(应用步骤3.2中弹性云服务器的弹性公网IP替换地址中的“EIP”),拜访智慧路灯Web页面。6.2参数设置在弹出的“参数设置”窗口,参数填写如下:①数据起源:参数设置页面下拉框抉择“订阅推送”;②本机IP:“控制台”->“服务列表”->“计算”->“弹性云服务器ECS”进入服务器列表,进行查看并复制弹性公网IP;敲黑板啊:为什么要配置这些参数?智慧路灯利用通过API形式和华为云对接,注册设施、获取设施数据和下发命令,这些参数在调用API时才用;③主题URN:“控制台”->“服务列表”->“治理与监管”->“音讯告诉服务SMN”进入主题列表,进行查看并复制主题URN④APPID:“控制台”->“服务列表”-> “物联网”->“设施接入IoTDA”,在左侧导航栏抉择“资源空间”,复制获取产品所需的“APPID”⑤账号名:零碎为您调配的华为云试验账号名⑥IAM用户名:零碎为您调配的华为云试验用户名⑦IAM用户明码:零碎为您调配的华为云试验明码⑧我的项目ID:控制台在右上角用户名下拉框中抉择“我的凭证->API凭证”页面复制获取所属区域为“华北-北京四”的我的项目ID。⑨产品ID:“控制台”->“服务列表”-> “物联网”->“设施接入IoTDA”,在左侧导航栏抉择“产品”,复制获取产品所需的“产品ID”。 ...

August 3, 2022 · 1 min · jiezi

关于python:Python编辑开发工具pycharm-pro-2022-for-mac激活补丁

pycharm pro 2022编程软件的智能代码编辑器为Python、JavaScript、CoffeeScript、类型记录、CSS、风行模板语言等提供了一流的反对。利用语言辨认的代码实现、谬误检测和即时代码修复!节省时间,而PyCharm负责解决例程。专一于更大的事件,并采纳以键盘为核心的办法来充分利用这款软件的许多生产力个性。这款软件对你的代码一目了然。依附它实现智能代码实现,实时谬误检查和疾速修复,容易的我的项目导航,等等。编写整洁和可保护的代码,而IDE帮忙您通过PEP 8查看、测试辅助、智能重构和大量查看来管制品质。PyCharm是由程序员为程序员设计的,目标是为高效的Python开发提供所需的所有工具。 装置pycharm pro 2022

August 3, 2022 · 1 min · jiezi

关于python:Python对象比较is-vs

当我还是个孩子的时候,咱们的街坊有两只双胞胎猫。他们看起来截然不同——同样的炭彩色皮毛和同样扎眼的绿色眼睛。 撇开一些性情怪癖不谈,你不能仅仅看它们就辨别它们。但当然,它们是两只不同的猫,两个不同的生物,只管它们看起来齐全一样。 这使我想到了相等和雷同之间的含意差别。这种差别对于了解 Python 的 is 和 == 比拟运算符的行为形式至关重要。 == 运算符通过查看是否相等来进行比拟:如果这些猫是 Python 对象并且咱们将它们与 == 运算符进行比拟,咱们会失去“两只猫相等”作为答案。 然而,is 运算符比拟身份(同一性):如果咱们将猫与 is 运算符进行比拟,咱们会失去“这是两只不同的猫”作为答案。 但在我纠结于这个麻绳猫的类比之前,让咱们看一下一些真正的 Python 代码。 首先,咱们将创立一个新的列表对象并将其命名为 a,而后定义另一个指向同一个列表对象的变量 (b): In [2]: a = [1, 2, 3]In [3]: b = a让咱们查看这两个变量。咱们能够看到它们指向外观雷同的列表: In [4]: aOut[4]: [1, 2, 3]In [5]: bOut[5]: [1, 2, 3]因为这两个列表对象看起来雷同,所以当咱们应用 == 运算符比拟它们是否相等时,咱们将失去预期的后果: In [6]: a == bOut[6]: True然而,这并不能通知咱们 a 和 b 是否实际上指向同一个对象。 当然,咱们晓得它们是指向同一个对象,是因为咱们之前指定了它们,但假如咱们不晓得——咱们怎么会发现呢? 答案是用 is 运算符比拟这两个变量。这证实了这两个变量实际上都指向一个列表对象: In [7]: a is bOut[7]: True让咱们看看当咱们创立列表对象的雷同正本时会产生什么。咱们能够通过在现有列表上调用 list() 来创立一个咱们将命名为 c 的正本: ...

August 3, 2022 · 1 min · jiezi

关于python:为什么权限管理会用124三个数字

置信很多人在Linux外面,遇到文件权限问题的时候,总是喜爱把文件的权限批改为777。感觉这样能够解决所有问题。 那么大家有没有想过一个问题,为什么数字7示意一个文件具备可读、可写、可运行的权限?对于以后用户,如果想给文件权限设置为可写可执行不可读,那么应该用哪个数字?如果想让文件可读可写不可执行,又要用哪个权限?零碎强制要求SSH私钥的权限为600,这里的600示意什么意思?如果想再加一个批改权限,那么它用哪个数字比拟好? 咱们晓得,1,2,4这三个数字能够示意7以内的所有数字。例如: 1: 1 2: 2 3: 1 + 2 4: 4 5: 1 + 4 6: 2 + 4 7: 1 + 2 + 4那么,如果要示意15以内的所有数字,还须要减少哪个数?你可能要想半天,才晓得,须要减少一个8。 然而,如果咱们从二进制的视角来看这些数字,就会发现实际上问题非常简单: 1: 001 2: 010 4: 100如果咱们令可执行权限对应001,可写权限对应010,可读权限对应100。那么,可读又可写对应110,也就是十进制的6。可写又可执行对应011也就是十进制的3。显然,111为可读可写可执行,对应十进制的7。 如果咱们要减少一个管制是否批改的参数,那么咱们就能够用高4位来示意,可批改:1000。 因为 Linux 中,文件的权限别离须要为文件所有者、跟所有者在同一个用户组的其他人以及不在同一组的其他人设置。如果不能读,不能写,不能执行,就是二进制的000对应十进制的0. 对于 SSH 私钥这种极度敏感的文件,显然只能文件所有者可读可写,于是它的权限为:110 000 000也就是600了。 如果要对所有登录零碎的人都可读可写可批改,显然文件权限为111 111 111天然就是十进制的777。 网上有一些垃圾文章,会诱惑你把文件权限设置为777。只有你看到这种文章,那么这个文章的作者肯定是一个水货。 请大家记住这样一句话:如果某个中央须要你把权限设置为777能力应用,那么肯定是你之前某个中央操作有问题!肯定是你出错了。任何让你给文件设置权限为777的人,不是蠢,就是坏。 最初给大家出一道思考题,应用二进制位来示意权限有什么益处? 最近整顿了几百 G 的 Python 学习材料,蕴含新手入门电子书、教程、源码等等,收费分享给大家!想要的返回 “Python 编程学习圈”,发送 “J” 即可收费取得

August 3, 2022 · 1 min · jiezi

关于python:JS-逆向百例某网站加速乐-Cookie-混淆逆向详解

申明本文章中所有内容仅供学习交换,抓包内容、敏感网址、数据接口均已做脱敏解决,严禁用于商业用途和非法用处,否则由此产生的所有结果均与作者无关,若有侵权,请分割我立刻删除! 逆向指标指标:减速乐加密逆向网站:aHR0cHM6Ly93d3cubXBzLmdvdi5jbi9pbmRleC5odG1s逆向难点:OB 混同、动静加密算法、多层 Cookie 获取减速乐减速乐是晓得创宇推出的一款网站CDN减速、网站平安防护平台。 减速乐的特点是拜访网站个别有三次申请: 第一次申请网站,网站返回的响应状态码为 521,响应返回的为通过 AAEncode 混同的 JS 代码;第二次申请网站,网站同样返回的响应状态码为 521,响应返回的为通过 OB 混同的 JS 代码;第三次申请网站,网站返回的响应状态码 200,即可失常拜访到网页内容。逆向思路依据咱们下面讲的减速乐的特点,咱们想要获取到实在的 HTML 页面,须要通过以下三个步骤: 第一次申请网站,服务器返回的 Set-Cookie 中携带 jsluid_s 参数,将获取到的响应内容解密拿到第一次 jsl_clearance_s 参数的值;携带第一次申请网站获取到的 Cookie 值再次拜访网站,将获取到的响应内容解混同逆向拿到第二次 jsl_clearance_s 参数的值;应用携带 jsluid_s 和 jsl_clearance_s 参数的 Cookie 再次拜访网站,获取到实在的 HTML 页面内容,继而采集数据。抓包剖析进入网站,关上开发者人员工具进行抓包,在 Network 中咱们能够看到,申请页面产生了三次响应 index.html,且前两次返回状态码为 521,合乎减速乐的特点: 第一层 Cookie 获取间接查看 response 显示无响应内容,咱们通过 Fiddler 对网站进行抓包,能够看到第一个 index.html 返回的响应内容通过 AAEncode 加密,大抵内容如下,能够看到一堆颜表情符号,还挺有意思的: <script> document.cookie=('_')+('_')+('j')+('s')+('l')+('_')+('c')+('l')+('e')+('a')+('r')+('a')+('n')+('c')+('e')+('_')+('s')+('=')+(-~[]+'')+((1+[2])/[2]+'')+(([2]+0>>2)+'')+((2<<2)+'')+(-~(8)+'')+(~~{}+'')+(6+'')+(7+'')+(~~[]+'')+((1<<2)+'')+('.')+((+true)+'')+(~~{}+'')+(9+'')+('|')+('-')+(+!+[]+'')+('|')+(1+6+'')+('n')+((1<<2)+'')+('k')+('X')+((2)*[4]+'')+('R')+('w')+('z')+('c')+(1+7+'')+('w')+('T')+('j')+('r')+('b')+('H')+('m')+('W')+('H')+('j')+([3]*(3)+'')+('G')+('X')+('C')+('t')+('I')+('%')+(-~[2]+'')+('D')+(';')+('m')+('a')+('x')+('-')+('a')+('g')+('e')+('=')+(3+'')+(3+3+'')+(~~{}+'')+(~~[]+'')+(';')+('p')+('a')+('t')+('h')+('=')+('/');location.href=location.pathname+location.search</script>document.cookie 里的颜表情串实际上是第一次 __jsl_clearance_s 的值,能够间接通过正则提取到加密内容后,应用execjs.eval()办法即可失去解密后的值: import reimport execjsAAEncode_text = """以上内容"""content_first = re.findall('cookie=(.*?);location', AAEncode_text)[0]jsl_clearance_s = execjs.eval(content_first).split(';')[0]print(jsl_clearance_s)# __jsl_clearance_s=1658906704.109|-1|7n4kX8Rwzc8wTjrbHmWHj9GXCtI%3D第二层 Cookie 获取抓包到的第二个 index.html 返回的是通过 OB 混同的 JS 文件,咱们须要对其进行调试剖析,然而间接在网页中通过 search 搜寻很难找到该 JS 文件的地位,这里举荐两种形式对其进行定位: ...

August 3, 2022 · 4 min · jiezi

关于python:分享3-个Python冷知识

第一个:神奇的字典键 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" 笼罩了. 第二个:异样解决中的return def 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 将始终是最初执行的语句.第三个:雷同对象的判断 ...

August 2, 2022 · 1 min · jiezi

关于python:10个你必须知道的Python内置函数

1. reduce()reduce() 是 functools 模块上面的一个函数,接管两个参数,一个是函数对象,一个是可迭代对象(比方list), reduce每次会把迭代对象中的下一个元素作用在函数上做累积计算,最初失去一个值。 来看个例子你就明确 # 创立函数def add(a, b): result = a + b print(f"{a} + {b} = {result}") return resultfrom functools import reduceresult = reduce(add, [1, 2, 3, 4])print("后果:", result)输入 1 + 2 = 33 + 3 = 66 + 4 = 10后果: 10执行过程:第一次将列表中的前两个数取出来作为函数add的参数,第二次将上一次函数add的返回值与列表的第3个数作为参数,依此类推,最初失去一个值。这就是reduce的作用。有点像万物归一的感觉。 当然,如果只是计算列表中的元素之和,大可不必绕这么大弯子用reduce来解决,间接用 sum 函数就能够解决。 result = sum([1, 2, 3, 4])如果是计算列表中元素的乘积,python并没有内置的函数间接计算,这时候咱们能够借用reduce来解决 def mul(a, b): return a * bresult = reduce(mul, [1, 2, 3, 4])print("后果:", result)输入 ...

August 2, 2022 · 2 min · jiezi

关于python:神操作居然有人用-Python-在-Excel-中画画

十字绣大家都晓得吧,明天咱们来玩个电子版的十字绣。 用 Python 读取图片的像素值,而后输入到 Excel 表格中,最终造成一幅像素画,也就是电子版的十字绣了。 筹备既然要读取图片,那就须要用到 Pillow 库,操作 Excel 须要用到 openpyxl 库,先把这两个库装置好。 $ pip3 install openpyxl$ pip3 install Pillow色值转换从图片读取的像素块色值是 RGB 值,而 openpyxl 向 Excel cell 内填充色彩是十六进制色值,因而咱们先写一个 RGB 和十六进制色值转换的一个函数。 def rgb_to_hex(rgb):    rgb = rgb.split(',')    color = ''    for i in RGB:        num = int(i)        color += str(hex(num))[-2:].replace('x', '0').upper()    return color图片转换有了色值转换函数,接下来要做的操作就是逐行读取图片的 RGB 色值,之后将 RGB 色值转换为十六进制色值填充到 Excel 的 cell 中即可。 def img2excel(img_path, excel_path):    img_src = Image.open(img_path)    # 图片宽高    img_width = img_src.size[0]    img_height = img_src.size[1]    str_strlist = img_src.load()    wb = openpyxl.Workbook()    wb.save(excel_path)    wb = openpyxl.load_workbook(excel_path)    cell_width, cell_height = 1.0, 1.0    sheet = wb["Sheet"]    for w in range(img_width):        for h in range(img_height):            data = str_strlist[w, h]            color = str(data).replace("(", "").replace(")", "")            color = rgb_to_hex(color)            # 设置填充色彩为 color            fille = PatternFill("solid", fgColor=color)            sheet.cell(h + 1, w + 1).fill = fille    for i in range(1, sheet.max_row + 1):        sheet.row_dimensions[i].height = cell_height    for i in range(1, sheet.max_column + 1):        sheet.column_dimensions[get_column_letter(i)].width = cell_width    wb.save(excel_path)    img_src.close()最初再来个入口函数,就功败垂成啦~ if __name__ == '__main__':    img_path = '/Users/xyz/Documents/tmp/03.png'    excel_path = '/Users/xyz/Documents/tmp/3.xlsx'    img2excel(img_path, excel_path)惊艳时刻冲动的心,颤动的手,来看下最终成果咋样。 是不是感觉有那么一丝丝韵味呢... 总结明天带大家一起实现了 Excel 像素画,小伙伴们能够施展本人的设想,比方把女神的头像藏进 Excel 中而后发她,你猜女神会不会被惊艳到呢。 以上就是本次分享的所有内容,如果你感觉文章还不错,欢送关注公众号:Python编程学习圈,每日干货分享,发送“J”还可支付大量学习材料,内容笼罩Python电子书、教程、数据库编程、Django,爬虫,云计算等等。或是返回编程学习网,理解更多编程技术常识。

August 2, 2022 · 1 min · jiezi

关于python:Python-高手都是怎么玩转-Excel-自动化的

在日常的工作中,对 Excel 的操作必不可少,如果波及到大量的 Excel 操作的话,手动解决效率还是比拟低的,因而 Excel 主动话齐全有必要,明天派森酱就和大家分享一下如何利用 Python 来批量化解决 Excel。 装置Python 操作 Excel 次要用到两个库 xlrd 和 xlwt,前者负责读,后者负责写。 能够间接通过 pip 命令装置这两个库。 pip3 install xlrdpip3 install xlwt上手咱先来看看读取模块,有如下的 Excel 文件。 1、获取 sheet file_path = './person.xls'data = xlrd.open_workbook(file_path)names = data.sheet_names()print(names)# 输入后果['list']当然,咱们也能够通过下标或者名称来获取指定的 sheet。 sheet = data.sheets()[0]print(sheet)sheet = data.sheet_by_name('list')print(sheet)# 输入后果Sheet  0:<list>Sheet  0:<list>2、行列操作 Excel 里每一个 sheet 都是由行和列组成的,先来看看行和列的操作。 rows = table.nrowsprint(rows)# 输入后果4cols = table.ncolsprint(cols)# 输入后果3print(table.row_slice(1))# 输入后果[text:'张三', number:18.0, text:'男']通过行和列来读取 Excel 表格数据。 for row in range(rows):    for col in range(cols):        print(table.cell(row, col), table.cell_type(row, col))# 输入后果text:'name' 1text:'age' 1text:'sex' 1text:'张三' 1number:18.0 2...通过行和列向 Excel 中写入数据,写入数据就须要用到 xlwt 这个库了。 import xlwtworkbook = xlwt.Workbook(encoding=ascii)worksheet = workbook.add_sheet('my sheet')  # 创立工作表for i in range(10):    for j in range(10):        worksheet.write(i, j, i + j)  # 写入内容workbook.save('data.xls') 当然,咱们也能够对单元格做一些设置。 # 更改列宽:worksheet.col(10).width = 256 * 20# 更改行高:style = xlwt.easyxf('font:height 360;')  # 18pt,类型小初的字号row = worksheet.row(10)row.set_style(style)# 填充色彩pattern = xlwt.Pattern()pattern.pattern = xlwt.Pattern.SOLID_PATTERNpattern.pattern_fore_colour = 2style = xlwt.XFStyle()style.pattern = patternworksheet.write(4, 4, '填充色彩', style)# 边框款式borders = xlwt.Borders()borders.left = xlwt.Borders.DASHEDborders.right = xlwt.Borders.DASHEDborders.top = xlwt.Borders.THINborders.bottom = xlwt.Borders.THICKstyle = xlwt.XFStyle()style.borders = bordersworksheet.write(5, 5, '边框款式', style)# 合并单元格worksheet.write_merge(6, 7, 7, 9, '合并单元格')  # 合并 6-7 行,7-9 列 总结明天和大家分享了如何通过 Python 来批量解决 Excel,心愿能进步一下小伙伴们的工作效率。 以上就是本次分享的所有内容,如果你感觉文章还不错,欢送关注公众号:Python编程学习圈,每日干货分享,发送“J”还可支付大量学习材料,内容笼罩Python电子书、教程、数据库编程、Django,爬虫,云计算等等。或是返回编程学习网,理解更多编程技术常识。

August 2, 2022 · 1 min · jiezi

关于python:如何系统地自学-Python

如何系统地自学 Python?学会Python能做的事件也很多,常见的就有网络爬虫,数据分析,前端开发,机器学习,都能很好地进步工作效率,往任何一个畛域倒退,工作前景是十分不错的。接下来我从根本的软件装置开始,认真的给大家剖析新手入门应该怎么学习Python吧,如果有讲得不到位的中央也欢送大家斧正,我会及时进行批改。 一、软件的装置和抉择1、配置环境关系到实操,所以在抉择材料的同时,你还须要装置好Python须要的软件,软件版本没有太多的要求,你能够抉择当初的最新版,也能够打听一下其余敌人们感觉比拟好用的是哪个版本在我看来,新版本会有一些新的内容呈现,但在应用的时候可能会不太稳固,而且想要找到新版相干的材料也会比拟艰难,罕用的正式版也是一个比拟好的抉择,应用的人群基数大,所以在操作方面不容易呈现问题。 如果是零开始学习Python的话,我倡议从python3开始,因为从将来的趋势来看python3倒退会较好,反对现有的支流操作平台,不论是 windows、mac还是linux,都能很好的运行 Python。这二者区别不太大,只是程序不兼容,然而语法变动并不多,抉择任何一个动手,都没有大影响,如果你python3语法纯熟了,再用python2同样上手很快。这里还是要举荐下小编的Python学习喂薪*(同音):‘’七六二,四五九,五一零‘’不论你是小白还是大牛,小编我都欢送,不定期分享干货,包含小编本人整顿的一份2021最新的Python材料和0根底入门教程,欢送初学和进阶中的小伙伴。在不忙的工夫我会给大家解惑。2、编辑器抉择python有很多种编译器,初学能够从Python 自带的编辑器idle动手,等到纯熟当前能够转到其余编译器上,例如pycharm、SublimeText、jupyter notebook等如果你筹备用python来进行数据分析的话,那上面这个课程就刚刚好。这是知乎的数据分析课程,python是数据分析工具的一部分,所以会着重来将这方面的常识,这个可比水灵灵来讲python可有意思多了。而且据我察看,大部分人学习python就是用来数据分析的,所以也是学以致用。不至于学习零碎的教程,导致适度学习,浪费时间。 二、Python根底学习办法1、抉择简略的入门书籍难度肯定要是入门级别,刚开始不能学得太简单,学货色要循序渐进,不能一口吃个瘦子,难度过高反而会打消你的学习积极性,对初学者来说,肯定要找一个通熟易懂的书。当初能找到的Python入门书籍很多,我集体举荐《 Python学习手册》作者写作思路十分清晰,每一个知识点解说的很到位,扼要易懂,对初学者来说,比拟敌对,电子版我曾经打包好,还有一些视频材料,都是根底入门阶段用得上的。 三、跟着视频学习当然如果你身边有Pytho`n学得好的大佬那就更好了,那比视频更间接更高效,Python只看书那是不事实的,因为你最终的目标还是通过计算`机实现一系列操作,在操作过程中可能会呈现大大小小的问题,这也是书本不可能解决的。视频的益处就是你能够直观的看明确每一步的操作步骤,晓得每一串字符,每一个代码起到的作用,书本在这里只是起到一个辅助的作用。四、多上手操作这听起来是一句废话,但的确是一句瞎话,学编程肯定要亲自去编写,没有什么捷径能够走.哪怕你把书外面的例子一字不落敲一遍,也好过你只是去看书,而不入手。还有就是保持,三天打鱼两天晒网的学习Python是不事实的,就算是每天抽小半个小时敲代码那都是有作用的,只有你能一直的保持,快的话几个星期就能入门了。如果有什么学习上的问题大家都能够在我的学习群里提出来,我看到了也会帮大家解答,同时群里也有一起打卡学习的伙伴,互相监督,比一个人埋头学习更有效率。再说一下哈,如果你只想通过python来进行数据分析,那知乎的数据分析课是最适宜你的。课程指导老师是知乎大 V 猴子老师,也是前 IBM的数据分析师,课程采纳直播的模式,一对一领导学习。整个课程从工具应用动手, Excel,SQL,Python,power BI ,再到数据分析十大分析方法,让你不光会python等数据分析工具,也能学会如何把这些工具利用到理论工作中,而且训练应用的数据,都是大厂实在的数据,用这些数据做练习,形象又活泼,不会感觉干燥。

August 2, 2022 · 1 min · jiezi

关于python:超干分享如何提高-Python-的运行速度

Python 曾经失去了寰球程序员的青睐,然而还是受到一些人的诟病,起因之一就是认为它运行迟缓。 其实某个特定程序(无论应用何种编程语言)的运行速度是快还是慢,在很大水平上取决于编写该程序的开发人员本身素质,以及他们编写优化而高效代码的能力。 Medium 上一位小哥就具体讲了讲如何让 Python 提速 30%,以此证实代码跑得慢不是 Python的问题,而是代码自身的问题。 01时序剖析 在开始进行任何优化之前,咱们首先须要找出代码的哪些局部使整个程序变慢。有时程序的问题很显著,然而如果你一时不晓得问题出在哪里,那么这里有一些可能的选项: 留神:这是我将用于演示的程序,它将进行指数计算 # slow_program.pyfrom decimal import *def exp(x): getcontext().prec += 2 i, lasts, s, fact, num = 0, 0, 1, 1, 1 while s != lasts: lasts = s i += 1 fact *= i num *= x s += num / fact getcontext().prec -= 2 return +sexp(Decimal(150))exp(Decimal(400))exp(Decimal(3000))最简洁的“配置文件” 首先,最简略最偷懒的办法——Unix工夫命令。 ~ $ time python3.8 slow_program.pyreal 0m11,058suser 0m11,050ssys 0m0,008s如果你只能晓得整个程序的运行工夫,这样就够了,但通常这还远远不够。 最具体的剖析 另外一个指令是cProfile,然而它提供的信息过于具体了。 ...

August 1, 2022 · 3 min · jiezi

关于python:高效办公Python-自动化教你一键获取日志

1. 前言对大部分的人来说,解决 Bug 都是依附关键字去日志去定位问题! 在调试状况下,咱们能够实时在控制台查看日志;但对于部署到服务器上的利用,日志都寄存在服务器某个目录下,没法通过本地查看到 这种状况下,就须要咱们先登录服务器,而后进入到日志目录文件夹,最初通过日志文件去定位问题;如果波及到 K8s 容器,可能还须要应用 kubectl 命令进入到服务对应的容器中,进入到日志目录,能力开始定位问题,这所有显得十分繁琐且低效 本篇文章介绍一款 Python 依赖库:pexpect,作为一款命令行自动化工具,它能够帮忙咱们一键获取日志,疾速定位问题! 2. pexpect 介绍pexpect 是 Python 语言实现的类 Expect 的一种实现,通过产生子应用程序并管制它们,通过冀望模式对子应用程序的输入做出相应解决 它次要对人机对话进行模仿,来实现一些自动化的场景 比方:用来和 SSH、FTP、PASSWD、Telnet 等命令行程序进行自动化交互 在应用之前,咱们先装置依赖包 # 装置依赖库pip3 install pexpect3. 实战一下咱们以从服务器 K8S 容器获取日志为例进行解说 3-1 SSH 登录 首先,初始化应用 pexpect 模仿 SSH 近程登录服务器 import pexpectPROMPT = ['# ', '>>> ', '> ', '\$ ']def login_with_pexpect(): """ 登录-pexpect :return: """ # 端口号 port = ** # 用户名 user = ** # 明码 pwd = ** # ip地址 ip = ** ssh_cmd = "ssh -p {} {}@{}".format(port,user,ip) # 指定登录命令,拿到程序操作句柄 child = pexpect.spawn(ssh_cmd, timeout=60, encoding='utf-8') # 提醒输出明码的字符呈现,否则超时 ret = child.expect([pexpect.TIMEOUT, '[P|p]assword: '], timeout=10) # 匹配胜利后,输出明码,执行登陆操作 if ret == 1: # 发送明码 child.sendline(pwd) child.expect(PROMPT) return child else: print('登录失败!')其中 ...

August 1, 2022 · 2 min · jiezi

关于python:真香-用这七大Python效率工具

为了提高效率,咱们在平时工作中常会用到一些Python的效率工具,Python作为比拟老的编程语言,它能够实现日常工作的各种自动化。为了更便当的开发我的项目,这里给大家举荐几个Python的效率工具。\ 1、Pandas-用于数据分析Pandas是一个弱小的剖析结构化数据的工具集;它的应用根底是Numpy(提供高性能的矩阵运算);用于数据挖掘和数据分析,同时也提供数据荡涤性能。 # 1、安装包 $ pip install pandas # 2、进入python的交互式界面 $ python -i # 3、应用Pandas>>> import pandas as pd>>> df = pd.DataFrame() >>> print(df) # 4、输入后果 Empty DataFrame Columns: [] Index: [] 2、Selenium-自动化测试Selenium是一个用于Web应用程序测试的工具,能够从终端用户的角度来测试应用程序。通过在不同浏览器中运行测试,更容易发现浏览器的不兼容性。并且它实用许多浏览器。 能够通过关上浏览器并拜访Google的主页做一个简略的测试: from selenium import webdriver    import time    browser = webdriver.Chrome(executable_path ="C:\Program Files (x86)\Google\Chrome\chromedriver.exe")    website_URL ="https://www.google.co.in/"    brower.get(website_URL)    refreshrate = int(3) #每3秒刷新一次Google主页。      # 它会始终运行,直到你停掉编译器。    while True:        time.sleep(refreshrate)        browser.refresh() 3、 Flask——微型Web框架Flask是一个轻量级的可定制框架,应用Python语言编写,较其余同类型框架更为灵便、轻便、平安且容易上手。Flask是目前非常风行的web框架。开发者能够应用Python语言疾速实现一个网站或Web服务。 from flask import Flask app = Flask(__name__) @app.route('/') def hello_world():     return 'Hello, World!' 4、 Scrapy——页面爬取Scrapy可能为你提供弱小反对,使你可能准确地从网站中爬取信息。是十分实用。 当初基本上大部分开发者都会利用爬虫工具来实现爬取工作的自动化。所以编写爬虫编码时就能够用到这个Scrapy。 启动Scrapy Shell也是非常的简略: scrapy shell 咱们能够试着提取百度主页上搜寻按钮的值,首先要找到按钮应用的类,一个inspect element显示该类为“ bt1”。 具体执行以下操作: response = fetch("https://baidu.com")     response.css(".bt1::text").extract_first()     ==> "Search" 5、 Requests——做API调用Requests是一个功能强大的HTTP库。有了它能够轻松地发送申请。无需手动向网址增加查问字符串。除此之外还有许多性能,比方authorization解决、JSON / XML解析、session解决等。 官网例子: >>> r = requests.get('https://api.github.com/user', auth=('user', 'pass')) >>> r.status_code 200 >>> r.headers['content-type'] 'application/json; charset=utf8' >>> r.encoding 'utf-8' >>> r.text '{"type":"User"...' >>> r.json() {'private_gists': 419, 'total_private_repos': 77, ...} 6、Faker-用于创立假数据Faker是一个Python包,为您生成假数据。无论是须要疏导数据库、创立难看的 XML 文档、填写您的持久性来强调测试它,还是从生产服务中获取的同名数据,Faker 都适宜您 有了它,你能够十分疾速地生成假的names、addresses、descriptions等!以下脚本为例,我创立一个联系人条目,蕴含了姓名、地址和一些形容文本: 装置: pip install Faker from faker import Faker fake = Faker() fake.name() fake.address() fake.text() 7、 Pillow-进行图像处理Python图像处理工具——Pillow有相当弱小的图像处理性能。当平时须要做图像处理时就能够用到,毕竟作为开发人员,应该抉择性能更弱小的图片解决工具。 简略示例: from PIL import Image, ImageFilter    try:        original = Image.open("Lenna.png")        blurred = original.filter(ImageFilter.BLUR)        original.show()        blurred.show()        blurred.save("blurred.png")    except:        print "Unable to load image" 无效的工具能够帮忙咱们更快捷地实现工作工作,所以就给大家分享几个认为好用的工具,也心愿这7个Python的效率工具可能帮忙到你。 以上就是本次分享的所有内容,如果你感觉文章还不错,欢送关注公众号:Python编程学习圈,每日干货分享,发送“J”还可支付大量学习材料,内容笼罩Python电子书、教程、数据库编程、Django,爬虫,云计算等等。或是返回编程学习网,理解更多编程技术常识。

August 1, 2022 · 1 min · jiezi

关于python:Python办公软件自动化5分钟掌握openpyxl操作

明天给大家分享一篇用openpyxl操作Excel的文章。 各种数据须要导入Excel?多个Excel要合并?目前,Python解决Excel文件有很多库,openpyxl算是其中性能和性能做的比拟好的一个。接下来我将为大家介绍各种Excel操作。 关上Excel文件新建一个Excel文件     >>> from openpyxl import Workbook    >>> wb = Workbook()关上现有Excel文件     >>> from openpyxl import load_workbook    >>> wb2 = load_workbook('test.xlsx')关上大文件时,依据需要应用只读或只写模式缩小内存耗费。 wb = load_workbook(filename='large_file.xlsx', read_only=True)wb = Workbook(write_only=True)获取、创立工作表获取以后流动工作表:     >>> ws = wb.active创立新的工作表:     >>> ws1 = wb.create_sheet("Mysheet") # insert at the end (default)    # or    >>> ws2 = wb.create_sheet("Mysheet", 0) # insert at first position    # or    >>> ws3 = wb.create_sheet("Mysheet", -1) # insert at the penultimate position应用工作表名字获取工作表:     >>> ws3 = wb["New Title"]获取所有的工作表名称:     >>> print(wb.sheetnames)    ['Sheet2', 'New Title', 'Sheet1']应用for循环遍历所有的工作表:    >>> for sheet in wb:    ...     print(sheet.title)保留保留到流中在网络中应用:     >>> from tempfile import NamedTemporaryFile    >>> from openpyxl import Workbook    >>> wb = Workbook()    >>> with NamedTemporaryFile() as tmp:            wb.save(tmp.name)            tmp.seek(0)            stream = tmp.read()保留到文件:    >>> wb = Workbook()    >>> wb.save('balances.xlsx')保留为模板:    >>> wb = load_workbook('document.xlsx')    >>> wb.template = True    >>> wb.save('document_template.xltx')单元格单元格地位作为工作表的键间接读取:     >>> c = ws['A4']为单元格赋值:     >>> ws['A4'] = 4    >>> c.value = 'hello, world'多个单元格 能够应用切片拜访单元格区域:     >>> cell_range = ws['A1':'C2']应用数值格局:     >>> # set date using a Python datetime    >>> ws['A1'] = datetime.datetime(2010, 7, 21)    >>>    >>> ws['A1'].number_format    'yyyy-mm-dd h:mm:ss'应用公式:     >>> # add a simple formula    >>> ws["A1"] = "=SUM(1, 1)"合并单元格时,除左上角单元分外,所有单元格都将从工作表中删除:     >>> ws.merge_cells('A2:D2')    >>> ws.unmerge_cells('A2:D2')    >>>    >>> # or equivalently    >>> ws.merge_cells(start_row=2, start_column=1, end_row=4, end_column=4)    >>> ws.unmerge_cells(start_row=2, start_column=1, end_row=4, end_column=4) 行、列能够独自指定行、列、或者行列的范畴:     >>> colC = ws['C']    >>> col_range = ws['C:D']    >>> row10 = ws[10]    >>> row_range = ws[5:10]能够应用Worksheet.iter_rows()办法遍历行:     >>> for row in ws.iter_rows(min_row=1, max_col=3, max_row=2):    ...    for cell in row:    ...        print(cell)    <Cell Sheet1.A1>    <Cell Sheet1.B1>    <Cell Sheet1.C1>    <Cell Sheet1.A2>    <Cell Sheet1.B2>    <Cell Sheet1.C2>同样的Worksheet.iter_cols()办法将遍历列:     >>> for col in ws.iter_cols(min_row=1, max_col=3, max_row=2):    ...     for cell in col:    ...         print(cell)    <Cell Sheet1.A1>    <Cell Sheet1.A2>    <Cell Sheet1.B1>    <Cell Sheet1.B2>    <Cell Sheet1.C1>    <Cell Sheet1.C2>遍历文件的所有行或列,能够应用Worksheet.rows属性:     >>> ws = wb.active    >>> ws['C9'] = 'hello world'    >>> tuple(ws.rows)    ((<Cell Sheet.A1>, <Cell Sheet.B1>, <Cell Sheet.C1>),    (<Cell Sheet.A2>, <Cell Sheet.B2>, <Cell Sheet.C2>),    (<Cell Sheet.A3>, <Cell Sheet.B3>, <Cell Sheet.C3>),    (<Cell Sheet.A4>, <Cell Sheet.B4>, <Cell Sheet.C4>),    (<Cell Sheet.A5>, <Cell Sheet.B5>, <Cell Sheet.C5>),    (<Cell Sheet.A6>, <Cell Sheet.B6>, <Cell Sheet.C6>),    (<Cell Sheet.A7>, <Cell Sheet.B7>, <Cell Sheet.C7>),    (<Cell Sheet.A8>, <Cell Sheet.B8>, <Cell Sheet.C8>),    (<Cell Sheet.A9>, <Cell Sheet.B9>, <Cell Sheet.C9>))或Worksheet.columns属性:     >>> tuple(ws.columns)    ((<Cell Sheet.A1>,    <Cell Sheet.A2>,    <Cell Sheet.A3>,    <Cell Sheet.A4>,    <Cell Sheet.A5>,    <Cell Sheet.A6>,    ...    <Cell Sheet.B7>,    <Cell Sheet.B8>,    <Cell Sheet.B9>),    (<Cell Sheet.C1>,    <Cell Sheet.C2>,    <Cell Sheet.C3>,    <Cell Sheet.C4>,    <Cell Sheet.C5>,    <Cell Sheet.C6>,    <Cell Sheet.C7>,    <Cell Sheet.C8>,    <Cell Sheet.C9>))应用Worksheet.append()或者迭代应用Worksheet.cell()新增一行数据:     >>> for row in range(1, 40):    ...     ws1.append(range(600))    >>> for row in range(10, 20):    ...     for col in range(27, 54):    ...         _ = ws3.cell(column=col, row=row, value="{0}".format(get_column_letter(col)))插入操作比拟麻烦。能够应用Worksheet.insert_rows()插入一行或几行:      >>> from openpyxl.utils import get_column_letter     >>> ws.insert_rows(7)      >>> row7 = ws[7]     >>> for col in range(27, 54):    ...         _ = ws3.cell(column=col, row=7, value="{0}".format(get_column_letter(col)))Worksheet.insert_cols()操作相似。Worksheet.delete_rows()和Worksheet.delete_cols()用来批量删除行和列。 只读取值应用Worksheet.values属性遍历工作表中的所有行,但只返回单元格值:     for row in ws.values:       for value in row:         print(value)Worksheet.iter_rows()和Worksheet.iter_cols()能够设置values_only参数来仅返回单元格的值:     >>> for row in ws.iter_rows(min_row=1, max_col=3, max_row=2, values_only=True):    ...   print(row)    (None, None, None)    (None, None, None)以上就是本次分享的所有内容,如果你感觉文章还不错,欢送关注公众号:Python编程学习圈,每日干货分享,发送“J”还可支付大量学习材料,内容笼罩Python电子书、教程、数据库编程、Django,爬虫,云计算等等。或是返回编程学习网,理解更多编程技术常识。

August 1, 2022 · 1 min · jiezi

关于python:11个-Python-字典用法详解

字典(Dictionary)是Python提供的一种罕用的数据结构,它用于寄存具备映射关系的数据。本期给大家带来Python字典11个办法的全面解析,心愿对你有所帮忙。 字典由键(key)和值(value)成对组成,键和值两头以冒号:隔开,项之间用逗号隔开,整个字典由大括号 {} 括起来 格局如下: dic = {key1 : value1, key2 : value2 } 字典也被称作关联数组或哈希表上面是几种常见的字典创立形式: # 办法1dic1 = { 'Author' : 'Python编程学习圈' , 'age' : 99 , 'sex' : '男' }# 办法2lst = [('Author', 'Python编程学习圈'), ('age', 99), ('sex', '男')]dic2 = dict(lst)# 办法3dic3 = dict( Author = 'Python编程学习圈', age = 99, sex = '男')# 办法4list1 = ['Author', 'age', 'sex']list2 = ['Python编程学习圈', 99, '男']dic4 = dict(zip(list1, list2))字典创立的形式还有很多种,这里不再赘述。 接下来是重点 接下来是重点 接下来是重点 字典由 dict 类代表,能够应用 dir(dict) 来查看该类蕴含哪些办法,输出命令,能够看到如下输入后果: ...

July 30, 2022 · 3 min · jiezi

关于python:分享一个2022年火遍全网的Python框架

最近Python圈子当中进去一个十分火爆的框架PyScript,该框架能够在浏览器中运行Python程序,只须要在HTML程序中增加一些Python代码即可实现。该我的项目进去之后便引起了轰动,马上蹿升到了Github趋势榜榜首,短短20天曾经有10K+的star了。既然如此,小编明天就带大家来看看该框架是如何应用的。 HelloWorld咱们先来看一下简略的例子,代码如下 <html>  <head>    <link rel="stylesheet" href="https://pyscript.net/alpha/pyscript.css" />    <script defer src="https://pyscript.net/alpha/pyscript.js"></script>  </head>  <body> <py-script> print('Hello, World!') </py-script> </body></html>其中Python代码被包裹在了py-script标签外面,而后咱们在浏览器中查看进去的后果,如下所示 要不来画个图上面这一个例子当中,咱们尝试将matplotlib绘制图表的代码搁置到HTML代码当中去,以实现绘制出一张直方图的操作。首先是matplotlib代码局部, import matplotlib.pyplot as pltimport numpy as npnp.random.seed(42)## 随机生成满足正态分布的随机数据rv = np.random.standard_normal(1000)fig, ax = plt.subplots()ax.hist(rv, bins=30)output 而后咱们将下面的代码搁置到HTML代码当中去,代码如下 <html><head>    <link rel="stylesheet" href="https://pyscript.net/alpha/pyscript.css"/>    <script defer src="https://pyscript.net/alpha/pyscript.js"></script>    <py-env>        - numpy        - matplotlib    </py-env></head><body><h1>Plotting a histogram of Standard Normal distribution</h1><div id="plot"></div><py-script output="plot">    import matplotlib.pyplot as plt    import numpy as np    np.random.seed(42)    rv = np.random.standard_normal(1000)    fig, ax = plt.subplots()    ax.hist(rv, bins=30)    fig</py-script></body></html>output 因为咱们前面须要用到numpy和matplotlib两个库,因而咱们通过py-env标签来引进它们,另外 再画个折线图咱们在下面的根底之上,再来绘制一张折线图,首先咱们再创立一个div标签,外面的id是lineplot,代码如下 <div id="lineplot"></div>同样地在py-script标签中搁置绘制折线图的代码,output对应div标签中的id值 <py-script output="lineplot">.........</py-script>绘制折线图的代码如下 import matplotlib.pyplot as pltfig, ax = plt.subplots()year1 = [2016, 2017, 2018, 2019, 2020]population1 = [30, 46, 45, 55, 48]year2 = [2016, 2017, 2018, 2019, 2020]population2 = [43, 48, 44, 75, 45]plt.plot(year1, population1, marker='o', linestyle='--', color='g', label='Countr_1')plt.plot(year2, population2, marker='d', linestyle='-', color='r', label='Country_2')plt.xlabel('Year')plt.ylabel('Population (M)')plt.title('Year vs Population')plt.legend(loc='lower right')figoutput 现阶段运行带有Pyscript的页面加载速度并不会特地地快,该框架刚刚推出,依然处于测试的阶段,前面必定会一直地优化。要是遇到加载速度慢地问题,读者敌人看一下是不是能够通过更换浏览器得以解决。 以上就是本次分享的所有内容,如果你感觉文章还不错,欢送关注公众号:Python编程学习圈,每日干货分享,发送“J”还可支付大量学习材料,内容笼罩Python电子书、教程、数据库编程、Django,爬虫,云计算等等。或是返回编程学习网,理解更多编程技术常识。

July 30, 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编程学习圈,每日干货分享,发送“J”还可支付大量学习材料,内容笼罩Python电子书、教程、数据库编程、Django,爬虫,云计算等等。或是返回编程学习网,理解更多编程技术常识。

July 30, 2022 · 1 min · jiezi

关于python:7-行代码搞崩溃-B-站原因令人唏嘘

前不久,哔哩哔哩(个别常称为 B 站)公布了一篇文章《2021.07.13 咱们是这样崩的》,具体回顾了他们在 2021.07.13 早晨全站解体约 3 小时的至暗时刻,以及万分缓和的故障定位与复原过程。 那篇文章将定位过程、问题剖析、优化改良等方面写得很具体,在我印象中,国内互联网大厂在产生相似事变后,可能如此推心置腹地“检讨”“还债”的并不多见。(值得送上一键三连~~~) 对于搞技术的同学来说,这篇文章是不错的学习材料。而我最为关注的内容,其实是对于编程语言的个性,也就是在代码层面上的细节问题。 在对于问题根因的剖析中,咱们看到了罪魁祸首的 7 行代码,它是用 Lua 语言写的一个求最大公约数的函数: 简略而言,这个函数预期接管的参数是两个数字(一般的数字或者字符串类型的数字,即两种类型都能够),然而,它的 if 语句却只判断了一种类型(一般数字),疏忽了字符串类型的“0”。 在故障产生时,它的第二个参数传入的是字符串类型“0”而不是数字类型 0,导致 if 语句判断生效! 因为 Lua 是动静类型语言,只有在程序运行时才晓得传入的参数是什么类型。这属于是所有动静类型语言的特色,在 Python、JavaScript、PHP、Ruby 等动静类型语言中,也会有同样的体现。这不是啥陈腐事物。 然而,真正该死的问题在于,Lua 还是一门弱类型语言,它不像 Python、Ruby、Java 等强类型语言那样,它竟反对隐式类型转换! 在 Lua 中,数字字符串在与一般数字作算术运算时,会将字符串类型隐式地转换成数字类型,如上图所示的“a % b”,如果 b 是字符串类型的数字,那它就会被转换成数字类型! 而在 Python 这种强类型动静类型语言中,这样的转换是不堪设想的,数字与字符串作算术运算,能失去的只会是报错:TypeError: unsupported operand type(s) for %: 'int' and 'str' Lua 语言的这种“字符串隐式变数字”的行为,即便在粗心不觉察的状况下,仿佛也不会造成太大问题。在 B 站代码中,除了出事变时传的字符串“0”以外,预计它始终接管的都是其它字符串数字,始终也没出问题,显然程序员是把这当成一种便当伎俩了(因为不需作类型转换)。 然而,可怜的是,Lua 中还有一个非凡的“nan”,它会进一步将这一个“小小的谬误”传递上来,直至传到了地老天荒不受管制的死循环里…… 在大多数编程语言中,除零操作都是不可宽恕的谬误,这跟咱们在小学数学课堂上就把握的常识相吻合:数字零不容许作为除数! 掏出手机,关上计算器,看看它是怎么说的: 看到了吧!不能除以0!!! 持续看看 Python 对于这种操作的反馈: ZeroDivisionError 除零谬误,这是在保卫咱们积重难返的数学常识。 那么,Lua 语言在除零操作后失去的 nan 到底是个什么货色呢? ...

July 29, 2022 · 1 min · jiezi

关于python:什么是-Git-和-Git-RepositoryPython-在线运行实例

置信许多人都对 GitHub 一点都不生疏,即使不是程序员,咱们也常常能够在 GitHub 上下载到十分优良的开源软件。如果留神一下的话,咱们会发现 GitHub 的名字是有 Git + Hub 组成的,而有一些编程根底的同学可能也会据说过 Git 或者 Git Repo 这类的词汇。但,Git 和 Git Repo 指的到底又是什么呢? Git 是一个用于追踪团队我的项目变动的开源利用,而 Git 又会将不同版本的我的项目贮存在名为 Git Repository(版本库)的文件夹中。咱们通过 Git 来进行版本控制,用户能够在此删除或复制已有的版本库或为现有的我的项目创立新的版本库,进步团队之间的合作效率。 在这篇教程中,咱们会阐明 Git 版本库是什么以及如何通过 Git 命令行创立并使用这些文件。而后,咱们会应用 Python 在线运行一系列代码,再通过 Git 来追踪并保留这个 Python 我的项目中的所有历史更改并同步到 GitHub 的版本库中。 注册 Git Hub 账号如果你已有 GitHub 账号,那就能够跳过这一步。 进入 GitHub 官网,国内的小伙伴可能须要迷信上网或抉择 Gitee 等其余 Git 资源网站。应用邮箱注册 GitHub 账号。实现注册后,在 GitHub 界面右上角的 + 号中抉择“New Repository”新建版本库。如果本地已有版本库,也能够通过“Import Repository”上传。 进入信息页面后,依据本人的爱好填写 Repository 的名称,你也能够间接在这里新建一个 README 的 Markdown 文件。实现后,点击“Create Repository”就能够了。 ...

July 29, 2022 · 2 min · jiezi

关于python:介绍一款能取代-Scrapy-的爬虫框架-feapder

1. 前言 家喻户晓,Python 最风行的爬虫框架是 Scrapy,它次要用于爬取网站结构性数据 明天举荐一款更加简略、轻量级,且功能强大的爬虫框架:feapder 2. 介绍及装置和 Scrapy 相似,feapder 反对轻量级爬虫、分布式爬虫、批次爬虫、爬虫报警机制等性能 内置的 3 种爬虫如下: AirSpider轻量级爬虫,适宜简略场景、数据量少的爬虫 Spider分布式爬虫,基于 Redis,实用于海量数据,并且反对断点续爬、主动数据入库等性能 BatchSpider分布式批次爬虫,次要用于须要周期性采集的爬虫 在实战之前,咱们在虚拟环境下装置对应的依赖库 # 装置依赖库pip3 install feapder3. 实战一下咱们以最简略的 AirSpider 来爬取一些简略的数据 指标网站:aHR0cHM6Ly90b3BodWIudG9kYXkvIA== 具体实现步骤如下( 5 步) 3-1 创立爬虫我的项目 首先,咱们应用「 feapder create -p 」命令创立一个爬虫我的项目 # 创立一个爬虫我的项目feapder create -p tophub_demo3-2 创立爬虫 AirSpider 命令行进入到 spiders 文件夹目录下,应用「 feapder create -s 」命令创立一个爬虫 cd spiders# 创立一个轻量级爬虫feapder create -s tophub_spider 1其中 1 为默认,示意创立一个轻量级爬虫 AirSpider2 代表创立一个分布式爬虫 Spider3 代表创立一个分布式批次爬虫 BatchSpider3-3 配置数据库、创立数据表、创立映射 Item 以 Mysql 为例,首先咱们在数据库中创立一张数据表 ...

July 29, 2022 · 2 min · jiezi

关于python:Python-里最具代表性的符号竟如此强大

Python有很多中央应用下划线。在不同场合下,有不同含意:比方_var示意外部变量;__var示意公有属性;__var__示意魔术办法;这些含意有的是程序员群体的约定,如_var;有的是Python解释器规定的模式,如__var。 本文总结Python语言编程中罕用下划线的中央,力求一次搞懂_用法。目前常见的用法有五种: _用于长期变量var_用于解决命名抵触问题_var用于爱护变量__var用于公有变量__var__用于魔术办法上面咱们具体看看这些下划线利用场景。 一、_用于长期变量单下划线个别用于示意长期变量,在REPL、for循环和元组拆包等场景中比拟常见。 1.1 REPL单下划线在REPL中关联的是上一次计算的非None后果。 >>> 1+12>>> _2>>> a=2+2>>> _21+1,后果为2,赋值给_;而赋值表达式a=2+2a为4,但整个表达式后果为None,故不会关联到_。这有点相似日常大家应用的计算器中的ANS按键,间接保留了上次的计算结果。 1.2 for循环中的_for循环中_作为长期变量用。下划线来指代没什么意义的变量。例如在如下函数中,当咱们只关怀函数执行次数,而不关怀具体秩序的状况下,能够应用_作为参数。 nums = 13for _ in range(nums): fun_oper()1.3 元组拆包中的_第三个用法是元组拆包,赋值的时候能够用_来示意略过的内容。如下代码疏忽北京市人口数,只获得名字和区号。 >>> city,_,code = ('Beijing',21536000,'010')>>> print(city,code)Beijing 010如果须要略过的内容多于一个的话,能够应用*结尾的参数,示意疏忽多个内容。如下代码疏忽面积和人口数,只获得名字和区号 city,*_,code = ('Beijing',21536000,16410.54,'010')1.4 国际化函数在一些国际化编程中,_罕用来示意翻译函数名。例如gettext包应用时: import gettextzh = gettext.tranlation('dict','locale',languages=['zh_CN'])zh.install()_('hello world')根据设定的字典文件,其返回相应的汉字“你好世界”。 1.5 大数字示意模式_也可用于数字的宰割,这在数字比拟长的时候罕用。 >>> a = 9_999_999_999>>> a9999999999a的值主动疏忽了下划线。这样用_宰割数字,有利于便捷读取比拟大的数。 二、var_用于解决命名抵触问题变量前面加一个下划线。次要用于解决命名抵触问题,元编程中遇时Python保留的关键字时,须要长期创立一个变量的正本时,都能够应用这种机制。 def type_obj_class(name,class_): passdef tag(name,*content,class_): pass以上代码中呈现的class是Python的保留关键字,间接应用会报错,应用下划线后缀的形式解决了这个问题。 三、_var用于爱护变量后面一个下划线,前面加上变量,这是仅供外部应用的“爱护变量”。比方函数、办法或者属性。 这种爱护不是强制规定,而是一种程序员的约定,解释器不做访问控制。一般来讲这些属性都作为实现细节而不须要调用者关怀,随时都可能扭转,咱们编程时尽管能拜访,然而不倡议拜访。 这种属性,只有在导入时,能力施展爱护作用。而且必须是from XXX import *这种导入模式能力施展爱护作用。 应用from XXX import *是一种通配导入(wildcard import),这是Python社区不举荐的形式,因为你基本搞不清你到底导入了什么属性、办法,很可能搞乱你本人的命名空间。PEP8举荐的导入形式是from XXX import aVar , b_func , c_func这种模式。比方在下例汽车库函数tools.py里定义的“爱护属性”:发动机型号和轮胎型号,这属于实现细节,没必要裸露给用户。当咱们应用from tools import * 语句调用时,其理论并没有导入所有_结尾的属性,只导入了一般drive办法。 ...

July 29, 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 中自带的信号有很多种,具体如下: ...

July 29, 2022 · 1 min · jiezi

关于python:Python-获取线程返回值的三种方式

提到线程,你的大脑应该有这样的印象:咱们能够管制它何时开始,却无法控制它何时完结,那么如何获取线程的返回值呢?明天就分享一下本人的一些做法。 办法一:应用全局变量的列表,来保留返回值ret_values = []def thread_func(*args):    ...    value = ...    ret_values.append(value)抉择列表的一个起因是:列表的 append() 办法是线程平安的,CPython 中,GIL 避免对它们的并发拜访。如果你应用自定义的数据结构,在并发批改数据的中央须要加线程锁。 如果当时晓得有多少个线程,能够定义一个固定长度的列表,而后依据索引来寄存返回值,比方: from threading import Threadthreads = [None] * 10results = [None] * 10def foo(bar, result, index):    result[index] = f"foo-{index}"for i in range(len(threads)):    threads[i] = Thread(target=foo, args=('world!', results, i))    threads[i].start()for i in range(len(threads)):    threads[i].join()print (" ".join(results))办法二:重写 Thread 的 join 办法,返回线程函数的返回值默认的 thread.join() 办法只是期待线程函数完结,没有返回值,咱们能够在此处返回函数的运行后果,代码如下: from threading import Threaddef foo(arg):    return argclass ThreadWithReturnValue(Thread):    def run(self):        if self._target is not None:            self._return = self._target(*self._args, **self._kwargs)    def join(self):        super().join()        return self._returntwrv = ThreadWithReturnValue(target=foo, args=("hello world",))twrv.start()print(twrv.join()) # 此处会打印 hello world。这样当咱们调用 thread.join() 期待线程完结的时候,也就失去了线程的返回值。 办法三:应用规范库 concurrent.futures我感觉前两种形式切实太低级了,Python 的规范库 concurrent.futures 提供更高级的线程操作,能够间接获取线程的返回值,相当优雅,代码如下: import concurrent.futuresdef foo(bar):    return barwith concurrent.futures.ThreadPoolExecutor(max_workers=10) as executor:    to_do = []    for i in range(10):  # 模仿多个工作        future = executor.submit(foo, f"hello world! {i}")        to_do.append(future)    for future in concurrent.futures.as_completed(to_do):  # 并发执行        print(future.result())某次运行的后果如下: hello world! 8hello world! 3hello world! 5hello world! 2hello world! 9hello world! 7hello world! 4hello world! 0hello world! 1hello world! 6以上就是本次分享的所有内容,如果你感觉文章还不错,欢送关注公众号:Python编程学习圈,每日干货分享,发送“J”还可支付大量学习材料,内容笼罩Python电子书、教程、数据库编程、Django,爬虫,云计算等等。或是返回编程学习网,理解更多编程技术常识。

July 29, 2022 · 1 min · jiezi

关于python:使用-chardet-判断文件编码需要注意的坑过大的文件会导致高耗时

chardet 判断 stream:bytes 的时候,要短,然而不能太短 越短越不准,越长越慢 判断一个 15MB 的 txt 文件,须要耗时 5-20 秒 所以,我倡议,取前 256 个字节来判断,能够均衡速度和准确率 def check_encoding(stream: bytes) -> str | None: encoding = chardet.detect(stream[:256]).get('encoding', None) return encoding这样(指取前 256 字节)大略只须要 10-30 ms 就能够判断出文件编码

July 28, 2022 · 1 min · jiezi

关于python:聊聊-Python-中数据库反向生成-Model-最优方案

1. 前言 相熟 Django 的敌人应该晓得,咱们能够通过「 inspectdb 」命令将数据库表反向生成 Model 并写入到文件中去 比方,Django 我的项目映射数据库中有一张 student 表,咱们心愿反向生成 Model 并写入到本地文件 models.py 文件中 只须要输出上面命令: # 反向生成Model# 进入到我的项目根目录,输出上面的命令# 其中# student:映射数据库的student数据表# 写入到index App 下的models.py文件内python3 manage.py inspectdb student > index/models.py但如果是一个一般 Python 我的项目,如何反向生成 Model 呢? 2. 一般我的项目反向生成 Model假如我的项目应用「 sqlalchemy 」连贯操作数据库 from sqlalchemy import create_enginefrom sqlalchemy.orm import sessionmakerengine = create_engine('mysql+pymysql://{}:{}@{}:{}/{}'.format(user, password, host, port, database), echo = True)session = sessionmaker(bind=self.engine)()...接着,咱们装置依赖「 sqlacodegen 」 # 装置依赖pip3 install sqlacodegen这样,咱们就能够应用 sqlacodegen 命令关联数据库表,在本地一键生成 Model 了 def generate_orm_table(db_ip, db_name, table_name, output, username='root', pwd='root', port=3306): """ 生成orm数据表 :return: """ exec_cmd( 'sqlacodegen --tables {} --outfile {} mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8'.format( table_name, output, username, pwd, db_ip, port, db_name))if __name__ == '__main__': # 生成orm数据库表 table_name = 'zlb_users' # 生成Model generate_orm_table("192.168.*.*", "db_name", "table_name", "./../model/{}.py".format(table_name))3. 最初尽管能够通过命令行一键生成 Model,然而生成的局部字段可能存在误差,须要手动进行调整一下比方,数据库如果某个字段为工夫 datetime,反向生成 Model 中的 DateTimeField 字段参数值须要稍微调整 ...

July 28, 2022 · 1 min · jiezi

关于python:DRF-中的模型序列化到底该怎么用

1. 模型序列化的作用? 作为 DRF 中十分要害的一步,模型序列化次要作用有 3 个 序列化数据用于将模型序列化成 JSON 格局的对象,便于数据返回 表单验证在表单申请中,用于验证用户上传的数据是否满足我的项目要求 数据操作可用于数据更新、数据创立、数据保留等 2. 表单字段验证指定须要序列化的字段时,能够设置字段类型、默认值、可读或可写、验证谬误提示信息等,而后针对表单字段进行验证 表单字段验证同样有 3 种形式,别离对应: 2-1 序列化字段,应用参数模式进行制订 比方,字段 name 数据类型为字符串,max_length 指定最大长度,必须输出,并应用「 error_messages 」设置验证失败的提示信息 # 最大长度50# required=True:必须输出# 如果不传递,则报错:name必须要传递name = serializers.CharField(max_length=50, required=True, error_messages={"required": "name必须要传递"})2-2 重写 validate( self , attrs ) 办法进行验证 参数 attrs 蕴含所有字段 咱们只须要自定义验证逻辑,如果验证不通过,抛出「 serializers.ValidationError 」异样即可 比方,这里验证 name 中必须蕴含关键字「 深圳 」,否则抛出异样(代表验证失败) def validate(self, attrs): """ 表单数据验证 :param attrs: :return: """ print(attrs) if "深圳" not in attrs.get("name"): raise serializers.ValidationError('名称中没有蕴含【深圳】,验证失败!') return attrs2-3 重写 validate_字段名(self,value) 办法 ...

July 28, 2022 · 1 min · jiezi

关于python:用Python制作一个相册播放器附源码

对于相册播放器,大家应该都不生疏(用于浏览多张图片的一个利用)。 当然还有视频、音乐播放器,同样是用来播放多个视频、音乐文件的。 在Win10零碎下,用【照片】这个利用关上一张图片,就能够浏览该图片所在文件夹中其它图片了。 从下面的图中发现,还有不少其它方面的性能,比方图片裁剪、编辑、打印等。 明天就带大家学习一个Python制作相册播放器的实战我的项目。 性能嘛,当然没有零碎自带的好,仅做学习哈。 默认5秒切换一张图片,点击向前按钮,能够疾速切换到下一张图片。 次要应用到Pygame这个库,创立一个图形界面。 还有Tkinter库,因为要增加一个图片文件夹,应用tkinter的filedialog疾速选取本地文件夹。 # 装置pip install pygamepip install tkinter好了,接下来就给大家介绍一下。 导入相干库。 import osimport sysimport globimport pygameimport tkinterimport os.pathfrom button import Buttonfrom tkinter import filedialog初始化,设置图形界面的宽为1600,高为900。 增加标题栏图表和标题栏文字,以及中文字体,这里用宋体,所以界面显得有些丑... 最初设置文字背景色和背景图片。 # 初始化pygame.init()# 设置宽, 高, 标题栏WIDTH, HEIGHT = 1600, 900SCREEN = pygame.display.set_mode((WIDTH, HEIGHT))pygame.display.set_caption("相册播放器 | 小F 2022")# 增加中文字体def bold_font(size):    os.chdir(sys.path[0])    return pygame.font.Font("assets/simhei.ttf", size)def regular_font(size):    return pygame.font.SysFont("simhei", size)# 设置文字背景色, 背景图片BASE_TEXT_COLOR = "#6fffe9"BACKGROUND_IMAGE = pygame.image.load("assets/background.png")SCREEN.blit(BACKGROUND_IMAGE, (0, 0))# 更新pygame.display.update()# 设置标题栏图标WINDOW_ICON = pygame.image.load("assets/window_icon.png")pygame.display.set_icon(WINDOW_ICON)成果如下,空空荡荡。 加载局部按钮的图标。 # 设置按钮背景色, 向后按钮, 暂停按钮, 播放按钮, 向前按钮, 加载新相册按钮MAIN_MENU_BUTTON_BACKGROUND = pygame.image.load("assets/main_menu_button_bg.png")REWIND_ICON_SURFACE = pygame.image.load("assets/rewind_icon.png")PAUSE_ICON_SURFACE = pygame.image.load("assets/pause_icon.png")PLAY_ICON_SURFACE = pygame.image.load("assets/play_icon.png")SEEK_ICON_SURFACE = pygame.image.load("assets/seek_icon.png")LOAD_NEW_ALBUM_SURFACE = pygame.image.load("assets/load_new_album_icon.png")设置按钮背景色,向后按钮,暂停按钮,播放按钮,向前按钮,加载新相册按钮。 其次定义各个按钮的性能函数。 # 加载按钮函数def load_button():    # 关上文件管理器, 抉择文件夹    filedialogwindow = tkinter.Tk()    filedialogwindow.withdraw()    filepath = filedialog.askdirectory(title="抉择你的相册")    filedialogwindow.destroy()    album_player(filepath)# 敞开按钮def quit_button():    pygame.quit()    sys.exit()# 向后按钮def rewind_button(current_image_index):    if current_image_index > 0:        current_image_index -= 1    rewind_button_pressed = True    return rewind_button_pressed, current_image_index# 向前按钮def seek_button(current_image_index, image_names):    if current_image_index+1 < len(image_names):        current_image_index += 1    seek_button_pressed = True    return seek_button_pressed, current_image_index# 播放按钮def play_button():    paused = False    unpaused = True    return paused, unpaused# 暂停按钮def pause_button():    paused = True    unpaused = False    return paused, unpaused加载按钮,增加相册; 敞开按钮,退出播放器; 向后按钮,向后切换一张图片; 向前按钮,向前切换一张图片; 播放按钮,开始播放相册中的图片; 暂停按钮,暂停相册图片的播放; 设置主界面,蕴含主页标题栏,加载按钮,敞开按钮文字属性。 同时还须要监听鼠标点击事件。 # 主界面def main_menu():    # 主页标题栏    TITLE_TEXT_SURFACE = bold_font(120).render("相册播放器", True, BASE_TEXT_COLOR)    TITLE_TEXT_RECT = TITLE_TEXT_SURFACE.get_rect(center=(WIDTH/2, 175))    SCREEN.blit(TITLE_TEXT_SURFACE, TITLE_TEXT_RECT)    # 加载按钮    LOAD_BUTTON = Button(        surface=MAIN_MENU_BUTTON_BACKGROUND, pos=(WIDTH/2, 415), text_input="加载",        font=bold_font(100), base_color=BASE_TEXT_COLOR, hovering_color="white"    )    # 敞开按钮    QUIT_BUTTON = Button(        surface=MAIN_MENU_BUTTON_BACKGROUND, pos=(WIDTH/2, 585), text_input="敞开",        font=bold_font(100), base_color=BASE_TEXT_COLOR, hovering_color="white"    )    while True:        # 监听鼠标点击事件        current_mouse_pos = pygame.mouse.get_pos()        LOAD_BUTTON.update(SCREEN)        QUIT_BUTTON.update(SCREEN)        # 依据鼠标点击状况, 是否点击右上角的敞开        for event in pygame.event.get():            if event.type == pygame.QUIT:                pygame.quit()                sys.exit()            # 依据鼠标点击状况, 点击加载或敞开按钮            if event.type == pygame.MOUSEBUTTONDOWN:                if LOAD_BUTTON.check_for_input(current_mouse_pos):                    load_button()                if QUIT_BUTTON.check_for_input(current_mouse_pos):                    quit_button()        # 当鼠标搁置在按钮上, 按钮色彩产生扭转        LOAD_BUTTON.change_color(current_mouse_pos)        QUIT_BUTTON.change_color(current_mouse_pos)        pygame.display.update()依据鼠标点击状况, 是否点击右上角的敞开; 依据鼠标点击状况, 点击加载或敞开按钮; 当鼠标搁置在按钮上, 按钮色彩产生扭转,变成红色。点击敞开,利用会敞开掉。 最初是相册播放器的性能函数,设置每5s切换一张图片。 此外还要调整图片的尺寸大小,不便在播放器中查看。 # 相册播放器性能函数def album_player(folder_path):    SCREEN.blit(BACKGROUND_IMAGE, (0, 0))    image_file_paths = []    image_names = []    current_image_index = 0    paused = False    unpaused = False    seek_button_pressed = False    rewind_button_pressed = False    # 增加加载按钮后, 失去的图片文件夹门路    os.chdir(folder_path)    for file in glob.glob("*"):        current_image_path = f"{folder_path}/{file}"        # 图片门路列表        image_file_paths.append(current_image_path)        # 图片名称列表        image_names.append(file)    # 向后按钮    REWIND_BUTTON = Button(        surface=REWIND_ICON_SURFACE, pos=(WIDTH/2-100, HEIGHT-150), text_input="",        font=bold_font(100), base_color=BASE_TEXT_COLOR, hovering_color="white"    )    # 暂停按钮    PAUSE_BUTTON = Button(        surface=PAUSE_ICON_SURFACE, pos=(WIDTH/2, HEIGHT-150), text_input="",        font=bold_font(100), base_color=BASE_TEXT_COLOR, hovering_color="white"    )    # 播放按钮    PLAY_BUTTON = Button(        surface=PLAY_ICON_SURFACE, pos=(WIDTH/2, HEIGHT-150), text_input="",        font=bold_font(100), base_color=BASE_TEXT_COLOR, hovering_color="white"    )    # 向前按钮    SEEK_BUTTON = Button(        surface=SEEK_ICON_SURFACE, pos=(WIDTH/2+100, HEIGHT-150), text_input="",        font=bold_font(100), base_color=BASE_TEXT_COLOR, hovering_color="white"    )    # 加载新相册按钮    LOAD_NEW_ALBUM_BUTTON = Button(        surface=LOAD_NEW_ALBUM_SURFACE, pos=(WIDTH-325, HEIGHT-150), text_input="",        font=bold_font(100), base_color=BASE_TEXT_COLOR, hovering_color="white"    )    # 获取工夫, 设置每5s切换一张图片    previous_time = pygame.time.get_ticks()    COOLDOWN = 5000    # 设置图片名称文字属性    photo_title_text_surface = bold_font(90).render(image_names[current_image_index], True, BASE_TEXT_COLOR)    photo_title_text_rect = photo_title_text_surface.get_rect(center=(WIDTH/2, 150))    # 图片张图显示    image_count_text_surface = regular_font(80).render(f"图片 {current_image_index+1}/{len(image_names)}", True, BASE_TEXT_COLOR)    image_count_text_rect = image_count_text_surface.get_rect(center=(300, 755))    # 获取图片宽高属性, 窗口显示不适合, 调整大小    new_image_surface = pygame.image.load(image_file_paths[current_image_index])    if new_image_surface.get_height() > 500:        new_image_surface = pygame.transform.scale(new_image_surface, (new_image_surface.get_width() * (500/new_image_surface.get_height()), 500))    elif new_image_surface.get_width() > 800:        new_image_surface = pygame.transform.scale(new_image_surface, (800, new_image_surface.get_height() * (800/new_image_surface.get_width())))    new_image_rect = new_image_surface.get_rect(center=(WIDTH/2, HEIGHT/2))    SCREEN.blit(new_image_surface, new_image_rect)    SCREEN.blit(photo_title_text_surface, photo_title_text_rect)    SCREEN.blit(image_count_text_surface, image_count_text_rect)    REWIND_BUTTON.update(SCREEN)    PAUSE_BUTTON.update(SCREEN)    SEEK_BUTTON.update(SCREEN)    LOAD_NEW_ALBUM_BUTTON.update(SCREEN)    pygame.display.update()    # 监听鼠标点击事件    while True:        for event in pygame.event.get():            # 依据鼠标点击状况, 是否点击右上角的敞开            if event.type == pygame.QUIT:                pygame.quit()                sys.exit()            if event.type == pygame.MOUSEBUTTONDOWN:                # 依据鼠标点击状况, 做向前, 向后, 暂停, 开始等切换图片操作                current_mouse_pos = pygame.mouse.get_pos()                if REWIND_BUTTON.check_for_input(current_mouse_pos):                    rewind_button_pressed, current_image_index = rewind_button(current_image_index)                if SEEK_BUTTON.check_for_input(current_mouse_pos):                    seek_button_pressed, current_image_index = seek_button(current_image_index, image_names)                if paused:                    if PLAY_BUTTON.check_for_input(current_mouse_pos):                        paused, unpaused = play_button()                else:                    if PAUSE_BUTTON.check_for_input(current_mouse_pos):                        paused, unpaused = pause_button()                if LOAD_NEW_ALBUM_BUTTON.check_for_input(current_mouse_pos):                    load_button()        current_time = pygame.time.get_ticks()        # 切换图片, 肯定工夫、点击向后按钮、点击向前按钮、点击开始按钮        if current_time - previous_time >= COOLDOWN or rewind_button_pressed or seek_button_pressed or paused or unpaused:            unpaused = False            if current_image_index < len(image_file_paths)-1 and not seek_button_pressed and not rewind_button_pressed and not paused:                current_image_index += 1            SCREEN.blit(BACKGROUND_IMAGE, (0, 0))            REWIND_BUTTON.update(SCREEN)            if paused:                PLAY_BUTTON.update(SCREEN)            else:                PAUSE_BUTTON.update(SCREEN)            SEEK_BUTTON.update(SCREEN)            LOAD_NEW_ALBUM_BUTTON.update(SCREEN)            new_image_surface = pygame.image.load(image_file_paths[current_image_index])            if new_image_surface.get_height() > 500:                new_image_surface = pygame.transform.scale(new_image_surface, (new_image_surface.get_width() * (500/new_image_surface.get_height()), 500))            elif new_image_surface.get_width() > 800:                new_image_surface = pygame.transform.scale(new_image_surface, (800, new_image_surface.get_height() * (800/new_image_surface.get_width())))            new_image_rect = new_image_surface.get_rect(center=(WIDTH/2, HEIGHT/2))            SCREEN.blit(new_image_surface, new_image_rect)            photo_title_text_surface = bold_font(90).render(image_names[current_image_index], True, BASE_TEXT_COLOR)            photo_title_text_rect = photo_title_text_surface.get_rect(center=(WIDTH/2, 150))            SCREEN.blit(photo_title_text_surface, photo_title_text_rect)            image_count_text_surface = regular_font(80).render(f"图片 {current_image_index+1}/{len(image_names)}", True, BASE_TEXT_COLOR)            image_count_text_rect = image_count_text_surface.get_rect(center=(300, 755))            SCREEN.blit(image_count_text_surface, image_count_text_rect)            pygame.display.update()            previous_time = pygame.time.get_ticks()            seek_button_pressed = False            rewind_button_pressed = False同样也有监听鼠标点击事件,依据鼠标点击状况,做向前、向后、暂停、开始等切换图片操作。 最终成果如下。 好了,本期的分享就到此结束了,有趣味的小伙伴能够自行去实际学习。 讲真,Python能做的货色真不少... 以上就是本次分享的所有内容,如果你感觉文章还不错,欢送关注公众号:Python编程学习圈,每日干货分享,发送“J”还可支付大量学习材料,内容笼罩Python电子书、教程、数据库编程、Django,爬虫,云计算等等。或是返回编程学习网,理解更多编程技术常识。

July 28, 2022 · 1 min · jiezi

关于python:python代码是如何执行的

解释运行程序 回顾上次内容py 文件的程序是依照程序 一行行挨排解释执行的咱们能够 python3 -m pdb hello.py 来对程序调试调试的目标是去除 bug别胆怯 bugbug 会有提醒咱们也就晓得如何 debug 调试程序执行 程序在文本中从上到下是一行行写的调试的时候也是从头到尾一行行执行的然而执行的时候是如何把代码一行行解释执行的呢?说到底 python3 到底是个啥呢? python3 又是怎么解释 hello.py 的?这两这节课相当简单如果感觉太过简单能够间接跳过不影响前面的了解 咱们先要看看python3对Guido.py做了些什么???tokenize首先把字符分组成词词法剖析(lexical analysis)中 把原来的字符流变成了词的流 token(令牌)流 词法剖析之后输入的是一个token流什么是token流呢? 首先要晓得什么是tokentokentoken 令牌 今人说听我号令 号指的是号角令指的是令牌 急急如律令令行禁止怎么把源文件变成一个token流呢?python3模块这个货色是python3的一个模块 具体怎么运行呢?token流咱们尝试运行 python3 -m tokenize guido.py对guido.py进行词法剖析剖析进去的词(token)流长什么样子呢? 这个词怎么了解呢?token流第0行设置了编码格局第1行[0,5)字符是第1行第1个token printprint是一个Name(名字)第1行[5,6)字符是第1行第2个token ((是一个Operator(操作符)第1行[6,30)字符是第1行第3个token "1982------Guido in cwi"这是一个String(字符串)第1行[30,31)字符是第1行第4个token ))是一个Operator(操作符)第1行[31,32)字符是第1行第5个token \n\n是一个NewLine(换行符)换行符意味着第一行完结第2行... 词剖析进去之后呢?组词词剖析进去就是怎么组词的问题 哪些词和哪些词先组合哪些词和哪些词后组合生成一棵形象语法树 AST(Abstract Syntax Tree) 具体怎么生成这棵ast树呢?引入ast模块 具体怎么做呢?流程先把这个ast模块导入(import)进来而后读取guido.py并送到s而后对于s进行语法分析(parse) 不过这乌七八糟堆一起怎么了解呢?缩进换行把剖析的后果进行dump(转储) 目前lanqiao.cn下面的python是3.8这个换行须要在3.9以上实现只能在本地演示一下缩进演示 这个就是把词组成语法树的样子然而语法树还不能间接执行什么能力间接执行呢?翻译成字节码字节码(指令)能力真正执行怎么把ast转化为字节码(指令)呢?须要编译从一种语言到另一种语言 从py文件到字节码(指令) 我能够看看这个编译过程么?compile 这个货色齐全是乱码我看不懂啊?vi关上这个这个pyc文件二进制状态:set wrap设置换行 能够看到他的二进制状态么?二进制:%!xxd 把文件转化为二进制 切实是看不懂啊能把这个字节码(指令)变成咱们人能看懂的么?反编译disassembler这个词由两局部组成 dis (反着来的)assembler (汇编语言)整体就是 把py源文件编译成的字节码(指令)反编译(disassembler)成这些字节码对应的助记符(指令的含意) 这能够用么?去试试!反编译(dis)python3 -m dis guido.py ...

July 28, 2022 · 1 min · jiezi

关于python:Python自动化操作sqlite数据库

你好,我是悦创。 原文首发:https://bornforthis.cn/column/pyauto/ 1. 什么是数据库数据库是“依照数据结构来组织、存储和治理数据的仓库”,是一个长期存储在计算机内的、有组织的、有共享的、对立治理的数据汇合。 数据库是以肯定形式贮存在一起、能与多个用户共享、具备尽可能小的冗余度、与应用程序彼此独立的数据汇合,可视为电子化的文件柜。 2. 有哪些数据库2.1 数据库类型大型数据库:甲骨文Oracle。 分布式数据库:HBase。 中型数据库:SqlServer、Mysql、MariaDB、PostgreSQL、Redis等。 小型数据库:Sqlite、 Access 。 2.2 如何抉择大团体:Oracle、HBase。 倒退中公司:PostgreSQL、Mysql。 app 的长期数据库:Sqlite。 2.3 Sqlite不便携带、易于操作、随时创立、Python 原生反对的小型数据库文件。轻型的数据库,恪守 ACID 的关系型数据库管理系统,它蕴含在一个绝对小的 C 库中。D.RichardHipp 建设的私有畛域我的项目。设计指标是嵌入式的,而且曾经在很多嵌入式产品中应用了它,它占用资源十分的低,在嵌入式设施中,可能只须要几百 K 的内存就够了。反对 Windows/Linux/Unix 等等支流的操作系统。可能跟很多程序语言相结合,比方 Tcl、C#、PHP、Java 等,还有 ODBC 接口。比起 Mysql、PostgreSQL 这两款开源的世界驰名数据库管理系统来讲,它的处理速度比他们都快。第一个 Alpha 版本诞生于 2000年5月。 至 2015年曾经有 15 个年头,SQLite 也迎来了一个版本 SQLite 3 曾经公布。Python 自带 sqlite3 这个库,不便且间接的创立和读取 sqlite3 数据库。3. sqlite 创建表格3.1 sqlitestudio 介绍本节内容的目标,是教大家如何在非代码的状况下,创立 sqlite3 数据库文件和表格编辑操作。 既然不写代码,就必定须要借助软件来操作。本节课对应的源码中,筹备好了 windows、macos、linux 三个零碎的 sqlitestudio 软件,如下图: windows 应用 zip;macos 应用 dmg;linux 应用 tar.xz;sqlitestudio 是一款绿色软件,装置你的操作系统所对应的 sqlitestudio 软件,而后执行,就能够失去启动界面。 ...

July 27, 2022 · 2 min · jiezi

关于python:5-分钟快速入门-Python-JWT-接口认证

1. 前言 为了反爬或限流节流,后端编写接口时,大部分 API 都会进行权限认证,只有认证通过,即:数据失常及未过期才会返回数据,否则间接报错 本篇文章以 Django 为例,聊聊后端 JWT 接口认证的操作流程 2. JWT 介绍JWT 全称为 JSON Web Token,是目前支流的跨域认证解决方案 数据结构由 3 局部组成,两头由「 . 」宰割开 它们别离是: Header 头部Payload 负载Signature 签名# JWT 数据的格局# 组成形式:头部.负载.签名Header.Payload.Signature其中 Header 用于设置签名算法及令牌类型,默认签名算法为 「 HS256 」,令牌类型能够设置为「 JWT 」 Payload 用于设置须要传递的数据,蕴含:iss 签发人、exp 过期工夫、iat 签发工夫等 Signature 用于对 Header 和 Payload 进行签名,默认应用的签名算法为 Header 中指定的算法 # JWT 数据组成# Header. Payload. Signature# Header:{ "alg": "HS256","typ": "JWT"}# Payload:iss、exp、iat等# Signature:签名Signature = HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)PS:base64UrlEncode 相比 Base64 算法,会将后果中的「 = 」省略、「 + 」替换成「 - 」、「 / 」替换成「 _ 」 ...

July 27, 2022 · 2 min · jiezi

关于python:Python-终结者-装饰器也叫-Decorator

1. 前言RPC,全程为 Remote Procedure Call,是一种过程间的通信形式,它采纳「 服务端 / 客户机 」模式,是一种申请响应模型 其中,服务端负责提供服务程序、响应申请做具体的实现逻辑,客户机负责申请调用 支流的 RPC 框架蕴含: 阿里的 DubboFacebook 的 ThriftGoogle 的 gRpc新浪微博的 MotanGolang 生态的 rpcx其中,gRpc 和 Thrift 是跨语言的 RPC 服务框架,并且 Thrift 相比性能更高 本篇文章以 Thrift 为例,聊聊 Python 中应用 RPC 的流程 2. thriftpy2 介绍Thrift 是一种接口描述语言和二进制通信协定,它能够被用来定义和创立跨语言的服务,使得不同语言的客户端、服务器之间能进行高效通明的通信 thriftpy2 是在 Thrift 的根底上进行二次封装,应用它编写 RPC 更加方便快捷 我的项目地址:https://github.com/Thriftpy/t... 首先,咱们在虚拟环境下装置依赖包 # 装置依赖pip3 install thriftpy2而后,如果是 Windows,倡议在 Pycharm 中装置 thrift 插件 PS:该插件能够不便咱们编写 Thrift 通信文件 下载地址:https://plugins.jetbrains.com... 3. 实战一下首先,依据需要编写 Thrift 通信文件 比方,该文件定义 2 个办法 无参函数 ping登录 login蕴含两个参数:username、password ...

July 27, 2022 · 1 min · jiezi

关于python:Python轻量级Web框架Bottle库

Bottle是一个超轻量级的python库。说是库,其自身只由一个4000行左右的文件形成,并且不须要任何依赖,只靠python规范库即可运作。 和它自身的轻便一样,Bottle库的应用也非常简略。置信在看到本文前,读者对python也曾经有了简略的理解。那么到底何种神秘的操作,能力用百行代码实现一个服务器的性能?让咱们刮目相待。 一. Bottle库装置 1)应用pip装置 2)下载Bottle文件 https://github.com/bottlepy/b... 二.“HelloWorld!” 所谓万事功成先HelloWorld,从这个简略的示例中,理解Bottle的根本机制。 先上代码: 首先咱们从bottle库中导入get和run两个办法。 接下来,咱们要构建一个网站,首先要有一个ip地址和一个端口(port),这部分性能由run来实现,在测试环节咱们就应用127.0.0.1(本机地址)和80端口(浏览器默认端口)来:运行这段代码 python HelloWorld.py 这样网站服务器就处于运行状态啦,关上浏览器,输出127.0.0.1(:80) 相熟的404,谬误提醒Not found:‘/’。这是当然的,因为网站除了服务器之外,还有很重要的成分——网页啊! 浏览器拜访ip地址时,即向这个ip发送了get申请,期待返回网页数据,那么咱们的bottle库里,封装了get办法,用来实现这一过程。 代码如下: 不晓得大家是否意识def下面的@符号,这个符号是python语法中的装璜器的意思,能够简略的了解为应用get函数对homepage进行润饰。在这里,@get(‘/’)行将homepage装璜成了浏览器发送GET 127.0.0.1/这个申请时的相应函数。能够做任意解决,最初返回get申请的相应。这里就返回了简略的HelloWorld页面,再次运行,就有这样的成果: 也能够应用bottle中封装的template办法,将网页数据独自写在.tpl文件中,示例如下: run函数还有一个参数reloader,将其设置为True将会关上主动重载,网页服务器会在你做出任何更改时主动重载服务器,可实现网站的热更新。 三.动静路由及文件下载 如上咱们应用的get(‘/’),实质上是一种动态路由,在服务器运行前就确定好的地址能够用这种办法来进行路由。 那么如果是服务器运行时呢?比如说网站服务器上存取文件,当然不能采取动态的形式,这时候咱们就能够采纳动静路由。 Bottle的动静路由,由route办法实现,和get相似,也是采纳装璜器来润饰函数实现路由性能。 这里咱们看到在装璜器的参量中呈现了一个不同凡响的货色:'name'。被其润饰的函数的参数与冒号后的参量同名,而在函数中,就能够应用name这个参数作为解决变量,最初返回响应即可。 而动静路由即可为文件路由提供便当。一个服务器中可能寄存着成千盈百的文件,不可能每个都依附动态地址。 这里咱们能够看到一个新的函数static_file,第一个参数为文件名,第二个参数为根目录地址(即这个文件所在的地位),以后文件系统为: --HelloWorld.py  --store1.txt 拜访浏览器失去 当然你也能够把文件放在文件夹里,只有把root参数更换成文件夹的地址即可。 四. POST的响应与文件上传 如果要实现更简单的性能,咱们岂但须要应用GET办法,也须要POST办法。这里咱们应用HTML语言中的Form来演示Bottle库对于POST申请的响应。 首先咱们实现一个上传文件的窗口,如上。 此处的页面为一个简略的表单提交界面,在此不做具体介绍,关上页面如下: 接下来的POST响应,代码如下: 从Bottle库中导入post办法和request。 和get办法相似,应用post装璜响应函数,之后在函数体中应用request即可获取网站服务器承受到的post申请体。request.forms.get()办法能够将表单中对应Key的字符串取出,request.files.get()办法能够将表单中对应Key的文件取出,应用save办法将数据贮存就实现了文件的上传。 接下来咱们进行一次测试: 点击上传后,咱们关上服务器根目录(就是python文件的地位),查看发现文件曾经上传胜利! 五.小结 在实现这些性能后,你肯定想把bottle部署到网络上吧,毕竟只在本地运行的话,网站又有什么作用呢? 清华网为咱们每一个网络接入点都提供了公网ip,在cmd中应用ipconfig查看ip地址,将run中的运行参数改为你的公网ip,而后在任何一台设施的浏览器上(倡议手机,电脑浏览器有时候会很慢)输出ip地址和端口号(默认80),就能够拜访啦! Bottle库还有很多弱小的性能,Cookie的读写、插件的装置卸载与禁用都不在话下,也能够将Bottle部署到其余的服务器,非常简单的实现多线程。 以上就是本次分享的所有内容,如果你感觉文章还不错,欢送关注公众号:Python编程学习圈,每日干货分享,发送“J”还可支付大量学习材料,内容笼罩Python电子书、教程、数据库编程、Django,爬虫,云计算等等。或是返回编程学习网,理解更多编程技术常识。

July 27, 2022 · 1 min · jiezi

关于python:mysql-select-需要提交-commit-吗

看你的需要 mysql 的 innodb 反对多种事务隔离级别: READ UNCOMMITTEDREAD COMMITTEDREPEATABLE READSERIALIZABLE默认的隔离级别是 REPEATABLE READ pgsql 的默认的隔离级别是 READ COMMITTED;sql server 默认是 READ UNCOMMITTED; sql server 默认是 Read Committed咱们应用 mysql 的默认事务隔离级别,又敞开了主动提交事务:SET AUTOCOMMIT = 0。又凑巧,你应用 select 后不应用 commit。那你这辈子会只能读取到反复的数据。 比方上面一个表: 连贯 1 ,读取 id = 1 的 row连贯 2,批改 id=1 的 row 的 name 为 pon 这个时候,连贯 1 再读取 id=1 的 row,你感觉 name 是什么?是 1 还是 pon? 答案是 1 ,而不是 pon 这很可怕 那要怎么能力读取到 pon 而不是 1 呢? ...

July 26, 2022 · 1 min · jiezi