首页 文章 精选 留言 我的

精选列表

搜索[python3],共1105篇文章
优秀的个人博客,低调大师

Python3源码—字符串(str)对象

5.1. 字符串对象 字符串对象是“变长对象”。 5.1.1. Python中的创建 Python中字符串(strs)对象最重要的创建方法为PyUnicode_DecodeUTF8Stateful,如下Python语句最终会调用到PyUnicode_DecodeUTF8Stateful: a = 'hello b = str('world') 5.1.2. PyUnicode_DecodeUTF8Stateful的C调用栈 词法解析,最终调到PyUnicode_DecodeUTF8Stateful,调用顺序如下: // ast.c ast_for_expr =>ast_for_power =>ast_for_atom_expr =>ast_for_atom (case STRING) =>parsestrplus =&g

优秀的个人博客,低调大师

Python3源码—字符串(bytes)对象

4.1. 字符串对象 字符串对象是“变长对象”。 4.1.1. Python中的创建 Python中字符串(bytes)对象创建最重要的方法为PyBytes_FromStringAndSize,如下Python语句最终会调用到PyBytes_FromStringAndSize: a = b'hello' b = str(b'world') 4.1.2. PyBytes_FromStringAndSize的C调用栈 词法解析,最终调到PyBytes_FromStringAndSize,调用顺序如下: // ast.c ast_for_expr =>ast_for_power =>ast_for_atom_expr =>ast_for_atom (case STRING) =>parsestrplus =>parses

优秀的个人博客,低调大师

Python3 & OpenCV之环境搭建(win10)

因为接下来要完成一个机器视觉的项目,在导师的指导下,选定了“工业场景视觉感知系统”的课题,其中涉及到图像处理相关知识,在一番查找下,决定先对OpenCV下手(通过openCV可实现计算机图像、视频的编辑。广泛应用于图像识别、运动跟踪、机器视觉等领域。)当了解到其提供了python接口时,我决定先配置好OpenCV的相关环境,来体验下OpenCV的强大功能,接下来便是环境搭建的过程。顺便对常见问题做了个整合!环境/工具:python3.6.5,pycharm,win10 1.先用管理员身份打开cmd,依次输入: pip install --upgrade setuptools pip install numpy Matplotlib pip install opencv-python 如果在pip install --upgrade setuptools时出现PermissionError: [WinError 32] 另一个程序正在使用此文件,进程无法访问。这个问题,请不要慌张。在一番查找下,发现原来是编码的问题,进入python目录下c:\program files\python36\lib\site-packages\pip\compat__init__.py找到文件并修改其大概75行出的代码,把return s.decode('utf_8')改为return s.decode('cp936')即可。 如果多次下载失败,可以从http://www.lfd.uci.edu/~gohlke/pythonlibs/直接下载whl包安装,安装whl包依然使用pip install +刚下载文件地址 2.测试 import cv2 as cv img = cv.imread('E:\\opencv.jpg') cv.namedWindow('test') cv.imshow('test', img) cv.waitKey(0) cv.destroyAllWindows() test 3.如遇到无法调用cv2 第一次导入cv2的时候在PyCharm IDE中使用的时候,会出现无法调取,不自动补全代码或者不自动提示的情况,这个时候,只要打开setting页面删除解释器,再次添加一下,重新加载好了以后就再不会出现这个问题。 依次打开File--->Default--->选择opencv-python--->选择删除--->再重新安装即可 重启pycharm,新建文件,测试代码 感谢 Mr番茄蛋的博客,yuanCruise ,lclblack,贾志刚提供的帮助。

优秀的个人博客,低调大师

Python3快速入门——(7)迭代(iterable)和迭代器

迭代(iterable) #任何可迭代对象都可以作用于for循环,包括我们自定义的数据类型,只要符合迭代条件,就可以使用for循环 d = { 'a' : 1 , 'b' : 2 , 'c' : 3 } #对dict迭代 for k,v in d.items(): # 如果要同时迭代key和value,可以用for k, v in d.items() print (k,v) #默认情况下,dict迭代的是key # 如果要迭代value,可以用for value in d.values() #字符串也是可迭代对象,因此,也可以作用于for循环 #如何判断一个对象是可迭代对象呢?方法是通过collections模块的Iterable类型判断 from collections import Iterable #导入collections模块的Iterable类型 n= isinstance (d,Iterable) print (n) #结果为True,可迭代 #Python内置的 enumerate 函数可以把一个list变成索引-元素对,这样就可以在for循环中同时迭代索引和元素本身 names=[ 'a' , 'b' , 'c' , 'd' ] for i,value in enumerate (names): #for循环同时引用两个变量 print (i,value) for x,y in [( 1 , 2 ),( 3 , 5 ),( 5 , 6 )]: ##for循环同时引用两个变量 print (x,y) 迭代器 可以直接作用于 for 循环的数据类型有以下几种: 一类是 集合数据类型 ,如 list 、 tuple 、 dict 、 set 、 str 等; 一类是 generator ,包括生成器和带 yield 的generator function。 这些可以直接作用于 for 循环的对象统称为可迭代对象: Iterable #可以使用isinstance()判断一个对象是否是Iterable对象 from collections import Iterable m= isinstance ([],Iterable) #True #而生成器不但可以作用于for循环,还可以被next()函数不断调用并返回下一个值, # 直到最后抛出StopIteration错误表示无法继续返回下一个值了。 #可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator #生成器都是Iterator对象,但list、dict、str虽然是Iterable,却不是Iterator。 #把list、dict、str等Iterable变成Iterator可以使用iter()函数 from collections import Iterator m= isinstance ( iter ( 'abc' ),Iterator) #True 凡是可作用于 for 循环的对象都是 Iterable 类型; 凡是可作用于 next() 函数的对象都是 Iterator 类型,它们表示一个惰性计算的序列; 集合数据类型如 list 、 dict 、 str 等是 Iterable 但不是 Iterator ,不过可以通过 iter() 函数获得一个 Iterator 对象。 Python的 for 循环本质上就是通过不断调用 next() 函数实现的

