PYTHON自动化Day4

一.判断

#   非空即真、非0即真
# 不为空的话就是true,是空的话就是false
# 只要不是0就是true,是0就是false

# 布尔类型
# True  False
name = input('请输入你的名字:').strip()
a = [] #false
d={} # false
c = 0 #false
f = tuple() #false
e='' #false

if name:  #name里面有没有东西,
   print('name不是为空的。。')
else:
   print('输入不能为空。。')
# a = b = c = 0  #定义了3个变量 ,值都是0

二.交换变量

a = 1
b = 2

#交换变量如果不定义第三个变量的方法:
a = a+b  # 3
b = a-b  # 1
a = a-b  # 2
print(a,b)

#python中的做法:
b,a= a,b #交换两个变量的值,Python底层帮你引入了一个的第三方变量在交换, 多个变量交换也可以 如: a,b,c=b,c,a
print(a,b)

三. 字符串方法:

print(a.index('t'))  #找下标
print(a.find('t'))  #找下标
# 1 find()方法:查找子字符串,若找到返回从0开始的下标值,若找不到返回-1
info = 'abca'
print( info.find('a'))##从下标0开始,查找在字符串里第一个出现的子串,返回结果:0
info = 'abca'
print (info.find('a',1))##从下标1开始,查找在字符串里第一个出现的子串:返回结果3
info = 'abca'
print( info.find('333'))##返回-1,查找不到返回-1
# 2 index()方法:
# python 的index方法是在字符串里查找子串第一次出现的位置,类似字符串的find方法,不过比find方法更好的是,如果查找不到子串,会抛出异常,而不是返回-1
info = 'abca'
print(info.index('a'))
print(info.index('33'))
# rfind和rindex方法用法和上面一样,只是从字符串的末尾开始查找。

print(a.replace('t','T')) #替换
print(a.isdigit()) #是否全都是数字
print(a.islower()) #是否全都是x小写字母
print(a.isupper()) #是否全都是大写字母
print(a.isalpha()) #是否全都是汉字或者字母
print(a.isalnum()) #只要里面没有特殊符号,就返回true &…
print(a.upper())  #变成大写
print(a.lower())#变成小写
print(a.startswith('test'))  #以xx开头
print(a.endswith('.xls')) # 以xx结尾
import string
print(string.ascii_lowercase) #所有的小写字母
print(string.ascii_uppercase)  #所有大写字母
print(string.digits)  #所有的数字
print(string.ascii_letters)  #所有大写字母和小写字母
print(string.punctuation) #所有的特殊字符

l=['zhang','liu','liang']
res = ','.join(string.ascii_lowercase)  #1、它把一个list变成了字符串
#2、通过某个字符串把list里面的每个元素连接起来
#3、只要是可以循环的,join都可以帮你连起来
names='abcd'
print(list(names))
name_list = names.split()#根据某个字符串,分割字符串,什么也不传的话,是以空格分割的
print(name_list)
user='牛寒阳'
sex=''
age=18
addr='回龙观'
money= '1000w'
cars='1w台'
# words = 'insert into user values ("%s","%s","%s","%s","%s","%s");'%(user,sex,age,addr,money,cars)
sql = 'insert into user values ("{name}","{sex}","{age}","{addr}","{qian}","{che}");'
new_sql = sql.format(age=age,che=cars,name=user,sex=sex,qian=money,addr=addr)
print(new_sql)
print('欢迎登录'.center(50,'*'))
print('1'.zfill(4))  #自动补足4位,前面补0

 四.深拷贝,浅拷贝

# int float list dict tuple  set
# 天生去重
import copy
#浅拷贝
#深拷贝

lis = [1,1,2,3,4,5,6,8]
l2 = copy.deepcopy(lis) #深拷贝
# l2 = lis   #浅拷贝
print(id(lis))
print(id(l2)) #id和lis的不同
l2.append('aaa')
lis.remove(8)
print(lis)
print(l2)
# print(id(l))
print(id(l2))   #浅拷贝和深拷贝的区别就是深拷贝会重新开辟一个内存空间,连个list相互独立不受影响

#动态循环删list里面的数据的时候,结果会不正确
l=[1,1,2,3,4,5,6,8]
#  0 1 2 3 4 5 6 7    第一次取下标0的元素1,然后删掉
# [1,2,3,4,5,6,8]
#  0 1 2 3 4 5 6      第二次取下标1的元素2, 所以第一个元素被跳过了没有检查
print(l)
for i in l:
    if int(i)%2!=0:
        l.remove(i)
print(l)  #[1, 2, 4, 6, 8]  #为什么多了一个1?因为是根据下标循环list的,操作后元素的位置变了

#所以我们定义两个相同的list,用第二个循环,用第一个删除,结果就正确了,因为可以保证没有元素都被检查到了
l2=copy.deepcopy(l)
for i in l2:
    if int(i)%2!=0:
        l.remove(i)
print(l)

五.集合

