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数据库