一、破解密码
1.排列
import itertools #排列 #概念:从n个不同的元素中取出每个元素【m<=n】,按照一定的顺序排成一列,叫做从n个不同元素中取出m个元素的一个排列【Arragement】 #特别的,如果m=n的时候,这个排列被叫做一个全排列【Permutation】 """ 1 2 3 4 假设从中取出3个数字进行排列 123 132 213 231 312 321 。。。 """ #需求:从[1,2,3,4]中取出3个元素,进行排列 #参数;可迭代对象,需要取出的元素个数 #注意:通过list()得到的结果为一个列表,其中的元素为元组 result = itertools.permutations([1,2,3,4],1) print(result) l = list(result) print(l) print(len(l)) """ 4-4 24 4-3 24 4-2 12 4-1 4 规律:排列的可能性:n! / (n - m) ! """
2.组合
import itertools #组合 #概念:从n个不同的元素中,任取m【m <= n】个元素为一组,叫做从n个不同元素中取出m个元素的一个组合【Combination】 """ 1 2 3 4 3 123 234 124 134 """ result = itertools.combinations([1,2,3,4],1) l = list(result) print(l) print(len(l)) """ 4-4 1 4-3 4 4-2 6 4-1 4 组合的可能性;n! / (m! * (n - m) !) """ #应用的场景;生成验证码【字母和数字】
3.排列组合
import itertools #参数:字符串,repeat重复的次数 result = itertools.product("0123456789qwertyuioplkjhgfdsazxcvbnm",repeat=2) l = list(result) print(l) #MemoryError:内存溢出 print(len(l))
4.疯狂破解密码
import itertools import time #需求:生成密码 passwd = ("".join(x) for x in itertools.product("0123456789qwertyuioplkjhgfdsazxcvbnm",repeat=6)) while True: try: s = next(passwd) time.sleep(0.5) print(s) except StopIteration as e: print(e) break
二、正则表达式
1.自定义需求
a.判断qq号是否合法
import re #Regular Expression #判断qq号是否合法 """ 一个合法的qq号具备的条件 1.全数字 2.开头不能为0 3.长度:5~11 """ def checkQQ(str): #不管传入的str是否合法,假设合法 result = True #寻找条件推翻最初的假设 try: #1 num = int(str) if num < 0 : return False #3 if len(str) >= 5 and len(str) <= 11: #2 if str[0] == "0": result = False else: result = False except ValueError as e: result = False return result print(checkQQ("012s3463")) #使用正则表达式实现上面的额需求 #如果匹配不上,返回则返回None,如果匹配上了,返回<_sre.SRE_Match object; span=(0, 11), match='43646545777'> result = re.match("[1-9]\d{4,10}","4364654577775674567456") print(result)b.判断手机号是否合法
import re #判断手机号 """ 1.开头为1 2.位数是11位 3.第二位:3,4,5,6,7,8,9 """ def checkPhoneNum(phone): result = True try: num = int(phone) if num < 0: return False if len(phone) == 11: if phone[0] == "1": if phone[1] == "0" or phone[1] == "1" or phone[1] == "2": result = False else: result = False else: result = False except ValueError as e: result = False return result print(checkPhoneNum("4364634")) result = re.match("[1][3-9]\d{9}","18501970795") print(result)
2.概念
2.1什么是正则表达式
正则表达式【Regular Expression】,在代码中长简写为regex或者RE【不推荐,系统有一个re的模块】
作用:使用单个字符串来描述具有某个特殊规则的匹配模式
a.搜索模式:文本搜索和文本替换
b.匹配模式:根据规则进行匹配指定的内容
2.2使用场景
用于校验邮箱,手机号,qq号,密码格式等
爬虫中的应用:可以快速的从网页代码中获取我们需要的数据
2.3使用原则
严格遵守正则表达式的语法
结合str的函数使用,效率不如str自带的函数
3.re模块的使用
3.1正则表达式的匹配规则
a.单字符匹配
代码演示:
import re """ ----------匹配单个字符与数字--------- . 匹配除换行符以外的任意字符 [0123456789] []是字符集合,表示匹配方括号中所包含的任意一个字符 [good] 匹配good中任意一个字符 [a-z] 匹配任意小写字母 [A-Z] 匹配任意大写字母 [0-9] 匹配任意数字,类似[0123456789] [0-9a-zA-Z] 匹配任意的数字和字母 [0-9a-zA-Z_] 匹配任意的数字、字母和下划线 [^good] 匹配除了good这几个字母以外的所有字符,中括号里的^称为脱字符,表示不匹配集合中的字符 [^0-9] 匹配所有的非数字字符 \d 匹配数字,效果同[0-9] \D 匹配非数字字符,效果同[^0-9] \w 匹配数字,字母和下划线,效果同[0-9a-zA-Z_] \W 匹配非数字,字母和下划线,效果同[^0-9a-zA-Z_] \s 匹配任意的空白符(空格,回车,换行,制表,换页),效果同[ \r\n\t\f] \S 匹配任意的非空白符,效果同[^ \f\n\r\t] """ #1.[]:代表是只匹配其中的一位字符,不管[]有多少个字符,括号里面是所有需要匹配的字符的集合 #2.- :连接符,表示一个区间,注意:要保证ASCII码的值都是连续的,其中的内容可以是数字,也可以是字母 #3.\ :表示转义,使得\后面的字母具有特殊含义 #具体的匹配步骤 #a.将正则表达式的字符串进行编译返回一个正则表达式的对象 pattern = re.compile(r".") #b.使用正则表达式的对象匹配指定的字符串,成功则返回对象,失败则返回None result = pattern.match("5") #c。检查结果,如果能匹配上,则返回匹配上的字符,如果匹配不上,则抛出异常:AttributeError:"NoneType" print(result.group()) pattern = re.compile(r"[01234]") result = pattern.match("1") print(result.group()) pattern = re.compile(r"[yhl]") #result = pattern.match("p") #print(result.group()) pattern = re.compile(r"[t-x]") result = pattern.match("u") print(result.group()) pattern = re.compile(r"[0-9a-zA-Z]") result = pattern.match("u") print(result.group()) pattern = re.compile(r"[0-9a-zA-Z_]") result = pattern.match("u") print(result.group()) #注意:^:表示除了[]中的内容,其他的都能匹配 pattern = re.compile(r"[^0-9]") result = pattern.match("u") print(result.group()) #注意:\d 等价于[0-9] pattern = re.compile(r"\d") result = pattern.match("2") print(result.group()) pattern = re.compile(r"\s") result = pattern.match("\n") print(result.group())
b.边界匹配
代码演示:
import re """--------------锚字符(边界字符)------------- ^ 行首匹配,和在[]里的^不是一个意思 $ 行尾匹配 \A 匹配字符串开始,它和^的区别是,\A只匹配整个字符串的开头,即使在re.M模式下也不会匹配它行的行首 \Z 匹配字符串结束,它和$的区别是,\Z只匹配整个字符串的结束,即使在re.M模式下也不会匹配它行的行尾 \b 匹配一个单词的边界,也就是值单词和空格间的位置 \B 匹配非单词边界 """ #search():搜索 #匹配上则返回结果,匹配不上则返回None #行首匹配 print(re.search(r"^is","today is a good day")) #startswith #行尾匹配 print(re.search(r"day$","today is a good day")) #endswith #re.M:多行匹配 #findall():搜索 #注意:findall返回值是列表 """ ^和$:在多行模式下,匹配每一行的行首和行尾 \A和\Z:在多行模式下,只匹配第一行的行首和行尾 """ print(re.findall(r"^today","today is a good day\ntoday is a good day",re.M)) print(re.findall(r"\Atoday","today is a good day\ntoday is a good day",re.M)) print(re.findall(r"day$","today is a good day\ntoday is a good day",re.M)) print(re.findall(r"day\Z","today is a good day\ntoday is a good day",re.M)) #\b匹配边界,\B匹配的非边界 print(re.search(r"er\b","never")) print(re.search(r"er\b","nerve")) #None print(re.search(r"er\B","never")) #None print(re.search(r"er\B","nerve"))
c.数量词
代码演示:
import re """ -------------------匹配多个字符------------------------ 说明:下方的x、y、z均为假设的普通字符,n、m(非负整数),不是正则表达式的元字符 (xyz) 匹配小括号内的xyz(作为一个整体去匹配) x? 匹配0个或者1个x x* 匹配0个或者任意多个x(.* 表示匹配0个或者任意多个字符(换行符除外)) x+ 匹配至少一个x x{n} 匹配确定的n个x(n是一个非负整数) x{n,} 匹配至少n个x x{n,m} 匹配至少n个最多m个x。注意:n <= m x|y |表示或,匹配的是x或y """ """ ();代表的是一个整体 ?* + :匹配多个 {}:表示数量匹配,符合条件的字符能够出现几次 """ print(re.findall(r"a?","aaaaa")) #?最多只能匹配一位字符 print(re.findall(r"a*","aaaaaaaaa")) #*可以匹配多位字符 print(re.findall(r"a+","aaaaaaaaaaaaa")) #至少匹配一位字符 """ 总结: ?:非贪婪匹配,尽可能少的匹配,通过findall函数返回一个列表,列表中的元素是每个单个的字符,最后还有"" * +;贪婪匹配,尽可能多的匹配 *:通过findall函数返回一个列表,列表中的元素只有两个,一个是匹配到的字符串,最后还有"" +:通过findall函数返回一个列表,列表中的元素只有一个,就是匹配到的字符串 """ print(re.findall(r"a{3}","aaaaa")) print(re.findall(r"a{3,}","aa")) print(re.findall(r"a{3,5}","aaaaa")) #包含两个便捷,至少和最多的次数都能够匹配到 #|;或,都可以匹配一次出来 print(re.findall(r"(g|G)ood","ggggggood--Good"))
d.匹配分组
e.贪婪和非贪婪
f.模式修正
3.2re模块中常用的函数
附录:测试题
一、单项选择题
1. 下列哪个语句在Python中是非法的?
A、x = y = z =1 B、x = (y = z + 1)
C、x, y = y, x D、x += y
1. 关于Python内存管理,下列说法错误的是
A、变量不必事先声明 B、变量无须先创建和赋值而直接使用
C、变量无须指定类型 D、可以使用del释放资源
1. 下面哪个不是Python合法的标识符
A、int32 B、40XL C、self D、name
1. 下列表达式的值为True的是
A、5+4j >2-3j B、3>2>2
C、(3,2)<('a','b') D、’abc’ > ‘xyz’
答案:C (在Py2.x版本中正确,在Py3.x运行错误)
1. Python不支持的数据类型有
A、char B、int C、float D、list
1. 以下不能创建一个字典的语句是
A、dict1 = {} B、dict2 = { 3 : 5 }
C、dict3 ={[1,2,3]: “uestc”} D、dict4 = {(1,2,3): “uestc”}
1. 下列Python语句正确的是:
A、min = x if x< y = y
B、max = x > y ?x:y
C、if (x >y) print x
D、while True :pass
二、正则表达式:
1. 一字符串 “@w3L?wR!7s.S2”,请取出该字符串中所有的字母,顺序不能改变
1. 对URL地址进行匹配,如:https://www.forta.com/ http://localhost:8080
1. 中国公民身份号码匹配,可能是15位或者18位,最后一位数字或者是X
1. 电话和手机号码匹配,如:010-87898765,0798-12345678,18607086789,+8613989765432 一个正则
1. Python匹配HTML tag的时候,<.*>和<.*?>有什么区别
1. 下面代码的输出结果为
import re
s = '<html><head><title>Title</title>'
print(re.match('<.*>', s).group())
print(re.match('<.*?>', s).group())
1. Python里面search()和match()的区别
三、简答:
(1) Python中元组,列表,字典的区别
(2) Python执行循环语句时出现“continue”或“break”,两者的区别是什么
(3) 分别讲一下except和pass语句的作用是什么
(4) 异常处理怎样使用?怎样去捕获特点的一个异常?某几个异常?全部异常?
(5) 这两个参数是什么意思:*args,**kwargs?我们为什么要使用它们?
(6) python中如何拷贝一个对象?(赋值,浅拷贝,深拷贝的区别)
(7) python里面如何生存随机数?
(8) 如何在函数中声明一个全局变量
(9) 单引号 双引号 三引号的区别
(10) is和==的区别
(11) 说出创建字典的方式 至少2种
四、补充缺失的代码
def print_directory_contents(sPath):
"""
这个函数接受文件夹的名称作为输入参数
返回该文件夹中文件的路径
以及其包含文件夹中文件的路径。
"""
# 补充代码
五、下面代码会输出什么:
def f(x,l=[]):
for i in range(x):
l.append(i*i)
print l
f(2)
f(3,[3,2,1])
f(3)
六、这些是什么意思@classmethod,@staticmethod, @property?请写出例子
七、看代码写结果
(1) 说明下列代码的输出结果
class A(object):
def go(self):
print("go A go!")
class B(A):
def go(self):
super(B, self).go()
print("go B go!")
class C(A):
def go(self):
super(C, self).go()
print("go C go!")
a = A()
b = B()
c = C()
# 说明下列代码的输出结果
a.go()
b.go()
c.go()
(2) 以下代码输出什么?
class Parent(object):
x = 1
class Child1(Parent):
pass
class Child2(Parent):
pass
print(Parent.x, Child1.x, Child2.x)
Child1.x = 2
print(Parent.x, Child1.x, Child2.x)
Parent.x = 3
print(Parent.x, Child1.x, Child2.x)
(3) 阅读下面的代码,写出A0,A1至An的最终值。
A0 = dict(zip(('a','b','c','d','e'),(1,2,3,4,5)))
A1 = range(10)
A2 = [i for i in A1 if i in A0]
A3 = [A0[s] for s in A0]
A4 = [i for i in A1 if i in A3]
A5 = {i:i*i for i in A1}
A6 = [[i,i*i] for i in A1]
(4) 以下代码将输出什么?
list = ['a', 'b', 'c', 'd', 'e']
print list[10:]
(5) 用3种方式来实现不使用第三个变量实现键值交换
x = 2
y = 3
(6) 写一个函数, 输入一个字符串, 返回倒序排列的结果 (最少2种方式)
(7) 列表推导式实现
1. 请写出一段Python代码实现删除一个list里面的重复元素
2. Python代a码得到列表list的交集与差集
list1 = [1, 3, 4, 6]
list2 = [1, 2, 3, 4]
(8) 输入某年某月某日,判断这一天是这一年的第几天?
(9) 找到年龄最大的人,并输出。
person = {"li":18,"wang":50,"zhang":20,"sun":22}
(11) 下面代码的运行结果
def _Add(a):
def add(b):
return a + b
return add
ad = _Add(1)
print(ad(1))
print(ad(2))
print(ad(3))
2
3
4
(12) 下面代码的执行结果
def myFunc(a,b,c,d):
print(a,b)
myList = [1,2,3,4]
myfunc(*myList)
1
2
(13) 请实现一个打印当前时间的装饰器
(14) 下面程序输出的结果为
class Demo:
def __init__(self,x):
self.x = x
obj = Demo(50)
obj.y = 10
obj.z = 2
print(obj.y+len(obj.__dict__))
(15) 有俩个磁盘文件A和B 各存放一行字母 要求把这俩个文件的信息合并(按照字母顺序排列) 输出到一个新文件C中