Python学习笔记
一、小知识点
1.1 Python中ASCII码的数字和字符的转换
将ASCII字符转换为对应的数值即‘a’–>65,使用ord函数,ord(‘a’)
反正,使用chr函数,将数值转换为对应的ASCII字符,chr(65)
1.2 找出list中最大或者最小几个数的索引
import heapq #导入heapq包
nums = [1,8,2,23,7,-4,18,23,24,37,2]
result = map(nums.index, heapq.nlargest(3, nums))
temp=[]
Inf = 0
for i in range(3):
temp.append(nums.index(max(nums)))
nums[nums.index(max(nums))]=Inf # 将每次的最大值置0;改变了原数组
result.sort()
temp.sort()
print(result)
print(temp)
如上,有result和temp两种求法,上面代码输出:
[3, 8, 9]
[3, 8, 9]
上述是没问题的。
但是把nums改一下(list中有相同数值):
nums = [1,8,2,23,7,-4,18,23,23,37,2]
[3, 3, 9]
[3, 7, 9]
发现问题了吧,result方法发现相同数字永远会返回第一次出现的索引。
1.3 json与str转换
str转json
str转换为json格式,前提一定需要保证这个str的格式和json是一致的,即左边最外层是大括号,右边的最外层是大括号。如果不一致,推荐用正则进行拆分至和json格式一致
1. 通过json.loads进行转换
import json
str = '{"key": "wwww", "word": "qqqq"}'
j = json.loads(str)
print(j)
print(type(j))
但是值得注意的是,json中内部数据需要用双引号来包围,不能使用单引号,如刚才的写法,如果写成这样,就会发生错误:
str = "{'key': 'wwww', 'word': 'qqqq'}"
j = json.loads(str)
2. 通过eval
eval函数的官方解释为:将字符串str当成有效的表达式来求值并返回计算结果。
即通过eval可以把list,tuple,dict和string相互转化
,例如:
a = "[[1,2], [3,4], [5,6], [7,8], [9,0]]"
b = eval(a)
type(b)
list
a = "{1: 'a', 2: 'b'}"
b = eval(a)
type(b)
dict
a = "([1,2], [3,4], [5,6], [7,8], (9,0))"
b = eval(a)
type(b)
tuple
同样,值得注意的是,eval()可以通过运行系统的命令,如:
eval("__import__('os').startfile('notepad.exe')") #启动记事本程序
那么为了保证安全,当需要用户输入时,可以对用户输入进行敏感字符检查和过滤
3. literal_eval
和eval用法相同,都可以将字符串str解析成list,tuple,dict,而且避免了eval的安全性的问题
import ast
a = "{1: 'a', 2: 'b'}"
b = ast.literal_eval(a)
type(b)
dict
json转str
使用json.dumps
的方法,可以将json对象转化为字符串
data = {"name":"wjp","age":"22"}
data = json.dumps(data)
1.4 from future import * 的作用
我们在读代码的时候,总是会看到代码开头会加上from future import *这样的语句。这样的做法的作用就是将新版本的特性引进当前版本中,也就是说我们可以在当前版本使用新版本的一些特性。则该特性将会被默认禁用。
可参考文章:https://blog.csdn.net/zzc15806/article/details/81133045
1.5 enumerate()
描述
enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。
语法
enumerate(sequence, [start=0])
参数
- sequence – 一个序列、迭代器或其他支持迭代对象。
- start --下标起始位置,序号的起始位置、而非数据的起始坐标。
例子
a = np.ones((3, 2, 2))
print(a)
for i, data in enumerate(a, start=2):
print(i)
data[0, 0] = 4
print(a)
"""
[[[1. 1.]
[1. 1.]]
[[1. 1.]
[1. 1.]]
[[1. 1.]
[1. 1.]]]
2
3
4
[[[4. 1.]
[1. 1.]]
[[4. 1.]
[1. 1.]]
[[4. 1.]
[1. 1.]]]
"""
其他
如上述例子中,改变for
循环中的data(因为for中的变量与原变量共用同一数据内存),则原数据也会随之改变。
1.6 argparse基本用法
描述
argparse 是python自带的命令行参数解析包,可以用来方便地读取命令行参数.
参考文章
二、numpy
1、ndarray与array的区别
1、numpy的核心是ndarray,然后,ndarray本质是数组。
2、np.array只是一个便捷的函数,用来创建一个ndarray,它本身不是一个类;你也能够用np.ndarray来创建,但这不是推荐的方式。
2、矩阵相乘
1、叉乘:矩阵中对应元素相乘,不相加;;符号:* 或 np.multiply(x, y)
2、点乘:矩阵相乘。符号: np.dot(x, y)
3、注意:当矩阵为mat而非array格式时,“*” 则变为矩阵相乘,但矩阵一般为array。
3、创建矩阵时出现data type not understood
问:如何使用Python产生一个数组,数组的长度为1024,数组的元素全为0?
答:使用zeros(1024) 即可实现!
问:如何产生一个2×1024的全0矩阵呢?是否是zeros(2,1024) ?
答:若是上述这种写法就会出现 TypeError: data type not understood 这种错误;
正确的写法是 zeros((2,1024)),python的二维数据表示要用二层括号来进行表示。同理,三维数据需要使用三层括号。
总结:使用np创建矩阵时,n维数组就要有n层括号。
Error:
1、TypeError: only size-1 arrays can be converted to Python scalars
解决办法:对于numpy的matrix还是调用numpy.的方法比较好,例如:1)int,最好使用np.int;2)寻找多维数组的最大值、最小值亦是如此,最好使用np.max、np.min
2、寻找最大值
三、matplotlib
3.1 设置x、y坐标轴等比例显示
# 有以下两种方法
# 第一种:
plt.gca().set_aspect('equal', adjustable='box')
# 第二种:
plt.axis('scaled')
3.2 绘制三维图
可参考:https://blog.csdn.net/u014636245/article/details/82799573