前言
有一个朋友李雷,想学Python。为啥想学呢?可能是看了这个帖子你都用 Python 来做什么?。
这个帖子非常的有意思,大家的回答超乎李雷的想象,你可能知道Python可以用来写爬虫,分析各种数据,比如京东上大家购买内衣的颜色分布等等,或者一些小工具,帮助我们自动化完成一些繁琐的工作。但是这只是冰山一角,帖子里的回答还有很多奇妙的作品:
拿来了解女朋友情绪变化,顺道自动回复。
分析B站宅舞主播如何跳舞。
为女朋友和自己定制一款游戏。
编程给图像随机填色呀。
用来玩游戏。
这个帖子看戏来,李雷有一点心动的感觉。于是想自己也来试一试,希望也能用Python开发出有价值的东西。
在网上搜索学Python,课程非常多,完全不知道从那里开始,要做什么,是先花钱买个课跟着学,还是先买几本书来看一看呢?
李雷不想花钱消除焦虑,于是李雷想挑战一下0基础0元在网上学习Python。
李雷开始了这个挑战。
了解Python
李雷知道,想学Python只是一时的冲动,真学起来其实坚持不了3小时,所以还是先了解一下Python是什么,学了能做哪些事情,为这个冲动再加一些利益诱惑,说不定能坚持3天。
了解一个事物的本质,或者说在网上了解一个事物的本质,最好的方式和路径如下:官网、维基百科、权威社区、大牛博客、相关文档等等。
Python官网
于是李雷,首先打开了Python的官方网站https://www.python.org/。如图1
官方网站对Python的定义是:让你更快的工作和更有效集成系统的程序语言。李雷知道更快的工作是什么意思,但是对更有效的集成系统不是很理解。接着看介绍,官方网站提供了初学者指南,源码下载,相关文档,甚至还有相关工作的招聘信息,真是业界良心网站。
在官方网站首页引起李雷注意的是,Use Python for。用Python做什么,上面列举了一些,后面的英文是框架的名字:
- 网站开发:Django、Pyramid
- 桌面程序开发:tkInter、PyGObject
- 科学和大数据:Scipy、Pandas
- 软件开发:Buildbot、Trac
- 系统管理:Ansible、Salt
李雷看到这里,产生了一个疑问,这个语言是万能的吗?咋能干这么多事情呢。接着李雷打开了维基百科网站,看看上面对这个万能语言怎么说。
维基百科讲Python
因为维基百科在大陆不能访问,所以找了一个替代网站进行了查询了Python的介绍。如图2:
其中对Python可以有几点认识:
- Python是一种高级动态语言,有很多人把Python作为一种“胶水语言”使用。使用Python将其他语言编写的编程进行集成和封装。
- Python的设计哲学是“优雅”、“明确”、“简单”。Python开发者的哲学是“用一种方法,最好是只有一种方法来做一件事”。
- Python相比于静态语言,速度会稍慢一些,不过,根据二八定律,大多数编程对速度要求不高。在某些对运行速度要求很高的情况,Python设计师倾向于使用JIT技术。
- Python因为对网络协议支持很完善,所以常用于写服务器软件和爬虫。
从那里开始
看了一些介绍,李雷依然有一些云里雾里,到底如何开始呢?
在知乎帖子里,有一个回答,提及了一个网站http://www.pythonchallenge.com/,这个网站给了一些谜题,可以使用Python来解答这个谜题,李雷觉得这是一个开始的方案,把学习当成一个游戏,去闯关,应该比上来就学一大顿知识会更容易坚持✊,于是,李雷打开了这个网站,看到了网站上介绍,如图3(已经使用谷歌翻译)
那就直接点击挑战吧,李雷已经准备好。
第0题
页面上显示了这样一句话Hint: try to change the URL address.
然后界面上有一张图片,上面有三个数字238。
根据提示,李雷把现在url上的0.html修改成了238.html,界面显示了 No... the 38 is a little bit above the 2...
李雷有点蒙,于是把0.html改成1.html试一试。结果界面显示 238 is much much larger.**
李雷凭借直觉,是不是应该输入2**38.html才行。结果界面显示 give the answer, not the question.
李雷这下知道了,需要238的值,现在怎么知道238的啥意思呢。根据常识,两个数字中间有符号,可能是某种运算符,于是在网上搜索 python ** 运算符找到一些说明,李雷知道了2**38代码了2的38次方。那是不是在Python语言里输入这个值,就能知道2的38次方是多了呢?
李雷打算找一个在线的Python环境试一试,因为本地安装环境太费事件,而且万一卡住,很容易就放弃了。
在Bing上搜索Python online,找到了一个在不翻墙的情况下,访问速度还可以的网站https://www.onlinegdb.com/online_python_compiler。通过这个网站,可以在线写Python代码,并运行代码看结果。
在中间的编辑器里输入代码,然后点击顶部的Run按钮,就能在下方的输出界面里看到结果了。
在题目url里输入274877906944.html。成功到了第一题的界面,第一次完成,李雷有了一点点信心。
第1题
第一题的界面如图4
看到第一题到界面,李雷刚有到信心要逃走了。这是啥意思,虽然给了提示,但是这一串茄子色的字母到底想说啥呢?
Think Think。李雷开始专注的在大脑中寻找思路,看到谍战片的同学知道,以前的情报人员交流情报都会用到编码,避免情报被直接泄露。上图中的K->M,O->Q,E->G。在字母表里,就是把字母往右移动两位映射。
字母表:ABCDEFGHIJKLMNOPQRSTUVWSYZ
比如g fmnc wms每个字母往右移动两位字母映射会得到i hope you。如果每个都这样手动算,是不是很累和苦逼。李雷想,这要是能用Python写个程序自动处理映射关系多好。
解题过程
这需要涉及处理字符串和ASCII码
李雷在花了4个小时,在网上寻找如何处理字符串,ASCII码,并且试着使用循环来处理每个字母。这个过程让李雷痛苦,但是正是有这个过程,李雷写出了下面对代码:
input1 = "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."
output = ""
startNumber = ord("a")
for i in range(len(input1)):
if input1[i] == " " or input1[i] == ".":
output = output + input1[i]
else:
oldasc = ord(input1[i])
newasc = oldasc + 2 - startNumber
newasc = newasc % 26
newasc = newasc + startNumber
newchr = chr(newasc)
output = output + newchr
print(output)
这里需要考虑,字母yz会对应ab,所以数字超过字母表会从字母表的头开始计算。输出的结果里包含了解题答案:
i hope you didnt translate it by hand. thats what computers are for. doing it in by hand is inefficient and thatws why this text is so long. using string.maketransxy is recommended. now apply on the url
这句话提示了,可以使用Python的string.maketrans方法。于是在网上查询了一番以后,李雷写出了下面的的代码:
intab = "abcdefghijklmnopkrstuvwxyz"
outab = "cdefghijklmnopkrstuvwxyzab"
trantab = str.maketrans(intab, outab)
str = "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."
print(str.translate(trantab))
李雷和自己第一次写代码一对比,后者真是比前者...不说了,python真是化繁为简~
这时,李雷知道把map带入到函数中,可以得到ocr,可以去第二题了。
总结
李雷了解了Python是什么,它的历史、优势,在当前能做什么事情。
写了自己第一个Python程序,帮助转换一个字符串。
对学习Python有了那么一点信心。