zoukankan      html  css  js  c++  java
  • python学习笔记(六)- 函数、文件json与python字典互操作

    1、函数:(方法、功能)

             1.提高代码的复用性

             2.让代码更简洁、简化代码

    1)定义一个简单的函数

    def sayHello():     #函数名,定义函数
        print("hello")  #函数体
    #函数不调用是不会被执行的
    sayHello()  #调用函数

    2)函数的参数:形参、实参

    def calc(a,b):   #a,b叫形参(形式参数)#位置参数,也叫必填参数
        res = a * b
        print('%s * %s = %s' % (a,b,res))
    calc(7,8)  #调用函数时,传入实参(实际参数),7传给a,8传给b

    3)默认值参数

    def op_file(filename,content=None): #content是默认值参数,非必填
        pass

     

    2、局部变量和return

    #局部变量(+ return使用)

             函数里面定义的变量,都是局部变量,只能在函数里面用,出了函数就不能用了

             #如果在函数外print(变量) 就会报错

    #return的作用

      1.return xxx   #调用完函数之后,返回处理的结果

      2.结束函数,函数遇到return,函数会立即结束

    def op_file(file_name,content=None): #文件名、需要写入的内容(默认None)
        f = open(file_name,'a+',encoding='utf-8')
        f.seek(0)
        if content:  #如果内容不为空(写入)
            f.write(content)
            f.flush() #刷新,立即写入到文件
        else:    #内容为空(读)
            all_user = f.read()  #局部变量,在函数里面定义的变量,只能在函数里面用,出了函数就不能用了
            return all_user    #调用完函数之后,返回处理的结果
        f.close()
    
    #op_file('a.txt','aaaa
    bbbb')   #content传入值,写入
    res = op_file('a.txt')   #content=None,读文件,res接收函数的返回值
    print(res)

    【例】:return结束函数

    def num():
        for i in range(5):
            print(i)
            if i==3:
                return   #只写一个return,表示立即结束函数,相当于break,返回None
    res = num()
    print(res)

    #>>> 0 1 2 None

    【例】函数里面如果没有return的话,默认返回None,函数里面return不是必须的,如果要接收函数的返回结果,就使用return,如果不需要函数结果,就不用return

    import string
    def check(pwd):
        #密码长度6-7位,必须包含字母和数字
        if len(pwd)>5 and len(pwd)<12:
            if set(pwd) & set(string.ascii_letters) and set(pwd) & set(string.digits):
                print("密码合法")
            else:
                print('密码不合法')
        else:
            print('密码长度6-11位')
    res = check('123abcd')   #函数里面如果没有return的话,默认返回None
    print(res)

     

    3、【例】:写一个 判断一个数是否是合法的小数 的函数

    #需求分析
        #定义一个函数
        # 1、小数点个数  .count()=1
        # 2、按照小数点进行分割 1.98 ->[1, 98]
        # 3、正小数:小数点左边是正数;右边也是整数 s.87  98.s
        # 4、负小数:左边:小数点左边以负号开头,且只有一个负号;右边是整数 -9.5
            #-9.5->['-9',5],再-9按'-'切割成['',9]
    def is_float(s):
        s = str(s)
        if s.count('.') == 1:
            left = s.split('.')[0]
            right = s.split('.')[1]
            if left.isdigit() and right.isdigit():
                print("是正小数")
                return True
            elif left.startswith('-') and left.split('-')[1].isdigit() and left.count('-')==1 and right.isdigit():
                print("是负小数")    #左边以‘-’开头,且只有一个负号,左边再按负号切割后的第二个元素是数字;右边也是数字
                return True     #'-1'.split('-') -> ['','1']
    
        print("不是小数")  #其它情况返回false
        return False
    
    print(is_float(1.98))
    print(is_float(-2.98))
    print(is_float(-1))   #False
    print(is_float('s.98'))  #False
    print(is_float('1.s98'))
    print(is_float(1.0))  #True
    print(is_float(-.5))  #True
    print(is_float('.98'))  #False

     

    4、常量:就是一个不变的值,一般全部用大写字母来定义  #比如PORT = 3306 ,比如,文件名FILENAME = 'a.txt'

    money = 500
    def
    test(consume): return money - consume def test1(money): return test(money) + money money = test1(money) print(money) >>> 500

     

    5、全局变量:

             公共的变量,都可以用的变量

             如果要修改全局变量的话,那要先声明一下修改的是全局变量

             #少用全局变量:全局变量不安全,所有人都可以修改;全局变量会一直占着内存

        def test():
        global a
        a = 5
    
    def test1():
        c = a + 5
        return c
    
    res = test1()
    print(res)   #>>>报错,a没有定义#因为test()没有被调用

     

    6、另一种不用按顺序一一对应的传参方式:

    def op_mysql(host,port,username,passwd,sql):
        print('连接数据库')
    op_mysql(sql='select * from xxx',
             host='192.158.11.1',
             username='root',
             passwd='123456',
             port='3306'
             )

     

    7、文件中的json串实际上是一个字符串,是一种通用的语言

    从文件里面读出来的内容都是字符串,然后把json串转成字典,方便取值

    #json文件里面必须使用双引号” ”,不能使用单引号

    #http://www.bejson.com/可以校验是否是一个正确的json格式

    #goods.json文件   
    {
        "iphone":{            #文件里面必须是双引号
            "color":"红色",
            "num":1,
            "price":98.5
        },
        "watch":{
            "num":100,
            "price":1,
            "color":"white"
        }
    }

    【例】:把文件中的json串转成字典(读文件)

    方法一:json.loads('str')

    import json  #导入json模块
    f = open('goods.json',encoding='utf-8')
    res = f.read()  #读文件
    goods_dic = json.loads(res)  #将读文件的结果,即json串转成python的字典
    print(goods_dic.get('iphone'))

    方法二:json.load(f)

    import json  #导入json模块
    f = open('goods.json',encoding='utf-8')
    print(json.load(f))  #传一个文件对象,直接把json转成字典#它会帮你读文件

     

    八、把字典转成json 写到文件(写到文件,保存到磁盘,持久化保存)

    方式一:json.dumps()

    import json
    dic = {
      "iphone":{
        "color":"红色",
        "num":1,
        "price":999
      },
      "watch":{
        "color":"white",
        "price":888
      }
    }
    fw = open('phone.json','w',encoding='utf-8')
    dic_json = json.dumps(dic,ensure_ascii=False,indent=4)  #参数:ensure_ascii=False显示中文,indent=4缩进4位
    fw.write(dic_json)

    字典转json,方式二:json.dump() #参数传入字典、传入文件

    fw = open('phone.json','w',encoding='utf-8')
    json.dump(dic,fw,ensure_ascii=False,indent=4) #json.dump()传入文件对象,直接帮你写文件

     

    九、【例】:使用函数 写注册和删除 

    #choice 1:注册 2:删除  #使用函数
    import json
    def op_file(filename,dic=None):  #传入文件名、字典=None
        if dic:    #如果dic不为空,表示字典需要写入文件
            with open(filename,'w',encoding='utf-8') as fw:
                json.dump(dic,fw,ensure_ascii=False,indent=4)   #把字典写入文件
        else:    #dic为空,表示读文件
            with open(filename,encoding='utf-8') as f:
                return json.load(f)
    
    FILE_NAME = 'user_info.json'  #把文件名定义成常量
    all_users = op_file(FILE_NAME)   #调用函数,读文件,已有的用户名读到字典里面
    #print(all_users)
    for i in range(3):
        choice = input("请输入选择,1:注册 2:删除").strip()
        if choice:
            if choice=='1':   #注册,dic不为空,写
                name = input("请输入用户名:").strip()
                pwd = input("请输入密码:").strip()
                rpwd = input("请输入确认密码:").strip()
                if name and pwd and rpwd:
                    if name not in all_users:
                        if pwd == rpwd:
                            all_users[name]=pwd
                            op_file(FILE_NAME,all_users)
                            print("注册成功")
                            break
                        else:
                            print("密码和确认密码不一致")
                    else:
                        print("用户名已存在")
                else:
                    print("用户名或密码不能为空")
            elif choice=='2':   #删除
                name = input("请输入需要删除的用户名:").strip()
                if name:
                    if name in all_users:
                        all_users.pop(name)   #先删除字典中的姓名
                        op_file(FILE_NAME,all_users)   #调用函数,重新写入文件
                        print("删除成功")
                        break
                    else:
                        print("输入的用户名不存在")
                else:
                    print("用户名不能为空")
            else:
                print("输入有误,1:注册 2:删除")
    
        else:
            print("输入不能为空,1:注册 2:删除")
    ###user_info.json###
    {
        "lisi": "123456",
        "www": "123456",
        "wangwu": "123456"
    }

    aa

     

  • 相关阅读:
    从零开始学架构(一):架构师成长路径(转)
    从零开始学架构:开篇-文章大纲(转)
    JAVA通信系列二:mina入门总结(转)
    JAVA通信系列三:Netty入门总结(转)
    JAVA通信系列一:Java Socket技术总结(转)
    大型网站架构系列:消息队列(二)(转)
    大型网站架构系列:分布式消息队列(一)(转)
    大型网站架构系列:缓存在分布式系统中的应用(三)(转)
    大型网站架构系列:缓存在分布式系统中的应用(二)(转)
    大型网站架构系列:负载均衡详解(3)(转)
  • 原文地址:https://www.cnblogs.com/chenhongl/p/8870945.html
Copyright © 2011-2022 走看看