我的技能树

python

预备知识


基础语法


进阶语法

1.列表推导式

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)])



2.三元表达式

语法格式为:
​ 表达式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循环前面

3.断言

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)



4.with-as

​ 介绍文件操作时,一直强调打开的文件最后一定要关闭,否则会程序的运行造成意想不到的隐患。但是,即便使用 close() 做好了关闭文件的操作,如果在打开文件或文件操作过程中抛出了异常,还是无法及时关闭文件。

为了更好地避免此类问题,不同的编程语言都引入了不同的机制。在 Python 中,对应的解决方式是使用 with as 语句操作上下文管理器(context manager),它能够帮助我们自动分配并且释放资源。

​ 通常用来操作文件

​ with as 语句的基本语法格式为:

	with 表达式 [as target]:
  				代码块

列子:

with open('a.txt', 'a') as f:
    f.write("\nPython教程")

5.异常捕获预处理

​ .异常的概念

异常相较于错误而言,是正常情况下出现的不正常现象,程序出现的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)

6.字符串方法

方法描述
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 值。

7.文件
1 操作文件的函数/方法

在Python中操作文件需要记住1个函数和3个方法

序号函数/方法说明
1open打开文件,并返回文件操作对象
2read将文件内容读取到内存
3write将指定内容写入到文件
4close关闭文件

open() 函数负责打开文件,并返回文件对象

read/write/close三个方法都需要通过文件对象来调用

