zoukankan      html  css  js  c++  java
  • 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('大写字母、小写字母、数字、特殊字符都要有!')
  • 相关阅读:
    BZOJ 3261 最大异或和(可持久化Trie)
    模板 普通平衡树
    HDU4825 Xor Sum(贪心+Trie树)
    二维LIS(CDQ分治)
    IOIOI卡片占卜(Atcoder-IOIOI カード占い)(最短路)
    USACO 2009 Dec cow toll paths 过路费-floyd
    [USACO08JAN]电话线Telephone Lines(分层图)/洛谷P1948
    lightoj 1038 Race to 1 Again 期望
    lightoj 1030 Discovering Gold 期望
    lightoj 1027 A Dangerous Maze 期望
  • 原文地址:https://www.cnblogs.com/Mezhou/p/9206179.html
Copyright © 2011-2022 走看看