python-函数&list&dic&集合&文件读取

NO1  很重要的函数

#函数就是一个功能,一个方法,简化代码
#函数必须得调用才会执行
#在函数里面的变量全都是局部变量,它只能在函数里面用,函数执行结束那么没有这个变量



#不带参数
def say():                    #函数名
  print('哈哈哈')            #函数体

say()      #函数调用 
#带一个参数
1
def say(name): #形参 2 print('%s说:哈哈哈哈!'%name) 3 4 say('周继蓉') #实参
#带多个参数
def
say(name,sex) print('%s 哈哈 性别%s '%(name,sex)) x='zhoujirong' say(x,‘女’)
 #默认值参数
1
def say(name,sex=''): 2 # 必填参数,未知 #默认值参数,非必填 3 print('%s 哈哈哈 性别%s'%(name,sex)) 4 x='zjr' 5 say(x) 6 say(x,'') 7 8 #结果: 9 # zjr 哈哈哈 性别男 10 # zjr 哈哈哈 性别女
#返回值
#如果需要用到函数的处理结果的话需要写return,不需要就不需要写
#函数里面如果碰到return,函数立即结束
1 def calc(a,b):
2     res = a*b
3     return res
4 cur_money = 8000
5 nx=calc(1000,13)
6 print(nx+cur_money)
 1 def my():
 2     for i in range(100):
 3         print(i)
 4         if i==2:
 5             return
 6 print(my())
 7 #结果
 8 #0
 9 #1
10 #2
11 #none
 1 #1.写一个校验输入的字符串是否是小数的程序
 2 # 0.12  -0.13
 3 #1.只有一个小数点,count
 4 #2.正小数的情况,小数点左边和右边都是整数的话,才合法 0.12  [0,12]
 5 #3.负小数的情况下,小数点右边是整数,左边必须以负号开头,只有一个负号
 6 # -5.4
 7 #[-5,4]
 8 #[1:] 从第二位开始到最后都是整数
 9 
10 def check_float(s):
11      s = str(s)#转成字符串
12      if s.count('.')==1:
13          s_list=s.split('.')
14          left=s_list[0]#小数点左边
15          right=s_list[1]#小数点右边
16          if left.isdigit() and right.isdigit():
17              return True
18          if left.startswith('-') and left.count('-')==1:
19              if left[1:].isdigit() and right.isdigit():
20                  return True
21 
22      return False
23 
24 print(check_float(-5.2))
25 print(check_float(-.6))
26 print(check_float('--.6'))
27 print(check_float('-dd.6'))

1
def my_file(name,content=None): 2 with open(name,'a+') as f: 3 f.seek(0) 4 if content: 5 f.write(content) 6 else: 7 return f.read()

NO2 json模块使用

 1 # json是一个字符串,只不过是长得像字典
 2 # json只能用双引号
3 import json 4 5 user_info = ''' 6 7 {"nhy":"123456","zjr":"111111"} 8 9 ''' 10 user_dic=json.loads(user_info)#把json(字符串)装换成字典 11 print(user_dic) 12 print('user_dic',type(user_dic)) 13 print('user_info',type(user_info))
#结果:
#{‘nhy’:'123456','zjr':'111111'}
#user_dic<class'dict'>

#user_info<class'str'>

将字典转换成json串

1 stu_info = {'laowang':{'cars':['bmw','Ben-z']}}
2 stu_str = json.dumps(stu_info)#把字典转成json(字符串)
3 print('json',type(stu_str))
4 print(stu_str)

结果:

#dump 将字典直接成json写进文件
1
stu_info = {'laowang':{'cars':['bmw','Ben-z']}} 2 fw=open('users.json','w',encoding='utf-8') 3 json.dump(stu_info,fw,indent=4)#不需要咱们自己再write,人家会自动写入文件,indent加缩进,4 就够用 4 5 # load 和loads 不带s直接读文件,带s读字符串,同dumps和dump