2 read方法——读取文件

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
 """
3 打开文件的方式

语法如下:

f = open( " 文件名 " , " 访问方式 " )

img

提示:频繁的移动指针,会影响文件读写效率,开发中更多的时候会以 只读、只写 的方式来操作文件

4 按行读取文件内容

read方法默认会把文件的所有内容一次性读到内存

如果文件太大,对内存的占用会非常严重

readline 方法:

可以一次读取一行内容

方法执行后,会把指针移动到下一行,准备再次读取

读取大文件的正确姿势:

#打开文件
file = open("sis.txt")
while True:
    #读取一行内容
    text = file.readline()
    #判断是否读取到内容
    if text == "":          #或者 if not text:
        print(type(text))   #<class 'str'>
        break
    #每读取到末尾都会有一个 \n
    print(text,end="")
"""
运行结果:
python1一
python2二
python3三
python4四<class 'str'>
"""
5 文件读写案例——复制文件
#复制小文件方式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()
6 目录的常用管理操作
  • 在 终端/文件浏览 中可以执行常规的 文件/目录 管理操作,例如

创建、重命名、删除、改变路劲、查看目录内容…

  • 在Python中如果希望通过程序实现上述功能,需要导入 os 模块

文件操作:

img

目录操作:

img

7 拓展:eval函数

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 的结果

8.常用标准库
文本类
string:通用字符串操作
re正则表达式操作
difflib差异计算工具
textwrap文本填充
unicodedataUnicode字符数据库
stringprep互联网字符串准备工具
readlineGNU按行读取接口
rlcompleterGNU按行读取的实现函数
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生成临时文件与目录
globUnix风格路径名格式的扩展
fnmatchUnix风格路径名格式的比对
linecache文本行的随机存储
shutil高级文件操作
macpathMacOS 9路径控制函数
持久化
picklePython对象序列化
copyreg注册机对pickle的支持函数
shelvePython对象持久化
marshal内部Python对象序列化
dbmUnix“数据库”接口
sqlite3针对SQLite数据库的API2.0
压缩
zlib兼容gzip的压缩
gzip对gzip文件的支持
bz2对bzip2压缩的支持
lzma使用LZMA算法的压缩
zipfile操作ZIP存档
tarfile读写tar存档文件
加密
hashlib安全散列与消息摘要
hmac针对消息认证的键散列
操作系统工具
os多方面的操作系统接口
io流核心工具
time时间的查询与转化
argparser命令行选项、参数和子命令的解析器
optparser命令行选项解析器
getoptC风格的命令行选项解析器
loggingPython日志工具
logging.config日志配置
logging.handlers日志处理器
getpass简易密码输入
curses字符显示的终端处理
curses.textpadcurses程序的文本输入域
curses.asciiASCII字符集工具
curses.panelcurses的控件栈扩展
platform访问底层平台认证数据
errno标准错误记号
ctypesPython外部函数库
并发
threading:基于线程的并行
multiprocessing基于进程的并行
concurrent并发包
concurrent.futures启动并行任务
subprocess子进程管理
sched事件调度
queue同步队列
select等待I / O完成
dummy_threadingthreading模块的替代(当_thread不可用时)
_thread底层的线程API(threading基于其上)
_dummy_thread:thread模块的替代(当_thread不可用时)
进程间通信
socket:底层网络接口
sslsocket对象的TLS / SSL填充器
asyncore异步套接字处理器
asynchat异步套接字命令 / 响应处理器
signal异步事务信号处理器
mmap内存映射文件支持
互联网
email邮件与MIME处理包
jsonJSON编码与解码
mailcapmailcap文件处理
mailbox多种格式控制邮箱
mimetypes文件名与MIME类型映射
base64RFC3548:Base16、Base32、Base64编码
binhexbinhex4文件编码与解码
binascii二进制码与ASCII码间的转化
quopriMIMEquoted - printable数据的编码与解码
uuuuencode文件的编码与解码
9字符编码与解码

​ 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

安装和更新 setuptools 的最简单方法是使用 pip

  1.  `$ sudo python -m pip install --upgrade setuptools`
    
    
    示例库
    
    

创建了一个简单的 Python 库,名为 myhellolib,来作为需要打包的示例代码。这个库接受一个字符串,然后用大写字母打印出这个字符串。

它只有两行代码,但项目结构很重要,所以首先创建目录树:

  1. $ mkdir -p myhellolib.git/myhellolib
    

为了确认这个项目是一个可导入的库(即 Python “模块”),在代码目录中创建一个空文件 __init__.py,同时创建一个包含代码的文件:

  1. 1. `$ touch myhellolib.git/myhellolib/__init__.py`
    2. `$ touch myhellolib.git/myhellolib/myhellolib.py`
    

myhellolib.py 文件中,输入简单的 Python 代码:

  1. 1. `def greeter(s):`
    2. `print(s.upper())`
    

这就是写好的库。

测试它

在打包之前,测试一下你的库。创建一个 myhellolib.git/test.py 文件并输入以下代码:

  1. 1. `import myhellolib.myhellolib as hello`
    2. `hello.greeter("Hello Opensource.com.")`
    

运行该脚本:

  1. 1. `$ cd myhellolib.git`
    2. `$ python ./test.py`
    3. `HELLO OPENSOURCE.COM`
    

它可以工作,所以现在你可以把它打包了。

Setuptools

要用 setuptools 打包一个项目,你必须创建一个 .toml 文件,将 setuptools 作为构建系统。将这段文字放在项目目录下的 myhellolib.toml 文件中。

    1. [build-system]
    2. requires = ["setuptools", "wheel"]
    3. build-backend = "setuptools.build_meta"

接下来,创建一个名为 setup.py 的文件,包含项目的元数据:

  1. `

    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

要创建你的 Python 包,你需要一个构建器。一个常见的工具是 build,你可以用 pip 安装它:

  1. 1. `$ python -m pip install build --user`
    

    构建你的项目:

  2. $ python -m build

过了一会儿,构建完成了,在你的项目文件夹中出现了一个新的目录,叫做 dist。这个文件夹包含一个 .tar.gz 和一个 .whl 文件。

这是你的第一个 Python 包! 下面是包的内容:

  1. 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 来安装它,就像你在这篇文章中安装 setuptoolsbuild 一样!

网络编程
发送邮件

web应用开发

web开发基础知识
django

笔记: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

Tornado
Flask

网络爬虫

  • urllib
  • 正则表达式
  • Beautful Soup
  • lxml
  • requsests
  • Selenium
  • Scrapy框架
  • pyspider框架的使用
  • 验证码处理
  • 动态渲染页面爬取
  • 模拟登陆
  • autoscraper
  • selectolax
  • requests-html

桌面应用开发

Tkinter
pyqt

pyqt的安装使用:见csdn链接:https://blog.csdn.net/wenshuang1234/article/details/126861112?spm=1001.2014.3001.5501

wxpython

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({

/**

  • 点击绑定的事件
    */
    clickMe:function(e){
var nid = e.currentTarget.dataset.nid;
console.log(nid);

}
})
5.2 页面跳转

wx.navigateTo({

url: '/pages/redirect/redirect?id='+nid

})
跳转到的页面如果想要接受参数,可以在onLoad方法中接受。

redirect.js

Page({
/**

  • 生命周期函数–监听页面加载
    */
    onLoad: function (options) {
console.log(options);

}
})
5.3 通过标签跳转

跳转到新页面
6.数据绑定

``` ... ```
<div id="content"></div>
<script>
    var name = "李业迟到";
    $('#content').val(name);
</script>
vue.js ```
{{message}}
```
<script>
    new Vue({
      el: '#app',
      data: {
        message: '老男孩教育Python'
      }
    })
</script>
6.1 基本显示

wxml

数据1:{{message}}
展示数据

// pages/bind/bind.js
Page({

/**

  • 页面的初始数据
    */
    data: {
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({

/**

  • 页面的初始数据
    */
    data: {
  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
    })
  }
})

},
/**

  • 生命周期函数–监听页面加载
    /
    onLoad: function (options) {

    },

    /
    *
  • 生命周期函数–监听页面初次渲染完成
    /
    onReady: function () {

    },

    /
    *
  • 生命周期函数–监听页面显示
    /
    onShow: function () {

    },

    /
    *
  • 生命周期函数–监听页面隐藏
    /
    onHide: function () {

    },

    /
    *
  • 生命周期函数–监听页面卸载
    /
    onUnload: function () {

    },

    /
    *
  • 页面相关事件处理函数–监听用户下拉动作
    /
    onPullDownRefresh: function () {

    },

    /
    *
  • 页面上拉触底事件的处理函数
    /
    onReachBottom: function () {

    },

    /
    *
  • 用户点击右上角分享
    */
    onShareAppMessage: function () {

    }
    })

注意事项:

想要获取用户信息,必须经过用户授权(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
一 ,查看数据库,表
1.查看当前数据库
mysql> show databases;

+--------------------+
| Database           |
+--------------------+
| django             |
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
2.查看数据库中包含的表
mysql> show tables;
+------------------+
| Tables_in_django |
+------------------+
| class            |
| student          |
| teacher          |
| teacher2class    |
+------------------+
2 - 查看表的结构
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:

数据控制语言,用于设置或者数据库用户或者角色权限

三,创建,删除新的数据库
1创建新的数据库
mysql> create database newdata;
Query OK, 1 row affected (0.03 sec)
mysql> **show databases;**
+--------------------+
| Database           |
+--------------------+
| django             |
| information_schema |
| mysql              |
| newdata            |
| performance_schema |
| sys                |
+--------------------+
2创建新的表
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             |
+-------------------+
3删除指定的库:
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                |
+--------------------+
4删除指定的表:
mysql> drop table banji;
Query OK, 0 rows affected (0.03 sec)
5向数据表中插入新数据:
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  |
+----+--------+------+------+
6查询数据记录
mysql> select name,sex from banji where id=1;
+--------+------+
| name   | sex  |
+--------+------+
| liuwei | nan  |
+--------+------+
7以列表形式竖向显示
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
8只显示前2行数据
 mysql> select * from banji limit 2;
+----+---------+------+------+
| id | name    | age  | sex  |
+----+---------+------+------+
|  1 | liuwei  |   24 | nan  |
|  2 | xiaohua |   14 | mv   |
+----+---------+------+------+
9显示第一行后的前一行
mysql> select * from banji limit 1,1;
+----+---------+------+------+
| id | name    | age  | sex  |
+----+---------+------+------+
|  2 | xiaohua |   14 | mv   |
+----+---------+------+------+
四,修改,更新数据表中的数据记录
1修改数据
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   |
+----+---------+------+------+
2删除表的全部数据
delete from banji;
五,修改表名和表结构
1修改表名
mysql> alter table banji rename banji2;
Query OK, 0 rows affected (0.03 sec)

mysql> **show tables;**
+-------------------+
| Tables_in_newdata |
+-------------------+
| banji2            |
+-------------------+
2扩展表结构
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   | 地址不详     |
+----+---------+------+------+--------------+
3修改字段(列)名,添加唯一键
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    |       |
+-----------+----------+------+-----+---------+-------+
4添加唯一键
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    |       |
+-----------+----------+------+-----+---------+-------+
5删除地段:
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    |       |
+-------+----------+------+-----+---------+-------+
6分组查询:

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)
六,方式
1内连接
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 |
+------+----------+------+
2左连接
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 |
+------+----------+------+
3右链接
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 |
+------+----------+------+
redis
3多种数据结构
  1. str:字符串类型 - 接口缓存

  2. list:列表 - 分布式

  3. hash:哈希(相当于Python中的字典) - 缓存

  4. set:集合 - 去重

  5. zset:有序的 - 排行榜

常用的redis命令
  1. keys* 查看当前库所有key(匹配:keys*1)

  2. exists key 判断某个key是否存在

  3. type key 查看你的key是什么类型

  4. del key 删除指定的key数据

  5. unlink key 根据value选择非阻塞删除

  6. 仅将 keys 从 keyspace元数据中删除,真正的删除会在后续异步操作

  7. expire key 10 10秒钟:为给定的key设置过期时间

  8. ttl key 查看还有多少秒过期,-1表示永不过期,-2表示已经过期

  9. select 命令切换数据库

  10. dbsize 查看当前数据库的key数量

  11. flushdb 清空当前库

  12. flushall 通杀全部库

二、常用的五大数据类型

Redis字符串(String)最大512MB
  1. 添加 set key value

  2. 查看 get key

  3. append key value 将给定的value追加到原值的末尾

  4. strlen key 获得值的长度

  5. setnx key value 只有在key不存在时 设置key的值

  6. incr key 将key中存储的数字值增1,只能对数字值操作,如果为空,新增值为1

  7. decr key 将key中存储的数字值减1

  8. incrby / decrby key 步长 将key中存储的数字值增减。自定义步长(redis中incr是原子性操作,单线程的)

  9. mset key1 value1 key2 value2 同时设置一个或多个 key-value对

  10. mget key1 key2 key3 同时获取一个或多个value

  11. msetnx key1 value1 key2 value2 当且仅当所有key不存在 (原子性:又一个失败都失败)

  12. getrange key 起始位置 结束位置 全闭

Redis列表(List)
  1. lpush/rpush key value1 value2 vaule3 从左边/右边插入一个或多个值

  2. lpop/rpop key 从左边/右边吐出一个值。值在健在,值光键亡

  3. rpoplpush key1 key2 从key1列表右边吐出一个值,插到key2列表左边

  4. lrange key start stop

Redis集合(Set)set无序排重
  1. sadd key value1 value2… 将一个或多个member元素加入到集合key中,已经存在的member元素将被忽略

  2. smembers key 取出该集合的所有值

  3. sismember key value 判断集合key是否含有该value值,有1,没有0

  4. scard key 返回该集合的元素个数

  5. srem key value1 value2 删除集合中的某个元素

  6. spop key 随机从该集合中吐出一个值

  7. srandmember key n 随机从该集合取出n个值。不会从集合中删除

  8. smove source destination value 把集合中一个值从一个集合移动到另一个集合

Redis哈希(Hash)
  1. hset key field value 给key集合中的 field键赋值value

  2. hget key1 filed 从key1集合field取出value

  3. hmset key1 field1 value1 field2 value2 批量设置hash的值

  4. hexists key1 field 查看哈希表 key 中,给定域 field是否存在

  5. hkeys key 列出该hash集合的所有field

  6. hvals key 列出该hash集合的所有value

  7. hincrby key field increment 为哈希表 key 中的域field的值加上增量1 -1

  8. hsetnx key field value 将哈希表key中的域field的值设置为value,当且仅当域field不存在

Reids有序集合Zset
  • 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安装教程
启动的3种方式
①最简启动

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工作目录

工具编程

numpy
  
  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]



  
pandas

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')
<bound method NDFrame.describe of    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>
                     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 <cell line: 14>()
     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)]


matplotlib
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()
<Figure size 576x432 with 0 Axes>


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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))

([<matplotlib.axis.YTick at 0x1ec21717b80>,
  <matplotlib.axis.YTick at 0x1ec216fb190>,
  <matplotlib.axis.YTick at 0x1ec21715370>,
  <matplotlib.axis.YTick at 0x1ec21843610>,
  <matplotlib.axis.YTick at 0x1ec2184b460>,
  <matplotlib.axis.YTick at 0x1ec2184bbb0>,
  <matplotlib.axis.YTick at 0x1ec21850340>,
  <matplotlib.axis.YTick at 0x1ec21850a90>,
  <matplotlib.axis.YTick at 0x1ec21850730>,
  <matplotlib.axis.YTick at 0x1ec2184b700>,
  <matplotlib.axis.YTick at 0x1ec2183a310>,
  <matplotlib.axis.YTick at 0x1ec21856610>,
  <matplotlib.axis.YTick at 0x1ec21856d60>,
  <matplotlib.axis.YTick at 0x1ec2185d4f0>,
  <matplotlib.axis.YTick at 0x1ec2185dcd0>,
  <matplotlib.axis.YTick at 0x1ec2185d8e0>],
 [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)]


代码管理工具

git

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文件,便便记录以及将依赖包环境传递给别人配置环境)

lua

文本操作

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,但不关闭文件

Python技能树是CSDN提供的一个系统化、面向实战的学习环境,旨在帮助用户从初学者成长为合格的Python工程师。技能树整理了关于Python领域的知识点,并从CSDN的海量数据中不断更新高质量内容。除了传统的阅读学习,技能树还为每个知识点提供了相应的练习题,帮助用户通过练习不断提升自己的技能,直至精通。初学者可以通过学习技能树来获得CSDN的技能认证。正在学习Python的人可以尝试技能树上的练习题,以了解自己的掌握程度。而对于Python领域的专家,他们可以给CSDN提供意见,并贡献高质量的文章。Python技能树的学习方式是通过阅读学习和练习题相结合。当然,随着人工智能时代的到来,越来越多的人开始学习Python,而Python技能树则提供了全面、详细的学习内容,包括Python基础、Python进阶、前端、数据库、django、flask、数据分析和机器学习等多个模块,帮助大家全面学习和了解Python语言123 #### 引用[.reference_title] - *1* *2* [Python之深入解析Python技能树的测评分析](https://blog.csdn.net/Forever_wj/article/details/120610403)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}} ] [.reference_item] - *3* [Python技能树](https://blog.csdn.net/CSDNedu/article/details/124011216)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值