Write the Code. Change the World.

3月 31

Python 练习册,每天一个小程序。

题目来自于GitHub上的 Show-Me-the-Code。有空的话一起来刷题吧~

我写的代码都在 里面的DIYgod文件夹 里,代码都很短,所以我也会在下面都贴出来的。

看样子要更新好久呀~呼…

正式开始:

第 0000 题:将你的 QQ 头像(或者微博头像)右上角加上红色的数字,类似于微信未读信息数量那种提示效果。 类似于图中效果

本题用了Python中最常用的图像处理库 PIL,推荐读一下官方文档:http://effbot.org/imagingbook/

思路:①通过 Image 类中的 open 方法载入图像文件并用 Image 类的 size 属性获取图片大小 ②用ImageFont 类的 truetype 方法载入字体并设置字体大小 ③用 ImageDraw 类的 Draw 方法在图片左上角加上数字 ④保存加上数字的图片

一切顺利未发现坑,代码如下:

 

 

第 0001 题:做为 Apple Store App 独立开发者,你要搞限时促销,为你的应用生成激活码(或者优惠券),使用 Python 如何生成 200 个激活码(或者优惠券)?

本题使用了 random 和 string 模块

思路:①打开或创建文件 Activation_code.txt ②用 string 的 letters 和 digits 属性获得激活码的字符集 ③执行7(只是以7为例)次 random 类的 choice 方法,得到由7个随机字符组成的list,写到文件中 ,这样就得到了一个激活码 ④重复③步骤200次 ⑤别忘了关闭文件

代码如下:

注:这两句是借鉴别人的,因为我感觉它很巧妙

 

 

第 0002 题:将 0001 题生成的 200 个激活码(或者优惠券)保存到 MySQL 关系型数据库中。

先为我的Ubuntu配置好MySQL环境:

嗯。。这个不是重点,不再赘述。。。

然后安装Python的MySQL驱动:

或者

这两个都行,我用的是第一个

然后代码就是 导入MySQL驱动 连接数据库 执行SQL语句 提交事务 关闭连接,就这个流程,没什么好说的

代码如下:

留坑:判断表是否已经存在 那里写得有些复杂,不知道是否还可以简化一下,先留着以后再解决

注:这句也是看别人才想到的,之前自己写的太复杂

 

 第 0003 题:将 0001 题生成的 200 个激活码(或者优惠券)保存到 Redis 非关系型数据库中。

同样先配置环境

本题使用了 redis 模块,使用前要先用 pip 安装

Redis 可以添加 字符串记录 数字记录 列表记录 哈希表记录,我这里使用的是列表记录(我不知道哪个更好,只是觉得列表记录更简便一些)

其他没什么好说的了,代码如下:

 

第 0004 题:任一个英文的纯文本文件,统计其中的单词出现的个数。

本题使用了 re 模块,进行正则式匹配

正则式就这样 [a-zA-Z0-9]+

代码如下:

 

第 0005 题:你有一个目录,装了很多照片,把它们的尺寸变成都不大于 iPhone5 分辨率的大小。

本题使用和0000题相同的 PIL 图像处理库

判断分辨率不符合题目要求后,将长宽等比例压缩(使用 Image 类的 resize 方法)

受C语言三目运算符的影响,我写了这样一句:

然后报错,Google得 Python 并没有这样的三目运算,坑爹啊,那么方便为什么没有

原来 Python 有类似的替代方案,这样就好啦:

还有同样受C语言影响,出现了 float(x) 写成 (float)x 这种错误 ==

代码如下:

 

第 0006 题:你有一个目录,放了你一个月的日记,都是 txt,为了避免分词的问题,假设内容都是英文,请统计出你认为每篇日记最重要的词。

对题目要求做了下扩充,统计的是指定目录及其子目录下所有文件。

分成了两个函数:get_files 和 get_important_word ,先调用 get_files 获取指定目录下的文件的文件名,再根据获得的文件名调用 get_important_word ,对这些文件中出现的所有单词按频次排序。

如果不想统计子目录下的文件就简单一些,这样就能得到所有文件

[参考] 其中值得一提的是对dict的按值排序:

sorted(iterable[, cmp[, key[, reverse]]])

(1)iterable:是可迭代类型类型;
(2)cmp:用于比较的函数,比较什么由key决定,有默认值,迭代集合中的一项;
(3)key:用列表元素的某个属性和函数进行作为关键字,有默认值,迭代集合中的一项;
(4)reverse:排序规则. reverse = True 或者 reverse = False,有默认值,默认为升序排列(False)。
返回值:是一个经过排序的可迭代类型,与iterable一样。一般来说,cmp和key可以使用lambda表达式。

如果对字典进行排序,常用的形式如下:

字典的items()函数返回的是一个列表,列表的每个元素是一个键和值组成的元组。因此,sorted(dict.items(), key=lambda e:e[1], reverse=True)返回的值同样是由元组组成的列表。

其中e表示dict.items()中的一个元素,e[1]则表示按 值排序如果把e[1]改成e[0],那么则是按键排序,reverse=False可以省略,默认为升序排列。

另外,如果不想排序直接得最大值直接用 max(worddict) 即可,得到max之后要遍历一下找有没有跟max相同数值的项,避免漏掉有多个最大值的情况。

 

第 0007 题:有个目录,里面是你自己写过的程序,统计一下你写过多少行代码。包括空行和注释,但是要分别列出来。

这道题很简单就不过多解释了

这里在对文件逐行读取的时候出了点差错,我本来是这样写的

这种类似写法在C中很普遍,但是在Python中会报错,这样就造成了一些不必要的麻烦。。

总结下文件按行读取的方法:

1. 全部读出,按行处理

2.  使用文件迭代器

3.  使用while循环

4.  带缓存的文件读取

5. 用fileinput模块 (效率低,但写法最简洁)

 

第 0008 题:一个HTML文件,找出里面的正文。

 

To be continued…

发表评论

电子邮件地址不会被公开。 必填项已用*标注

活捉 24 条
  1. 天然呆

    喵,最近被联通的校园宽带web认证弄死了,我看到网上有Python的验证码识别程序,我想放到路由器上先识别验证码然后用curl登录,这两个可不可以放到一个.py还是要分成两个,执行的时候内存会不会boom掉,128的内存

  2. 其实第七题有个比较复杂点的情况,当时我跳过没写了,就是 /*多行注释*/,然后这之间有多少行,现在想想在每行读取时,第一次遇到/*flag置1,遇到*/flag置0,然后flag置1的时候,添加总行数的同时,给注释也添加w

      1. 嗯,我考虑少了233,不过也不会很麻烦~单行存入字符串,考虑两种情况,/**/一行结束的~这个用正则的^/**/$匹配首尾检测来解决~第二种就是 /**/ 不在一行了,这个如果代码规范的话,切片检测前2个元素即可~当然写得不工整也可以通过字符串去掉空格的方法来解决

    1. 一只萌萌哒博主

      应该不是吧。。其他人也都是统计单词种类,而且如果统计次数那就跟第六题差不多了。。但表述的确有歧义==