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)

 

posted on 2020-04-29 22:53  彩彩常  阅读(251)  评论(0编辑  收藏  举报