# 集合天生就能去重,集合也是无序的
s=set()  #空集合
s2 = set('1234445566778')
# print(s2)
s3 = {'1','1','3','4','5','6','7','9'}  #自己定义一个集合,和字典的区别是字典有key:value
#d = {'k':'v'} #字典
# 交集 并集 差集
# 就是两个集合相同的地方
print(s3 & s2)  #取交集
print(s3.intersection(s2))  #取交集
#并集
    # 就是把两个集合合并到一起,然后去重
print(s2 | s3)  #取并集
print(s2.union(s3))  #取并集
s4 = {1,2,3}
s5 = {1,4,6}
#差集
    #在一个集合里有,在另一个集合里面没有的
#    S4里面有,s5里面没有的
#   取一个集合存在,另一个不存在的元素
print( s4 - s5)  #取差集
print(s4.difference(s5)) #取差集
#对称差集
    #俩集合里面都没有
    #去掉俩集合里面都有的
print(s4 ^ s5)
print(s4.symmetric_difference(s5))
s4.add('ss') #加元素
s4.pop()#随机删一个
s4.remove('ss')#指定删除哪个
s4.update({1,2,3}) #把另外一个集合加进去
s4.isdisjoint(s5)#如果没有交集的话返回true,可以用于判断是否不包含黑名单中的内容

学会了集合后,判断密码复杂性就更方便了:

# 校验密码里面是否包含
# 数字、大写字母、小写字母、特殊符号
import string
nums_set = set(string.digits)
upper_set = set(string.ascii_uppercase)
lower_set = set(string.ascii_lowercase)
pun = set(string.punctuation)
for i in range(5):
    pwd=input('请输入密码:').strip()
    pwd_set = set(pwd)
    if pwd_set & nums_set and pwd_set & upper_set and pwd_set & lower_set and pwd_set & pun:
        print('密码是合法的',pwd)
    else:
        print('密码必须包含大写字母、小写字母、数字和特殊字符')

六.文件操作

# python 2 3
# file() #python2中有,python3中没有
#utf-8  bbk
# 读模式  写模式  追加模式
f = open('names','r',encoding='utf-8') #python3和python2中都有 ,r模式指针在文件开头,读过后到末尾
print(f.read()) #读文件
# f.seek(0)
print(f.readline()) #读取一行内容
# f.seek(0)
print(f.readlines())  #是把文件的每一行放到一个list里面
# f.write('双方都')#写入
# f.seek(0)
# print(f.read())
#只要沾上了r,文件不存在的就会报错
#只要沾上了w,都会清空原来的内容

# 读模式    r    读写模式 r+
    #1、不能写
    #2、文件不存在的话会报错
# 写模式  w  写读模式   w+
    #1、文件不存在的话,会帮你新建文件
    #2、打开一个已经存的文件,他会清空以前文件的内容
    #3、不能读

# 追加模式  a   追加读模式 a+  #文件末尾去增加内容
    # 1、文件不存在的话,会帮你新建文件
    # 2、打开一个已经存的文件,不会清空,末尾增加
    # 3、不能读

七.文件指针

# 文件指针:
# 用来记录文件到底读到哪里了
f = open('naems','a+',encoding='utf-8')
# a模式的文件指针是在末尾的
f.write('呵呵呵')
f.seek(0)  #移动文件指针到最前面
f.write('鹏妹妹')   #移动完文件指针之后,是只能读,写的时候还是在文件末尾写
f.seek(0)
print(f.read())

小练习,自动产生电话号码,并写入到一个文件中:

import random
#18612343,
#12384234
# 1861253 2945
print(random.randint(1,9999))
print('1'.zfill(4))  #自动补足4位,前面补0

#1、先随机产生一些手机号
#2、写到文件里面
f = open('phones.txt', 'w')
num = input('请输入你要产生的手机号个数:')
for i in range(int(num)):  #
    start = '1861235'
    random_num = str(random.randint(1, 9999))
    new_num = random_num.zfill(4)#补0
    phone_num = start+new_num  
    f.write(phone_num+'\n')
f.close()

小练习:

#需求
# 1、监控日志,如果有攻击咱们的,就把ip加入黑名单

#分析:
    #1、打开日志文件
    #2、把ip地址拿出来
    #3、判断每一个ip出现的次数,如果大于100次的话,加入黑名单
    #4、每分钟读一次

#直接循环一个文件对象的话,每次循环的是文件的每一行
#文件句柄   文件对象
import time

point = 0  # 每次记录文件指针的位置
while True:
    all_ips = [] #存放所有的ip地址
    f = open('access.log',encoding='utf-8')
    f.seek(point)#移动文件指针
    for line in f:
        ip = line.split()[0]
        all_ips.append(ip)
    point = f.tell() #记录了指针的位置
    all_ip_set = set(all_ips)  #
    for ip in all_ip_set:
        if all_ips.count(ip)>50:
            print('应该加入黑名单的ip是%s'%ip)
    f.close()
    time.sleep(60) #暂停60秒


# for i in all_ips:
#     if all_ips.count(i)>100:
#         print('攻击的ip是%s'%i)

猜你喜欢

转载自www.cnblogs.com/lilyzhang-2018/p/9878495.html
今日推荐