优秀的个人博客,低调大师

Python3快速入门——(4)循环结构和判断结构

循环结构 #循环结构 cities=[ "Austin" , "Dallas" , "Houston" ] for city in cities: #for循环 print (city) #通过缩进控制整体结构 i= 0 while i< 3 : #while循环 i+= 1 print (i) for j in range ( 10 ): #range(n)表示从0到n-1的n个数 print (j) cities=[[ "Austin" , "Dallas" , "Houston" ],[ "Haerbin" , "Shanghai" , "Beijing" ]] #list中的元素仍是list for city in cities: print (city) #输出list中的两个list元素 for i in cities: #两层for循环输出两个list中的每个元素 for j in i: print (j) #注意: 如果代码写得有问题,会让程序陷入“死循环”,也就是永远循环下去。这时可以用 Ctrl+C 退出程序,或者强制结束Python进程。 #注意 : Python提供一个 range() 函数,可以生成一个整数序列,再通过 list() 函数可以转换为list #例如: list ( range (5)) 结果为:[0, 1, 2, 3, 4] 判断结构 #选择结构 cat= True #bool类型值 dog= False print ( type (cat)) #<class 'bool'> print ( 8 == 8 ) #True 判断语句 print ( 8 != 8 ) #False print ( 10 >= 5 ) #True sample_rate= 700 if (sample_rate> 50 ): #if语句选择 print (sample_rate) else : print ( 'less lan' )

优秀的个人博客,低调大师

使用Docker Swarm部署可扩展的Python3应用

Ben Firshman 最近在 Dockercon 做了一个关于使用 Docker 构建无服务应用的演讲,你可以在这里查看详情(还有视频)。之后,我写了一篇关于如何使用 AWS Lambda 构建微服务系统的文章。 今天,我想展示给你的就是如何使用 Docker Swarm 部署一个简单的 Python Falcon REST 应用。这里我不会使用dockerrun 或者是其他无服务特性,你可能会惊讶,使用 Docker Swarm 部署(复制)一个 Python(Java、Go 都一样)应用是如此的简单。 注意:这展示的部分步骤是截取自 Swarm Tutorial,我已经修改了部分内容,并且增加了一个 Vagrant Helper 的仓库来启动一个可以让 Docker Swarm 工作起来的本地测试环境。请确保你使用的是 1.12 或以上版本的 Docker Engine。我写这篇文章的时候,使用的是 1.12RC2 版本。注意的是,这只是一个测试版本,可能还会有修改。 你要做的第一件事,就是如果你想本地运行的话,你要保证 Vagrant 已经正确的安装和运行了。你也可以按如下步骤使用你最喜欢的云服务提供商部署 Docker Swarm 虚拟机系统。 我们将会使用这三台 VM:一个简单的 Docker Swarm 管理平台和两台 worker。 安全注意事项:Vagrantfile 代码中包含了部分位于 Docker 测试服务器上的 shell 脚本。这是一个潜在的安全问题,它会运行你不能控制的脚本,所以请确保你会在运行代码之前审查过这部分的脚本。 $gitclonehttps://github.com/chadlung/vagrant-docker-swarm $cdvagrant-docker-swarm $vagrantplugininstallvagrant-vbguest $vagrantup Vagrant up 命令需要一些时间才能完成。 SSH 登录进入 manager1 虚拟机: $vagrantsshmanager1 在 manager1 的 ssh 终端会话中执行如下命令: $sudodockerswarminit--listen-addr192.168.99.100:2377 现在还没有 worker 注册上来: $sudodockernodels 让我们注册两个新的 worker,请打开两个新的终端会话(保持 manager1 会话继续运行): $vagrantsshworker1 在 worker1 的 ssh 终端会话上执行如下命令: $sudodockerswarmjoin192.168.99.100:2377 在 worker2 的 ssh 终端会话上重复这些命令。 在 manager1 终端上执行如下命令: $dockernodels 你将会看到: 在 manager1 的终端里部署一个简单的服务。 sudodockerservicecreate--replicas1--namepingeralpinepinggoogle.com 这个命令将会部署一个服务,它会从 worker 之一 ping google.com。(或者 manager,manager 也可以运行服务,不过如果你只是想 worker 运行容器的话,也可以禁用这一点)。可以使用如下命令,查看哪些节点正在执行服务: $sudodockerservicetaskspinger 结果会和这个比较类似: 所以,我们知道了服务正跑在 worker1 上。我们可以回到 worker1 的会话里,然后进入正在运行的容器: $sudodockerps 你可以看到容器的 id 是: ae56769b9d4d,在我的例子中,我运行如下的代码: $sudodockerattachae56769b9d4d 你可以按下 CTRL-C 来停止服务。 回到 manager1,然后移除这个 pinger 服务。 $sudodockerservicermpinger 现在,我们将会部署可复制的 Python 应用。注意,为了保持文章的简洁,而且容易复制,所以部署的是一个简单的应用。 你需要做的第一件事就是将镜像放到 Docker Hub上,或者使用我已经上传的一个。这是一个简单的 Python 3 Falcon REST 应用。它有一个简单的入口: /hello 带一个 value 参数。 放在 chadlung/hello-app 上的 Python 代码看起来像这样: importjson fromwsgirefimportsimple_server importfalcon classHelloResource(object): defon_get(self,req,resp): try: value=req.get_param('value') resp.content_type='application/json' resp.status=falcon.HTTP_200 resp.body=json.dumps({'message':str(value)}) exceptExceptionasex: resp.status=falcon.HTTP_500 resp.body=str(ex) if__name__=='__main__': app=falcon.API() hello_resource=HelloResource() app.add_route('/hello',hello_resource) httpd=simple_server.make_server('0.0.0.0',8080,app) httpd.serve_forever() Dockerfile 很简单: FROMpython:3.4.4 RUNpipinstall-Upip RUNpipinstall-Ufalcon EXPOSE8080 COPY./hello-app WORKDIR/hello-app CMD["python","app.py"] 上面表示的意思很简单,如果你想,你可以在本地运行该进行来访问这个入口: http://127.0.0.1:8080/hello?value=Fred 这将返回如下结果: {"message":"Fred"} 在 Docker Hub 上构建和部署这个 hello-app(修改成你自己的 Docker Hub 仓库或者使用这个): $sudodockerbuild.-tchadlung/hello-app:2 $sudodockerpushchadlung/hello-app:2 现在,我们可以将应用部署到之前的 Docker Swarm 了。登录 manager1 的 ssh 终端会话,并且执行: $sudodockerservicecreate-p8080:8080--replicas2--namehello-appchadlung/hello-app:2 $sudodockerserviceinspect--prettyhello-app $sudodockerservicetaskshello-app 现在,我们已经可以测试了。使用任何一个 Swarm 节点的 IP 来访问 /hello 入口。在本例中,我在 manager1 的终端里使用 curl 命令: 注意,Swarm 中的所有的 IP 都可以,不管这个服务是运行在一台还是更多的节点上。 $curl-v-XGET"http://192.168.99.100:8080/hello?value=Chad" $curl-v-XGET"http://192.168.99.101:8080/hello?value=Test" $curl-v-XGET"http://192.168.99.102:8080/hello?value=Docker" 结果: *HostnamewasNOTfoundinDNScache *Trying192.168.99.101... *Connectedto192.168.99.101(192.168.99.101)port8080(#0) >GET/hello?value=ChadHTTP/1.1 >User-Agent:curl/7.35.0 >Host:192.168.99.101:8080 >Accept:*/* > *HTTP1.0,assumecloseafterbody <HTTP/1.0200OK <Date:Tue,28Jun201623:52:55GMT <Server:WSGIServer/0.2CPython/3.4.4 <content-type:application/json <content-length:19 < {"message":"Chad"} 从浏览器中访问其他节点: 如果你想看运行的所有服务,你可以在 manager1 节点上运行如下代码: $sudodockerservicels 如果你想添加可视化控制平台,你可以安装 Docker Swarm Visualizer(这对于展示非常方便)。在 manager1 的终端中执行如下代码: $sudodockerrun-it-d-p5000:5000-eHOST=192.168.99.100-ePORT=5000-v/var/run/docker.sock:/var/run/docker.sockmanomarks/visualizer 打开你的浏览器,并且访问: http://192.168.99.100:5000/ 结果如下(假设已经运行了两个 Docker Swarm 服务): 要停止运行 hello-app(已经在两个节点上运行了),可以在 manager1 上执行这个代码: $sudodockerservicermhello-app 如果想停止 Visualizer, 那么在 manager1 的终端中执行: $sudodockerps 获得容器的 ID,这里是: f71fec0d3ce1,从 manager1 的终端会话中执行这个代码: $sudodockerstopf71fec0d3ce1 祝你成功使用 Docker Swarm。这篇文章主要是以 1.12 版本来进行描述的。 本文作者:Chad Lung 来源:51CTO

