Menu Close

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

作业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

总结

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

发表回复

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