python学习笔记18(附阶段测试题)

一、破解密码

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中

    
    
    
    
    
    
 

猜你喜欢

转载自blog.csdn.net/weixin_42569562/article/details/81809960