优秀的个人博客,低调大师

Leetcode 498:对角线遍历Diagonal Traverse(python3、java)

对角线遍历 给定一个含有 M x N 个元素的矩阵(M 行,N 列),请以对角线遍历的顺序返回这个矩阵中的所有元素,对角线遍历如下图所示。Given a matrix of M x N elements (M rows, N columns), return all elements of the matrix in diagonal order as shown in the below image.示例: 输入: [ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ] ] 输出: [1,2,4,7,5,3,6,8,9] 解释: 说明: 给定矩阵中的元素总数不会超过 100000 。 思路: ​ 实例输入的二维数组范围均是0~2 ​ 先观察一下遍历规律:(0,0)->(0,1)->(1,0)->(2,0)->(1,1)->(0,2)->(1,2)->(2,1)->(2,2) ​ 数组索引(m,n),两种改变方式1、(m-1,n+1) 2、(m+1,n-1) ​ 数组从(0,0)开始,先是(m-1,n+1) ,(0,0)->(-1,1)此时m=-1,超出范围,m赋值0。然后切换索引改变方式(m+1,n-1),执行两次(0,1)->(1,0)->(2,-1),n赋值0得到(2,0),再次切换为索引改变方式(m-1,n+1)直到下次超出范围(2,0)->(1,1)->(0,2)->(-1,3)。此时m<0且n>2均超出范围,(m+2,n-1),应当优先判断n是否超出范围,执行(m+2,n-1)->(1,2),避免因为m<0再次切换一次索引改变方式。然后正常切换后:(1,2)->(2,1)->(3,0),因为m>2,切换方式并(m-1,n+2) java: class Solution { public int[] findDiagonalOrder(int[][] matrix) { if (matrix.length==0||matrix[0].length==0)return new int[0]; int col=matrix.length,row=matrix[0].length; int nums=col*row,m=0,n=0; int res[]=new int[nums]; boolean flag=true; for(int i=0;i<nums;i++){ res[i]=matrix[m][n]; if(flag){ n+=1; m-=1; }else{ n-=1; m+=1; } if(m>=col){ m-=1; n+=2; flag=true; }else if(n>=row){ n-=1; m+=2; flag=false; } if(m<0){ m=0; flag=false; }else if(n<0){ n=0; flag=true; } } return res; } } 注意点: ​ if (matrix.length==0||matrix[0].length==0)return new int[0];首先判断是否为空数组,另外 matrix.length==0||matrix[0].length==0 判断条件顺序不能颠倒,因为如果 matrix.length==0 后面的 matrix[0].length==0 不会再判断,即返回空数组;但是matrix[0].length==0 在前时,如果输入数组为空,matrix[0] 会报错因为matrix并没有0号索引。 ​ for循环里应当先判断m、n是否大于或等于各自的最大长度,然后执行(m-1,n+2)、(m+2,n-1)。避免出现m、n同时小于0时flag布尔值转换两次的错误。 python: class Solution: def findDiagonalOrder(self, matrix: List[List[int]]) -> List[int]: if(len(matrix)==0 or len(matrix[0])==0): return [] col=len(matrix) row=len(matrix[0]) nums=col*row m=n=0 flag=True res=[] for i in range(nums): res.append(matrix[m][n]) if flag: m-=1 n+=1 else: m+=1 n-=1 if m>=col: m-=1 n+=2 flag=True elif n>=row: m+=2 n-=1 flag=False if m<0: m=0 flag=False elif n<0: n=0 flag=True return res

