1、元组(定义让别人不想改变得东西)
比如定义一个连接数据库,不能修改,就可以用元组
# 定义元组(定义让别人不想改变得东西) l = (1, 2, 3) # 可正常取值 print(l[0]) print(l[-1]) # 也可循环 for i in l: print(i) # 注:它不能修改 # l[0] = 3 # 和列表得唯一区别,没有增删改 l1 = ('ip', 3306, 'user', 'password') print(type(l1)) l2 = ('ss',) # 元组只有一个元素,加逗号,才可认为是元组 print(type(l2)) # 只有俩方法 print(l1.index('ip')) # 找下标 print(l1.count('ip')) # 找个数
运行结果:
1 3 1 2 3 <class 'tuple'> <class 'tuple'> 0 1
2、字符串常用方法(必须转成字符串)
s = 'hahaha' # 字符串也是有下标的 print(s[0]) # 也是可以取值的 print(s[1]) for i in s: # 也是可以循环的 print(i) print(s.count('a')) # a出现得次数 print(s.index('a', 2)) # 从第2个开始找,不指定从0开始找 print(s.index('c')) # 找不到元素会报错 print(s.find('c')) # 也是找下标的,找不到元素返回-1 s = ' hahaha ' print(s.strip()) # 默认去掉字符串两边的空格和换行符(\n) print(s.lstrip()) # 取左 print(s.rstrip()) # 取右 s = '1234567890acABC' print(s.startswith()) # 判断以什么开头,如电话号码以“1”开头 print(s.endswith()) # 判断以什么结束,如以“com”结尾 print(s.lower()) # 小写 print(s.upper()) # 大写 print(s.islower()) # 全部小写 print(s.isupper()) # 全部大写 s = [1, 2, 3, 4, 5, 7] # 0001 0002 0003 0004 s = '1' # 字符串类型,先转换 print(s.zfill(5)) # 用来补0的,字符串类型,结果:00001 s = '1ccax' print(s.capitalize()) # 首字母大写 print(s.replace('c', 'm')) # 替换,c替换称m,mmax; print(s.replace(' ', '')) # 也可取中间空格 print(s.isdigit()) # 判断是否为纯数字 s = '欢迎光临' print(s.center(20, '#')) # 居中 s = ' ' print(s.isspace()) # 判断是不是空格,是空格,返回true,反之false s = '编号是,{name},{age}' print(s.format(name=1, age=2)) # 传谁等于谁就行 print(s.format_map({'name': 1, 'age': 35})) # 传一个字典 s = '编号是nameage' print(s.isalnum()) # 如果是大小写字母,汉字、数字返回是true,其他的字符串都返回false print(s.isalpha()) # 如果是大小写字母,汉字返回是true,其他的字符串都返回false # 重要的方法合计: print(s.find('c')) # 也是找下标的,找不到元素返回-1 print(s.count('a')) # a出现得次数 print(s.strip()) # 默认去掉字符串两边的空格和换行符 print(s.startswith()) # 判断以什么开头,如电话号码以“1”开头 print(s.endswith()) # 判断以什么结束,如以“com”结尾 print(s.lower()) # 小写 print(s.upper()) # 大写 print(s.replace('c', 'm')) # 替换,c替换称m,mmax; print(s.isdigit()) # 判断是否为纯数字 # 很重要、很重要、很重要,切记:s.split()、s.join() s.split() # 把字符串分割变成list s = 'zyb,cmc,wy,lj,lzh,lxy' s1 = 'zyb,cmc,wy,lj,lzh,lxy' s2 = 'zyb.cmc.wy.lj.lzh.lxy' print(s.split(',')) # 用来分割字符串,返回一个list:['zyb', 'cmc', 'wy', 'lj', 'lzh', 'lxy'] print(s1.split()) # 用空格分隔 print(s2.split(',')) # ['zyb.cmc.wy.lj.lzh.lxy']结果找不到,直接放在一个list里 s.join() # 把一个list元素通过什么连接起来变成字符串 l = ['zyb', 'cmc', 'wy', 'lj', 'lzh', 'lxy'] print(','.join(l)) # 通过‘,’连接 zyb,cmc,wy,lj,lzh,lxy print(''.join(l)) # 全整一块了 zybcmcwyljlzhlxy print(' '.join(l)) # 通过空格连接 zyb cmc wy lj lzh lxy l3 = [1, 2, 3, 4, 5, 6] # 报错,必须全是字符串才可行 print(','.join(l3)) print(''.join(l3)) print(' '.join(l3)) l4 = 'abcdefhijklm' print(','.join(l4)) # a,b,c,d,e,f,h,i,j,k,l,m print(''.join(l4)) # abcdefhijklm print(' '.join(l4)) # a b c d e f h i j k l m
3、切片是list取值的一种方式
# 切片是list取值的一种方式,范围取值如1 - 5 l = range(10) print(l) # 运行结果:range(0, 10) l = list(range(10)) # 强制类型转换 0-9 print(l) # 运行结果:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] l = list(range(1, 11)) print(l) # 运行结果:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] print(l[0:4]) # 顾头不顾尾 print(l[:4]) # 从第一个开始取 print(l[5:11]) # 取后五位 print(l[5:]) # 取到末尾 print(l[:]) # 全部都取出来 print(l[0:11:2]) # step步长(步长是正数,从前往后取)意思1+2=3,3+2=5,5+2=7,7+2=9 # 运行结果:[1, 3, 5, 7, 9] print(l[::-1]) # 步长是负数,从后往前取; # 运行结果:[10, 9, 8, 7, 6, 5, 4, 3, 2, 1] print(l[0:11:-1]) # 取不到,运行结果:[] 因为-1,-2,-3...-10 print(l[-1:-11:-1]) # 因为是负数,从后往前取得么 # 运行结果:[10, 9, 8, 7, 6, 5, 4, 3, 2, 1] print(l[-1:-5:-1]) # 运行结果:[10, 9, 8, 7] # 总结: # [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] # -10 -9 -8 -7 -6 -5 -4 -3 -2 -1 # 1、如果步长是负数的话就从后往前取值了 # 2、前面指定的范围用的下标也得写负数 # 元组都可切 t = (1, 2, 3) print(t[::-1]) # 也可通过下标来取值 # 运行结果:(3, 2, 1) # 字符串也可切 s = 'abcdefghijklm' print(s[::-1]) # 也可通过下标来取值 # 运行结果:mlkjihgfedcba # 字典不可切,木有下标 user_info = { 'xiaohei': '123456', 'xiaobai': '11111', 'xiaoming': '1', 'lcl': '123' } print(user_info[::-1]) # 运行结果:TypeError: unhashable type: 'slice'
4、集合
# set 集合 # 1、集合天生可以去重 # 2、集合是无序的 s = {1, 2, 3, 4, 5, 6, 7, 7, 7, 6, 6, 1, 1} # 集合就是每个元素用逗号隔开 print(s) # 运行结果:{1, 2, 3, 4, 5, 6, 7} s = {} # 不是集合,是空字典 s = set() # 空集合 l = [1, 2, 3, 4, 5, 6, 7, 7, 7, 6, 6, 1, 1] # 一个list print(set(l)) # list转成集合,没有重复 # 运行结果:{1, 2, 3, 4, 5, 6, 7} l = list(set(l)) # 再转回来 print(l) # 运行结果:[1, 2, 3, 4, 5, 6, 7] for i in s: # 集合也可来循环,但没有下标,不能来取值 print(i) # 添加元素 s = {1, 2, 3, 4, 5, 6, 7, 7, 7, 6, 6, 1, 1} s.add(8) # 结果:{1, 2, 3, 4, 5, 6, 7, 8},其实无序 s.update({4, 5, 6}) # 把另一个集合加入这个集合里面 # 运行结果:{1, 2, 3, 4, 5, 6, 7} s.remove(4) # 删除指定的元素,{1, 2, 3, 5, 6, 7} print(s) # 关系测试 l1 = [1, 2, 3, 4] # 学了自动化的学生 l2 = [2, 4, 5, 6] # 学性能的学生 l1 = set(l1) # 转成集合 l2 = set(l2) # 下面两两为一组。。。 print(l1 & l2) # 取交集,就是两个集合里面相同的元素 print(l1.intersection(l2)) # 也是取交集, # 运行结果都是:{2, 4} print(l1.union(l2)) # 并集,就是把两个集合合并到一起 print(l1 | l2) # 也是并集 # 运行结果都是:{1, 2, 3, 4, 5, 6} print(l1 - l2) # 差集,在a集合里存在,在b集合里不存在的 print(l1.difference(l2)) # 也是差集 # 运行结果都是:{1, 3} print(l1 ^ l2) # 对称差集,去掉a集合和b集合里相同的元素,剩下的元素 print(l1.symmetric_difference(l2)) # 也是对称差集 # 运行结果都是:{1, 3, 5, 6} l1 = range(0, 11) l2 = [2, 4, 5, 6] l1 = set(l1) l2 = set(l2) print(l1.issuperset(l2)) # 判断a集合是不是b集合的父集,结果:True print(l2.issubset(l1)) # 判断a集合是不是b集合的子集,结果:True
5、非空即真、非0即真
bool 布尔类型
True #真
False #假
a = 1 b = 3 print(a > 0) # True print(a > b) # False # 总结:非空即真,非0即真, 帮你节省代码 s = '' # False l = [] # False d = {} # False t = () # False se = set # False num = 1 # True num2 = 0 # True l1 = ['', ''] # True # 小例子 for i in range(3): choice = input('1、登录2、退出3、取钱:').strip() # if choice!='': if choice: # 非空即真 if choice == 1: print('登录') else: print('输入不能为空') for i in range(3): choice = input('1、登录2、退出3、取钱:').strip() if not choice: # 非空即真,not取反,本来是true,负负得正 if choice == 1: print('为空') else: print('已经输入')
6、文件操作
# 1、打开文件 # 2、读写文件 # 3、关闭文件 # 打开的模式r(读) w(写) a(追加模式) f = open('ccx', 'r', encoding='utf-8') # 当前路径不需要,如果在其他的路径,得写绝对路径; result = f.read() # 读文件,获取文件里面的全部内容 print(result) f.close() # 文件有打开就有关闭 # 运行结果 # 1234 # 5678 # abnd result2 = f.readline() # 调一次只读一行,调两次读两行 print(result2) # 结果:1234 f.close() result3 = f.readlines() # 读取文件里面所有内容,返回的是一个list,每行内容是list的一个元素 print(result3) # 结果:['1234\n', '5678\n', 'abnd\n'] f.close() # 第一次read完之后,文件指针(记录我当前文件读哪里了)指示在末尾,已读完,所以后面取不到内容 f = open('ccx', 'r', encoding='utf-8') result = f.read() print('result', result) # 运行结果:result # 1234 # 5678 # abnd result2 = f.readline() print('result2', result2) # 运行结果:result2 result3 = f.readlines() print('result3', result3) # 运行结果:result3 [] f.close() # 处理大文件的时候,一次只取一行 f = open('ccx', 'r', encoding='utf-8') # count = 0 # 定义count计数 for line in f: print(line) # 每行内容 # count += 1 # print(count) f = open('ccx', 'r', encoding='utf-8') f.write('123hhnn') # r模式下w 不能写:not writable f = open('ccx', 'w', encoding='utf-8') f.write('123hhnn') # 替换了以前的内容 f.close() result = f.read() # w模式读不了,not readable print(result) f.close() f = open('ccx', 'w', encoding='utf-8') f.write('ccc\n') f.close() # writelines和循环一样结果 f = open('ccx', 'w', encoding='utf-8') l = ['1234\n', '5678\n', 'abnd\n'] f.writelines(l) f.close() # 循环 f = open('ccx', 'w', encoding='utf-8') l = ['1234\n', '5678\n', 'abnd\n'] for i in l: f.write(i) f.close()
7、小例子监控日志)
# 1、监控、一直在运行,死循环,每分钟读一次 # 2、第一次运行,读取文件所有的内容,从文件内容里面读取到ip地址,以及每个ip地址出现的次数 # 3、记住当前的位置,下次从这个位置开始读 # 4、判断每个ip地址出现的次数,如果大于50次,那么发短信报警 # 5、等待60秒,继续重复上面的操作,读文件,获取内容 import time point = 0 # 最前面的位置 # ip_list={} #字典若放在在外面,每执行一次,字典增加一次 while True: f = open('access.log', encoding='utf-8') f.seek(point) # 移动文件指针到那个位置 ip_list = {} # 字典 key是ip:2(出现的次数) for line in f: ip = line.split()[0] # 取ip地址 if ip not in ip_list: ip_list[ip] = 1 # IP第一次出现 else: ip_list[ip] += 1 # 不是第一次出现+1 point = f.tell() # 记一下当前指针的位置 f.close() for ip in ip_list: count = ip_list.get(ip) if count >= 50: print('ip地址【%s】有问题,请注意' % ip) time.sleep(60)
一朵黑莲花