1.语法:[表达式 for 变量 in 序列或迭代对象]
Python列表推导式
一.为什么要学习列表推导式 ?
1.列表推导式可以说在Python程序开发时应用广泛。
2.列表推导式可以使用非常简洁的方式来快速生成满足特定需求的列表,且代码具有非常强的可读性。
3.Python的内部实现对列表推导式做了大量优化,可以保证很快的运行速度。
二.开始学习列表推导式了 快醒醒
1.语法:[表达式 for 变量 in 序列或迭代对象]
列表推导式在逻辑上相当于一个循环,但形式更加简洁
2.具体操作:
①简单举例
>>> list = [x*x for x in range(10)]
>>> print(list)
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> print(sum(list))
285
用循环实现其等价写法:
>>> vec = [[1,2,3],[4,5,6],[7,8,9]]
>>> list = [num for elem in vec for num in elem]
>>> print(list)
[1, 2, 3, 4, 5, 6, 7, 8, 9]
'''
在这个列表推导式中有两个循环,其中第一个循环为外循环,执行得慢;
第二个循环为内循环,执行得快。
'''
#用循环实现其等价写法:
vec = [[1,2,3],[4,5,6],[7,8,9]]
result= []
for elem in vec:
for num in elem:
result.append(num)
print(result)
③过滤不符合条件的元素
在列表推导式中可以使用if子句来进行筛选,只在结果列表中保留符合条件的元素。
>>> list = [1,2,3,45,6,7,7,8,90,22]
>>> list = [i for i in list if i >10]#if条件判断
>>> list
[45, 90, 22]
>>> list = [x*x if x%2 != 0 else x for x in[1,2,3,4,5]]#if-else条件判断
>>> list
[1, 2, 9, 4, 25]
#已知成绩列表查找最高分学生
scores = {'zhangsan':11,"lisi":22,"wanngwu":33}
highest = max(scores.values())
highestperson = [name for name,score in scores.items() if score == highest]
print(highestperson)
#使用列表推导式查找列表中最大元素的位置
>>> from random import randint
>>> x = [randint(1,10) for i in range(10)]#randint(1,10)是在1-10之间随机生成一个数,后面range(10)的作用是循环10次
>>> x
[2, 6, 5, 9, 7, 4, 8, 3, 1, 5]
>>> m = max(x)
>>> m
9
>>> index_l = [index for index,value in enumerate(x) if value == m]
>>> index_l
[3]
④使用多个循环实现多序列元素的任意组合
>>> l = [(x,y) for x in[1,2,3] for y in[3,2,4] if x != y]
>>> l
[(1, 3), (1, 2), (1, 4), (2, 3), (2, 4), (3, 2), (3, 4)]
'''
对于包含多个循环的列表推导式,一定要清楚多个循环的执行顺序或嵌套关系
'''
⑤使用列表推导式实现矩阵转置
>>> matrix = [[1,2,3],[4,5,6],[7,8,9]]
>>> re_matrix = [[row[i] for row in matrix]for i in range(3)]
>>> re_matrix
[[1, 4, 7], [2, 5, 8], [3, 6, 9]]
⑥列表推导式中可以使用函数或复杂表达式
def f(v):
if v%2 == 0:
v *= 2
else:
v += 1
return v
print([f(v) for v in [-1,0,1,2,3] if v > 0])
print([v*2 if v%2==0 else v+1 for v in [-1,0,1,2,3] if v > 0])
⑦列表推导式支持文件对象迭代
>>> fp = open("D:\各种文件\课程设计\郑州十四五规划.txt",'r',encoding = 'utf-8')
>>> print([line for line in fp])
#读取结果过长,省略
>>> fp.close()
应用1:使用列表推导式生成100以内的所有素数
要求:一行代码干掉它!
>>> import math
>>> l = [p for p in range(2,100) if 0 not in[p%d for d in range(2,int(math.sqrt(p))+1)]]
>>> l
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
我可没作弊啊,核心代码确实就一行(傲娇 )
应用2:实现矩阵转置
matrix = [[1, 2, 3, 4],[5, 6, 7, 8],[9, 10, 11, 12]]
print("原矩阵:",matrix)
print("转置矩阵为:",[[row[i] for row in matrix] for i in range(4)])
语法格式为:
表达式1 if 条件表达式 else 表达式2
当表达式返回True时,返回结果表达式1,否则返回结果表达式2。
三元表达式用于列表推导,过滤出列表中的偶数,如果是奇数则赋值None
>>> li = [1,2,3,4,5,6,7]
>>> [i if i%2 == 0 else None for i in li]
[None, 2, None, 4, None, 6, None]
# 注意:三元表达式用于列表推导,要写在for循环前面
Python也提供了断言,但是我们很少使用。因为断言是出于调试目的的一种手段,而python中可供调试的手段实际上非常多。而且python还内置了unittest模块来提供完成单元测试。例如:
a = 1
assert a,'error'
a += 1
print(a)
断言的作用是判断a是否为真,如果不为真,那么python就会引发异常。data项将称为异常构造函数的参数。当然,如果不捕获assert异常,那么将会导致程序中断。例如:
a = 0
assert a,'error'
a += 1
print(a)
直接执行,将会导致程序中断,抛出AssertionError异常。但是你可以使用下面的方式来使断言失效。
python3 -O 断言.py
这是因为断言是一种调试手段,实际上相当于:
a = 0
if __debug__:
if not a:
raise AssertionError('error')
a += 1
print(a)
介绍文件操作时,一直强调打开的文件最后一定要关闭,否则会程序的运行造成意想不到的隐患。但是,即便使用 close() 做好了关闭文件的操作,如果在打开文件或文件操作过程中抛出了异常,还是无法及时关闭文件。
为了更好地避免此类问题,不同的编程语言都引入了不同的机制。在 Python 中,对应的解决方式是使用 with as 语句操作上下文管理器(context manager),它能够帮助我们自动分配并且释放资源。
通常用来操作文件
with as 语句的基本语法格式为:
with 表达式 [as target]:
代码块
列子:
with open('a.txt', 'a') as f:
f.write("\nPython教程")
.异常的概念
异常相较于错误而言,是正常情况下出现的不正常现象,程序出现的Bug及错误都是补充正长的(错误不等于异常,异常不等价于错误)异常发生的后果导致程序崩溃
处理异常(容错):包容不正常的错误,使程序正常运行
处理方式:try: excepr: 语句块 :捕获异常
语法:
try:
#可能发生异常的代码
except:
处理异常
例如:
a = int(input("输入数字:"))
num = a + 10
print("{}+10={}".format(a,num))
当输入不是数字时会报错终止程序运行退出,所以我们采用捕获异常的方法来实现这种情况使程序在异常时仍旧征程运行
方式一:
try:
a = int(input("输入数字:")) #捕获异常
except:
a=int(input("必须输入数字:")) #处理异常
num = a + 10
print("{}+10={}".format(a,num))
方式二
try:
a = int(input("输入数字:"))
except Exception as e:
print("发生了异常",e)
a=int(input("必须输入数字:"))
num = a + 10
print("{}+10={}".format(a,num))
BaseException()所有异常的父类 Exception() (BaseException()的子类)是常见异常的父类
3.1 运用关键字:finally关键字代表必须要执行的代码(多用来当程序出现异常时 释放资源)
try:
a = int(input("输入数字:"))
except Exception as e:
print("发生了异常",e)
finally:
print("这条代码一定要执行!!")
num = a + 10
print("{}+10={}".format(a,num))
** 程序出现错误时,也一定会运行finally**
def demo(f):
try:
s = f +10
return 2
except Exception as e:
print("程序发生错误!",e)
return 1
finally:
print("释放资源")
return 0
if __name__ == '__main__':
a = demo(input(">>>>:"))
print(a)
3.2自定义定义异常需要创建类,之后继承Exception或者BaseException的异常类 抛出异常关键字:raise
class MineException(Exception):
def __init__(self,msg):
Exception.__init__(self,msg)
def User(username,password):
if username == None or username.stript() =="":
raise MineException("用户名不能为空!")
if password == None or password.stript() =="":
raise MineException("密码名不能为空!")
if __name__ == '__main__':
try:
User(None,None)
except Exception as e:
print("抛出异常---》",e)
方法 | 描述 |
---|---|
capitalize() | 把首字符转换为大写。 |
casefold() | 把字符串转换为小写。 |
center() | 返回居中的字符串。 |
count() | 返回指定值在字符串中出现的次数。 |
encode() | 返回字符串的编码版本。 |
endswith() | 如果字符串以指定值结尾,则返回 true。 |
expandtabs() | 设置字符串的 tab 尺寸。 |
find() | 在字符串中搜索指定的值并返回它被找到的位置。 |
format() | 格式化字符串中的指定值。 |
format_map() | 格式化字符串中的指定值。 |
index() | 在字符串中搜索指定的值并返回它被找到的位置。 |
isalnum() | 如果字符串中的所有字符都是字母数字,则返回 True。 |
isalpha() | 如果字符串中的所有字符都在字母表中,则返回 True。 |
isdecimal() | 如果字符串中的所有字符都是小数,则返回 True。 |
isdigit() | 如果字符串中的所有字符都是数字,则返回 True。 |
isidentifier() | 如果字符串是标识符,则返回 True。 |
islower() | 如果字符串中的所有字符都是小写,则返回 True。 |
isnumeric() | 如果字符串中的所有字符都是数,则返回 True。 |
isprintable() | 如果字符串中的所有字符都是可打印的,则返回 True。 |
isspace() | 如果字符串中的所有字符都是空白字符,则返回 True。 |
istitle() | 如果字符串遵循标题规则,则返回 True。 |
isupper() | 如果字符串中的所有字符都是大写,则返回 True。 |
join() | 把可迭代对象的元素连接到字符串的末尾。 |
ljust() | 返回字符串的左对齐版本。 |
lower() | 把字符串转换为小写。 |
lstrip() | 返回字符串的左修剪版本。 |
maketrans() | 返回在转换中使用的转换表。 |
partition() | 返回元组,其中的字符串被分为三部分。 |
replace() | 返回字符串,其中指定的值被替换为指定的值。 |
rfind() | 在字符串中搜索指定的值,并返回它被找到的最后位置。 |
rindex() | 在字符串中搜索指定的值,并返回它被找到的最后位置。 |
rjust() | 返回字符串的右对齐版本。 |
rpartition() | 返回元组,其中字符串分为三部分。 |
rsplit() | 在指定的分隔符处拆分字符串,并返回列表。 |
rstrip() | 返回字符串的右边修剪版本。 |
split() | 在指定的分隔符处拆分字符串,并返回列表。 |
splitlines() | 在换行符处拆分字符串并返回列表。 |
startswith() | 如果以指定值开头的字符串,则返回 true。 |
strip() | 返回字符串的剪裁版本。 |
swapcase() | 切换大小写,小写成为大写,反之亦然。 |
title() | 把每个单词的首字符转换为大写。 |
translate() | 返回被转换的字符串。 |
upper() | 把字符串转换为大写。 |
zfill() | 在字符串的开头填充指定数量的 0 值。 |
在Python中操作文件需要记住1个函数和3个方法
序号 | 函数/方法 | 说明 |
---|---|---|
1 | open | 打开文件,并返回文件操作对象 |
2 | read | 将文件内容读取到内存 |
3 | write | 将指定内容写入到文件 |
4 | close | 关闭文件 |
open() 函数负责打开文件,并返回文件对象
read/write/close三个方法都需要通过文件对象来调用
open函数的第一个参数,是被打开的文件名(文件名区分大小写)
如果文件存在,返回文件操作对象
如果文件不存在,会抛出异常
read方法 可以一次性读入并返回 文件的所有内容
close方法 负责关闭文件
如果忘记关闭文件,会造成系统资源消耗,而且会影响到后续对文件的访问
注意:方法执行后,会把文件指针移动到文件的末尾
提示:
在开发中,通常先编写打开和关闭的代码,在编写中间针对文件读/写操作!
#获得文件操作对象(sis.txt文件)
file = open("sis.txt")
#读取
text = file.read()
print(text)
#关闭文件
file.close()
'''
运行结果
我是中文的哦
nidie中文
'''
文件指针文件指针
文件指针 标记 从那个位置开始读取数据
第一次打开文件时,通常文件指针会指向文件开始的位置
当执行了read方法后,文件指针会移动到读取内容的末尾
默认情况下会移动到文件末尾
思考:如果执行了一次read方法,读取了所有内容,那么再次调用read方法还能获取到内容吗?
答案:不能。第一次读取内容后,文件指针移动到文件末尾,再次调用不会读取到任何内容
#获得文件操作对象(sis.txt文件)
file = open("sis.txt")
#读取
text = file.read()
#查看读取文件的长度 (14)
print(len(text))
#输出读取到的文件
print(text)
print("*"*30)
#重新读取文件
text = file.read()
print(text) # 空
print(len(text)) # (0)
#关闭文件
file.close()
"""
运行结果:
14
我是中文的哦
nidie中文
******************************
0
"""
语法如下:
f = open( " 文件名 " , " 访问方式 " )
提示:频繁的移动指针,会影响文件读写效率,开发中更多的时候会以 只读、只写 的方式来操作文件
read方法默认会把文件的所有内容一次性读到内存
如果文件太大,对内存的占用会非常严重
readline 方法:
可以一次读取一行内容
方法执行后,会把指针移动到下一行,准备再次读取
读取大文件的正确姿势:
#打开文件
file = open("sis.txt")
while True:
#读取一行内容
text = file.readline()
#判断是否读取到内容
if text == "": #或者 if not text:
print(type(text)) #
break
#每读取到末尾都会有一个 \n
print(text,end="")
"""
运行结果:
python1一
python2二
python3三
python4四
"""
#复制小文件方式1
file_read = open("sis.txt","r")
file_write = open("test.txt","w")
text_1 = file_read.read()
text_2 = file_write.write(text_1)
file_write.close()
file_read.close()
#复制小文件方式2 推荐(with关键字,会自动释放文件对象空间)
test = None
with open("sis.txt","r") as file:
test = file.read()
with open("test1.txt","w") as file:
file.write(test)
#大文件复制
file_read = open("五笔词根1.jpg","rb")
file_write = open("五笔词根2.jpg","wb")
while True:
text = file_read.readline()
#python中,除了‘'、""、0、()、[]、{}、None为False, 其他转换都为True。 也就是说字符串如果不为空,则永远转换为True。
if not text:
break
file_write.write(text)
file_read.close()
file_write.close()
创建、重命名、删除、改变路劲、查看目录内容…
文件操作:
目录操作:
eval函数功能非常强大——将字符串当成有效的表达式来求值,并返回计算结果
# -*- coding: gbk -*-
#基本的数学计算
print(eval("1+1"))
#字符串重复
print(eval("'*'*30"))
#将字符串转变成列表
print(type(eval("[1,2,3,4,5]")))
#将字符串转变成元组
print(type(eval("(1,2,3,4,5)")))
#将字符串转变成字典
print(type(eval("{'name':'苹果','age':18}")))
案例——计算器
input_str = input("输入算数题")
print(eval(input_str))
'''
运行:
输入算数题1+1
2
'''
注意:在开发的时候千万不要使用 eval 直接转换 input 的结果
string: | 通用字符串操作 |
---|---|
re | 正则表达式操作 |
difflib | 差异计算工具 |
textwrap | 文本填充 |
unicodedata | Unicode字符数据库 |
stringprep | 互联网字符串准备工具 |
readline | GNU按行读取接口 |
rlcompleter | GNU按行读取的实现函数 |
struct | 将字节解析为打包的二进制数据 |
codecs | 注册表与基类的编解码器 |
datetime: | 基于日期与时间工具 |
---|---|
calendar: | 通用月份函数 |
collections: | 容器数据类型 |
collections.abc: | 容器虚基类 |
heapq: | 堆队列算法 |
bisect: | 数组二分算法 |
array: | 高效数值数组 |
weakref: | 弱引用 |
types: | 内置类型的动态创建与命名 |
copy: | 浅拷贝与深拷贝 |
pprint: | 格式化输出 |
reprlib: | 交替repr()的实现 |
numbers: | 数值的虚基类 |
---|---|
math | 数学函数 |
cmath | 复数的数学函数 |
decimal | 定点数与浮点数计算 |
fractions | 有理数 |
random | 生成伪随机数 |
函数式编程
itertools: | 为高效循环生成迭代器 |
---|---|
functools: | 可调用对象上的高阶函数与操作 |
operator: | 针对函数的标准操作 |
os.path | 通用路径名控制 |
---|---|
fileinput | 从多输入流中遍历行 |
stat | 解释stat()的结果 |
filecmp | 文件与目录的比较函数 |
tempfile | 生成临时文件与目录 |
glob | Unix风格路径名格式的扩展 |
fnmatch | Unix风格路径名格式的比对 |
linecache | 文本行的随机存储 |
shutil | 高级文件操作 |
macpath | MacOS 9路径控制函数 |
pickle | Python对象序列化 |
---|---|
copyreg | 注册机对pickle的支持函数 |
shelve | Python对象持久化 |
marshal | 内部Python对象序列化 |
dbm | Unix“数据库”接口 |
sqlite3 | 针对SQLite数据库的API2.0 |
zlib | 兼容gzip的压缩 |
---|---|
gzip | 对gzip文件的支持 |
bz2 | 对bzip2压缩的支持 |
lzma | 使用LZMA算法的压缩 |
zipfile | 操作ZIP存档 |
tarfile | 读写tar存档文件 |
hashlib | 安全散列与消息摘要 |
---|---|
hmac | 针对消息认证的键散列 |
os | 多方面的操作系统接口 |
---|---|
io | 流核心工具 |
time | 时间的查询与转化 |
argparser | 命令行选项、参数和子命令的解析器 |
optparser | 命令行选项解析器 |
getopt | C风格的命令行选项解析器 |
logging | Python日志工具 |
logging.config | 日志配置 |
logging.handlers | 日志处理器 |
getpass | 简易密码输入 |
curses | 字符显示的终端处理 |
curses.textpad | curses程序的文本输入域 |
curses.ascii | ASCII字符集工具 |
curses.panel | curses的控件栈扩展 |
platform | 访问底层平台认证数据 |
errno | 标准错误记号 |
ctypes | Python外部函数库 |
threading | :基于线程的并行 |
---|---|
multiprocessing | 基于进程的并行 |
concurrent | 并发包 |
concurrent.futures | 启动并行任务 |
subprocess | 子进程管理 |
sched | 事件调度 |
queue | 同步队列 |
select | 等待I / O完成 |
dummy_threading | threading模块的替代(当_thread不可用时) |
_thread | 底层的线程API(threading基于其上) |
_dummy_thread: | thread模块的替代(当_thread不可用时) |
socket: | 底层网络接口 |
---|---|
ssl | socket对象的TLS / SSL填充器 |
asyncore | 异步套接字处理器 |
asynchat | 异步套接字命令 / 响应处理器 |
signal | 异步事务信号处理器 |
mmap | 内存映射文件支持 |
邮件与MIME处理包 | |
---|---|
json | JSON编码与解码 |
mailcap | mailcap文件处理 |
mailbox | 多种格式控制邮箱 |
mimetypes | 文件名与MIME类型映射 |
base64 | RFC3548:Base16、Base32、Base64编码 |
binhex | binhex4文件编码与解码 |
binascii | 二进制码与ASCII码间的转化 |
quopri | MIMEquoted - printable数据的编码与解码 |
uu | uuencode文件的编码与解码 |
1. 常用的编码
ASCII:只能表示一些字母,数字和特殊的字符,占一个字节
GBK:国家简体中文字符集和繁体字符集,兼容ASCII,占两个字节
Unicode:能够表示全世界上所有的字符,Unicode有人说占4个字节也有人说占2个字节,但中文占2个字节
UTF-8:Unicode的压缩版,占1~3个字节,其中中文占三个字节
2.编码和解码
2.1.编码操作
可以通过encode进行编码,其中语法如下:
对字符串进行ASCII编码(只能转换数字,英文字母和一些符号)
# 方式1: 通过bytes方法 bytes(“a”, “ASCII”) # 方式2: 通过encode方法进行 “a”.encode(“ASCII”)
将字符串转换成gbk编码格式
# 方式1: 通过encode方法进行 print(“你好”.encode(“GBK”)) # 编码之后的结果为:b"xc4xe3xbaxc3" # 方式2: 通过bytes类型 print(bytes(“我爱你”, “GBK”)) # 编码之后的结果为:b"xcexd2xb0xaexc4xe3"
将字符串转换成Unicode编码格式
# 方式1: 通过encode方法进行 print(“你好”.encode(“unicode_escape”)) # 编码之后的结果为:b"\u4f60\u597d" # 方式2: 通过bytes类型 print(bytes(“我爱你”, “unicode_escape”)) # 编码之后的结果为:b"\u6211\u7231\u4f60"
将字符串转换成UTF-8编码格式
# 方式1: 通过encode方法进行 print(“你好”.encode(“utf-8”)) # 编码之后的结果为:b"xe4xbdxa0xe5xa5xbd" # 方式2: 通过bytes类型 print(bytes(“我爱你”, “utf-8”)) # 编码之后的结果为:b"xe6x88x91xe7x88xb1xe4xbdxa0"
2.解码操作
将GBK编码格式转换成字符串
# 通过decode方法解码 print(b"xc4xe3xbaxc3xcexd2xb0xaexc4xe3".decode(“GBK”)) # 解码之后结果为:你好我爱你
将UTF-8编码格式转换成字符串
# 通过decode方法解码 print(b"xe4xbdxa0xe5xa5xbdxe6x88x91xe7x88xb1xe4xbdxa0".decode(“utf-8”)) # 解码之后结果为:你好我爱你
将Uniconde编码格式转换成字符串
# 通过decode方法解码 print(b"\u4f60\u597d\u6211\u7231\u4f60".decode(“GBK”)) # 解码之后结果为:你好我爱你
安装和更新 setuptools
的最简单方法是使用 pip
:
`$ sudo python -m pip install --upgrade setuptools`
示例库
创建了一个简单的 Python 库,名为 myhellolib
,来作为需要打包的示例代码。这个库接受一个字符串,然后用大写字母打印出这个字符串。
它只有两行代码,但项目结构很重要,所以首先创建目录树:
$ mkdir -p myhellolib.git/myhellolib
为了确认这个项目是一个可导入的库(即 Python “模块”),在代码目录中创建一个空文件 __init__.py
,同时创建一个包含代码的文件:
1. `$ touch myhellolib.git/myhellolib/__init__.py`
2. `$ touch myhellolib.git/myhellolib/myhellolib.py`
在 myhellolib.py
文件中,输入简单的 Python 代码:
1. `def greeter(s):`
2. `print(s.upper())`
这就是写好的库。
在打包之前,测试一下你的库。创建一个 myhellolib.git/test.py
文件并输入以下代码:
1. `import myhellolib.myhellolib as hello`
2. `hello.greeter("Hello Opensource.com.")`
运行该脚本:
1. `$ cd myhellolib.git`
2. `$ python ./test.py`
3. `HELLO OPENSOURCE.COM`
它可以工作,所以现在你可以把它打包了。
要用 setuptools
打包一个项目,你必须创建一个 .toml
文件,将 setuptools
作为构建系统。将这段文字放在项目目录下的 myhellolib.toml
文件中。
[build-system]
requires = ["setuptools", "wheel"]
build-backend = "setuptools.build_meta"
接下来,创建一个名为 setup.py
的文件,包含项目的元数据:
`
1. from setuptools import setup`
2.
3. `setup(`
4. `name='myhellolib',`
5. `version='0.0.1',`
6. `packages=['myhellolib'],`
7. `install_requires=[`
8. `'requests',`
9. `'importlib; python_version == "3.8"',`
10. `],`
11. `)
`
不管你信不信,这就是 setuptools
需要的所有设置。你的项目已经可以进行打包。
要创建你的 Python 包,你需要一个构建器。一个常见的工具是 build
,你可以用 pip
安装它:
1. `$ python -m pip install build --user`
构建你的项目:
$ python -m build
过了一会儿,构建完成了,在你的项目文件夹中出现了一个新的目录,叫做 dist
。这个文件夹包含一个 .tar.gz
和一个 .whl
文件。
这是你的第一个 Python 包! 下面是包的内容:
1. `$ tar --list --file dist/myhellolib-0.0.1.tar.gz`
2. `myhellolib-0.0.1/`
3. `myhellolib-0.0.1/PKG-INFO`
4. `myhellolib-0.0.1/myhellolib/`
5. `myhellolib-0.0.1/myhellolib/__init__.py`
6. `myhellolib-0.0.1/myhellolib/myhellolib.py`
7. `myhellolib-0.0.1/myhellolib.egg-info/`
8. `myhellolib-0.0.1/myhellolib.egg-info/PKG-INFO`
9. `myhellolib-0.0.1/myhellolib.egg-info/SOURCES.txt`
10. `myhellolib-0.0.1/myhellolib.egg-info/dependency_links.txt`
11. `myhellolib-0.0.1/myhellolib.egg-info/requires.txt`
12. `myhellolib-0.0.1/myhellolib.egg-info/top_level.txt`
13. `myhellolib-0.0.1/setup.cfg`
14. `myhellolib-0.0.1/setup.py`
15.
16. `$ unzip -l dist/myhellolib-0.0.1-py3-none-any.whl `
17. `Archive: dist/myhellolib-0.0.1-py3-none-any.whl`
18. `Name`
19. `----`
20. `myhellolib/__init__.py`
21. `myhellolib/myhellolib.py`
22. `myhellolib-0.0.1.dist-info/METADATA`
23. `myhellolib-0.0.1.dist-info/WHEEL`
24. `myhellolib-0.0.1.dist-info/top_level.txt`
25. `myhellolib-0.0.1.dist-info/RECORD`
26. `-------`
27. `6 files`
现在你知道了打包你的 Python 包是多么容易,你可以使用 Git 钩子、GitLab Web 钩子、Jenkins 或类似的自动化工具来自动完成这个过程。你甚至可以把你的项目上传到 PyPi,这个流行的 Python 模块仓库。一旦它在 PyPi 上,用户就可以用 pip
来安装它,就像你在这篇文章中安装 setuptools
和 build
一样!
笔记:http://t.csdn.cn/qWPgX
视频:https://www.bilibili.com/video/BV1vK4y1o7jH/?spm_id_from=333.337.search-card.all.click&vd_source=d233ea2956e3148d2a7a51445fb08598
我的django+HTML+MySQL项目:https://gitee.com/double0605/django.git
步骤笔记:http://t.csdn.cn/LbTp2
pyqt的安装使用:见csdn链接:https://blog.csdn.net/wenshuang1234/article/details/126861112?spm=1001.2014.3001.5501
1.微信小程序制作
什么是微信小程序?
在手机微信自己的平台就可以运行的程序,不需要再下载新的软件,存现在与本身应用里的小应用,类似于微信,qq都有小程序
为什么要做小程序?
微信用户基数大。
在微信上用我们小程序会比较便捷。
如何开发小程序?
利用微信开发者工具,加上django框架和drf框架来完成
掌握的技能
小程序:学习微信开发的语言(前端html、css、js、vue.js)
微信开发者工具
pycharm
API:restful接口(Python+django+drf框架)。
2.环境的搭建
2.1 Python环境
虚拟环境
django
drf
pycharm
2.2 小程序环境
2.2.1 申请一个微信公众平台
2.2.2 保存自己的appid
appid = wxda080f8685b53eed
2.2.3 下载开发者工具
2.2.4 创建项目
3.开发小程序
3.1 全局配置
页
3.2配置介绍
app.js: 小程序初始化js;
app.json: 小程序配置文件,如:导航,窗口,各页面引入;
app.wxss: 小程序公共样式;
各个页面:
Pages:各个子页面以js+json+wxml+wxss组成,方便管理,右边可快捷生成page;
小程序遵循MVC结构(Model View Controller),js为页面逻辑(C&M),wxss为页面样式,修饰wxml的DOM元素,wxml为页面机构(V),json为页面配置(具体API可见微信官方文档,可以修改此页面标题等,也充当了部分M);
3.3 组件
3.2.1 text:编写文本信息,类似于span标签
3.2.2 view:容器,类似于div标签
3.2.3 image:图片
{
“pages”: [
"pages/index/index",
"pages/home/home"
],
//相当于导航栏,视图文件必须在这里面有配置
“window”: {
"navigationBarBackgroundColor": "#FFDAB9",
"navigationBarTextStyle": "black",
"navigationBarTitleText": "李业"
},
//小程序最上面的window窗口,固定的属性
“tabBar”: {
"selectedColor":"#CD5C5C",
"list": [
{
"pagePath": "pages/index/index",
"text": "首页",
"iconPath": "static/tabbar/ic_menu_choice_nor.png",
"selectedIconPath": "static/tabbar/ic_menu_choice_pressed.png"
},
{
"pagePath": "pages/home/home",
"text": "我的",
"iconPath": "static/tabbar/ic_menu_me_nor.png",
"selectedIconPath": "static/tabbar/ic_menu_me_pressed.png"
}
]
}
}
//小程序最下面的导航页,最多可以分成9
4.flex布局
一种非常方便的布局方式。
在容器中记住4个样式即可。
display: flex; flex布局
flex-direction: row; 规定主轴的方向:row/column
justify-content: space-around; 元素在主轴方向上的排列方式:flex-start/flex-end/space-around/space-between
align-items: center; 元素在副轴方向上的排列方式:flex-start/flex-end/space-around/space-between
5. 跳转
5.1 对标签绑定点击事件
点我跳转
//绑定事件名称clisck数据由data-nid,data-name传递参数
Page({
…
/**
var nid = e.currentTarget.dataset.nid;
console.log(nid);
}
})
5.2 页面跳转
wx.navigateTo({
url: '/pages/redirect/redirect?id='+nid
})
跳转到的页面如果想要接受参数,可以在onLoad方法中接受。
redirect.js
Page({
/**
console.log(options);
}
})
5.3 通过标签跳转
跳转到新页面
6.数据绑定
vue.js ```
6.1 基本显示
wxml
数据1:{{message}}
展示数据
// pages/bind/bind.js
Page({
/**
message:"沙雕李业",
}
)}
6.2 数据更新
wxml
数据2:{{message}}
点击修改数据
修改数据
Page({
data: {
message:"沙雕李业",
},
changeData:function(){
// 修改数据
this.setData({ message: "大沙雕李业"});
}
})
7.获取用户信息
方式一
wxml
获取当前用户名
js
getUserName:function(){
// 调用微信提供的接口获取用户信息
wx.getUserInfo({
success: function (res) {
// 调用成功后触发
console.log('success',res)
},
fail:function(res){
// 调用失败后触发
console.log('fail', res)
}
})
},
方式二
wxml
授权登录
js
xxxx:function(){
wx.getUserInfo({
success: function (res) {
// 调用成功后触发
console.log('success', res)
},
fail: function (res) {
// 调用失败后触发
console.log('fail', res)
}
})
}
示例
wxml
当前用户名:{{name}}
当前头像:
获取信息button
js
// pages/login/login.js
Page({
/**
name:"",
path: "/static/default.png"
},
fetchInfo:function(){
var that = this;
wx.getUserInfo({
success:function(res){
console.log(res);
that.setData({
name:res.userInfo.nickName,
path:res.userInfo.avatarUrl
})
}
})
},
/**
注意事项:
想要获取用户信息,必须经过用户授权(button)。
已授权
不授权,通过调用wx.openSetting
// 打开配置,手动授权。
// wx.openSetting({})
8.获取用户位置信息
wxml
{{localPath}}
小程序获取位置信息需要在app.json中配置permission属性
js
data: {
localPath:"请选择位置",
},
getLocalPath:function(){
var that = this;//因为this指代的是该父级函数的内容,但是自行创建的没有这个说法,就使用that传递一下
wx.chooseLocation({
success: function(res) {
that.setData({localPath:res.address});
},
})
},
8.获取图片
wxml
请上传图片
js
data: {
imageList: ["/static/hg.jpg", "/static/hg.jpg"]
},
uploadImage:function(){
var that = this;
wx.chooseImage({
count:9,
sizeType: ['original', 'compressed'],
sourceType: ['album', 'camera'],
success:function(res){
// 设置imageList,页面上图片自动修改。
// that.setData({
// imageList: res.tempFilePaths
// });
// 默认图片 + 选择的图片;
that.setData({
imageList: that.data.imageList.concat(res.tempFilePaths)//concat将两个列表相加得到一个新的列表
});
}
});
},
总结
标签(组件)
text
view
image
navigator,跳转到其他页面(默认只能跳转到非tabbar页面)
button,按钮(特殊:建议获取用户信息时)
事件
bindtap
func:function(e){
e.currentTarget.dataset
}
api
navigateTo
wx.navigateTo({
url: '/pages/redirect/redirect?id='+nid,
})
openSetting
wx.openSetting({})
getUserInfo
wx.getUserInfo({
success:function(res){
console.log(res);
}
})
注意:结合button按钮实现
chooseLocation
wx.chooseLocation({
success: function(res) {
},
})
chooseImage
wx.chooseImage({
count:9,
sizeType: ['original', 'compressed'],
sourceType: ['album', 'camera'],
success:function(res){
}
});
数据绑定
for指令:
wxml
商品列表
{{index}} - {{item}}
{{idx}} - {{x}}
{{userInfo.name}}
{{userInfo.age}}
{{index}} - {{item}}
js
data: {
dataList:["白浩为","海狗","常鑫"],
userInfo:{
name:"alex",
age:18
}
},
注意:setData + that
//绑定函数
bindTxt:function (e)
{
this.setData({massage:e.detail.value});
},
bindphone:function (e)
{
this.setData({phonege:e.detail.value});
},
bindcode:function (e)
{
this.setData({code:e.detail.value});
},
————————————————
版权声明:本文为CSDN博主「我叫Double」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/wenshuang1234/article/details/124924530
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| django |
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
mysql> show tables;
+------------------+
| Tables_in_django |
+------------------+
| class |
| student |
| teacher |
| teacher2class |
+------------------+
mysql> describe class;
+-------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+----------------+
| id | int | NO | PRI | NULL | auto_increment |
| title | varchar(255) | YES | | NULL | |
+-------+--------------+------+-----+---------+----------------+
mysql> desc class;
+-------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+----------------+
| id | int | NO | PRI | NULL | auto_increment |
| title | varchar(255) | YES | | NULL | |
+-------+--------------+------+-----+---------+----------------+
DDL:
数据定义语言,用于创建数据对象,如库,表,索引
DML:
数据操作语言,用于表中的数据进行管理
DQL:
数据查询语言,用于数据表中查找符合条件的数据记录
DCL:
数据控制语言,用于设置或者数据库用户或者角色权限
mysql> create database newdata;
Query OK, 1 row affected (0.03 sec)
mysql> **show databases;**
+--------------------+
| Database |
+--------------------+
| django |
| information_schema |
| mysql |
| newdata |
| performance_schema |
| sys |
+--------------------+
mysql> create table banji (id int not null ,name char(10),age int(3),sex char(10) );
Query OK, 0 rows affected, 1 warning (0.05 sec)
mysql> desc banji;
+-------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| id | int | NO | | NULL | |
| name | char(10) | YES | | NULL | |
| age | int | YES | | NULL | |
| sex | char(10) | YES | | NULL | |
+-------+----------+------+-----+---------+-------+
mysql> show tables;
+-------------------+
| Tables_in_newdata |
+-------------------+
| banji |
+-------------------+
mysql> create database aaaa;
Query OK, 1 row affected (0.01 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| aaaa |
| django |
| information_schema |
| mysql |
| newdata |
| performance_schema |
| sys |
+--------------------+
mysql> drop database aaaa;
Query OK, 0 rows affected (0.03 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| django |
| information_schema |
| mysql |
| newdata |
| performance_schema |
| sys |
+--------------------+
mysql> drop table banji;
Query OK, 0 rows affected (0.03 sec)
mysql> create table banji (id int not null ,name char(10),age int(3),sex char(10) );
Query OK, 0 rows affected, 1 warning (0.02 sec)
mysql> show tables;
+-------------------+
| Tables_in_newdata |
+-------------------+
| banji |
+-------------------+
1 row in set (0.00 sec)
mysql> select * from banji;
Empty set (0.01 sec)
mysql> insert into banji (id,name,age,sex) values(1,'liuwei',24,'nan');
Query OK, 1 row affected (0.01 sec)
mysql> select * from banji;
+----+--------+------+------+
| id | name | age | sex |
+----+--------+------+------+
| 1 | liuwei | 24 | nan |
+----+--------+------+------+
mysql> select name,sex from banji where id=1;
+--------+------+
| name | sex |
+--------+------+
| liuwei | nan |
+--------+------+
mysql> select * from banji\G;
*************************** 1. row ***************************
id: 1
name: liuwei
age: 24
sex: nan
*************************** 2. row ***************************
id: 2
name: xiaohua
age: 14
sex: mv
mysql> select * from banji limit 2;
+----+---------+------+------+
| id | name | age | sex |
+----+---------+------+------+
| 1 | liuwei | 24 | nan |
| 2 | xiaohua | 14 | mv |
+----+---------+------+------+
mysql> select * from banji limit 1,1;
+----+---------+------+------+
| id | name | age | sex |
+----+---------+------+------+
| 2 | xiaohua | 14 | mv |
+----+---------+------+------+
mysql> update banji set sex='nv'where id=2;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from banji;
+----+---------+------+------+
| id | name | age | sex |
+----+---------+------+------+
| 1 | liuwei | 24 | nan |
| 2 | xiaohua | 14 | nv |
+----+---------+------+------+
delete from banji;
mysql> alter table banji rename banji2;
Query OK, 0 rows affected (0.03 sec)
mysql> **show tables;**
+-------------------+
| Tables_in_newdata |
+-------------------+
| banji2 |
+-------------------+
mysql> desc banji2;
+-------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| id | int | NO | | NULL | |
| name | char(10) | YES | | NULL | |
| age | int | YES | | NULL | |
| sex | char(10) | YES | | NULL | |
+-------+----------+------+-----+---------+-------+
mysql> alter table banji2 add address varchar(50) default '地址不详';
Query OK, 0 rows affected (0.03 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc banji2;
+---------+-------------+------+-----+--------------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+--------------+-------+
| id | int | NO | | NULL | |
| name | char(10) | YES | | NULL | |
| age | int | YES | | NULL | |
| sex | char(10) | YES | | NULL | |
| address | varchar(50) | YES | | 地址不详 | |
+---------+-------------+------+-----+--------------+-------+
mysql> select * from banji2;
+----+---------+------+------+--------------+
| id | name | age | sex | address |
+----+---------+------+------+--------------+
| 1 | liuwei | 24 | nan | 地址不详 |
| 2 | xiaohua | 14 | nv | 地址不详 |
+----+---------+------+------+--------------+
mysql> desc banji2;
+---------+-------------+------+-----+--------------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+--------------+-------+
| id | int | NO | | NULL | |
| name | char(10) | YES | | NULL | |
| age | int | YES | | NULL | |
| sex | char(10) | YES | | NULL | |
| address | varchar(50) | YES | | 地址不详 | |
+---------+-------------+------+-----+--------------+-------+
mysql> alter table banji2 change address myaddress char(50);
Records: 2 Duplicates: 0 Warnings: 0
mysql> desc banji2;
+-----------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+----------+------+-----+---------+-------+
| id | int | NO | | NULL | |
| name | char(10) | YES | | NULL | |
| age | int | YES | | NULL | |
| sex | char(10) | YES | | NULL | |
| myaddress | char(50) | YES | | NULL | |
+-----------+----------+------+-----+---------+-------+
mysql> desc banji2;
+-----------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+----------+------+-----+---------+-------+
| id | int | NO | | NULL | |
| name | char(10) | YES | | NULL | |
| age | int | YES | | NULL | |
| sex | char(10) | YES | | NULL | |
| myaddress | char(50) | YES | | NULL | |
+-----------+----------+------+-----+---------+-------+
mysql> alter table banji2 change id tid int(5) unique key;
Query OK, 0 rows affected, 1 warning (0.85 sec)
Records: 0 Duplicates: 0 Warnings: 1
mysql> desc banji2;
+-----------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+----------+------+-----+---------+-------+
| tid | int | YES | UNI | NULL | |
| name | char(10) | YES | | NULL | |
| age | int | YES | | NULL | |
| sex | char(10) | YES | | NULL | |
| myaddress | char(50) | YES | | NULL | |
+-----------+----------+------+-----+---------+-------+
mysql> desc banji2;
+-----------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+----------+------+-----+---------+-------+
| tid | int | YES | UNI | NULL | |
| name | char(10) | YES | | NULL | |
| age | int | YES | | NULL | |
| sex | char(10) | YES | | NULL | |
| myaddress | char(50) | YES | | NULL | |
+-----------+----------+------+-----+---------+-------+
mysql> alter table banji2 drop myaddress;
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc banji2;
+-------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| tid | int | YES | UNI | NULL | |
| name | char(10) | YES | | NULL | |
| age | int | YES | | NULL | |
| sex | char(10) | YES | | NULL | |
+-------+----------+------+-----+---------+-------+
GROUP BY 语句根据一个或多个列对结果集进行分组。
在分组的列上我们可以使用 COUNT, SUM, AVG,等函数。
语法:
SELECT column_name, function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name;
mysql> SELECT * FROM employee_tbl;
+----+--------+---------------------+--------+
| id | name | date | signin |
+----+--------+---------------------+--------+
| 1 | 小明 | 2016-04-22 15:25:33 | 1 |
| 2 | 小王 | 2016-04-20 15:25:47 | 3 |
| 3 | 小丽 | 2016-04-19 15:26:02 | 2 |
| 4 | 小王 | 2016-04-07 15:26:14 | 4 |
| 5 | 小明 | 2016-04-11 15:26:40 | 4 |
| 6 | 小明 | 2016-04-04 15:26:54 | 2 |
+----+--------+---------------------+--------+
mysql> SELECT name, COUNT(*) FROM employee_tbl GROUP BY name;
+--------+----------+
| name | COUNT(*) |
+--------+----------+
| 小明 | 3 |
| 小王 | 2 |
| 小丽 | 1 |
+--------+----------+
3 rows in set (0.01 sec)
mysql> SELECT name, SUM(signin) as signin_count FROM employee_tbl GROUP BY name WITH ROLLUP;
+--------+--------------+
| name | signin_count |
+--------+--------------+
| 小丽 | 2 |
| 小明 | 7 |
| 小王 | 7 |
| NULL | 16 |
+--------+--------------+
4 rows in set (0.00 sec)
mysql> select * from bb;
+------+-------+------+
| id | tname | sin |
+------+-------+------+
| 1 | zhao | 5 |
| 2 | qian | 2 |
| 3 | sun | 3 |
+------+-------+------+
3 rows in set (0.00 sec)
mysql> select * from aa;
+------+----------+------+
| id | name | age |
+------+----------+------+
| 1 | xiaohua | 18 |
| 2 | xioaming | 19 |
| 3 | xiaoliu | 20 |
| 4 | dongdong | 21 |
| 5 | xixi | 22 |
| 6 | qq | 20 |
+------+----------+------+
mysql> select a.id ,a.name,b.sin from aa a inner join bb b on a.id = b.sin;
+------+----------+------+
| id | name | sin |
+------+----------+------+
| 2 | xioaming | 2 |
| 3 | xiaoliu | 3 |
| 5 | xixi | 5 |
+------+----------+------+
mysql> select a.id ,a.name,b.sin from aa a left join bb b on a.id = b.sin;
+------+----------+------+
| id | name | sin |
+------+----------+------+
| 1 | xiaohua | NULL |
| 2 | xioaming | 2 |
| 3 | xiaoliu | 3 |
| 4 | dongdong | NULL |
| 5 | xixi | 5 |
| 6 | qq | NULL |
+------+----------+------+
mysql> select a.id ,a.name,b.sin from aa a right join bb b on a.id = b.sin;
+------+----------+------+
| id | name | sin |
+------+----------+------+
| 5 | xixi | 5 |
| 2 | xioaming | 2 |
| 3 | xiaoliu | 3 |
+------+----------+------+
str:字符串类型 - 接口缓存
list:列表 - 分布式
hash:哈希(相当于Python中的字典) - 缓存
set:集合 - 去重
zset:有序的 - 排行榜
keys* 查看当前库所有key(匹配:keys*1)
exists key 判断某个key是否存在
type key 查看你的key是什么类型
del key 删除指定的key数据
unlink key 根据value选择非阻塞删除
仅将 keys 从 keyspace元数据中删除,真正的删除会在后续异步操作
expire key 10 10秒钟:为给定的key设置过期时间
ttl key 查看还有多少秒过期,-1表示永不过期,-2表示已经过期
select 命令切换数据库
dbsize 查看当前数据库的key数量
flushdb 清空当前库
flushall 通杀全部库
二、常用的五大数据类型
添加 set key value
查看 get key
append key value 将给定的value追加到原值的末尾
strlen key 获得值的长度
setnx key value 只有在key不存在时 设置key的值
incr key 将key中存储的数字值增1,只能对数字值操作,如果为空,新增值为1
decr key 将key中存储的数字值减1
incrby / decrby key 步长 将key中存储的数字值增减。自定义步长(redis中incr是原子性操作,单线程的)
mset key1 value1 key2 value2 同时设置一个或多个 key-value对
mget key1 key2 key3 同时获取一个或多个value
msetnx key1 value1 key2 value2 当且仅当所有key不存在 (原子性:又一个失败都失败)
getrange key 起始位置 结束位置 全闭
lpush/rpush key value1 value2 vaule3 从左边/右边插入一个或多个值
lpop/rpop key 从左边/右边吐出一个值。值在健在,值光键亡
rpoplpush key1 key2 从key1列表右边吐出一个值,插到key2列表左边
lrange key start stop
sadd key value1 value2… 将一个或多个member元素加入到集合key中,已经存在的member元素将被忽略
smembers key 取出该集合的所有值
sismember key value 判断集合key是否含有该value值,有1,没有0
scard key 返回该集合的元素个数
srem key value1 value2 删除集合中的某个元素
spop key 随机从该集合中吐出一个值
srandmember key n 随机从该集合取出n个值。不会从集合中删除
smove source destination value 把集合中一个值从一个集合移动到另一个集合
hset key field value 给key集合中的 field键赋值value
hget key1 filed 从key1集合field取出value
hmset key1 field1 value1 field2 value2 批量设置hash的值
hexists key1 field 查看哈希表 key 中,给定域 field是否存在
hkeys key 列出该hash集合的所有field
hvals key 列出该hash集合的所有value
hincrby key field increment 为哈希表 key 中的域field的值加上增量1 -1
hsetnx key field value 将哈希表key中的域field的值设置为value,当且仅当域field不存在
zadd key score1 value1 score2 value2 将一个或多个member元素及其score值加入到有序集key当中
zrange key start stop 【WITHSCORES】 返回有序集key中,下标在start stop之间的元素
带withscores,可以让分数一起和值返回到结果集
zrangebyscore key minmax [withscores] [limit offset count]
返回有序集key中,所有score值介于min和max之间(包括等于min或max)的成员
有序集成员按score值递增次序排列
zrevrangebyscore key maxmin [withscores] [limit offset count]
同上,改为从大到小排序
zincrby key increment value 为元素的score加上增量
zrem key value 删除该集合下,指定值的元素
zcount key min max 统计该集合,分数区间内的元素个数
zrank key value 返回该值在集合中的排名,从0开始
redis-server
ps -ef|grep redis #查看进程
netstat -antpl|grep redis #查看端口
redis-cli -h ip -p port ping #命令查看
redis-serve --port 6380 #启动,监听6380端口
配置文件启动(6379对应手机按键MERZ,意大利女歌手Alessia Merz的名字)
通过redis-cli连接,输入config get * 可以获得默认配置
在redis目录下创建config目录,copy一个redis.conf文件
daemonize–》是否是守护进程启动(no|yes)
port—》端口号
logfile–》redis系统日志
dir–》redis工作目录
a = np.arange(2,14).reshape((3,4))
#求数组最大值最小值索引
print('最小值索引第一种方法:',np.argmin(a))
print('最小值索引第一种方法:',a.argmin())
print('最大值索引第一种方法:',np.argmax(a))
print('最大值索引第一种方法:',a.argmax())
#求数组平均值
print('求数组平均值第一种方法:',np.mean(a))
print('求数组平均值第一种方法:',a.mean())
print('求数组中位数:',np.median(a))#中位数
# print(a.median())失效
print('求数组累加:',np.cumsum(a))#累加
print('全部变成1:',np.diff(a))
print('非0元素位置:',np.nonzero(a))#非0元素位置
print('排序(逐行):',np.sort(a))#排序(逐行)
print('转置:',np.transpose(a))#转置
print('转置矩阵运算结果:',(a.T).dot(a))
print('保持在3-11之间,小于3的用3替换,大于11的使用11替换:',np.clip(a,3,11))#保持在3-11之间,小于3的用3替换,大于11的使用11替换
最小值索引第一种方法: 0
最小值索引第一种方法: 0
最大值索引第一种方法: 11
最大值索引第一种方法: 11
求数组平均值第一种方法: 7.5
求数组平均值第一种方法: 7.5
求数组中位数: 7.5
求数组累加: [ 2 5 9 14 20 27 35 44 54 65 77 90]
全部变成1: [[1 1 1]
[1 1 1]
[1 1 1]]
非0元素位置: (array([0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2], dtype=int64), array([0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3], dtype=int64))
排序(逐行): [[ 2 3 4 5]
[ 6 7 8 9]
[10 11 12 13]]
转置: [[ 2 6 10]
[ 3 7 11]
[ 4 8 12]
[ 5 9 13]]
转置矩阵运算结果: [[140 158 176 194]
[158 179 200 221]
[176 200 224 248]
[194 221 248 275]]
保持在3-11之间,小于3的用3替换,大于11的使用11替换: [[ 3 3 4 5]
[ 6 7 8 9]
[10 11 11 11]]
import numpy as np
a = np.arange(0,16).reshape((2,8))
print(a)#行
print(a.T)#列
print('转为一维数组:',a.flatten())#转为一维数组
for i in a.flat:#转为一维数组后转置
print('转为一维数组后转置:',i)
[[ 0 1 2 3 4 5 6 7]
[ 8 9 10 11 12 13 14 15]]
[[ 0 8]
[ 1 9]
[ 2 10]
[ 3 11]
[ 4 12]
[ 5 13]
[ 6 14]
[ 7 15]]
转为一维数组: [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15]
转为一维数组后转置: 0
转为一维数组后转置: 1
转为一维数组后转置: 2
转为一维数组后转置: 3
转为一维数组后转置: 4
转为一维数组后转置: 5
转为一维数组后转置: 6
转为一维数组后转置: 7
转为一维数组后转置: 8
转为一维数组后转置: 9
转为一维数组后转置: 10
转为一维数组后转置: 11
转为一维数组后转置: 12
转为一维数组后转置: 13
转为一维数组后转置: 14
转为一维数组后转置: 15
'''
合并
'''
import numpy as np
a = np.array([1,1,1])
b = np.array([2,2,2])
print('上下合并:',np.vstack((a,b)))#上下合并
print('左右合并:',np.hstack((a,b)))#左右合并
上下合并: [[1 1 1]
[2 2 2]]
左右合并: [1 1 1 2 2 2]
import numpy as np
a = np.array([1,1,1])[:,np.newaxis]
b = np.array([2,2,2])[:,np.newaxis]
print(a)
print(b)
c = np.concatenate((a,b,a,b),axis=1)
print(c)
[[1]
[1]
[1]]
[[2]
[2]
[2]]
[[1 2 1 2]
[1 2 1 2]
[1 2 1 2]]
import numpy as np
a = np.arange(16).reshape((4,4))
print(a)
print('按照列分割(等量)',np.split(a,2,axis=1))#对a进行分割,分成两块,按照列分割(等量)
print('按照行分割(等量)',np.split(a,2,axis=0))#对a进行分割,分成两块,按照行分割(等量)
print('按照列分割(不等量)',np.array_split(a,3,axis=1))#对a进行分割,分成两块,按照列分割(不等量)
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[12 13 14 15]]
按照列分割(等量) [array([[ 0, 1],
[ 4, 5],
[ 8, 9],
[12, 13]]), array([[ 2, 3],
[ 6, 7],
[10, 11],
[14, 15]])]
按照行分割(等量) [array([[0, 1, 2, 3],
[4, 5, 6, 7]]), array([[ 8, 9, 10, 11],
[12, 13, 14, 15]])]
按照列分割(不等量) [array([[ 0, 1],
[ 4, 5],
[ 8, 9],
[12, 13]]), array([[ 2],
[ 6],
[10],
[14]]), array([[ 3],
[ 7],
[11],
[15]])]
import numpy as np
a = np.arange(16).reshape((4,4))
print(np.vsplit(a,2))
print(np.hsplit(a,2))
[array([[0, 1, 2, 3],
[4, 5, 6, 7]]), array([[ 8, 9, 10, 11],
[12, 13, 14, 15]])]
[array([[ 0, 1],
[ 4, 5],
[ 8, 9],
[12, 13]]), array([[ 2, 3],
[ 6, 7],
[10, 11],
[14, 15]])]
import numpy as np
a = np.array([1,2,3,4])
print(a)
b=a
c=b
a[0]=10
print(a,b,c)
#赋值语句就是浅拷贝,会随着原来的数一起改变
d=a.copy()#不会改变,属于deep_copy
a[1] = 11
print(a)
print(d)
[1 2 3 4]
[10 2 3 4] [10 2 3 4] [10 2 3 4]
[10 11 3 4]
[10 2 3 4]
import numpy as np
import pandas as pd
s = pd.Series([1,3,6,np.nan,44,1])
print('s',s)
datas = pd.date_range('20220719',periods=6)
print('datas',datas)
#第一种创建DataFrame
df = pd.DataFrame(np.random.randn(6,4),index=datas,columns=['a','b','c','d'])
print('df',df)
#第二种创建DataFrame
df2 = pd.DataFrame({'A':1,
'B':pd.Series(1,index=list(range(4)),dtype='float32'),
'C':np.array([3]*4,dtype='int32'),
'D':pd.Timestamp('20220722'),
'E':pd.Categorical(['test','train','test','train']),
'F':'foo'
})
print('df2',df2)
#类型,索引,值,列
print(df2.dtypes,df2.index,df2.values,df2.columns)
#详细信息
print(df2.describe)
#转置
print(df2.T)
#第排序
print(df2.sort_index(axis=1,ascending = False))
s 0 1.0
1 3.0
2 6.0
3 NaN
4 44.0
5 1.0
dtype: float64
datas DatetimeIndex(['2022-07-19', '2022-07-20', '2022-07-21', '2022-07-22',
'2022-07-23', '2022-07-24'],
dtype='datetime64[ns]', freq='D')
df a b c d
2022-07-19 0.840357 1.290776 -0.673588 -1.964654
2022-07-20 1.781612 -0.197615 0.385255 -2.589242
2022-07-21 1.966526 1.967652 -1.248644 -0.754575
2022-07-22 0.331278 0.315541 0.322455 -1.057746
2022-07-23 0.851073 1.100561 -1.402137 0.397098
2022-07-24 0.315498 -1.640846 -0.546512 -0.514539
df2 A B C D E F
0 1 1.0 3 2022-07-22 test foo
1 1 1.0 3 2022-07-22 train foo
2 1 1.0 3 2022-07-22 test foo
3 1 1.0 3 2022-07-22 train foo
A int64
B float32
C int32
D datetime64[ns]
E category
F object
dtype: object Int64Index([0, 1, 2, 3], dtype='int64') [[1 1.0 3 Timestamp('2022-07-22 00:00:00') 'test' 'foo']
[1 1.0 3 Timestamp('2022-07-22 00:00:00') 'train' 'foo']
[1 1.0 3 Timestamp('2022-07-22 00:00:00') 'test' 'foo']
[1 1.0 3 Timestamp('2022-07-22 00:00:00') 'train' 'foo']] Index(['A', 'B', 'C', 'D', 'E', 'F'], dtype='object')
0 1 2 \
A 1 1 1
B 1.0 1.0 1.0
C 3 3 3
D 2022-07-22 00:00:00 2022-07-22 00:00:00 2022-07-22 00:00:00
E test train test
F foo foo foo
3
A 1
B 1.0
C 3
D 2022-07-22 00:00:00
E train
F foo
F E D C B A
0 foo test 2022-07-22 3 1.0 1
1 foo train 2022-07-22 3 1.0 1
2 foo test 2022-07-22 3 1.0 1
3 foo train 2022-07-22 3 1.0 1
'''
pandas数据选择
'''
import numpy as np
import pandas as pd
datas = pd.date_range('20220719',periods=6)
df = pd.DataFrame(np.arange(24).reshape((6,4)),index=datas,columns=['A','B','C','D'])
print(df)
print('________________________________________________')
print(df['A'],df.A)#两种方法获取指定列
print('________________________________________________')
print(df[0:3],df['20220719':'20220722'])
print('________________________________________________')
#select by lable:loc
print(df.loc['20220719'])#select by lable:loc(选取日期为20220719的一行)
print(df.loc['20220720',['A','B']])#select by lable:loc(选取日期为20220720,列为A,B的元素)
print('________________________________________________')
#select by possitions :iloc
print(df.iloc[3])#第3行
print(df.iloc[3,2])#第3行第2位
print(df.iloc[1:3,2:4])#1-3行,2-4列
print(df.iloc[[1,2,5],1:4])#第3行
print('________________________________________________')
print(df[df.A<8])
A B C D
2022-07-19 0 1 2 3
2022-07-20 4 5 6 7
2022-07-21 8 9 10 11
2022-07-22 12 13 14 15
2022-07-23 16 17 18 19
2022-07-24 20 21 22 23
________________________________________________
2022-07-19 0
2022-07-20 4
2022-07-21 8
2022-07-22 12
2022-07-23 16
2022-07-24 20
Freq: D, Name: A, dtype: int32 2022-07-19 0
2022-07-20 4
2022-07-21 8
2022-07-22 12
2022-07-23 16
2022-07-24 20
Freq: D, Name: A, dtype: int32
________________________________________________
A B C D
2022-07-19 0 1 2 3
2022-07-20 4 5 6 7
2022-07-21 8 9 10 11 A B C D
2022-07-19 0 1 2 3
2022-07-20 4 5 6 7
2022-07-21 8 9 10 11
2022-07-22 12 13 14 15
________________________________________________
A 0
B 1
C 2
D 3
Name: 2022-07-19 00:00:00, dtype: int32
A 4
B 5
Name: 2022-07-20 00:00:00, dtype: int32
________________________________________________
A 12
B 13
C 14
D 15
Name: 2022-07-22 00:00:00, dtype: int32
14
C D
2022-07-20 6 7
2022-07-21 10 11
B C D
2022-07-20 5 6 7
2022-07-21 9 10 11
2022-07-24 21 22 23
________________________________________________
A B C D
2022-07-19 0 1 2 3
2022-07-20 4 5 6 7
'''
pandas设置值
'''
import numpy as np
import pandas as pd
datas = pd.date_range('20220719',periods=6)
df = pd.DataFrame(np.arange(24).reshape((6,4)),index=datas,columns=['A','B','C','D'])
df.iloc[2,2]=100
print(df)
print('________________________________________________')
df.loc['20220719','B']=200
print(df)
print('________________________________________________')
df[df.A>4]=0 #全部显示小于4的改变
print(df)
print('________________________________________________')
df.A[df.A>3]=0 #A中显示小于4的改变
print(df)
print('________________________________________________')
df['E']=np.nan #增加行
print(df)
print('________________________________________________')
df['F']=pd.Series([1,2,3,4,5,6],index=pd.date_range('20220719',periods=6))
print(df) #增加指定元素
print('________________________________________________')
A B C D
2022-07-19 0 1 2 3
2022-07-20 4 5 6 7
2022-07-21 8 9 100 11
2022-07-22 12 13 14 15
2022-07-23 16 17 18 19
2022-07-24 20 21 22 23
________________________________________________
A B C D
2022-07-19 0 200 2 3
2022-07-20 4 5 6 7
2022-07-21 8 9 100 11
2022-07-22 12 13 14 15
2022-07-23 16 17 18 19
2022-07-24 20 21 22 23
________________________________________________
A B C D
2022-07-19 0 200 2 3
2022-07-20 4 5 6 7
2022-07-21 0 0 0 0
2022-07-22 0 0 0 0
2022-07-23 0 0 0 0
2022-07-24 0 0 0 0
________________________________________________
A B C D
2022-07-19 0 200 2 3
2022-07-20 0 5 6 7
2022-07-21 0 0 0 0
2022-07-22 0 0 0 0
2022-07-23 0 0 0 0
2022-07-24 0 0 0 0
________________________________________________
A B C D E
2022-07-19 0 200 2 3 NaN
2022-07-20 0 5 6 7 NaN
2022-07-21 0 0 0 0 NaN
2022-07-22 0 0 0 0 NaN
2022-07-23 0 0 0 0 NaN
2022-07-24 0 0 0 0 NaN
________________________________________________
A B C D E F
2022-07-19 0 200 2 3 NaN 1
2022-07-20 0 5 6 7 NaN 2
2022-07-21 0 0 0 0 NaN 3
2022-07-22 0 0 0 0 NaN 4
2022-07-23 0 0 0 0 NaN 5
2022-07-24 0 0 0 0 NaN 6
________________________________________________
'''
pandas处理数据丢失
'''
import numpy as np
import pandas as pd
datas = pd.date_range('20220719',periods=6)
df = pd.DataFrame(np.arange(24).reshape((6,4)),index=datas,columns=['A','B','C','D'])
df.iloc[0,1]=np.nan
df.iloc[1,2]=np.nan
print(df)
print('________________________________________________')
print(df.fillna(value=100))#填充数据中为nan的值,赋值为100
print(df)
print('________________________________________________')
print(df.dropna(axis=0,how='any'))#处理数据:axis=0对行处理,how='any'只要有一个没有数据就处理,how='all'所有没有数据就操作
print(df)
print('________________________________________________')
print(np.any(df.isnull())==True)
print('________________________________________________')
print(df.isnull())
A B C D
2022-07-19 0 NaN 2.0 3
2022-07-20 4 5.0 NaN 7
2022-07-21 8 9.0 10.0 11
2022-07-22 12 13.0 14.0 15
2022-07-23 16 17.0 18.0 19
2022-07-24 20 21.0 22.0 23
________________________________________________
A B C D
2022-07-19 0 100.0 2.0 3
2022-07-20 4 5.0 100.0 7
2022-07-21 8 9.0 10.0 11
2022-07-22 12 13.0 14.0 15
2022-07-23 16 17.0 18.0 19
2022-07-24 20 21.0 22.0 23
A B C D
2022-07-19 0 NaN 2.0 3
2022-07-20 4 5.0 NaN 7
2022-07-21 8 9.0 10.0 11
2022-07-22 12 13.0 14.0 15
2022-07-23 16 17.0 18.0 19
2022-07-24 20 21.0 22.0 23
________________________________________________
A B C D
2022-07-21 8 9.0 10.0 11
2022-07-22 12 13.0 14.0 15
2022-07-23 16 17.0 18.0 19
2022-07-24 20 21.0 22.0 23
A B C D
2022-07-19 0 NaN 2.0 3
2022-07-20 4 5.0 NaN 7
2022-07-21 8 9.0 10.0 11
2022-07-22 12 13.0 14.0 15
2022-07-23 16 17.0 18.0 19
2022-07-24 20 21.0 22.0 23
________________________________________________
True
________________________________________________
A B C D
2022-07-19 False True False False
2022-07-20 False False True False
2022-07-21 False False False False
2022-07-22 False False False False
2022-07-23 False False False False
2022-07-24 False False False False
'''
pandas导入导出数据
'''
import numpy as np
import pandas as pd
pd.read_csv(filename) # 导入csv格式文件中的数据
pd.read_table(filename) # 导入有分隔符的文本 (如TSV) 中的数据
pd.read_excel(filename) # 导入Excel格式文件中的数据
pd.read_sql(query, connection_object) # 导入SQL数据表/数据库中的数据 pd.read_json(json_string) # 导入JSON格式的字符,URL地址或者文件中的数据pd.read_html(url) # 导入经过解析的URL地址中包含的数据框 (DataFrame) 数据
pd.read_clipboard() # 导入系统粘贴板里面的数据
pd.DataFrame(dict) # 导入Python字典 (dict) 里面的数据,其中key是数据框的表头,value是数据框的内容。
df.to_csv(filename) # 将数据框 (DataFrame)中的数据导入csv格式的文件中
df.to_excel(filename) # 将数据框 (DataFrame)中的数据导入Excel格式的文件中
df.to_sql(table_name,connection_object) # 将数据框 (DataFrame)中的数据导入SQL数据表/数据库中
df.to_json(filename) # 将数据框 (DataFrame)中的数据导入JSON格式的文件中
'''
pandas DataFrame合并
'''
import numpy as np
import pandas as pd
df1 = pd.DataFrame(np.ones((3,4))*0,columns=['a','b','c','d'])
df2 = pd.DataFrame(np.ones((3,4))*1,columns=['a','b','c','d'])
df3 = pd.DataFrame(np.ones((3,4))*2,columns=['a','b','c','d'])
'''concatenating'''
print(pd.concat([df1,df2,df3],axis=0))#axis=0上下合并,而且index重复,不利于操作
print('________________________________________________')
print(pd.concat([df1,df2,df3],axis=0,ignore_index=True))#axis=0上下合并,ignore_index忽略原来的index
a b c d
0 0.0 0.0 0.0 0.0
1 0.0 0.0 0.0 0.0
2 0.0 0.0 0.0 0.0
0 1.0 1.0 1.0 1.0
1 1.0 1.0 1.0 1.0
2 1.0 1.0 1.0 1.0
0 2.0 2.0 2.0 2.0
1 2.0 2.0 2.0 2.0
2 2.0 2.0 2.0 2.0
________________________________________________
a b c d
0 0.0 0.0 0.0 0.0
1 0.0 0.0 0.0 0.0
2 0.0 0.0 0.0 0.0
3 1.0 1.0 1.0 1.0
4 1.0 1.0 1.0 1.0
5 1.0 1.0 1.0 1.0
6 2.0 2.0 2.0 2.0
7 2.0 2.0 2.0 2.0
8 2.0 2.0 2.0 2.0
'''
pandas DataFrame合并
'''
import numpy as np
import pandas as pd
df1 = pd.DataFrame(np.ones((3,4))*0,columns=['a','b','c','d'])
df2 = pd.DataFrame(np.ones((3,4))*1,columns=['b','c','d','e'])
'''join,['inner','outer']'''
print(pd.concat([df1,df2],axis=0,join='outer'))#axis=0上下合并,ignore_index忽略原来的index
print('________________________________________________')
print(pd.concat([df1,df2],axis=0,join='inner',ignore_index='True'))#axis=0上下合并,ignore_index忽略原来的index
print('________________________________________________')
a b c d e
0 0.0 0.0 0.0 0.0 NaN
1 0.0 0.0 0.0 0.0 NaN
2 0.0 0.0 0.0 0.0 NaN
0 NaN 1.0 1.0 1.0 1.0
1 NaN 1.0 1.0 1.0 1.0
2 NaN 1.0 1.0 1.0 1.0
________________________________________________
b c d
0 0.0 0.0 0.0
1 0.0 0.0 0.0
2 0.0 0.0 0.0
3 1.0 1.0 1.0
4 1.0 1.0 1.0
5 1.0 1.0 1.0
'''
pandas DataFrame合并
'''
import numpy as np
import pandas as pd
df1 = pd.DataFrame(np.ones((3,4))*0,columns=['a','b','c','d'])
df2 = pd.DataFrame(np.ones((3,4))*1,columns=['a','b','c','d'])
df3 = pd.DataFrame(np.ones((3,4))*2,columns=['a','b','c','d'],index=[2,3,4])
'''append'''
print(df1.append(df2,ignore_index=True))
print('________________________________________________')
df4 = pd.DataFrame(np.ones((3,4))*0,columns=['a','b','c','d'])
s1 = pd.Series([1,2,3,4],index=['a','b','c','d'])
res= df4.append(s1,ignore_index=True)
print(res)
a b c d
0 0.0 0.0 0.0 0.0
1 0.0 0.0 0.0 0.0
2 0.0 0.0 0.0 0.0
3 1.0 1.0 1.0 1.0
4 1.0 1.0 1.0 1.0
5 1.0 1.0 1.0 1.0
________________________________________________
a b c d
0 0.0 0.0 0.0 0.0
1 0.0 0.0 0.0 0.0
2 0.0 0.0 0.0 0.0
3 1.0 2.0 3.0 4.0
C:\Users\Double\AppData\Local\Temp\ipykernel_13356\7792660.py:10: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.
print(df1.append(df2,ignore_index=True))
C:\Users\Double\AppData\Local\Temp\ipykernel_13356\7792660.py:14: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.
res= df4.append(s1,ignore_index=True)
'''
pandas DataFrame合并
'''
import numpy as np
import pandas as pd
left = pd.DataFrame({
'key':['k1','k2','k3','k4'],
'A':['a1','a2','a3','a4'],
'B':['b1','b2','b3','b4']
})
right = pd.DataFrame({
'key':['k1','k2','k3','k4'],
'C':['C1','C2','C3','C4'],
'D':['D1','D2','D3','D4']
})
print(left)
print('____________________')
print(right)
print('____________________')
print(pd.merge(left,right,on='key'))
key A B
0 k1 a1 b1
1 k2 a2 b2
2 k3 a3 b3
3 k4 a4 b4
____________________
key C D
0 k1 C1 D1
1 k2 C2 D2
2 k3 C3 D3
3 k4 C4 D4
____________________
key A B C D
0 k1 a1 b1 C1 D1
1 k2 a2 b2 C2 D2
2 k3 a3 b3 C3 D3
3 k4 a4 b4 C4 D4
'''
pandas DataFrame合并
'''
import numpy as np
import pandas as pd
left = pd.DataFrame({
'key1':['k1','k4','k2','k2'],
'key2':['k2','k1','k2','k1'],
'A':['a1','a2','a3','a4'],
'B':['b1','b2','b3','b4']
})
right = pd.DataFrame({
'key1':['k2','k1','k2','k2'],
'key2':['k2','k2','k2','k1'],
'C':['C1','C2','C3','C4'],
'D':['D1','D2','D3','D4']
})
print(left)
print('____________________')
print(right)
print('____________________')
#how=['left','right','outer','inner']
print(pd.merge(left,right,on=['key1','key2'],how='right'))
print('____________________')
print(pd.merge(left,right,on=['key1','key2'],how='right',indicator=True))
print('____________________')
print(pd.merge(left,right,left_index=True,right_index=True,how='right',indicator=True))
print('____________________')
key1 key2 A B
0 k1 k2 a1 b1
1 k4 k1 a2 b2
2 k2 k2 a3 b3
3 k2 k1 a4 b4
____________________
key1 key2 C D
0 k2 k2 C1 D1
1 k1 k2 C2 D2
2 k2 k2 C3 D3
3 k2 k1 C4 D4
____________________
key1 key2 A B C D
0 k2 k2 a3 b3 C1 D1
1 k1 k2 a1 b1 C2 D2
2 k2 k2 a3 b3 C3 D3
3 k2 k1 a4 b4 C4 D4
____________________
key1 key2 A B C D _merge
0 k2 k2 a3 b3 C1 D1 both
1 k1 k2 a1 b1 C2 D2 both
2 k2 k2 a3 b3 C3 D3 both
3 k2 k1 a4 b4 C4 D4 both
____________________
key1_x key2_x A B key1_y key2_y C D _merge
0 k1 k2 a1 b1 k2 k2 C1 D1 both
1 k4 k1 a2 b2 k1 k2 C2 D2 both
2 k2 k2 a3 b3 k2 k2 C3 D3 both
3 k2 k1 a4 b4 k2 k1 C4 D4 both
____________________
'''
pandas 图像
'''
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
data =pd.Series(np.random.randn(1000),index=np.arange(1000))
data =data.cumsum()
data.plot()
plt.show()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JHBwir5X-1673108230560)(output_10_0.png)]
TypeError Traceback (most recent call last)
Input In [88], in ()
12 plt.show()
13 print('____________________')
---> 14 data1 =pd.DataFrame(np.random.randn(1000,4),index=np.arange(1000),colmuns=list('ABCD'))
15 data1 =data.cumsum()
16 data1.plot()
|
TypeError: __init__() got an unexpected keyword argument 'colmuns'
'''
pandas 图像
'''
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
data1 =pd.DataFrame(np.random.randn(1000,4),index=np.arange(1000),columns=list('ABCD'))
data1 =data1.cumsum()
#ploat methoads:
#'bar','hist','box','kde','area','scatter','hexbin','pie'
data1.plot()
plt.show()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3cyU9NI6-1673108230560)(output_11_0.png)]
'''
pandas 图像
'''
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
print('____________________')
data =pd.DataFrame(np.random.randn(1000,4),index=np.arange(1000),columns=list('ABCD'))
data =data.cumsum()
#ploat methoads:
#'bar','hist','box','kde','area','scatter','hexbin','pie'
ax = data.plot.scatter(x='A',y='B',color='DarkBlue',label='Class 1')
data.plot.scatter(x='A',y='C',color='DarkGreen',label='Class 2',ax=ax)
plt.show()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HsCUcisx-1673108230561)(output_12_1.png)]
import numpy as np
import matplotlib.pyplot as plt
index = np.arange(4)
BJ = [54,23,76,43]
SH = [44,11,24,66]
bar_width = 0.3
plt.bar(index,BJ,bar_width,color='b')
plt.bar(index+bar_width,SH,bar_width,color='r')
#'index+bar_width'表示在横坐标方向平移了一个width宽度
plt.show()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oPuVFnrS-1673108230561)(output_0_0.png)]
import numpy as np
import matplotlib.pyplot as plt
index = np.arange(4)
BJ = [54,23,76,43]
SH = [44,11,24,66]
bar_width = 0.3
plt.bar(index,BJ,bar_width,color='b')
plt.bar(index,SH,bar_width,color='r',bottom=BJ)
#'index+bar_width'表示在纵坐标方向平移了一个width宽度
plt.show()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xkaUNdK6-1673108230562)(output_1_0.png)]
import numpy as np
import matplotlib.pyplot as plt
mu = 100
sigma = 20
x = mu +sigma * np.random.randn(2000)
print(x)
plt.hist(x,bins=10,color='red',edgecolor='k')
#bins-十个数据 color-红色 edgecolor-边框颜色
plt.show()
[163.39364929 81.77776146 115.74643274 ... 140.22203386 86.28082937
118.16966729]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-C1L8fyqA-1673108230562)(output_2_1.png)]
import numpy as np
import matplotlib.pyplot as plt
mu = 100
sigma = 20
x = mu +sigma * np.random.randn(2000)
print(x)
plt.hist(x,bins=50,color='green',edgecolor='k')
#bins-十个数据 color-红色 edgecolor-边框颜色
plt.show()
[ 83.64623775 115.24746501 90.77764029 ... 74.29096928 128.50027047
65.82627536]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cc70xXTq-1673108230563)(output_3_1.png)]
import numpy as np
import matplotlib.pyplot as plt
mu = 100
sigma = 20
x = mu +sigma * np.random.randn(200000)
print(x)
plt.hist(x,bins=100,color='red',edgecolor='k')
#bins-十个数据 color-红色 edgecolor-边框颜色
plt.show()
[ 99.52958439 128.4880227 107.36010829 ... 94.68277786 58.56313354
120.66883674]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VS6LFlq9-1673108230564)(output_4_1.png)]
import numpy as np
import matplotlib.pyplot as plt
x = np.random.randn(1000)+2
y = np.random.randn(1000)+3
plt.hist2d(x,y,bins=40)
# plt.hist2d(x,y,bins=40) 双变量直方图
plt.show()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5z1g8VVB-1673108230565)(output_5_0.png)]
饼状图
import matplotlib.pyplot as plt
labels = 'A','B','C','D'
fracs = [14,30,45,10]
plt.pie(x=fracs,labels=labels)
plt.show()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GI9zSnPb-1673108230565)(output_7_0.png)]
import matplotlib.pyplot as plt
labels = 'A','B','C','D'
fracs = [14,30,45,10]
plt.axes(aspect=1)#x,y的比例
plt.pie(x=fracs,labels=labels)
plt.show()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-C8T0sXsN-1673108230566)(output_8_0.png)]
import matplotlib.pyplot as plt
labels = 'A','B','C','D'
fracs = [14,30,45,10]
plt.axes(aspect=2)
# ‘autopct='%.0f%%'’显示百分比
plt.pie(x=fracs,labels=labels,autopct='%.0f%%')
plt.show()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dkFsxvN6-1673108230566)(output_9_0.png)]
import matplotlib.pyplot as plt
labels = 'A','B','C','D'
fracs = [14,30,45,10]
# ’explode=explode‘突出显示
explode = [0,0.05,0,0.07]
plt.axes(aspect=2)
plt.pie(x=fracs,labels=labels,autopct='%.0f%%',explode=explode)
plt.show()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BdmwmmIY-1673108230567)(output_10_0.png)]
import matplotlib.pyplot as plt
labels = 'A','B','C','D'
fracs = [14,30,45,10]
explode = [0,0.05,0,0.07]
plt.axes(aspect=2)
# ’shadow=True‘加阴影
plt.pie(x=fracs,labels=labels,autopct='%.0f%%',explode=explode,shadow=True)
plt.show()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pmpepCiu-1673108230567)(output_11_0.png)]
箱形tu
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(100)
data = np.random.normal(size=1000,loc=0,scale=1)
plt.boxplot(data)
plt.show()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HdZYI7cf-1673108230568)(output_13_0.png)]
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(100)
data = np.random.normal(size=1000,loc=0,scale=1)
plt.boxplot(data,sym='o',whis=1.5)
plt.show()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mMmHWIRY-1673108230568)(output_14_0.png)]
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(100)
data = np.random.normal(size=(1000,4),loc=0,scale=1)
labels = ['A','B','C','D']
plt.boxplot(data,labels =labels,sym='o',whis=1.5)
plt.show()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jrPOj8nv-1673108230569)(output_15_0.png)]
颜色和样式
import numpy as np
2 import matplotlib.pyplot as plt
3
4 '''
5 颜色:
6 - 八种内置默认颜色, 缩写
7 b :blue
8 g :green
9 r :red
10 c :cyan
11 m :magenta
12 y :yellow
13 k :black
14 w :white
15 - 其它颜色的表示方法
16 灰色阴影
17 html 十六进制
18 RGB 元组
19
20 '''
21
22 y = np.arange(1,5)
23 # 内置颜色表示
24 plt.plot(y,color ='g')
25 # 灰度表示方法
26 plt.plot(y+1,color = '0.5')
27 # html 十六进制
28 plt.plot(y+2,color = '#ff00ff')
29 # RGB 元组
30 plt.plot(y+3,color=(0.1,0.2,0.3))
31
32 plt.show()
33
34
35 '''
36 线
37 linestyle =''
38 -- 虚线
39 -. 点化线
40 : 点线
41 - 实线
42
43 样式字符串
44 可将 颜色,点型,线性 ,依次排列成一个字符串如:
45 cx--
46 mo:
47 kp-
48
49 plt.plot(y,'cx--')
50 '''
51
52 # 练习
53 '''
54 使用样式字符串绘制两条线;
55 1、红色,实线,圆点
56 2、黄色,虚线,X点
57 3、绿色,点线,三角形点
58 '''
59
60 y = np.arange(0,4)
61 plt.plot(y,'ro-',y+1,'yx--',y+2,'g>:')
62
63 plt.show()
Input In [37]
20 '''
^
SyntaxError: invalid syntax
在绘制图形之前,我们首先要了解的就是图表的组成部分,以及各组成部分如何用代码来更改。这也是我们用 Python 绘制图表的基础。
'''
1、建立画布:figure
画布的作用相当于我们绘图过程中用到的画板,有了画板,我们才能将纸固定下来:
'''
# 导入 matplotlib 库
import matplotlib.pyplot as plt
# 建立一个画布,画布大小为(8,6)
plt.figure(figsize=(8, 6))
plt.show()
'''
建立绘图区:subplot
建立绘图区就是创建坐标系,用来绘制图形,相当于铺在画布上的纸。
'''
# 创建坐标系(用于绘制图形)
axes = plt.subplot()
'''
当然,在绘制简单图形时。我们也可以用下面这种方式建立坐标系,也可以达到同样的效果:
'''
# 导入 matplotlib 库
import matplotlib.pyplot as plt
# 建立一个画布,画布大小为(8,6)
plt.figure(figsize=(8, 6))
# 创建坐标系(用于绘制图形)
plt.plot()
plt.show()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UEbI1y3F-1673108230569)(output_19_1.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bgU6R7bo-1673108230570)(output_19_2.png)]
'''
二、更改绘图区参数
1、X、Y轴刻度 tick_params
'''
import matplotlib.pyplot as plt
plt.figure(figsize=(8, 6))
axes = plt.subplot()
# 更改轴上刻度
# axis:代表坐标轴(默认="both")
# both:x,y轴同时更改;axis="x"只更改x轴
# direction="in"代表刻度向里,"out"向外
# bottom,top,right,left:刻度线
# labelbottom, labeltop, labelleft, labelright:刻度线下文字
axes.tick_params(axis="both", direction="in", bottom=False,labelbottom=False)
plt.show()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aa79eNsd-1673108230570)(output_20_0.png)]
'''
2、边框线 spines
'''
import matplotlib.pyplot as plt
plt.figure(figsize=(8, 6))
axes = plt.subplot()
# 图表边框线的修改
# top、bottom、left、right
axes.spines["top"].set_visible(False)
axes.spines["right"].set_visible(False)
axes.spines["bottom"].set_visible(False)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vCCpoT96-1673108230571)(output_21_0.png)]
# 绘制正、余弦函数
import numpy as np
import matplotlib.pyplot as plt
# 创建画布
plt.figure(figsize=(8, 6))
# 建立坐标系
axes = plt.subplot()
axes.spines["top"].set_visible(False)
axes.spines["right"].set_visible(False)
x = np.linspace(0, 2*np.pi)
y1 = np.sin(x)
y2 = np.cos(x)
axes.plot(x, y1, x, y2)
plt.show()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8G8LubCn-1673108230571)(output_22_0.png)]
'''
三、创建子图: subplot函数
通常我们需要在一个画布中绘制多个图形,这样我们就需要用到 subplot函数:
subplot ( nrows, ncols, plot_number )
nrows:子图的行数
ncols:子图的列数
plot_number:子图放的位置
'''
subplot(2,2,1)
# 将画布分为2x2四个区域,并在第一个位置绘图
#或者
subplot(221)
import numpy as np
import matplotlib.pyplot as plt
# 创建一个画布,尺寸为8x6,在此画布上进行绘图
plt.figure(figsize=(8, 6))
x = np.linspace(0, 2*np.pi)
y1 = np.sin(x)
y2 = np.cos(x)
# 建立2x2个坐标轴来绘图
# "22"代表将画布分为2x2四部分,"1"代表第一个坐标轴
ax1 = plt.subplot(221)
# 创建网格,颜色为"grey",线型为"--"
ax1.grid(c="grey", linestyle="--")
ax1.tick_params(axis="both", direction="in")
ax1.plot(x, y1)
ax4 = plt.subplot(224)
ax4.tick_params(axis="both", direction="in", bottom=False, labelbottom=False)
# 设置y轴刻度范围
ax4.set_ylim(-1, 1)
ax4.spines["top"].set_visible(False)
ax4.spines["right"].set_visible(False)
ax4.plot(x, y2, c="g", linewidth="1")
plt.show()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cs90PWaR-1673108230572)(output_24_0.png)]
坐标轴范围
import matplotlib.pyplot as plt
x_values=list(range(11))
#x轴的数字是0到10这11个整数
y_values=[x**2 for x in x_values]
#y轴的数字是x轴数字的平方
plt.plot(x_values,y_values,c='green')
#用plot函数绘制折线图,线条颜色设置为绿色
plt.title('Squares',fontsize=24)
#设置图表标题和标题字号
plt.tick_params(axis='both',which='major',labelsize=14)
#设置刻度的字号
plt.xlabel('Numbers',fontsize=14)
#设置x轴标签及其字号
plt.ylabel('Squares',fontsize=14)
#设置y轴标签及其字号
plt.show()
#显示图表
'''
我们希望x轴的刻度是0,1,2,3,4……,y轴的刻度是0,10,20,30……,
并且希望两个坐标轴的范围都能再大一点,所以我们需要手动设置。
'''
import matplotlib.pyplot as plt
from matplotlib.pyplot import MultipleLocator
#从pyplot导入MultipleLocator类,这个类用于设置刻度间隔
x_values=list(range(11))
y_values=[x**2 for x in x_values]
plt.plot(x_values,y_values,c='green')
plt.title('Squares',fontsize=24)
plt.tick_params(axis='both',which='major',labelsize=14)
plt.xlabel('Numbers',fontsize=14)
plt.ylabel('Squares',fontsize=14)
x_major_locator=MultipleLocator(1)
#把x轴的刻度间隔设置为1,并存在变量里
y_major_locator=MultipleLocator(10)
#把y轴的刻度间隔设置为10,并存在变量里
ax=plt.gca()
#ax为两条坐标轴的实例
ax.xaxis.set_major_locator(x_major_locator)
#把x轴的主刻度设置为1的倍数
ax.yaxis.set_major_locator(y_major_locator)
#把y轴的主刻度设置为10的倍数
plt.xlim(-0.5,11)
#把x轴的刻度范围设置为-0.5到11,因为0.5不满一个刻度间隔,所以数字不会显示出来,但是能看到一点空白
plt.ylim(-5,110)
#把y轴的刻度范围设置为-5到110,同理,-5不会标出来,但是能看到一点空白
plt.show()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-N7Ag7GcT-1673108230572)(output_26_0.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-m7U5cqXV-1673108230573)(output_26_1.png)]
'''
Matplotlib 可以根据自变量与因变量的取值范围,自动设置 x 轴与 y 轴的数值大小。当然,您也可以用自定义的方式,通过 set_xlim() 和 set_ylim() 对 x、y 轴的数值范围进行设置。
当对 3D 图像进行设置的时,会增加一个 z 轴,此时使用 set_zlim() 可以对 z 轴进行设置。
'''
import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure()
#添加绘图区域
a1 = fig.add_axes([0,0,1,1])
#准备数据
x = np.arange(1,10)
#绘制函数图像
a1.plot(x, np.exp(x))
#添加题目
a1.set_title('exp')
plt.show()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZxcWFk5d-1673108230573)(output_27_0.png)]
'''
第二种:自定义设置,set_xlim() 将 x 轴的数值范围设置为(0到10); set_ylim() 将 y 轴的范围设置为(0到10000)
'''
import matplotlib.pyplot as plt
fig = plt.figure()
a1 = fig.add_axes([0,0,1,1])
import numpy as np
x = np.arange(1,10)
a1.plot(x, np.exp(x),'r')
a1.set_title('exp')
#设置y轴
a1.set_ylim(0,10000)
#设置x轴
a1.set_xlim(0,10)
plt.show()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hGtIUyas-1673108230574)(output_28_0.png)]
刻度
'''
一、未设置横纵坐标轴刻度(默认情况下)
'''
# 修改x轴与y轴的刻度
import matplotlib.pyplot as plt
lst1 = list(range(0,15))
lst2 = list(range(15,30))
plt.plot(lst1,lst2)
plt.show()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VjUox2ho-1673108230574)(output_30_0.png)]
'''
此时上图中的坐标轴刻度间距为2
二、修改坐标轴刻度
通过添加以下代码对坐标轴刻度进行修改
'''
from pylab import xticks,yticks,np
# 修改横坐标的刻度
xticks(np.linspace(0,15,16,endpoint=True))
# 修改纵坐标的刻度
yticks(np.linspace(15,30,16,endpoint=True))
([,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
],
[Text(0, 0, ''),
Text(0, 0, ''),
Text(0, 0, ''),
Text(0, 0, ''),
Text(0, 0, ''),
Text(0, 0, ''),
Text(0, 0, ''),
Text(0, 0, ''),
Text(0, 0, ''),
Text(0, 0, ''),
Text(0, 0, ''),
Text(0, 0, ''),
Text(0, 0, ''),
Text(0, 0, ''),
Text(0, 0, ''),
Text(0, 0, '')])
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dWVZTEX2-1673108230575)(output_31_1.png)]
# 修改x轴与y轴的刻度
import matplotlib.pyplot as plt
from pylab import xticks,yticks,np
lst1 = list(range(0,15))
lst2 = list(range(15,30))
"""
linspace()中四个参数的意义:
第一个参数为坐标的起始位置
第二个参数为坐标的终止位置
第三个参数为将坐标分成多少份(该例中将0-15分成了16份,每刻度为1)
第四个参数为是否取最后一个点(默认是endpoint=False左开右闭)
"""
# 修改横坐标的刻度
xticks(np.linspace(0,15,16,endpoint=True))
# 修改纵坐标的刻度
yticks(np.linspace(15,30,16,endpoint=True))
plt.plot(lst1,lst2)
plt.show()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VUmuNpjR-1673108230575)(output_32_0.png)]
添加坐标轴
#第一种方法:
import numpy as np
import matplotlib.pyplot as plt
x=np.arange(2,20,1)
y1=x
y2=np.log(x)
plt.plot(x,y1)
plt.twinx()
plt.plot(x,y2,'r')
plt.show()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lbfVhcSe-1673108230576)(output_34_0.png)]
#第二种方法:
import numpy as np
import matplotlib.pyplot as plt
x=np.arange(2,20,1)
y1=x
y2=np.log(x)
fig=plt.figure()
ax1=fig.add_subplot(111)
ax1.plot(x,y1)
ax1.set_ylabel('Y1')
ax2=ax1.twinx()
ax2.plot(x,y2,'r')
ax2.set_ylabel('Y2')
ax1.set_xlabel('Compare Y1 and Y2')
plt.show()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0RlHxH8o-1673108230576)(output_35_0.png)]
添加注释
'''
1.添加文本标签 plt.text()
用于在绘图过程中,在图像上指定坐标的位置添加文本。需要用到的是plt.text()方法。
其主要的参数有三个:
plt.text(x, y, s)
其中x,y表示传入点的x和y轴坐标。s表示字符串。
需要注意的是,这里的坐标,如果设定有xticks、yticks标签,则指的不是标签,而是绘图时x、轴的原始值。
因为参数过多,不再一一解释,根据代码学习其用法。
ha='center’表示垂直对齐方式居中,fontsize=30表示字体大小为30,rotation=-25表示旋转的角度为-25度。c设定颜色,alpha设定透明度。
va表示水平对齐方式。
下边的代码在图像中添加了两段文本,一段是“股市有风险,投资需谨慎”的斜体水印,透明度为0.4。
另一段是在折线的每个折点附近标出当天收盘价
'''
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
x = range(9)
y = [5.12, 5.15, 5.13, 5.10, 5.2, 5.25, 5.19, 5.24, 5.31]
c = 0.5 * (min(x) + max(x))
d = min(y) + 0.3 * (max(y)-min(y))
# 水印效果
plt.text(c, d, '股市有风险,入市需谨慎', ha='center', fontsize=30, rotation=-25, c='gray', alpha=0.4)
plt.plot(x, y, label='股票A收盘价', c='r', ls='-.', marker='D', lw=2)
plt.xticks(x, [
'2022-03-27', '2022-03-28', '2022-03-29', '2022-03-30',
'2022-03-31', '2022-04-01', '2022-04-04', '2022-04-05',
'2022-04-06'], rotation=45)
plt.title('某股票收盘价时序图')
plt.xlabel('日期')
plt.ylabel('价格')
plt.grid(True)
plt.legend()
# 标出每天的收盘价
for a, b in zip(x, y):
plt.text(a, b+0.01, '%.1f'%b, ha='center', va='bottom', fontsize=9)
plt.show()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6LubmuP4-1673108230577)(output_37_0.png)]
'''
2. 添加注释 plt.annotate()
在上例代码的基础之上,添加注释。注释即对图像中某一位置的解释,可以用箭头来指向。
添加注释使用的是plt.annotate()方法
其语法中的常用参数如下
plt.annotate(str,xy,xytext,xycoords,arrowcoords)
其中str即注释要使用的字符串,即注释文本
xy指被注释的坐标点
xytext指注释文本要写在的位置
xycoords是被注释的点的坐标系属性,即以什么样的方式描述该点的坐标。设置值默认为"data",即用(x,y)坐标来描述。其他可以选择的设置值如下,其中figure指的是整个画布作为一个参考系。而axes则表示仅对于其中的一个axes对象区域。
设置值 描述
data 默认值,表示被注释点的(x,y)坐标
figure points 以绘图区的左下角为坐标原点,单位是点数
figure pixels 以绘图区的左下角为坐标原点,单位是像素数
figure fraction 以绘图区的左下角为坐标原点,单位是百分比
axes points 以绘图区的左下角为坐标原点,单位是点数
axes pixels 以绘图区的左下角为坐标原点,单位是像素数
axes fraction 以绘图区的左下角为坐标原点,单位是百分比
polar 不使用本地数据坐标系,使用极坐标描述。
arrowprops是一个字典,用来设置箭头的属性。写在这个字典之外的参数都表示的是注释文本的属性。
字典内可以设置的值有
设置值 描述
width 箭头的宽度(非头部)
headwidth 箭头头部的宽度
headlength 箭头头部的长度
facecolor 箭头的颜色
shrink 箭头两端收缩的百分比(占总长)
? 任何matplotlib.patches.FancyArrowPacth中的关键字
关于这些参数的进一步解释:其中箭头的总长度先是通过被注释点位置坐标 与 注释文本位置坐标 所决定的,可以通过调节参数arrowprops中的shrink键来进一步调节箭头的长度,shrink表示将箭头缩短的长度占总长度(被注释点位置坐标 与 注释文本位置坐标 决定的长度)的百分比。当不设定shrink时,shrink默认为0,即不缩短。当shrink很大,接近1时,其效果等同于不缩短。
以标出图中的最低价的点为例。在目标位置添加一个红色的箭头,及“最低价”三个字。
其他更多参数,如关于设置注释文本的字体的,c或color表示颜色,fontsize表示字体大小。更多属性自行了解尝试。
'''
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
x = range(9)
y = [5.12, 5.15, 5.13, 5.10, 5.2, 5.25, 5.19, 5.24, 5.31]
c = 0.5 * (min(x) + max(x))
d = min(y) + 0.3 * (max(y)-min(y))
# 仿水印效果
plt.text(c, d, '股市有风险,入市须谨慎', ha='center', fontsize=30, rotation=-25, c='gray', alpha=0.4)
plt.plot(x, y, label='股票A收盘价', c='r', ls='-.', marker='D', lw=2)
# plt.plot([5.09, 5.13, 5.16, 5.12, 5.09, 5.25, 5.16, 5.20, 5.25], label='股票B收盘价', c='g', ls=':', marker='H', lw=4)
plt.xticks(x, [
'2022-03-27', '2022-03-28', '2022-03-29', '2022-03-30',
'2022-03-31', '2022-04-01', '2022-04-04', '2022-04-05',
'2022-04-06'], rotation=45)
plt.title('某股票收盘价时序图')
plt.xlabel('日期')
plt.ylabel('价格')
plt.grid(True)
plt.legend()
# 标出每天的收盘价
for a, b in zip(x, y):
plt.text(a, b+0.01, '%.1f'%b, ha='center', va='bottom', fontsize=9)
# 添加注释
plt.annotate('最低价', (x[y.index(min(y))],min(y)), (x[y.index(min(y))] + 0.5, min(y)), xycoords='data',
arrowprops=dict(facecolor='r', shrink=0.1), c='r',fontsize=15)
plt.show()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CbiOUmKY-1673108230577)(output_38_0.png)]
'''
下边换一种效果呈现,将提示语“股市有风险,入市需谨慎”
字体调大到50,不透明。添加的注释箭头宽度为3,箭头的头部宽度为10,长度为20
,缩短0.05,且箭头为绿色,注释字体为红色。代码示例如下
'''
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
x = range(9)
y = [5.12, 5.15, 5.13, 5.10, 5.2, 5.25, 5.19, 5.24, 5.31]
c = 0.5 * (min(x) + max(x))
d = min(y) + 0.3 * (max(y)-min(y))
plt.plot(x, y, label='股票A收盘价', c='k', ls='-.', marker='D', lw=2)
plt.xticks(x, [
'2022-03-27', '2022-03-28', '2022-03-29', '2022-03-30',
'2022-03-31', '2022-04-01', '2022-04-04', '2022-04-05',
'2022-04-06'], rotation=45)
plt.title('某股票收盘价时序图')
plt.xlabel('日期')
plt.ylabel('价格')
plt.grid(True)
plt.legend()
# 标出每天的收盘价
for a, b in zip(x, y):
plt.text(a, b+0.01, '%.1f'%b, ha='center', va='bottom', fontsize=9)
plt.text(c, d, '股市有风险,入市须谨慎', ha='center', fontsize=50, rotation=-25, c='r')
plt.annotate('最低价', (x[y.index(min(y))], min(y)), (x[y.index(min(y))] + 2, min(y)), xycoords='data',
arrowprops=dict(width=3,headwidth=10,headlength=20, facecolor='g',shrink=0.05), c='r',fontsize=20)
plt.show()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JdUiySqs-1673108230578)(output_39_0.png)]
csdn参考学习网址:https://mp.weixin.qq.com/s?__biz=MzUyNTgzNDc3MQ==&mid=2247485105&idx=1&sn=d3a8ac128916c6980f1bc68b3826d597&chksm=fa1949cdcd6ec0dbfcb945e5655151b10f277fbba2d056dd1b24ba562cddac9c73c0ac6622db&scene=21#wechat_redirect
sourceTree:
requirements.txt 操作
在做好一个项目时,项目所用到的包可以打包成一个txt文件
是用于记录所有依赖包及其精确的版本号。
使用方法:
1、命令:pip install -r requirements.txt(执行requiements文件中记录的依赖包版本号)
2、pip freeze > requirements.txt自动生成requirement.txt(在依赖包所在环境生成requiements文件,便便记录以及将依赖包环境传递给别人配置环境)
r 读,文件不存在则报错
w 写,若文件存在则覆盖重写,若文件不存在则新建
a 写,若文件不存在,则新建;如果文件存在,则在文件尾追加要写的内容
r+ 读写,文件不存在则报错
w+ 读写,若文件存在则覆盖重写,若文件不存在则新建
a+ 读写,若文件不存在,则新建;如果文件存在,则在文件尾追加要写的内容
b 以二进制模式打开文件
io.read()参数
参数 作用
“*n” 读取一个数字并返回它
“*a” 从当前位置读取整个文件
“*l”(默认) 读取下一行,在文件尾 处返回 nil
number 返回一个指定字符个数的字符串,在 EOF 时返回 nil
io的其他用法
方法 作用
io.tmpfile() 返回一个临时文件句柄,该文件以更新模式打开,程序结束时自动删除
io.type(file) 检测obj是否一个可用的文件句柄
io.flush() 向文件写入缓冲中的所有数据
io.lines(optional file name) 返回一个迭代函数,每次调用将获得文件中的一行内容,当到文件尾时,将返回nil,但不关闭文件