结果:

1 f=open('users.json')
2 res=json.load(f) #将json文件读成字典
3 print(res)

结果:

用json写注册程序:

 1 import json
 2 f = open('users','a+',encoding='utf-8')  #文件句柄,文件对象
 3 f.seek(0)
 4 all_users = json.load(f) #把json(字符串)转换成字典
 5 for i in range(3):
 6     u = input('user:').strip()
 7     p = input('p:').strip()
 8     cp = input('cp:').strip()
 9     if not u or not p:
10         print('账号、密码不能为空')
11     elif u in all_users:
12         print('该用户已经被注册!')
13     elif u not in all_users and cp==p:
14         all_users[u]=p
15         break
16 f.seek(0)
17 f.truncate()#清空原来的内容
18 json.dump(all_users,f,indent=4) #字典转json
19 f.close()

 NO3  高效读取文件

速度顺序: CPU>内存>磁盘

存用户名、密码进文件,写登录和注册

 1 all_users = {}
 2 f = open('users.txt','a+',encoding='utf-8') #文件句柄,文件对象
 3 f.seek(0)
 4 for line in f: #直接循环文件对象,每次循环的时候就是取的每一行数据
 5 line = line.strip()
 6 line_list = line.split(',') # [nhy,123456]
 7 username = line_list[0]
 8 passwd = line_list[1]
 9 all_users[username] = passwd
10 u = input('user:').strip()
11 p = input('p:').strip()
12 cp = input('cp:').strip()
13 for i in range(3):
14 if not u or not p:
15 print('账号、密码不能为空')
16 elif u not in all_users:
17 print('用户不存在!')
18 elif p!=all_users.get(u):
19 print('密码错误!')
20 else:
21 print('登录成功')
22 break
23 
24 for i in range(3):
25 if not u or not p:
26 print('账号、密码不能为空')
27 elif u in all_users:
28 print('该用户已经被注册!')
29 elif u not in all_users and cp==p:
30 info = '%s,%s
'%(u,p)
31 f.write(info)
32 break
33 f.close()

缓存区:内存和磁盘中间存数据的地方,缓存区存满会写入磁盘

fw = open('zjr','w')
fw.write('dddd','w')
fw.flush()#把缓冲区里面的数据立即写到磁盘上
fw.close()

with写打开文件,会自己关闭文件

1 with open('zjr','w') as fw,open('tzy','w') as fw2:  #打开多个文件,用逗号隔开
2     fw.read()
3     fw.write()

NO4 文件修改

方法一:

 1 #文件修改
 2 方法1#1.简单粗暴直接  文件小可以,文件大会崩溃
 3   1.先获取到文件里的所有内容
 4    2.然后修改内容
 5    3.清空原来文件里面的内容
 6    4.重新写入
 7 
 8 f = open('test','a+')
 9 f.seek(0)
10 all_data=f.read()
11 new_data=all_data.replace('123','python')
12 f.seek(0)
13 f.truncate()#清空文件内容
14 f.write(new_data)
15 f.flush()
16 f.close()

方法二:

 1 #方法2 高效的处理文件方式
 2  #      words            words_new
 3     #1.先打开原来的文件,再打开一个空文件
 4     #2.循环处理原来文件里面的每一行数据,处理完之后,写到新文件里面
 5     #3.把原来的文件删掉,把新的文件的名字改为原来文件的名字
 6 import os #引入os模块删除
 7 with open('words',encoding='utf-8') as fr,open('.words','w',encoding='utf-8') as fw:
 8     for line in fr:
 9         line=line.lstrip()#去左边空格
10         if line:#判断这一行是否有数据 非空即真,真就处理,假就不处理,继续循环
11             line = line.replace('','you')#替换数据
12             fw.write(line)#写到新文件里面
13 os.remove('words')#删除原来文件
14 os.rename('.words','words')#把新文件的名字改成原来文件的名字

练习修改文件

 #邮箱