优秀的个人博客,低调大师

Python3和tkinter开发简单图形界面程序

源码库: program-in-chinese/wubi_code_editor 起因在这里. 由于此项目和汉字相关, 个人也想尝试Python的图形界面开发, 于是开始尝试. 遇到的一个坑. 用户测试时, 发现png图片加载不了, 后发现是由于tkinter版本问题: Tkinter.PhotoImage doesn't not support png image 现在还处于原型状态, 两百多行代码都在一个文件中. 几个主要问题: 界面需要分离, 与界面无关的部分需要添加测试用例 文件路径只支持Linux/Mac, 还需支持Windows, 参考: Python 3 Quick Tip: The easy way to deal with file paths on Windows, Mac and Linux 完善功能: 支持对缺失数据的添加, 按编码范围导出到不同文件(出处); 按字搜索; 笔顺数据; Unicode 编码区 在VS code下开发, 还没使用测试/调试相关功能. 参考: Python in Visual Studio Code 源码节选: 读入csv源数据: def 读入源数据文件(self, 文件名): # 官方文档参考: https://docs.python.org/3/library/csv.html#module-contents with open(文件名, newline='') as 源数据文件: 源数据读取器 = csv.reader(源数据文件, delimiter=',') for 行 in 源数据读取器: self.字符列表.append(行) 导出csv文件: def 导出文件(self): with open(常量_修改后文件, 'w', newline='') as 目标文件: 写文件 = csv.writer(目标文件, delimiter=',') for 字符 in self.字符列表: 写文件.writerow(字符) print("修改保存到: " + 常量_修改后文件) 创建图片显示: # 显示图片, 参考: https://stackoverflow.com/questions/35024118/how-to-load-an-image-into-a-python-3-4-tkinter-window def 创建图片显示(self, 区域, 字体名, 位置): 字体区 = Frame(区域) 字体区.pack(side = 位置) 字体提示 = Label(字体区, text = 字体名) 字体提示.pack() 图片路径 = 常量_图片主目录 + 常量_图片路径[字体名] + self.图片子路径 print(图片路径) try: 图片 = PhotoImage(file=图片路径) except: print("找不到图片") 图片 = PhotoImage() 图片显示 = Label(字体区, image=图片) 图片显示.image = 图片 图片显示.pack() return 图片显示 ----------- 10/1/2018 更新 ------------ 功能和重构基本完成. 还剩下一个问题"文件路径只支持Linux/Mac, 还需支持Windows", 由于题主只在Linux下使用, 暂不打算实现. 经过添加测试, 发现了几个bug. 承蒙题主宣传: 感谢 xuanwu 制作五笔编码编校软件 Python 版 - V2EX ---------- 12/24/2018 更新 ---------- 上个月题主提交了好几个PR, 很高兴看到原本的纯用户成为了合作者. 最近的在国内原创开源项目中使用中文命名的意义与方式一文也受了这个实例的启发.

优秀的个人博客,低调大师

Python3爬虫】最新的模拟登录新浪微博教程

