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