1.Python JSON 数据解析
JSON(JavaScript Object Notation)是一种轻量级数据交换格式,它易于阅读和编写,同时也易于机器解析和生成。Python提供了内置的JSON模块,用于处理JSON数据。
#json;在python中格式和字典的格式基本一样,不同的是json数据的key只能是字符串类型
#定义json和定义字典方法形同
#json的键必须使用双引号
js = {"name":"zhangsan","age":20}
#定义的json在python中的数据类型就是dict
print(type(js))
#字典序列化为json字符串
import json
s = json.dumps(js)
print(s)
print(type(s))
#序列化为json字符串后,该json字符串不能修改
# s["name"] = "zhangsan"
# print(s)
#json字符串反序列化为字典
dic =json.loads(s)
print(dic)
print(type(dic))
#如果需要修改json字符串的元素值,需要反序列化为字典再修改
#dump和loads做序列化操作,dump和load做文件读写操作
#对象存文件:dump(dic,file),dic是要写入的数据,file是要写入的文件
with open('data.json', 'w') as f:
json.dump(dic, f)
字典和JSON格式不同之处
-
数据类型限制:
-
JSON:支持的数据类型包括对象(类似于字典)、数组(类似于列表)、字符串、数字、布尔值和
null
。JSON 不支持 Python 特有的数据类型如tuple
、set
、bytes
等。 -
Python 字典:可以包含多种 Python 特有的数据类型,比如
tuple
、set
、bytes
等。
-
-
格式要求:
-
JSON:数据必须以字符串的形式表示,键必须是双引号括起来的字符串,值可以是字符串、数字、布尔值、数组、对象或
None
。 -
Python 字典:键可以是任意不可变的类型(如字符串、数字、元组),值可以是任意类型。键通常用单引号或双引号括起来,但 Python 允许在字典中使用不加引号的键。
-
1.Numpy基础
1.1 概念
-
NumPy 的全称是“ Numeric Python”,它是 Python 的第三方扩展包,主要用来计算、处理一维或多维数组
-
在数组算术计算方面, NumPy 提供了大量的数学函数
-
NumPy 的底层主要用 C语言编写,因此它能够高速地执行数值计算
-
NumPy 还提供了多种数据结构,这些数据结构能够非常契合的应用在数组和矩阵的运算上
1.2 优点
NumPy 可以很便捷高效地处理大量数据,使用 NumPy 做数据处理的优点如下:
-
NumPy 是 Python 科学计算基础库
-
NumPy 可以对数组进行高效的数学运算
-
NumPy 的 ndarray 对象可以用来构建多维数组
-
NumPy 能够执行傅立叶变换与重塑多维数组形状
-
NumPy 提供了线性代数,以及随机数生成的内置函数
1.3 与python列表区别
NumPy 数组是同质数据类型(homogeneous),即数组中的所有元素必须是相同的数据类型。数据类型在创建数组时指定,并且数组中的所有元素都必须是该类型。
Python 列表是异质数据类型(heterogeneous),即列表中的元素可以是不同的数据类型。列表可以包含整数、浮点数、字符串、对象等各种类型的数据。
NumPy 数组提供了丰富的数学函数和操作,如矩阵运算、线性代数、傅里叶变换等。
Python 列表提供了基本的列表操作,如添加、删除、切片、排序等。
1.4 安装
pip install numpy==1.26.0 -i https://pypi.tuna.tsinghua.edu.cn/simple/
2.ndarray
NumPy 定义了一个 n 维数组对象,简称 ndarray 对象,它是一个一系列相同类型元素组成的数组集合。数组中的每个元素都占有大小相同的内存块,您可以使用索引或切片的方式获取数组中的每个元素。
ndarray 对象采用了数组的索引机制,将数组中的每个元素映射到内存块上,并且按照一定的布局对内存块进行排列,常用的布局方式有两种,即按行或者按列。
主要特点
-
多维数组:ndarray 可以表示任意维度的数组,包括一维、二维、三维等。
-
同质数据类型:ndarray 中的所有元素必须是相同的数据类型。
-
高效内存布局:ndarray 在内存中是连续存储的,这使得数组的访问和操作非常高效。
-
丰富的功能和方法:ndarray 提供了丰富的数学函数和操作,如矩阵运算、线性代数、傅里叶变换等。
使用方式:
-
ndarray 是通过 array 函数或其他 NumPy 函数(如 zeros、ones、arange 等)创建的。
-
array 函数接受一个序列作为输入,并返回一个 ndarray 对象。
# array创建数组:
# 参数:object,要传入序列,可以是一维多维数组
# dtype :数组元素的数据类型,如果未指定dtype,numpy自动根据输入判断数据类型
# order :按照那种存储方式存数据,c——按照行存,F按照列存
#ndmin:指定数组维度,在整个数组外面加一个维度,不能修改形状
import numpy as np
a = np.array([1,2,3,4,5], dtype=np.int32, order='C', ndmin=2)
print(a)
print(type(a))
print(a.dtype)
#创建二维数组
a = np.array([[1,2,3],[4,5,6]])
print(a)
print(a.dtype)
# 描述ndarray数组形状,数据类型:元组,(n ,m)形状表示n行,m列
print(a.shape)
#zeros:根据指定的shape创建数组,数组元素默认以0填充
a = np.zeros((2,3))
print(a)
#ones:根据指定形状创建数组,数组元素默认1填充
a = np.ones((3,2))
print(a)
#full:根据形状创建数组,以value填充元素值
a = np.full((3,2), 5)
print(a)
# arange():(start,stop,step):创建一个等差数列的一维数组
#start:起始值 ; stop:终止值;step步长
a = np.arange(1, 10, 2)
print(a)
a = np.arange(1, 10, 1)
print(a)
a = np.arange(10, 0, -1)
print(a)
#linspace():创建一个等差数列的一维数组,根据份数创建
#start:起始值;stop:终止值默认包含,由endpoint参数控制,该参数默认True
#num;把序列分成多少份,默认份数为50
#endpoint:为True表示包含终止值,为False表示不包含终止值,默认为True
a = np.linspace(0,10 ,10)
print(a)
练习
编写一个程序,打开文本文件,计算其中的大写字母数量。
def num_A():
num = 0
#自己创建一个文本文件,最好在你编写程序的同一路径下,不然绝对路径查找很烦,不懂半天找不到
f = open(r'Numpy语法\大写字母的数量.txt','r',encoding='utf-8')
#encoding记得改成utf—8不然汉字是乱码
text = f.read()
for i in text:
if i.isupper(): #判断字符大写的函数
num += 1
f.close() #记得关文件
print(num)
num_A()
练习2
在无限的平面上,机器人最初位于 (0, 0) 处,面朝北方。注意:
北方向 是y轴的正方向。
南方向 是y轴的负方向。
东方向 是x轴的正方向。
西方向 是x轴的负方向。
机器人可以接受下列三条指令之一:
"G":直走 1 个单位
"L":左转 90 度
"R":右转 90 度
机器人按顺序执行指令 instructions,并一直重复它们。
只有在平面中存在环使得机器人永远无法离开时,返回 true。否则,返回 false。
提示1.联合数学所学的平面知识判断向量,和机器人的位置。
提示2.结束指令后,只有方向改变即机器人不面向北,或者,仍处于原点,即位移为0,此时机器人会被困于环之内,否则逃离。
示例 1:
输入:instructions = "GGLLGG"
输出:true
解释:机器人最初在(0,0)处,面向北方。
“G”:移动一步。位置:(0,1)方向:北。
“G”:移动一步。位置:(0,2).方向:北。
“L”:逆时针旋转90度。位置:(0,2).方向:西。
“L”:逆时针旋转90度。位置:(0,2)方向:南。
“G”:移动一步。位置:(0,1)方向:南。
“G”:移动一步。位置:(0,0)方向:南。
重复指令,机器人进入循环:(0,0)——>(0,1)——>(0,2)——>(0,1)——>(0,0)。
在此基础上,我们返回true。
class Solution:
def isRobotBounded(self, instructions: str) -> bool:
direction = 0 #方向
x,y = 0, 0 #位置
for i in instructions:
if i == 'G':
if direction == 0:
y += 1
elif direction == 90 or direction == -270: #位置判断
x += 1
elif direction ==180 or direction == -180:
y -= 1
elif direction == 270 or direction == -90:
x -= 1
elif i == 'L':
direction -= 90
if direction == -360: #向量判断
direction = 0
elif i == 'R':
direction += 90
if direction == 360:
direction = 0
if direction != 0 or (x == 0 and y == 0):
return True #根据位置结果判断
else:
return False