一、写在前面 首先呢,由于之前重装系统,又要重新配置环境,然后还有一些别的事,导致我一直没有写爬虫了,不过现在又可以继续写了。 然后我这次说的模拟登录新浪微博呢,不是使用Selenium模拟浏览器操作,毕竟Selenium的效率是真的有些低,所以我选择用Python发送请求实现模拟登录,整个过程还算是有点小曲折吧。 二、开发环境 Windows10 + Python3.7 + Pycharm + Fiddler 三、页面分析 首先打开新浪微博,网址为:https://weibo.com/,这里我们只需要关注登录这一部分,如下图: 这样看是看不出来东西的,打开开发者工具,刷新一下页面,找找看有没有什么可疑的东西,然后就能找到下面这个包: 看到prelogin就能猜到应该是和登录有关的了,于是点击“Preview”查看具体内容: 到这里还是什么都看不出来,也不知道这些数据有什么用。这时候Fiddler就能派上用场了,首先打开Fiddler,然后在网页上输入用户名和密码并登录新浪微博,登录成功之后在Fiddler中找寻相关信息,可以找到下面这个url: https://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.19) 点开之后可以看到携带了很多参数: 在这些参数中,我们需要关注的参数为:su,sp,servertime,nonce,pubkey,rsakv。其中su是用户名加密后的结果,sp是密码加密后的结果,servertime是一个时间戳,而剩余三个参数都来源于我们前面找到的prelogin.php。那么现在的问题就在于用户名和密码是怎么加密的? 小编给大家推荐一个学习氛围超好的地方,python交流企鹅裙:【611+530+101】适合在校大学生,小白,想转行,想通过这个找工作的加入。裙里有大量学习资料,有大神解答交流问题,每晚都有免费的直播课程 四、加密规则 首先还是找到prelogin.php,在它携带的参数中看到有一个ssologin.js,猜测它可能和加密规则有关系,所以找一下这个ssologin.js。 这里需要打开新浪的登录页面:https://login.sina.com.cn/,然后右键查看源码,再搜索“ssologin.js”,就能找到这个js文件了: https://passport.sinaimg.cn/js/sso/ssologin.js 打开之后搜索“username”,就能找到加密规则了,如下图(红框框出来的分别是用户名加密规则和密码加密规则): 用户名的加密是很简单的,使用base64加密就行了。但是对于密码的加密有一些复杂,虽然有if和else,但其实这里我们只需要看if部分: request.servertime =me.servertime; request.nonce =me.nonce; request.pwencode ="rsa2"; request.rsakv =me.rsakv; var RSAKey =new sinaSSOEncoder.RSAKey(); RSAKey.setPublic(me.rsaPubkey,"10001"); password = RSAKey.encrypt([me.servertime,me.nonce].join("\t") +"\n" + password) 密码的加密过程为:首先创建一个rsa公钥,公钥的两个参数都是固定值,第一个参数是prelogin.php中的pubkey,第二个参数是加密的ssologin.js文件中指定的10001,这两个值需要先从16进制转换成10进制,其中10001转成十进制为65537。最后再加入servertime时间戳和nonce字段,以及一个“\t”和一个"\n"进行进一步加密。 五、主要代码 由于使用了rsa加密,所以需要使用导入rsa模块,没有安装的可以使用pip install rsa进行安装。 这里主要说一下加密用户名和密码部分的代码: # Base64加密用户名 def encode_username(usr): return base64.b64encode(usr.encode('utf-8'))[:-1] 需要注意的是要使用base64加密,需要先转换成字节型数据,而且加密之后末尾会多一个"\n",因此需要用[:-1]来去掉多余字符。 # RSA加密密码 def encode_password(code_str): pub_key = rsa.PublicKey(int(pubkey, 16), 65537) crypto = rsa.encrypt(code_str.encode('utf8'), pub_key) return binascii.b2a_hex(crypto) # 转换成16进制 在加密密码的时候传入的这个code_str参数就是servertime + '\t' + nonce + '\n' + password得到的结果,而在整个加密过程完成之后要转换成16进制再返回。 但是做了这两步之后并没有真的登录微博,还需要提取链接并进行跳转,不过对于我们来说做到这一步就已经够了,我们只需要保存此时的Cookie就行了,为了验证这个Cookie是否有效,我还写了一段代码进行测试,这里就不放出来了。

优秀的个人博客,低调大师

Python3 与 C# 面向对象之~继承与多态

