我们寻常学 Python 都是按章节递次、包或许模块来学,轻易前学后忘。恰好能够拿这个网站来综合测试一下对 Python 的控制情况,以便查缺补漏。
来说说这个网站怎样玩。
这是网站主页面,很有历史感对吧,诞生了已有十几年了。但万万不要由于看着像老古董而小瞧它。
我们来玩玩看,点击「get challenged」最先应战。
第 0 关是 Warming up 热身环节:
这一关要求是修正 URL 链接,给的提醒是电脑上的数学表达式:2 的 38 次方,所以也许就是须要盘算出数值,然后修正url 进入下一关。
所以这关就是考 Python 的基础数值运算,你晓得怎样算么?
翻开 Python 自带终端,一行代码就可以盘算出效果:
把原链接中的 0替代为 274877906944回车就会进入下一关:
游戏这就正式最先了。图片中的笔记本给了三组字母,很轻易发明规律:前面的字母今后挪动两位就是背面的字母。
那末须要做的就是依据这个规律把下面的提醒字符串,做位移解密获得真正的句子寄义:
这道题考核字符串编码和 for 轮回相干学问,代码完成以下:
text = '''g fmnc wms bgblr rpylqjyrc gr zw fylb. rfyrq ufyr amknsrcpq ypc dmp. bmgle gr gl zw fylb gq glcddgagclr ylb rfyr'q ufw rfgq rcvr gq qm jmle. sqgle qrpgle.kyicrpylq() gq pcamkkclbcb. lmu ynnjw ml rfc spj.''' text_translate = '' for i in text: if str.isalpha(i): n = ord(i) if i >= 'y': n = ord(i) + 2 - 26 else: n = ord(i) + 2 text_translate += chr(n) else: text_translate += i print(text_translate)
获得效果:
i hope you didnt translate it by hand. thats what computers are for. doing it in by hand is inefficient and that's why this text is so long. using string.maketrans()is recommended. now apply on the url.
作者很有趣,固然不能手动去一个推算了,引荐用 string.maketrans() 这个要领处理,我们上面采用的是比较直接的要领,官方给出了更加精简的要领:
import string l = string.lowercase t = string.maketrans(l, l[2:] + l[:2]) print (text.translate(t))
然后把 url 中的 map 改成ocr回车就来到了第 2 关:
作者接着说过关的提醒可能在书里(固然不可能了)也可能在网页源代码里。那就右键检察源代码往下拉看到绿色地区,果真找到了题目:
意义就是:要在下面这一大串字符里找到涌现次数起码的几个字符
考核了这么几个学问点:
正则表达式提取字符串
list 计数
前提语句
假如是你,你会怎样做?
来看下,十行代码疾速完成:
import requests url = 'http://www.pythonchallenge.com/pc/def/ocr.html' res = requests.get(url).text text = re.findall('.*?<!--.*-->.*<!--(.*)-->',res,re.S) # list转为str便于遍历字符 str = ''.join(text) lst = [] key=[] #遍历字符 for i in str: #将字符存到list中 lst.append(i) #假如字符是唯一的,则添加进key if i not in key: key.append(i) # 将list列表中的字符涌现字数统计出来 for items in key: print(items,lst.count(items))
起首,用 Requests 要求网页然后用正则提取出字符串,接着 for 轮回盘算每一个字符涌现的次数。
% 6104 $ 6046 @ 6157 _ 6112 ^ 6030 # 6115 ) 6186 & 6043 ! 6079 + 6066 ] 6152 * 6034 } 6105 [ 6108 ( 6154 { 6046 e 1 q 1 u 1 a 1 l 1 i 1 t 1 y 1
能够看到涌现次数起码的就是末了几个字符,合起来是「equality」,替代 url 字符就闯过过了第 2 关进入下一关继承应战。是否是有点意义?
背面每一关都须要用到相干的 Python 技能处理,比方第 4 关:
这一关作者弄了个小开玩笑,须要手动输入数值到 url 中然后回车,你认为如许就完了么?并没有它有会不停反复弹出新的数值让你输入,貌似无穷尽。
所以,这一关一定不能采用手动输入的要领闯关,天然要用到 Python 了。要完成自动添补修正 url 回车跳转到新 url,轮回直到网页再也没法跳转为止这一功用。
假如是你,你会怎样做?
实在,一段简朴的爬虫加正则就可以搞定。思绪很简朴,把每次网页中的数值提取出来替代成新的 url 再要求网页,轮回下去,代码完成以下:
import requests import re import os # 首页url resp = requests.get( 'http://www.pythonchallenge.com/pc/def/linkedlist.php?nothing=12345').text url = 'http://www.pythonchallenge.com/pc/def/linkedlist.php?nothing=' # 计数器 count = 0 while True: try: # 提取下一页动态数值 nextid = re.search('\d+', resp).group() count = count + 1 nextid = int(nextid) except: print('末了一个url为:%s' % nexturl) break # 猎取下一页url nexturl = url + str(nextid) print('url %s:%s' % (count, nexturl)) # 反复要求 resp = requests.get(nexturl).text
输出效果以下:
能够看到,终究轮回了 85 次找到了末了一个数字16044,输入到 url 中就闯关胜利。
假如碰到不会做的题,能够在这里找到参考答案:
中参考文教程:
https://www.cnblogs.com/jimnox/archive/2009/12/08/tips-to-python-challenge.html
官方参考教程:
http://garethrees.org/2007/05/07/python-challenge/
以上就是经由过程游戏闯关来测试本身的python控制才能的细致内容,更多请关注ki4网别的相干文章!