1
import os #引入os模块删除 2 import string 3 with open('eamil.txt',encoding='utf-8') as fr,open('.words','w',encoding='utf-8') as fw: 4 for line in fr: 5 if not line[0] in string.digits: 6 line=line.rstrip() 7 line = line+'@163.com '#替换数据 8 fw.write(line)#写到新文件里面 9 os.remove('eamil.txt')#删除原来文件 10 os.rename('.words','eamil.txt')#把新文件的名字改成原来文件的名字

监控日志

 1 #1.监控日志
 2 #  1.如果一分钟之内某个ip访问超过100次
 3 #  2.就把ip找出来
 4 
 5 
 6 #集合  天生去重
 7 #1.打开日志文件
 8 #2.获取每行数据
 9 #3.split,取第一个元素
10 #4.找出所有ip,统计次数
11 #5. 判断每个ip次数大于100,就发邮件
12 #6. 记录文件指针,给下一次读的时候用
13 #7. 等待60a,重新读取文件
14 
15 import time
16 point = 0 #存放的是文件初始的位置
17 while True:
18     with open('access.log',encoding='utf-8') as f:
19         f.seek(point)
20         ip_info={}#定义字典存放ip和它出现的次数
21         for line in f:
22             ip=line.split()[0]#列表按空格切分,第一个就是ip
23             if ip in ip_info:
24                 ip_info[ip]+=1
25             else:
26                 ip_info[ip]=1
27         point = f.tell()#获取当前文件指针的位置
28         for k in ip_info:
29             if ip_info.get(k)>=100:
30                 print('该ip正在攻击你:%s'%k)
31     time.sleep(60)#等待60s再统计

NO5 集合

 1.天生去重,循环
2.关系测试 - 交集、差集、并集、反向差集、对称差集

集合:天生去重

1 nums = [1,1,1,2,3,4,4]
2 nums_set = set(nums)
3 nums2 = {1,2,3,4,1,1,1}
4 print(nums2)
5 
6 null_set=set()#空集合定义
 1 #转集合
 2 list = [1,2,3,4,5,6]
 3 list_2 = [2,5,4,7]
 4 list=set(list)
 5 list_2=set(list_2)
 6 print(list.intersection(list_2))#交集 取出重复数据
 7 print(list.union(list_2))#并集 去重 统一展示
 8 print(list.difference(list_2))#差集 list中有,list_2没有
 9 
10 list_3 = set([1,3,6])
11 print(list_3.issubset(list))#子集
12 print(list.issuperset(list_3))#父集
13 print(list.symmetric_difference(list_2))#对称差集,并集-交集
14 
15 # & 交集  |并集  - 差集  ^对称差集
16 print(list & list_2)
17 print(list | list_2)
18 print(list - list_2)
19 print(list ^ list_2)
20 
21 #集合操作
22 #添加
23 list.add(555)#一次只能添加一个
24 list.update(666,777)#同时添加多个
25 #删除
26 # list.remove(5)#指定删除,删除一个不存在的会报错
27 list.pop()#随机删除
28 list.discard(666)#删除一个不存在的不会报错

集合练习-密码

 1 pwd = input('请输入你的密码:').strip()
 2 pwd = set(pwd)
 3 #大写字母、小写字母、数字、特殊字符
 4 import string
 5 nums=set(string.digits)
 6 ascii_lowercase = 'abcdefghijklmnopqrstuvwxyz'
 7 lower=set(ascii_lowercase)
 8 ascii_uppercase = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
 9 upper =set(ascii_uppercase)
10 punctuation = r"""!"#$%&'()*+,-./:;<=>?@[]^_`{|}~"""
11 zifu=set(punctuation)
12 if pwd & nums & lower & upper & zifu:
13     print('合法!')
14 else:
15     print('大写字母、小写字母、数字、特殊字符都要有!')
原文地址:https://www.cnblogs.com/Mezhou/p/9206179.html