代码裤子:https://github.com/lotapp/BaseCode 在线编程:https://mybinder.org/v2/gh/lotapp/BaseCode/master在线预览:http://github.lesschina.com/python/base/oop/2.继承与多态.html 2.继承 ¶ 2.1.单继承 ¶ 在OOP中,当我们定义一个Class的时候,可以从某个现有的Class继承 新的Class称为子类,而被继承的class称为 基类 或者 父类 Python的继承格式 ==> xxx(base_class) 小明兴高采烈的听着老师开新课,不一会就看见了一个演示Demo: In[1]: class Animal(object): def eat(self): print("动物会吃") class Cat(Animal): # 注意一下Python的继承格式 pass class Dog(Animal): pass def main(): cat = Cat() dog = Dog() cat.eat() dog.eat() if __name__ == "__main__": main() 动物会吃 动物会吃 当听到老师说:“ 私有的属性方法 不会被子类继承 ”的时候,小明心里一颤,联想到之前讲的 类属性、 实例属性、 实例方法、 类方法、 静态方法,于是赶紧写个Demo验证一下: In[2]: class Animal(object): # 类属性 name = '动物' def __init__(self): # 实例属性 self.age = 1 def __bug(self): """实例私有方法""" print("我是动物类身上的私有方法:bug") def eat(self): """实例方法""" print("我是实例方法,动物会吃哦~") @classmethod def call(cls): """类方法""" print("我是类方法,动物会叫哦") @staticmethod def play(): """静态方法""" print("我是静态方法,动物会玩耍哦") class Dog(Animal): pass def main(): dog = Dog() # 实例属性 print(dog.age) # 实例方法 dog.eat() # 类属性 print(dog.name) # 类方法 dog.call() Dog.call() Animal.call() # 静态方法 dog.play() Dog.play() Animal.play() if __name__ == '__main__': main() 1 我是实例方法,动物会吃哦~ 动物 我是类方法,动物会叫哦 我是类方法,动物会叫哦 我是类方法,动物会叫哦 我是静态方法,动物会玩耍哦 我是静态方法,动物会玩耍哦 我是静态方法,动物会玩耍哦 来张图就懂了,不是 私有的 都能访问: 这时候,小明老高兴了,单回头一想 ==> 不科学啊,dog应该有其对应的方法吧,C#有 虚方法重写,Python怎么搞?在 子类里面又 怎么调用父类方法呢? 对于小明的提示老师很高兴,于是点名小潘来写一个子类调用父类的demo(老师昨天从窗户里看见小潘有预习): In[3]: # 调用父类的方法 class Father(object): def eat(self): print("文雅的吃饭") class Son(Father): def eat(self): # 调用父类方法第1种(super().方法) super().eat() class GrandSon(Son): def eat(self): # 调用父类方法第2种(记得传self) Son.eat(self) def main(): xiaoming = Son() xiaoming.eat() xiaoli = GrandSon() xiaoli.eat() if __name__ == '__main__': main() 文雅的吃饭 文雅的吃饭 一般我们使用 super().方法来调用父类方法 第二种方法 类名.方法(self)千万别忘记传self哦 对了,C#是用base关键词,别搞混了 小明这时候可不高兴了,风头怎么能被小潘全部抢走呢,赶紧问问旁边同样预习的伟哥 不一会儿淡定的发了份重写父类方法的demo给老师: In[4]: # 重写父类方法==>子类和父类有同名方法 class Father(object): def __init__(self, name): self.name = name def eat(self): print("%s喜欢文雅的吃饭" % self.name) class Son(Father): def __init__(self, name): super().__init__(name) def eat(self): print("%s喜欢大口吃饭大口喝酒" % self.name) def main(): xiaoming = Father("小明") xiaoming.eat() xiaopan = Son("小潘") xiaopan.eat() if __name__ == "__main__": main() 小明喜欢文雅的吃饭 小潘喜欢大口吃饭大口喝酒 老师半喜半忧的说道:“小明同学啊,你也老大不小了,怎么跟孩子一样啊?案例不错,但是怎么能人身攻击人家小潘了?” 当子类和父类都存在相同的 eat()方法时,我们说,子类的 eat()覆盖了父类的 eat() 在代码运行的时候,总是会调用子类的 eat() 这样,我们就获得了继承的另一个好处: 多态 2.2.多继承 ¶ 在讲 多态之前,我们先引入一下Python的 多继承 对,你没有听错 Java、C#都是单继承,多实现。Python和C++一样,可以多继承,先不要吐槽, 规范使用其实很方便的 来个案例看看: In[5]: # 多继承引入 class Father(object): def eat(self): print("文雅的吃饭") class Mom(object): def run(self): print("小碎步") class Son(Father, Mom): pass def main(): son = Son() son.eat() son.run() if __name__ == '__main__': main() 文雅的吃饭 小碎步 继承可以把父类的所有功能都直接拿过来,这样就不必重0开始写代码,子类只需要新增自己特有的方法,也可以把父类不适合的方法覆盖重写 注意一个情况,如果父类里面有同名方法咋办了?到底调哪个呢? 使用 子类名.__mro__可以看在调方法的时候搜索顺序 一般同名方法都是 先看自己有没有,然后看继承顺序,比如这边 先看Mom再看Father In[6]: # 如果父类里面有同名方法怎么知道调哪个? class Father(object): def eat(self): print("文雅的吃饭") class Mom(object): def eat(self): print("开心的吃饭") class Son(Mom, Father): pass def main(): son = Son() son.eat() print(Son.__mro__) # 一般同名方法都是先看自己有没有,然后看继承顺序,比如这边先看Mom再看Father if __name__ == '__main__': main() 开心的吃饭 (<class '__main__.Son'>, <class '__main__.Mom'>, <class '__main__.Father'>, <class 'object'>) Python的多继承最好是当C#或者Java里面的接口使用,这样结构不会混乱( 特殊情况除外) 来个例子: class Animal(object): pass class Flyable(object): """飞的方法""" pass class Runable(object): """跑的方法""" pass class Dog(Animal, Runable): pass class Cat(Animal, Runable): pass class Bird(Animal, Flyable): pass class Dack(Animal, Runable, Flyable): """鸭子会飞也会跑""" pass 和C#一样,Python的 父类构造函数不会被继承 其实从资源角度也不应该被继承,如果有1w个子类,那每个子类里面都有一个父类方法,想想这是多么浪费的一件事情? 2.3.C#继承 ¶ 下课后,小明认真思考总结,然后对照Python写下了C#版的继承: 定义一个人类 public class Person { public string Name { get; set; } public ushort Age { get; set; } public Person(string name, ushort age) { this.Name = name; this.Age = age; } public void Hi()//People { Console.WriteLine("Name: " + this.Name + " Age: " + this.Age); } public virtual void Show()//People { Console.WriteLine("Name: " + this.Name + " Age: " + this.Age); } } 定义一个学生类 public class Student : Person { #region 属性 /// <summary> /// 学校 /// </summary> public string School { get; set; } /// <summary> /// 班级 /// </summary> public string StrClass { get; set; } /// <summary> /// 学号 /// </summary> public string StrNum { get; set; } #endregion #region 构造函数 /// <summary> /// 调用父类构造函数 /// </summary> /// <param name="name"></param> /// <param name="age"></param> public Student(string name, ushort age) : base(name, age) { } public Student(string name, ushort age, string school, string strClass, string strNum) : this(name, age) { this.School = school; this.StrClass = strClass; this.StrNum = strNum; } #endregion /// <summary> /// new-隐藏 /// </summary> public new void Hi()//Student { Console.WriteLine("Name: " + this.Name + " Age: " + this.Age + " School: " + this.School + " strClass: " + this.StrClass + " strNum: " + this.StrNum); } /// <summary> /// override-覆盖 /// </summary> public override void Show()//Student { Console.WriteLine("Name: " + this.Name + " Age: " + this.Age + " School: " + this.School + " strClass: " + this.StrClass + " strNum: " + this.StrNum); } } 调用一下: Person p = new Student("app", 10, "北京大学", "001", "01001"); p.Hi(); p.Show(); Console.WriteLine(); Student s = p as Student; s.Hi(); s.Show(); 结果: Name: app Age: 10 Name: app Age: 10 School: 北京大学 strClass: 001 strNum: 01001 Name: app Age: 10 School: 北京大学 strClass: 001 strNum: 01001 Name: app Age: 10 School: 北京大学 strClass: 001 strNum: 01001 2.4C#接口的多实现 ¶ 定义两个接口: public interface IRun { //什么都不用加 void Run(); } public interface IEat { void Eat(); } 定义一个Dog类来实现两个接口,这样dog就有了run和eat的方法了 var dog = new Dog(); dog.Eat(); dog.Run(); 结果: 狗狗吃 狗狗跑 3 多态 ¶ 3.1.Python ¶ 说多态之前说说类型判断,以前我们用 type() or isinstance() 判断一个变量和另一个变量是否是同一个类型==> type(a)==type(b) 判断一个变量是否是某个类型==> type(a)==A or isinstance(a,A) In[7]: # 判断一个变量是否是某个类型 ==> isinstance() or type class Animal(object): pass class Dog(Animal): pass def main(): dog = Dog() dog2 = Dog() print(type(dog) == Dog) print(type(dog) == type(dog2)) print(type(dog)) print(isinstance(dog, Dog)) print(isinstance(dog, Animal)) # arg 2 must be a type or tuple # print(isinstance(dog, dog2)) if __name__ == '__main__': main() True True <class '__main__.Dog'> True True 小明老高兴了,终于讲解多态了,不禁问道:“ 多态的好处是啥?” 小潘瞥了一眼小明~“废话,肯定为了 屏蔽子类差异用的啊,像简单工厂不就干的这个事?" 小明楞了楞,眼巴巴的看着老师继续讲课。 设计模式我们会找个专题讲讲,现在给你们说的是Python的基础。 Python是动态语言的“ 鸭子类型”,它并不要求严格的继承体系。 一个对象只要“看起来像鸭子,走起路来像鸭子”,那它就可以被看做是鸭子(最后会贴一个案例) C#实现多态有很多方式,比如虚方法,比如抽象类,比如接口等等... 小明迷迷糊糊的问道:“那 Python怎么实现多态呢?” 老师看了一眼打断他讲课的小明,然后继续说道~来个简单案例: In[8]: class People(object): def eat(self): print("人类会吃饭") class Father(object): def eat(self): print("优雅的吃饭") class Teacher(object): def eat(self): print("赶时间的吃饭") # C# 或者 Java里面 写成 eat(People obj) def eat(obj): obj.eat() def main(): teacher = Teacher() father = Father() eat(teacher) eat(father) if __name__ == '__main__': main() 赶时间的吃饭 优雅的吃饭 多态的好处在于,如果这时候我再来个Son子类,有eat()方法编写正确,不用管原来的代码是如何调用的 这次小明懂了,为了装一下,说道:”老师老师,我记得C# 或者 Java里面是写成 eat(People obj) 的吧?“ 老师欣慰的笑了一下,说道:”记得刚才说的 填鸭式吗?Python这么写有个好处哦,我们来看个案例,然后你自己总结“ In[9]: class People(object): def eat(self): print("人类会吃饭") class Father(object): def eat(self): print("优雅的吃饭") class Teacher(object): def eat(self): print("赶时间的吃饭") class Dog(object): def eat(self): print("舔着吃") def eat(obj): obj.eat() def main(): teacher = Teacher() father = Father() eat(teacher) eat(father) # 我们添加一个不是People子类的Dog类,只要有eat方法,参数一样就可以直接调 dog = Dog() eat(dog) if __name__ == '__main__': main() 赶时间的吃饭 优雅的吃饭 舔着吃 小明突然大声说道:”老师老师,我知道了,Python这是吧类的继承和接口继承融合起来了啊,实现多态就相当于C#里面的接口实现多态啊!!!“ 老师点评道:”你姑且可以这么理解,这些我们后面还会继续说的,这种填鸭式的手段刚开始的确会有点不方便,用着用着你就会觉得挺方便的“ 小明认真思考总结,然后对照Python和小潘一起写下了 C#版的多态: 3.2.C#虚方法实现多态 ¶ 定义一个人类: public class Person { #region 字段+属性 /// <summary> /// 姓名 /// </summary> private string _name; public string Name { get { return _name; } set { _name = value; } } /// <summary> /// 性别 /// </summary> private bool _gender; public bool Gender { get { return _gender; } set { _gender = value; } } /// <summary> /// 年龄 /// </summary> public short Age { get; set; } #endregion #region 构造函数 public Person() { } public Person(string name, bool gender) { this.Name = name; this.Gender = gender; } public Person(string name, bool gender, short age) : this(name, gender) { this.Age = age; } #endregion #region 方法 /// <summary> /// 打招呼 /// </summary> public virtual void SaiHi() { Console.WriteLine("我是一个人类!"); } #endregion } 定义一个女孩类: public class Gril : Person { #region 构造函数 public Gril() { } public Gril(string name, bool gender) : base(name, gender) { } public Gril(string name, bool gender, short age) : base(name, gender, age) { } #endregion /// <summary> /// 重写父类方法 /// </summary> public override void SaiHi() { string genderStr = Gender == true ? "男孩" : "女孩"; Console.WriteLine($"你好,我叫{Name},今年{Age}岁了,我是一个腼腆的小{genderStr}"); } } 定义一个男孩类: public class Boy : Person { #region 构造函数 public Boy() { } public Boy(string name, bool gender) : base(name, gender) { } public Boy(string name, bool gender, short age) : base(name, gender, age) { } #endregion //public void SaiHi() public override void SaiHi() { string genderStr = Gender == true ? "男孩" : "女孩"; Console.WriteLine($"你好,我叫{Name},今年{Age}岁了,我是一个腼腆的小{genderStr}"); } } 调用: static void Main(string[] args) { Person[] persons = { new Person(), new Boy("铁锅", true, 13), new Gril("妞妞", false, 22) }; foreach (var item in persons) { //看看item里面到底放的是什么 Console.WriteLine(item.ToString()); item.SaiHi(); Console.WriteLine(); } } 结果: Polymorphism1.Person 我是一个人类! Polymorphism1.Boy 你好,我叫铁锅,今年13岁了,我是一个腼腆的小男孩 Polymorphism1.Gril 你好,我叫妞妞,今年22岁了,我是一个腼腆的小女孩 3.3.C#抽象类实现多态 ¶ 定义一个动物类: public abstract class Animal { /// <summary> /// 抽象类中可以有正常的方法 /// </summary> public void Action() { Console.WriteLine("动物可以动"); } /// <summary> /// 抽象方法必须在抽象类中 /// </summary> public abstract void Call(); } 定义一个猫科动物类(子类必须实现父类抽象方法,如果不实现,那么该类也必须是抽象类) /// <summary> /// 猫科动物---子类必须实现父类抽象方法,如果不实现,那么该类也必须是抽象类 /// </summary> public abstract class Feline : Animal { } 定义一个猫类 public class Cat : Feline { /// <summary> /// 子类必须实现父类抽象方法,如果不实现,那么该类也必须是抽象类 /// </summary> public override void Call() { Console.WriteLine("喵喵叫~~~"); } } 定义一个狗类 public class Dog : Animal { /// <summary> /// 子类必须实现抽象类中的抽象方法 /// </summary> public override void Call() { Console.WriteLine("汪汪叫~~~"); } } 调用: Animal[] animals = { new Dog(), new Cat() }; foreach (var item in animals) { item.Call(); } 结果: 汪汪叫~~~ 喵喵叫~~~ 3.4.C#接口实现多态 ¶ 定义一个跑的接口: public interface IRun { /// <summary> /// 接口中可以声明属性,方法,索引器等 /// </summary> //string Name { get; set; } void Runing(); } 定义一个猫类: public class Cat : IRun { public void Runing() { Console.WriteLine("飞快的跑着上树"); } } 定义一个学生类: public class Student : IRun { public void Runing() { Console.WriteLine("飞快的跑着去上课"); } } 调用: IRun[] objs = { new Student(), new Cat() }; foreach (var item in objs) { item.Runing(); } 结果: 飞快的跑着去上课 飞快的跑着上树 作者: 毒逆天 出处: https://www.cnblogs.com/dotnetcrazy 打赏: 18i4JpL6g54yAPAefdtgqwRrZ43YJwAV5z 本文版权归作者和博客园共有。欢迎转载,但必须保留此段声明,且在文章页面明显位置给出原文连接!

