#文件操作
sample(序列a,n) #从序列a中随机抽取n个元素,并将n个元素以list形式返回
','.join() #以某个指定的分隔符将list变成字符串
import string,random
f=open('email.txt','w')
for i in range(10):
u=''.join(random.sample(string.ascii_letters+string.digits,7)) #sample(seq, n)
f.write(u+'
')
fw=open('nhy','w')
fw.write('sssssss')
fw.flush() #将缓存区里面的数据立即写到磁盘上
fw.close()
with open('nhy','w') as fw,open('nhy2','w') as fw2: #使用with打开多个文件,且能自动关闭文件
fw.write('xxx')
#修改文件
# 1.简单粗暴直接的方式
1.先获取到文件里面的所有内容
2.然后修改内容
3.清空原来文件里面的内容
4.重新写入
f = open('users.txt','a+') #打开文件
f.seek(0) #移动指针
all_f=f.read() #读文件
new_f=all_f.replace('123456','python') #修改文件内容
f.seek(0) #读文件后指针就在最后面
f.truncate() #清空文件内容
f.write(new_f) #重新写入
f.flush()
f.close()
# 2.高效的处理方式
# words words
1.先打开原来的文件,再打开一个空文件
2.循环处理原来文件里面每一行数据,处理完之后,写到新文件里面
3.把原来的文件删除,把新文件的名字改成原来文件的名字
1、去掉前面的空格
2、把空行去掉
3、你替换you
4、写到新文件里
5、把原来的文件删除,把新文件的名字改成原来文件的名字
import os
with open('words') as fr,open('.words','w') as fw: #打开多个文件
for line in fr: #使用for循环读每行数据
line=line.lstrip() #去掉左边的空格
if line: #跳过空行
line=line.replace('你','you') #修改文件
fw.write(line) #写入新文件
os.remove('words') #删除源文件
os.rename('.words','words') #重命名文件
# 1、监控日志
# { '192.168.1.1':0,'192.158.1.1':2 }
# [192,]
# 1、如果一分钟之内某个ip访问超过100次
# 2、就吧他的ip找出来,split,取第一个元素
# 3、找出所有的ip,统计次数
# 4、判断每个ip次数day100,就发邮件
# 5、记录文件指针,给下次读的时候用
# 6、等待60s,重新读取文件
import time
point=0 #存放的是文件指针初始的位置
while True:
with open('access.log') as f:
f.seek(point)
ip_info={} #定义一个空字典,存放ip和他出现的次数
for line in f:
p=line.split()[0]
if ip in ip_info:
ip_info[ip]+=1
else:
ip_info[ip]= 1
point=f.tell() #获取当前文件指针的位置
for k in ip_info:
if ip_info.get(k)>100:
print('该ip在攻击你%s'%k)
time.sleep(60)
# 写一个注册小程序,注册成功后把账号/密码存到文件里
all_users={}
f=open('users.txt','a+') #文件句柄,文件对象
for i in range(3):
u = input('user:').strip()
p = input('p:').strip()
cp = input('cp:').strip()
if not u or not p or not cp:
print('账号、密码不能为空')
elif u in all_users:
print('该用户已经被注册!')
elif u not in all_users and cp==p:
info = '%s,%s
'%(u,p)
f.write(info)
break
f.close()
#写一个登录小程序,登录时从文件里获取账号密码,并判断
all_users={}
f=open('users.txt','a+')
f.seek(0)
for line in f: #直接循环文件对象,每次循环的时候就是取的每一行数据
line=line.strip()
line_list=line.split(',')
username=line_list[0]
passwd=line_list[1]
all_users[username]=passwd
for i in range(3):
u = input('user:').strip()
p = input('p:').strip()
if not u or not p:
print('账号/密码不能为空')
elif u not in all_users:
print('用户不存在')
elif p!=all_users.get(u):
print('密码错误')
else:
print('登录成功')
break
f.close()
# json
json是一个字符串,只不过长得像字典
在json串里只能写双引号
# json.loads()的用法-把json串转成字典:
# 把json串(字符串)转成字典
import json
user_info='''
{"nhy":"123456","lxy":"456789"}
'''
user_dict=json.loads(user_info) #把json串(字符串)转成字典
# 把文件里的json串转成字典
import json
f=open('stu.txt')
res=json.loads(f.read()) #使用json.loads()方法需要自己先读一次,入参是字符串
import json
f=open('stu.txt')
res=json.load(f) #使用json.load()方法这个是直接从文件里拿,入参是文件,不需要再读一次文件了,json帮你读
# json.dumps()的用法-把字典转成字符串:
# 把字典转成字符串
import json
stu_info = { 'laowang':{ 'cars':['BMW','Ben-z'] } }
stu_str=json.dumps(stu_info) #把字典转成json串(字符串)
#把字典转成的json串写到文件里
import json
stu_info = { 'laowang':{ 'cars':['BMW','Ben-z'] } }
stu_str=json.dumps(stu_info) #使用json.dumps()方法,需要自己写write,入参是字典
fw=open('stu.txt','w')
fw.write(stu_str)
fw.close()
import json
stu_info = { 'laowang':{ 'cars':['BMW','Ben-z'] } }
fw=open('stu.txt','w') #打开一个文件
json.dump(stu_info,fw,indent=4) #使用json.dump()方法不需要再write了,只需要传入文件对象,会自动写入文件
#json写上周的作业
import json
f=open('users.txt','a+') #文件句柄,文件对象
f.seek(0)
all_users=json.load(f)
for i in range(3):
u=input('user:').strip()
p=input('p:').strip()
cp=input('cp:').strip()
if not u or not p:
print('账号/密码不能为空')
elif u in all_users:
print('该用户已经被注册')
elif u not in all_users and cp==p:
all_users[u]=p
print('恭喜注册成功!')
break
f.seek(0)
f.truncate()
json.dump(all_users,f,indent=4)
f.close()
# 集合
1.天生去重,可以循环
2.集合也是无序的
nums={6,7,1,2,3,4,5}
nums2={1,8,7,12}
nums3={1,2,3,4}
# 循环
for n in nums:
print(n)
# 交集
print(nums.intersection(nums2)) #取2个集合里面都有的
print(nums & nums2) #取2个集合里面都有的
# 并集
print(nums.union(nums2)) #合并到一起之后,再去重
print(nums|nums2) #合并到一起之后,再去重
# 差集
print(nums.difference(nums2)) #取在num中存在,在num2里面没有
print(nums-nums2) #取在num中存在,在num2里面没有
# 对称差集
print(nums.symmetric_difference(nums2)) #把俩集合里面都有的去掉
print(nums^nums2)
# 子集
print(nums3.issubset(nums)) #判断nums3是否是nums的子集
# 父集
print(nums.issuperset(nums3)) #判断nums是否是nums3的父集
# 新建
set1 = set() or set1 = {1,2,3}
# 增
nums.add(8) #增加一个元素
nums.update([9,10]) #增加多个元素
# 删
nums.remove(9) #删除元素,如果是不存在的元素会报错
nums.discard(0) #删除元素,如果是不存在的元素不会报错
# 改/查
查:无法通过下标索引
改:不可变类型无法修改元素
# 转变成list或tuple
转变成list:list(nums)
转变成tuple:tuple(nums)
# 校验密码
1.密码必须包含大写字母、小写字母、数字、特殊字符
import string
all_nums=set(string.digits)
lower=set(string.ascii_lowercase)
upper=set(string.ascii_uppercase)
punctuation=set(string.punctuation)
for i in range(5):
pwd=input('pwd:').strip()
pwd=set(pwd)
if pwd & all_nums and pwd & lower and pwd & upper and pwd & punctuation:
print('密码合法')
else:
print('密码不合法')
# 函数
1. 函数就是一个功能,一个方法,能简化代码;
# 定义函数
def say(name,sex='男'): #say是函数名;say括号里接收的name,sex是形参
print('%s哈哈哈 性别%s'%(name,sex) #函数体
# 函数的4种形参类型
# 1.位置参数-就是按照参数的位置来进行传参
def calc(x,y): #定义一个函数,参数有x和y,x和y就是形参,也是位置参数
print(x*y)
calc(5,2) #调用上面定义的函数,5和2就是实参
简单点说,形参就是函数接收的参数,而实参就是你实际传入的参数
# 2.默认参数
默认参数就是在定义形参的时候,给函数默认赋一个值,这样就算你在调用的时候没传入这个参数,它也是有值的;
默认参数不是必填的。如果使用默认值参数的话,必须放在位置参数后面定义;
def say(name,sex='男'): #sex就是一个默认值参数
print(name,sex)
say('luxi') #调用,没指定默认值
say('luxi',sex='女') #调用,指定默认值参数的值
# 3.可变参数
可变参数用*来接收,后面想传多少个参数就传多少个;
可变参数必须在位置参数和默认值参数后面。可变参数也是非必传的;
def more_arg(name,age,*agrs): #*agrs是可变参数,调用的时候可变参数会把后面多传的参数都放到args这个元组中
print(name,age,agrs)
more_arg('Marry', 18, 'nv', 'python', 'China') # 调用
# 4.关键字参数
关键字参数使用**来接收,后面的参数也是不固定的,想写多少个写多少个;
当然也可以和上面的几种一起来使用,如果要一起使用的话,关键字参数必须在最后面;
使用关键字参数的话,调用的时候必须使用关键字传参。关键字参数也是非必传的;
def kw_arg(name,**kwargs): #name位置参数、**kwargs关键字参数,调用的时候会把传入的关键字参数放到kwargs这个字典中
print(name, kwargs)
kw_arg('sriba', sex='男', age=18) #调用,sex和age就是关键字调用
# 变量
在函数里面的变量全都是局部变量,它只能在函数里面使用,函数执行结束那么没有这个变量
函数的返回值
每个函数都有返回值,如果没有在函数里面指定返回值的话,在python里面函数执行完之后,默认会返回一个None;
如果需要用到函数的处理结果的话,那么就写return,不需要的话,那就不用写;
函数里面如果碰到return,函数立即结束;
def calc(a,b):
res=a*b
return res #这个就是定义了一个有返回值的函数
res=calc(6,6) #把函数的返回结果赋值给res
print(res)
def my():
for i in range(100):
print(i)
if i==2:
return #碰到return,函数立即结束
my()
# 写一个校验输入的字符串是否为小数的程序
# 1、只有一个小数点 判断小数点个数
# 2、 正小数的情况下,小数点左边和右边都是整数的话,才合法 [0 ,12]
# 3、负小数的情况下 小数点右边整数,左边 必须以负号开头,只有一个负号。
def check_float(s):
s=str(s)
if s.count('.')==1:
s_list=s.split('.')
left=s_list[0] #小数点左边
right=s_list[1] #小数点右边
if left.isdigit() and right.isdigit(): #这里是判断正小数的
return True
elif left.startswith('-') and left[1:].isdigit() and right.isdigit():
return True
return False
print(check_float(0.25))