Python笔记三(互换变量,文件操作,文件指针,集合)
今天我们继续学习python的语法:
一,互换变量
1 a =1 2 b =2 3 c =3 4 #以前的老方法,其他语言写的 5 c = None 6 c = b 7 b = a 8 a = c 9 print(a,b) 10 11 #python里面交换值 12 b,a = a,b 13 print(a,b) #交换两个变量的值,Python低层帮你引入第三方变量在交换 14 b,a,c=a,c,b#对应值互换 15 16 17 #不通过第三方变量交换值 18 a = a+b #3 19 b = a-b #1 20 a = a-b #2 21 print(a,b)
二,判断【非空即真,非零即真】
1 #非空即真,非0即真 2 # 不为空的话就是true,是空的话就是false 3 # 只要不是0就是true,是0就是false 4 a=[]#list也是假的 5 b={}#字典也是假的 6 c=0 #也是假的 7 f=tuple() #也是假的 8 e= ''#也是假的 9 name = input('输入你的姓名').strip() 10 if name: #name里面有没有东西 11 print('输入正确了') 12 else: 13 print('输入不能为空') 14 15 #布尔类型 16 #true false 17 print(bool('')) 18 print(bool('aa')) 19 20 21 a=b=c=0#这样代表定义了3个变量,值都是0,也可以这样定义
三.字符串方法
1 a='python' 2 print(a.isalpha())#是否全都是汉字或者字母 3 print(a.isalnum())#只要里面没有特殊符号就返回true 4 print(a.isupper())#是否全部是大写字母 5 print(a.islower())#是否全部是小写字母 6 print(a.isdigit())#是否全部是数字 7 print(a.isalpha())#判断是否全是汉字或者字母 8 print(a.isalnum())#只要没有特殊符号,都返回true 9 10 11 import string 12 print(string.ascii_uppercase) #所有小写字母 13 print(string.ascii_lowercase) #所有大写字母 14 print(string.digits) #所有数字 15 print(string.ascii_letters)#所有大写字母和小写字母 16 print(string.punctuation)#所有的特殊字符 17 18 #下面是两个方法 19 ''.join('') #连接字符串 20 #他把一个list变为字符串 21 # 通过某个字符串把list里面的每个元素连接起来 22 print(','.join(string.ascii_lowercase)) 23 # 只要是可以循环的,join都可以帮你连接起来 24 # ''.split('') 25 t=['a','b','c','d'] 26 res=''.join(t) 27 res1='-----'.join(t) 28 print(res) 29 print(res1) 30 31 32 names='admin,zhansga,hah ,huahu' 33 hh=names.split(',')#根据某个字符串,分割字符串,以谁隔开,谁就不存在了,如果什么都不传的话,是以空格分割的 34 hh1=names.split('h')#aplit只能是字符串方法 35 print(hh,hh1) 36 37 user = '张三' 38 sex = '男' 39 age = 17 40 addr = '珠海' 41 moneny = '10w' 42 cars = '1w台' 43 44 sql = 'insert into user values ({user},{sex},{age},{addr},{moneny},{che});' 45 new_sql=sql.format(age=age,che=cars,user=user,sex=sex,moneny = moneny,addr=addr) 46 print(new_sql) 47 48 49 #加*号 50 print('欢迎登录'.center(50,'*'))
四。集合
1.深拷贝与浅拷贝
1 import copy #引入拷贝模块 2 #浅拷贝 3 #深拷贝 4 l=[1,1,2,3,4,5,6,8]#单独一个list循环删除list里面的数据的时候,结果会不正确 5 l2=copy.deepcopy(l)#深拷贝 浅拷贝和深拷贝的区别就是深拷贝会重新开辟一个内存空间 6 print(id(l)) 7 print(id(l2))#获取内存地址id 8 for i in l2: 9 if i%2!=0: 10 l.remove(i) 11 print(l) 12 13 14 l2=l #浅拷贝 15 l2.append('aa') 16 print(l2)
2.集合天生去重,集合也是无序的 set表示集合
s = set()#定义空集合 s2 = set('1234445566778') s3 = {'1','1','3','4','5','6','7','9'} print(s2)
3.交集与并集
1 #取交集 2 s2 = set('1234445566778') 3 s3 = {'1','1','3','4','5','6','7','9'} 4 print(s3&s2)#取交集 类型要一致 5 print(s3.intersection(s2))#取交集 6 7 #取并集 就是把两个集合合并到一起,然后去重 8 print(s2|s3) #取并集 9 print(s2.union(s3))#取并集
4.差集与对称差集
1 s4 = {1,2,3} 2 s5 = {1,4,6} 3 #取差集 取s4为准,s5里面有的 那么s4就去除这个有的 4 print(s4-s5) #取差集 5 print(s4.difference(s5))#取差集 6 # 7 # #对称差集 去掉两个集合里面都有的 8 print(s4^s5)#对称差集 9 print(s4.symmetric_difference(s5))#对称差集
5.增加,删除集合
1 s4 = {1,2,3} 2 s5 = {1,4,6} 3 s4.add('ss')#增加元素 4 s4.pop()#随机删一个 5 s4.remove('ss')#指定删除那个 6 s4.update({1,2,4})#把另外一个集合加进去 7 print(s4) 8 s4.isdisjoint(s5)#如果没有交集返回true
6.用集合校验密码的复杂程度,一个小练习
1 #校验密码里面是否含 2 #数字 ,大写字母,小写字母,特殊字符 3 import string 4 nums_set = set(string.digits) 5 upper_set=set(string.ascii_uppercase) 6 lower_set=set(string.ascii_lowercase) 7 pun = set(string.punctuation) 8 for i in range(5): 9 pwd= input('请输入密码:').strip() 10 pwd_set=set(pwd) 11 if pwd_set&nums_set and pwd_set&upper_set and pwd_set&lower_set and pwd_set&pun: 12 print('密码是合法的:',pwd) 13 else: 14 print('密码必须包含大小写字母,数字,特殊字符')
五.文件操作
文件打开分为三种模式:读模式,写模式,追加模式
1 # python2.0的版本写的是file() 2 #文件打开的三种方式:读模式 写模式 追加模式 3 f=open('words2','r',encoding='utf-8')#默认是一个r 读模式 4 f=open('words','w',encoding='utf-8')#写模式 5 f=open('words','a',encoding='utf-8')#追加模式 6 7 #简单的打开和读写文件 8 f=open('words',encoding='utf-8')#打开文件 9 # windows操作系统下面需要增加encoding不然会报错:UnicodeDecodeError: 10 # 'gbk' codec can't decode byte 0xb9 in position 20: illegal multibyte sequence 11 print(f.read())#读文件 12 print(f.readline())#读取一行内容 13 print(f.readlines())#是把文件的每一行放到一个list里面 14 print(type(f.readlines())) 15 f.write('我是好人haha')#写入 报错:io.UnsupportedOperation: not writable io.UnsupportedOperation: not writable 16 17 #模式只要沾上R+,文件不存在就会报错 18 #模式只要沾上w+,都会清空原来的内容 19 20 f=open('words','a+',encoding='utf-8') 21 f.write('哈哈') 22 print(f.read()) 23 24 #读模式 r 读写模式r+ 25 #1.不能写 26 #2.文件不存在的话,会报错 27 28 29 # f=open('words','w+',encoding='utf-8') 30 # print(f.read()) 31 #写模式 w 写读模式w+ 32 #1.如果文件不存在的话,会帮你新建一个文件 33 #2.打开一个已经存在的文件,会清空以前的文件内容 34 #3.不能读,报错 35 36 # f=open('words1','a',encoding='utf-8') 37 # print(f.read()) 38 #追加模式 a 追加读模式 a+ 文件末尾去增加内容 39 #1.先打开一个不存在,新建一个文件 40 #2.打开一个已经存在的文件,不会清空,末尾增加 41 #3.不能读
六,文件指针
1 #文件指针 2 # 用来记录文件到底读到哪里了 3 f=open('names','a+',encoding='utf-8') 4 #a模式默认文件指针是在末尾的 所以读不到文件内容 5 f.write('呵呵') 6 print(f.read()) 7 8 f = open('name','a+',encoding='utf-8') 9 f.seek(0)#移动文件指针到最前面 就能读出文件 10 f.write('\n我最美')#移动完文件指针之后,是只能读,写的时候还是在文件末尾写 11 print('read读的:',f.read())
1.文件指针练习
1 import random 2 #随机生成一些手机号 1861253 3453 3 # print(random.randint(1,9999))#随机产生一个1到1000的数字 4 # print('1'.zfill(4))#这个方法用于补领 5 # 1.先随机产生一些手机号 6 # 2.写到文件里面 7 f=open('phone.txt','w') 8 num = input('请输入你要产生的手机号个数:') 9 for i in range(int(num)): 10 start = '1861253' 11 random_num=str(random.randint(1, 9999)) 12 new_num = random_num.zfill(4) 13 phone_num = start+new_num 14 f.write(phone_num+'\n')#\n代表就是换行的意思 15 f.close()#关闭文件
七,综合上面的讲述,练习题
1 # 读日志文件,监控日志,如果有攻击我们,就把ip加入黑名单 2 # 分析 3 # 1.打开日志文件 4 # 2.把ip地址拿出来 5 # 3.判断每一个ip出现的次数,如果大于100次,就加入黑名单 6 # 每分钟读一次 7 8 #直接循环一个文件对象的话,每次循环的是文件的每一行 9 #f一般叫做文件句柄 文件对象 10 import time 11 point = 0 #每次记录文件指针位置 12 while True: 13 all_ips=[]#存放所有的ip地址 14 f=open(r'C:\Users\Administrator\Desktop\access.log',encoding='utf-8')#路径前面早呢更加一个r是为了让路径变为一个普通的字符串 15 f.seek(point)#移动文件指针 16 for line in f: 17 ip = line.split()[0] 18 all_ips.append(ip) 19 point = f.tell() # 获取到当前文件指针的位置 记录指针的位置 20 all_ip_set = set(all_ips)#利用集合去重 21 for ip in all_ip_set: 22 if all_ips.count(ip)>30: 23 print('应该加入黑名单的名单是:%s'%ip) 24 f.close() 25 time.sleep(60)#暂停60秒,隔60秒读一次
八。自动关闭文件
1 with open('names','a+') as f: 2 for line in f: 3 print(line)