python2 学习笔记之 第一阶段作业

5次阅读
没有评论

共计 3118 个字符,预计需要花费 8 分钟才能阅读完成。

作业 1

屏幕快照 2017-09-01 下午 7.53.21.png

注意事项

  1. 邮箱可能为数字或者字符,或 -_符号。AZaz-_
  2. 后缀可能是字符或数字 AZaz0-9
  3. 邮箱域名包括 com org edu . [com|org|edu]

例:[email protected]
字符串不一定要一次就写成功,可能慢慢测试匹配

# 一点一点替换正则表达式
text = "[email protected]"
re.search(r".*",test).group()  

个人的作业提交

re.search(r"[a-z0-9A-Z-_]+\@[A-Za-z0-9]+\.com|org|edu+",test).group()
解析:1. [a-z0-9A-z-_]意思是匹配大写 A 到 Z 小写 a 到 z 以及 "_" "-" 这两个符号,后面的加号表示 1 个或多个
2. \@ 表示匹配 @这个字符串  \ 是转义的意思
3. 后面同上,匹配大写 A 到 Z,小写 a 到 z 以及数字, 这里匹配的是域名比如上面例子的 heibanke2015
4. 接下来匹配一个 '.' 符号,然后匹配邮箱域名,\. 先转义,表示只匹配一个 '.',(com|org|edu)表示分支条件, 域名必须是括号中的某一个,$ 表示匹配字符串的结束

作业 2

利用随机函数产生一个用户的用户名,密码,并利用文件将用户名密码保存下来

分析

  1. 考察随机函数的使用。
  2. 考察文件的使用

随机数 random 文档可以参考 9.6. random — Generate pseudo-random numbers

此模块实现的伪随机数,支持数字、字符串、列表和元组。一些 demo 如下:

>>> random.random()        # Random float x, 0.0 <= x < 1.0
0.37444887175646646
>>> random.uniform(1, 10)  # Random float x, 1.0 <= x < 10.0
1.1800146073117523
>>> random.randint(1, 10)  # Integer from 1 to 10, endpoints included
7
>>> random.randrange(0, 101, 2)  # Even integer from 0 to 100
26
>>> random.choice('abcdefghij')  # Choose a random element
'c'
>>> items = [1, 2, 3, 4, 5, 6, 7]
>>> random.shuffle(items)
>>> items
[7, 3, 2, 5, 6, 4, 1]
>>> random.sample([1, 2, 3, 4, 5],  3)  # Choose 3 elements
[4, 1, 5]

因为我们生成的是字符串和密码, 所以我们大概需要 random.choice 这个函数,函数每次只随机生成其中的一个字符,所以我们大概还需要循环处理一下。

import random
#定义一串用于随机的字符串
str = 'abcdefghijklmnopqrstuvwxyz123456789'
#定义一个空列表,用于将每个随机字符串追加至列表,然后转换成字符串
list_user = []
list_pwd  = []
#循环, 用户名和密码的长度控制在 10 位
for i in range(0,10):
    list_user.append(random.choice(str))
    list_pwd.append(random.choice(str))
#列表转换为字符串
user = "".join(list_user)  #user = 7jw863hc8p
pwd  = "".join(list_pwd)   #pwd = smxxku9jao

字符串生成之后,需要将账户和密码追加到文件中, 可能需要文件处理函数

# 引入 codees 模块,使其支持中文
import codecs
file = codecs.open('save_user.txt','w','utf-8')
#将用户名写入,并换行
file.write(u" 用户名是 %s \n" % (user))
#同上
file.write(u" 密码是 %s\n" % (pwd))
file.close()
#查看目录,应该已经有文件和文件内容了

作业 3

上面的文件中密码没有加密,请将文件内容读取后通过 MD5 加密后,再保存至另外一个文件

分析

  1. 首先先将之前保存到文件的内容打开,需要注意如何获取到用户名和密码。
  2. 将获取到的用户名和密码加密
  3. 将加密后的内容保存至新的文件
# 这次的读取模式为 r,表示读取模式
file = codecs.open('save_user.txt','r','utf-8')
#读取一行,内容大约是 " 用户名是 7jw863hc8p"
user_str = file.readline()
pwd_str = file.readline()
#这里获取用户名有多种方法,正则、匹配都行,在这里,简单的用了字符串的分片功能
user = user_str[4:] #7jw863hc8p
pwd  = pwd_str[3:]  #smxxku9jao
#下面进行 md5 加密,MD5 函数示例
#引入 hash 模块
import hashlib
#进行 MD5 哈希
pwd_md5 = hashlib.md5(pwd).hexdigest() #d71ebedf7b18235147b54465e1eaeb24
#然后重新保存到一个新的文件
file = codecs.open("hash_user.txt",'w','utf-8')
file.write(u" 用户名是 %s\n" % (user))
file.write(u" 加密后的密码是 %s\n" % (pwd_md5))
file.close()

作业 4

给定一个 csv 文件,文件内为北京市的公车数据,将其存成字典格式。

文件打开是这样的

屏幕快照 2017-09-01 下午 7.53.21.png

需要的格式是这样的{"1(马官营 - 四惠站)":['马官营','六里桥北里']}

分析

  1. 之前没有讲使用 csv,所以判断可能不是通过 csv 模块来处理, 可能还是通过 file 函数的 readline()和 read()函数来处理
  2. 测试后,发现如果使用 readline()来读取所有行,相当不好处理,所以选用 read()函数。辅以正则。

流程分解

  1. 读取文件,并先去除第一行(无用的 title),剩下全部的公交信息
  2. 将剩余文字使用 file.read()全部读取到某个变量
  3. 观察其特征,发现在每次到新的公交站的时候会有一个换行,后面会有个 '"' 号。使用正则,将剩下的内容按照 ID-station 拆分
  4. 新建一个字典,然后以每个列表的第 1 个 (比如 1(马官营 - 四惠站)) 为索引,最后一个转换成列表后作为值
import codecs
import re
file = codecs.open('beijing_jt.csv','r','utf-8')
#将文件的标题读出,因为这些信息在处理时没有用处
file.read(116)
#将剩下的内容全部放到一个变量
text = file.read()
#按照规则拆分成一列一列的字符串
list = re.split(r'\"\s',text)
#删除最后一个空元素
del(list[2])
#新建一个空字典
dict = {}
for row in list:
#将 row 格式化成列表, 逗号分隔
    _l    = row.split(',')
    key    =    _l[1] #字典的索引出来了
    value  =    _l[12].split('\n')  #字典的值出来了
    #dict.update({key,value})  这种方式会报错, 使用下面的方式
    dict[key] = value

总结

以上方式是我根据自己的想法而写的一些方案,一个问题可以有很多种答案,只要是能解决问题,都算的上是好方法。
在解决的基础上如果能考虑性能就更佳了。最后一个作业的表格其实有很多数据,这就需要考虑如果在最短的时间内计算出。大家加油吧。

正文完
 0
admin
版权声明:本站原创文章,由 admin 于2017-09-01发表,共计3118字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)
验证码