优秀的个人博客,低调大师

Python3快速入门——(2)list和tuple(列表和元组)

1、List基础结构 #python中数据类型转换 str_eight= str (8) #整型8装换位字符型'8' str_eight_two="8" int_eight= int (str_eight_two) #字符型转换为整型 float_eight=float(str_eight_two) #字符型转换为浮点型 #python 中的运算符**表示指数 china=10 print(china**2) #结果为100 #List months=[] #声明months为list类型 print(type(months)) #<class 'list'> print(months) #[] 此时list为空 months. append ("January") #向list中添加元素(字符串) months.append("February") months.append(2) #向list中添加元素(整型)向同一个list中可以添加不同类型的元素 print(months) #输出list 结果为:['January', 'February', 2] 2、List索引 int_months=[1,2,3,4,5,6,7,8,9,10,11,12] #声明一个list length= len (int_months) #获取list的长度即有多少个元素 month1=int_months[0] #获取list中的第一个元素,每个list索引是默认从0开始的 month2=int_months[1] #获取list中的第二个元素 index=len(int_months)-1 #获取list最后一个元素的索引 last_value=int_months[index] #获取list最后一个元素 last_value1=int_months[-1] #索引-1代表最后一个元素的索引,-2代表倒数第二个元素的索引 #获取list中的某段元素(切片操作) months=["Jan","Feb","Mar","Apr","May","Jun","Jul"] two_four=months [2:4] #获取索引为2,3的值,不包括索引4的值(取头不取尾),注意索引是从0开始的,输出结果为["Mar","Apr"] three_six=months [3:] #获取索引3以后的所有元素 ['Apr', 'May', 'Jun', 'Jul'] months=[ "Jan" , "Feb" , "Mar" , "Apr" , "May" , "Jun" , "Jul" ] b=months[: 5:2 ] #取前5个元素,每两个取一个 print (b) #结果为['Jan', 'Mar', 'May'] b=months[:: 3 ] #对所有元素,每三个取一个 ;#结果为['Jan', 'Apr', 'Jul'] #字符串也可以用切片操作,只是操作结果仍是字符串 #tuple也可以用切片操作,只是操作的结果仍是tuple 3、list和tuple(列表和元组) list和tuple是Python内置的有序集合,一个可变,一个不可变 #list 列表 classmates=[ "Bob" , "Jim" , "Mar" , "Asia" , "Kry" ] classmates.append( "Bill" ) #往list中追加元素到末尾 classmates.insert( 1 , "Aut" ) #把元素插入到指定的位置,比如索引号为1的位置 classmates.pop() #要删除list末尾的元素,用pop()方法 classmates.pop( 1 ) #要删除指定位置的元素,用pop(i)方法,其中i是索引位置 classmates[ 1 ]= "Git" #要把某个元素替换成别的元素,可以直接赋值给对应的索引位置 #tuple 元组 names=( "Bob" , "Jim" ,[ "Mar" , "Asia" ], "Kry" ) #声明一个元组 #names这个tuple不能变,它也没有append(),insert()这样的方法。其他获取元素的方法和list是一样的 #可以正常地使用names[0],names[-1],但不能赋值成另外的元素 #当定义一个tuple时,在定义的时候,tuple的元素就必须被确定下来,可以为空names=() names[ 2 ][ 0 ]= "X" names[ 2 ][ 1 ]= "Y" print (names) # 结果为('Bob', 'Jim', ['X', 'Y'], 'Kry') #表面上看,tuple的元素确实变了,但其实变的不是tuple的元素,而是list的元素。 # tuple一开始指向的list并没有改成别的list,所以,tuple所谓的“不变”是说,tuple的每个元素,指向永远不变。即指向'a',就不能改成指向'b',指向一个list,就不能改成指向其他对象,但指向的这个list本身是可变的!

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册