python函数递归json模块操作

Posted zhouly-008

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python函数递归json模块操作相关的知识,希望对你有一定的参考价值。

一、修改文件

修改文件方法:简单粗暴直接,步骤以下:

#1、打开一个文件,获取到文件的内容

#2、对内容进行修改

#3、清空文件的内容

#4、把新的内容写入到文件

代码示例:

f=open(‘username‘,‘a+‘)

f.seek(0)

all_str=f.read()

new_str=all_str.replace(‘123456‘,‘79910‘)

f.seek(0)

f.truncate()

f.write(new_str)

f.close()

 

#把每行的内容加上str,代码示例:

f=open(‘username‘,‘a+‘)

f.seek(0)

all_str=‘‘

for s in f:

new_s=‘syz‘+s

all_str=all_str+new_s

f.seek(0)

f.truncate()

f.write(all_str)

f.close()

 

f = open(‘username‘, ‘a+‘)

f.write()# 只能写字符串

f.writelins()#会帮助循环一次

# fw = open(‘username‘,‘w‘)

# fw.write(‘hhhh‘)

# fw.flush() #强制把缓冲区里面的数据写到磁盘上

 

#打开两个文件

#a文件

#写一行到b文件

#a.txt a.txt.bak

#删掉a文件,b文件名改成a文件名

#with打开不用关文件

#花替换为flower

import os

with open(‘words‘,encoding=‘utf-8‘) as fr,open(‘.words.bak‘,‘w‘,encoding=‘utf-8‘) as fw:

for line in fr:

new_line=line.replace(花‘,‘flower‘)

fw.write(new_line)

os.remove(‘words‘)#删除文件

os.rename(‘.words.bak‘,‘words‘)#改名

 

二、函数

概念:函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。

函数能提高应用的模块性,和代码的重复利用率、代码可扩展。

函数代码结构:

def say(): #函数名

print(‘hello‘)#函数体

#函数不调用是不会被执行的

调用函数时用函数名+括号的格式

# say() #调用函数

 

1、函数的参数

函数在调用的时候,可以传入参数,有形参和实参

形参:

形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只在函数内部有效。

实参:

实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。函数调用结束返回主调用函数后则不能再使用该形参变量。

def calc(a,b): #形参, 形式参数

#位置参数,必填参数

res = a * b

print(‘%s * %s = %s‘%(a,b,res))

 

# calc(7,8) #实参,实际参数

 

2、参数组:

参数组的参数处用“*args”表示。参数组特点:(1)参数是非必填的;(2)没有限制参数的个数;(3)传过来的参数放到args参数里,不限格式

def syz(*args):#参数组

username=args[0]

pwd=args[1]

age=args[2]

print(args)

syz(‘liubei‘,‘2423‘,‘2323‘)

执行结果:

(‘liubei‘, ‘2423‘, ‘2323‘)

 

如果定义函数时,写成 def syz(a,*args),则a是必传参数,*args是非必填的

def syz(a,*args):#参数组

print(args)

syz(‘liubei‘,‘2423‘,‘2323‘)

执行结果:

(‘2423‘, ‘2323‘)

3、关键字参数

关键字参数用“**kwargs”表示。特点:(1)参数是非必填;(2)没有限制参数个数;(3)所传参数必须是字典格式。

def syz2(**kwargs):#关键字参数,参数放到字典里面

print(kwargs)

syz2()

syz2(name=‘nhy‘,age=38)

syz2(name=‘nhy‘,age=38,addr=‘回龙观‘,home=‘河南‘)

代码执行结果:

 

如果def syz2(time,**kwargs),则time参数必传。其中,time=‘20180912‘是第一个参数time的值,因此输出kwargs时,没有time这一项

def syz2(time,**kwargs):#关键字参数,参数放到字典里面

print(kwargs)

syz2(name=‘nhy‘,age=38,addr=‘回龙观‘,time=‘20180420‘)

代码执行结果:

{‘age‘: 38, ‘addr‘: ‘回龙观‘, ‘name‘: ‘nhy‘}

 

4、函数的返回值:

每个函数都有返回值,如果没有在函数里面指定返回值的话,在python里面函数执行完之后,默认会返回一个None,函数也可以有多个返回值,如果有多个返回值的话,会把返回值都放到一个元组中,返回的是一个元组。

为什么要有返回值呢,是因为在这个函数操作完之后,它的结果在后面的程序里面需要用到。

函数中的返回值使用return,函数在遇到return就立即结束。

 

操作文件的函数,如果传内容参数,则将对应内容写入文件。没有传内容,就读取文件原来的内容,代码示例:

def op_file(file_name,conent=None):

#默认值参数,它是非必填的

f = open(file_name,‘a+‘,encoding=‘utf-8‘)

f.seek(0)

if conent:#不为空代表写

f.write(conent)

f.flush()

else:

all_users = f.read()

return all_users #调用完函数之后,返回什么结果

f.close()

# res = op_file(‘a.txt‘)

# print(res)

 

def haha():

#函数里面遇到return函数就立即结束了

for i in range(5):

print(i)

if i==3:

return #只写一个return的话,就返回None

# res = haha()

# print(res)

 

检查输入的密码是否符合要求,密码包含大小写字母、数字、特殊字符,长度6-11之间

import string

def check(pwd):

#长度6-11

#字母和数字吧

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(‘密码不合法‘)

# res = check(‘asd1234‘) #函数里面如果没有return的话,默认返回None

 

案例:判断是否为小数:

#  需求分析:
    #1、 小数点个数  .count()
    # 2、按照小数点进行分割  1.98  [1,98] s.87  98.s1
    #3、正小数:小数点左边是整数 右边也是整数 .isdigits()
    #   负小数:小数点左边是以负号开头,但是只有一个负号,右边也是整数  -9.85
def is_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.count(-)==1 and                 left.split(-)[1].isdigit() and                 right.isdigit():  #判断合法负小数
                return True
    return False

三、变量

局部变量和全局变量

局部变量意思就是在局部生效的,出了这个变量的作用域,这个变量就失效了

全局变量的意思就是在整个程序里面都生效的,在程序最前面定义的都是全局变量,全局变量如果要在函数中修改的话,需要加global关键字声明,如果是list、字典和集合的话,则不需要加global关键字,直接就可以修改。

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

def sayName():

global name

name = ‘刘伟‘

print(‘name1‘,name)

def lw():

age = 28

return age

 

def setName():

global name

name = ‘刘备‘

# sayName()

# setName()

# print(‘name2‘,name)

 

一个函数中使用多个变量

def op_mysql(host,port,username,password,db,charset,sql):

print(‘连接数据库‘)

op_mysql(

‘192.168.1.1‘,

3306,‘root‘,‘123456‘,‘jxz‘,‘utf-8‘,‘select‘)

op_mysql(

host=‘192.168.1.1‘,

db=‘sfsdf‘,

charset=‘sdfsdf‘,

sql=‘select * from user;‘

)

四、递归

在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。

递归调用的意思就是,在这个函数内部自己调用自己,就有点循环的意思。

def test1():

num = int(input(‘please enter a number:‘))

if num%2==0:#判断输入的数字是不是偶数

return True #如果是偶数的话,程序就退出了,返回true

print(‘不是偶数请重新输入!‘)

return test1()#如果不是偶数的话继续调用自己,输入值

# print(test1())#调用test

 

#少用递归,递归最多递归999,递归的效率不高。

i = 0

def test():

global i

i+=1

print(i)

test()

test()

 

递归调用的特性:

1. 必须有一个明确的结束条件

2. 每次进入更深一层递归时,问题规模相比上次递归都应有所减少

3. 递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)

 

五、json数据解析

JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于ECMAScript的一个子集。

Python3 中可以使用 json 模块来对 JSON 数据进行编解码,它包含了两个函数:

    • json.dumps(): 对数据进行编码。把python的数据类型变成json串

json.loads(): 对数据进行解码。把json串变成python的数据类型

 

json.dumps 与 json.loads 实例:

import json
#json串是一个字符串
#把json串转换成字典
f = open(product.json,encoding=utf-8)
# res = f.read()
# product_dic = json.loads(res)  #把json串变成python的数据类型
# print(json.load(f)) #传一个文件对象,它会帮你读文件
d =  {
    zll:{
        addr:北京,
        age:28
    },
    ljj:{
        addr:北京,
        age:38
    }
}
fw = open(user_info.json,w,encoding=utf-8)
# dic_json = json.dumps(d,ensure_ascii=False,indent=4)  #字典转成json,字典转成字符串
# fw.write(dic_json)
json.dump(d,fw,ensure_ascii=False,indent=10)  #操作文件

将数据类型为字典的变为json串写入文件,将文件中的json串变为字典,读取出来,代码:
import json
def op_data(filename,dic=None):
    if dic:#写入进去
        with open(filename,w,encoding=utf-8) as fw:
            json.dump(dic,fw,ensure_ascii=False,indent=4)
    else:
        with open(filename,encoding=utf-8) as fr:
            return json.load(fr)

            
FILE_NAME = user_info.json
all_users = op_data(FILE_NAME)
for i in range(3):
    choice = input(输入,1注册,2、删除)
    if choice==1:
        username = input(usenrame:)
        pwd = input(pwd:)
        if username not in all_users:
            all_users[username]=pwd
            op_data(FILE_NAME,all_users)
    elif choice=="2":
        username = input(usenrame:)
        all_users.pop(username)
        op_data(FILE_NAME, all_users)

六、内置函数

print(all([1,2,3,4]))#判断可迭代的对象里面的值是否都为真

print(any([0,1,2,3,4]))#判断可迭代的对象里面的值是否有一个为真

print(bin(10))#十进制转二进制

print(bool(None))#把一个对象转换成布尔类型

print(chr(69))#打印数字对应的ascii

print(ord(‘E‘))#打印字符串对应的ascii码

s=‘nhy‘

d={}

print(dir(d))#打印传入对象的可调用方法

exec(‘def a():print("我是a")‘)#执行python代码

 

a = eval(‘1+2‘) #也是用来执行python代码的,只能执行一些简单的代码,比如运算,[] {}

print(a)

print(filter(lambda x:x>5,[12,3,12,2,1,2,35]))#把后面的迭代对象根据前面的方法筛选

print(map(lambda x:x>5,[1,2,3,4,5,6]))

print(max(111,12))#取最大值

print(min((1,2,3)))#取最小值

print(abs(-1))#取绝对值的

print(round(11.119999,3))#取几位小数

print(sorted([2,31,34,6,1,23,4]))#排序

以上是关于python函数递归json模块操作的主要内容,如果未能解决你的问题,请参考以下文章

模块调用,datetime,time,logging,递归,双层装饰器, json,pickle迭代器和生成器

Python:递归+内置函数+第三方模块+md5加密+操作mysql

递归os.walk内置函数lambdahashlib模块md5加密python安装第三方模块操作mysql数据库

python学习 -函数---递归--模块(os)--时间操作

python学习之路

Python自动化四--json模块使用,集合操作,函数