#文件操作
# with open('a.txt',encoding='utf-8') as f:
# result=f.read()
# print(result)
#一行一行的读文件
# with open('user.txt',encoding='utf-8') as f:#文件对象,文件句柄
# for line in f:
# line=line.strip()
# if line:
# print(line)
#把A文件一行行读取并修改,放到B文件中,然后把A文件删除,把B文件改名为A文件
# import os
# with open('words.txt') as fr,open('words_new.txt','w') as fw:
# for line in fr:
# line=line.strip()
# if line:
# line=line.upper()
# fw.write(line+'\n')
# os.remove('words.txt')
# os.rename('words_new.txt','words.txt')
#日志文件,查询一分钟内IP出现200次以上的,加入黑名单
# 分析
# 死循环
# 打开文件
# 读取文件指针(初始值设为0)
# 获取文件里面每一行的IP地址
# 存到一个字典里,判断这个IP是不是存在字典中
# 次数+1 或者 加入字典
# 记录当前的文件指针位置
# 循环字典,判断velue(次数)大于等于200
# sleep 60秒
# import time
# point=0
# while True:
# ips={}
# f=open('access.log',encoding='utf-8')
# f.seek(point)
# for line in f:
# line=line.strip()
# if line:
# ip= line.split()[0]
# if ip in ips:
# ips[ip]+=1
# else:
# ips[ip]=1
# point = f.tell()
# for ip in ips:
# count=ips[ip]
# if count>=200:
# print('加入黑名单的IP的地址是:%s'%ip)
# time.sleep(60)
#
#三元表达式
#如果if条件成立,取前面的值,否则去后面的值
# age=18
# v = '未成年人' if age < 18 else '成年人'
# print(v)
# # 列表生成式
# a=[1,2,3,4,5]
# b=[]
# for i in a:
# b.append(str(i))
#
# c=[str(i) for i in a]
# print(c)
# d=[str(i) for i in a if i%2!=0]
# print(d)
#
# # 集合 set
# #天生去重,无序的(没有下标)不能取出单独的元素,要把集合转化成list才能取元素
# l2={1,2,3,4,5,6,1}#定义集合用大括号,有重复元素,打印时直接去除
# l3=set()#定义空的集合
# l=[1,2,3,4,1,5,1,6]
# s=set(l)
# print(s)
#
# #交集,并集,差集
# l3.add(1)#增加元素
# l3.remove(1)#删除元素
# l3.update(l2)#把一个集合加入到另外一个集合里面,并去重
# l3.copy()#浅拷贝一份
#
# #用于关系测试
# stu1=['fd','wxl','zjl','lty']#自动化班学生名单
# stu2=['fd','wxl','dsx','cc']#性能班学生名单
# stu1_set=set(stu1)
# stu2_set=set(stu2)
#
# print(stu1_set.intersection(stu2_set))#取交集
# print(stu1_set & stu2_set)#取交集
#
# #并集,把两个集合合并到一起,重复的去掉
# s1={1,2,3,4}
# s2={4,5,6,7}
# print(s1.union(s2))
# print(s1 | s2)
#
# #差集,在一个集合中存在,在另外一个集合中不存在
# print(s1.difference(s2))
# print(s1 - s2)
#
# #对称差集
# print(s1 ^ s2)
# print(s1.symmetric_difference(s2))
#
# #集合是可以循环的
# for s in s1:
# print(s)
#
# #判断密码里是否含有数字、大小写字母
# import string
# password='abAc123'
# password_set=set(password)
# if password_set & set(string.digits) and password_set & set(string.ascii_uppercase) \
# and password_set & set(string.ascii_lowercase):
# print('密码合法')
# else:
# print('密码不合法')
#
#json操作
# import json
# d={'name':'xiaohei','cars':[1,2,3],'house':(4,5,6),'addr':'北京','age':18,'sex':'男'}
#
# #json就是一个字符串,只不过是所有语言都能解析这个字符串
#
# result=json.dumps(d,ensure_ascii=False,indent=4)#python的数据类型转json的#(list,tuple,dict)有中文要添加ensure_ascii=False,格式化indent=4
# print(result)
# print(type(result))
#
# json_str='{"name": "xiaohei", "cars": [1, 2, 3], "house": [4, 5, 6]}'
# dict2=json.loads(json_str)#json转换成字典
# print(dict2)
#dump、load是帮你封装了处理文件的功能
# with open('info.txt','w',encoding='utf-8') as fw:
# json.dump(d,fw,ensure_ascii=False,indent=4)
# with open('info.txt',encoding='utf-8') as fw:
# d=json.load(fw)
# print(d)
# print(d.get('name'))
#函数
#默认值参数
# def write_file(file_name,content):
# with open(file_name,'w',encoding='utf_8') as fw:
# fw.write(content)
#
# def read_file(file_name):
# with open(file_name,encoding='utf_8') as fr:
# result=fr.read()
# return result
#
# def op_file(file_name,content=None):
# print(content)
# if content:
# write_file(file_name,content)
# else:
# result=read_file(file_name)
# return result
#
# print(op_file('1.txt'))
# op_file('1.txt','sdfsdfsdfsdfsdfsdf')
#
#判断小数
# 有且只有一个小数点
# 小数点左边是正整数/负整数
# 小数点右边是正整数
# def is_float(s):
# s=str(s)
# if s.count('.')==1:
# left,right = s.split('.')
# if left.isdigit() and right.isdigit():
# return True
# if left[0]=='-' and left[1:].isdigit() and right.isdigit():
# return True
# return False
# print(is_float(-1.3))
#如果一个函数没有写返回值,返回的就是None
#如果函数有多个返回值,那么返回的是一个元组
#全局变量
#局部变量:在函数里面定义的变量,都是局部变量
#修改全局变量需要声明,再对其进行操作,
#global a
#如果是list、dict、set类型的全局变量,就不需要用global进行声明,直接可以修改
#str、int、float、tuple、bool需要声明
#必传参数(位置参数),默认参数(有默认值)
#可选参数(参数组)、关键字参数
#可选参数,它不是必传的,不限制个数,它是把参数放到一个list里面
# def send(*phones):
# for p in phones:
# print('发短信给:%s'%p)
#
# send()
# send(110)
# send(110,120,119)
#关键字参数,它不是必传的,不限制个数,它是把参数放到一个dict里面,但是它传参数的时候必须用关键字方式
# def send_sms(**info):
# print(info)
#
# send_sms()
# send_sms(xzh='晚上好')
# send_sms(lhh='新年好',fd='生日快乐',lyh='新婚幸福')
#四种参数类型都能用到,顺序是:1、必填参数2、默认参数3、参数组4、关键字参数
#def nb_func(name,country='China',#args,**kwargs):
#传参数的简便方式
def hhh(name,age,sex):
print(name)
print(age)
print(sex)
l=['xianhei',18,'男']
hhh(*l)
d={'name':'xiaobai','age':19,'sex':'女'}
hhh(**d)#字典的关键字正好与函数的参数名相同,并一一对应,调用时会把d拆解成name=xiaobai,age=19,sex=‘女’