1.写一个函数,可以在有序的序列中插入数值
暂且不考虑序列是字符还是数字,当时不知为何第一个想到的就是二分查找,许久不曾接触基本的算法了,傻傻的拿起笔在纸上写了几句代码后才发现,在纸上的思路真的不是那么灵光了,于是干脆停笔只将所想到的解决思路写下来,第二个问题也是同样的方法处理。今天有空就重新回顾一下这个问题,先简单温习一下算法的基本过程,然后胡乱的凑了一些代码,基本功能反正是实现了:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
# -*- coding:utf-8 -*- def binsearch(org_l, num): n = len(org_l) i, j = 0, n if n == 0: org_l.insert(0, num) return while i < j: m = (i + j) // 2 if num == org_l[m]: return elif num < org_l[m]: j = m - 1 else: i = m + 1 if i == j: org_l.insert(j, num) else: org_l.insert(m, num) if __name__ == '__main__': l = [] binsearch(l, 8) print(l) binsearch(l, 7) print(l) binsearch(l, 0) print(l) l = [1, 2, 3, 4, 5, 6] binsearch(l, 10) print(l) binsearch(l, 7) print(l) binsearch(l, 0) print(l) |
程序执行输出如下:
1 2 3 4 5 6 7 8 |
[8] [7, 8] [0, 7, 8] [1, 2, 3, 4, 5, 6, 10] [1, 2, 3, 4, 5, 6, 7, 10] [0, 1, 2, 3, 4, 5, 6, 7, 10] |
感叹,东西经常不用就容易过期,学习语言也是一样,基础还是要不断的翻阅,才能稳固。
2.大体实现如下功能:
- 获取某一版本网址中(jenkins)所有版本信息并过滤得到最新的版本号
- 根据版本名称格式abc-版本号.apk下载版本包
- 安装版本包到Android设备
这个问题分成几个步骤来分别实现,同时也再好好复习巩固一下相关的内容:
①首先通过urllib获取版本信息。为了方便这里用Mozilla的官方ftp作为操作的对象,例如(http://ftp.mozilla.org/pub/firefox/releases/51.0.1/win32/en-US/)是Firefox英文版下载路径,通过url来GET网页信息:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
from urllib import request def http_get(url): response = request.urlopen(url) page = response.read() return page.decode('utf-8') url = 'http://ftp.mozilla.org/pub/firefox/releases/51.0.1/win32/en-US/' print(http_get(url)) |
运行并查看输出信息,可以看到成功获取到了版本文件的信息:
对结果稍微处理一下,修改为对方要求的格式然后继续下一步,通过正则方式获取感兴趣的字符串
1 2 3 4 5 6 7 8 |
<tr> <td>File</td> <td><a href="/pub/firefox/releases/51.0.1/win32/en-US/Firefox%20Setup%2051.0.1.exe">51.0.1</a></td> <td>43M</td> <td>26-Jan-2017 16:57</td> </tr> |
②通过re过滤需要的信息
1 2 3 4 5 |
def ver_get(page): reg = re.compile(r'<tr>\s+<td>\w+</td>\s+<td><a href=.*>(.*)</a></td>\s+<td>\w+</td>\s+<td>(.*)</td>\s+</tr>') return reg.findall(page) |
获取所有匹配成功的结果列表。这里写的比较冗余,如果以后需要获取其他列的内容,可以直接添加括号就行。正则表达式一定要参考python IDE里面输出的内容,pycharm的输出是已经将\t\n处理过的结果,容易让人忽略其中的空格字符,例如原始IDE中输出的page内容如下:
1 2 3 |
'<!DOCTYPE html>\n<html>\n\t<head>\n\t\t<meta charset="UTF-8">\n\t\t<title>Directory Listing: /pub/firefox/releases/51.0.1/win32/en-US/</title>\n\t</head>\n\t<body>\n\t\t<h1>Index of /pub/firefox/releases/51.0.1/win32/en-US/</h1>\n\t\t<table>\n\t\t\t<tr>\n\t\t\t\t<th>Type</th>\n\t\t\t\t<th>Name</th>\n\t\t\t\t<th>Size</th>\n\t\t\t\t<th>Last Modified</th>\n\t\t\t</tr>\n\t\t\t\n\t\t\t<tr>\n\t\t\t\t<td>Dir</td>\n\t\t\t\t<td><a href="/pub/firefox/releases/51.0.1/win32/">..</a></td>\n\t\t\t\t<td></td>\n\t\t\t\t<td></td>\n\t\t\t</tr>\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t<tr>\n\t\t\t\t<td>File</td>\n\t\t\t\t<td><a href="/pub/firefox/releases/51.0.1/win32/en-US/Firefox%20Setup%2051.0.1.exe">Firefox Setup 51.0.1.exe</a></td>\n\t\t\t\t<td>43M</td>\n\t\t\t\t<td>26-Jan-2017 16:57</td>\n\t\t\t</tr>\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t<tr>\n\t\t\t\t<td>File</td>\n\t\t\t\t<td><a href="/pub/firefox/releases/51.0.1/win32/en-US/Firefox%20Setup%20Stub%2051.0.1.exe">Firefox Setup Stub 51.0.1.exe</a></td>\n\t\t\t\t<td>239K</td>\n\t\t\t\t<td>26-Jan-2017 16:57</td>\n\t\t\t</tr>\n\t\t\t\n\t\t\t\n\t\t</table>\n\t</body>\n</html>\n' |
过滤结果则正确输出了列表:
1 2 3 4 |
[('Firefox Setup 51.0.1.exe', '26-Jan-2017 16:57'), ('Firefox Setup Stub 51.0.1.exe', '26-Jan-2017 16:57')] |
虽然这里的信息是一样的,但是不妨碍我们的测试。
③时间和版本信息都已经获取了,接下来寻找最新的版本,假设以编译时间来作为区分
1 2 3 4 5 6 7 8 9 10 11 12 13 |
def newest_get(ver_list): newest = datetime.datetime(1970, 1, 1) index = 0 current = 0 for item in ver_list: nexttime = datetime.datetime.strptime(item[1], '%d-%b-%Y %H:%M') if nexttime > newest: newest = nexttime index = current current += 1 return index |
通过冒泡方法找到最新的一次编译时间,然后返回已查获的时间在列表中的index值,对第2步得到的列表进行操作,返回的index值为0,符合预期。
④最后是构造版本包名称,然后下载。
包路径构造先且忽略,看一下下载,曾经的思路是通过调用系统wget命令或者通过urllib实现,在测试过程中发现os.popen()操作wget会立即返回,无法查看结果,所以使用urllib看一下效果:
1 2 3 4 |
def download(url, filename): request.urlretrieve(url, filename) |
一句话就可以了,网上大人介绍大文件时最好用requests模块的stream方式,我这里没有安装这个模块,暂且按下。
⑤安装,使用os.popen就可以实现了
1 2 3 4 5 |
def install(filename): cmd = os.popen("adb install " + filename) print(cmd.read()) |
这一块就不实际操作了,简单的用netstat -ano做个测试,得到结果可以正常打印基本就算完结了。整体的框架大致就是这样,看代码行数也不是很多,一张纸应该可以写个大概吧。