我是靠谱客的博主 清脆钢笔,最近开发中收集的这篇文章主要介绍Python语言程序设计学习笔记Python语言程序设计学习笔记,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

Python语言程序设计学习笔记

python计算生态 = 标准库+第三方库

  • 标准库:随解释器直接安装到操作系统中的功能模块,如turtle
  • 第三方库:需要经过安装才能使用的功能模块
  • 库Library、包Package、模块Module,统称模块

注释

单行注释:以 # 开头
多行注释:以 ‘’’ 开头和结尾

数据类型

数字类型:整型和浮点型
整型

4种进制表示形式:
十进制
二进制,以0b或0B开头
八进制,以0o或0O开头
十六进制,以0x或0X开头

浮点型
  • 浮点数间运算存在不确定尾数,不是bug。因为计算机中53位二进制表示小数 ,可以无限接近,但不完全相同
  • round(x,d):对x四舍五入,d是小数截取位数
  • 浮点数间运算及比较用round()函数辅助
  • 浮点数可以采用科学计数法表示,使用字母e或E作为幂的符号,以10为基数,格式如下:<a>e<b>,表示a*10的b次方。例如4.3e-3值为0.0043
复数类型

只有python中有复数类型。
对于复数z,可用z.real获得实部,z.imag获得虚部。

数值运算操作符
  • /:除,结果是浮点数结果
  • //:整数除,结果是整数
  • 幂运算,x**y表示x的y次幂,y是小数时,表示开平方

三种类型存在一种逐渐“变宽”的关系:整数->浮点数->复数
数字类型间可以进行混合运算,生成结果为“最宽”类型,如整数+浮点数=浮点数

数值运算函数
  • pow(x,y):计算x的y次方,想算多大算多大
  • pow(x,y[,z]):幂余,计算x的y次方对z的取余
  • abs(x):计算x的绝对值
  • divmod(x,y):商余,同时输出商和余数
  • round(x[,d]):四舍五入,d是保留小数位数,默认值为0
  • max(x1,x2,x3…xn):求最大值
  • min(x1,x2,x3…xn):求最小值
  • int(x):将x变成整数,舍弃小数部分
  • float(x):将x变成浮点数,增加小数部分
  • complex(x):将x变成复数,增加虚数部分
字符串类型
  • 由一对单引号或一对双引号表示(没区别)。字符串类型的一对引号仅在程序内部使用,输出无引号
  • 字符串是字符的有序序列,可以对其中的字符进行索引
  • 字符串中的序号是从0开始的,而不是从1开始的
  • 对于字符串的序号,python语言提供了两种索引体系:正向递增序号(第一个字符的序号为0,后面的依次递增)、反向递减序号(最后一个字符的序号为-1,往前依次递减)
字符串的使用

索引: <字符串>[M],返回字符串中序号为M的单个字符。
切片: <字符串>[M:N] ,返回字符串中序号从M开始但不到N的字符子串,M缺失表示至开头,N缺失表示至结尾
根据步长K切片:<字符串>[M:N:K] ,步长为负数时表示逆序

字符串类型的表示

字符串有2类共4种表示方法(方便处理字符串中出现单引号或双引号的情况)

  • 由一对单引号或双引号表示,仅表示单行字符串
  • 由一对三单引号或三双引号表示,可表示多行字符串
字符串的特殊字符

转义符 :表达特殊字符的本意
转义符可以形成一些组合,表达一些不可打印的含义,如:"b"回退 "n"换行 "r"回车(光标移动到本行首)

字符串操作符
  • x + y :连接两个字符串x和y
  • n * x 或 x * n : 复制n次字符串x
  • x in s:如果 x 是 s 的子串,返回True,否则返回False
字符串处理函数
  • len(x):返回字符串的长度
  • str(x):任意类型x所对应的字符串形式(相当于加" ")
  • hex(x)或oct(x):整数x的十六进制或八进制小写形式字符串
  • chr(x):u为Unicode编码,返回其对应的字符
  • ord(x):x为字符,返回其对应的Unicode编码
    Unicode编码是Python字符串的编码方式,该编码方式是统一字符编码,即覆盖几乎所有字符的编码方式,Python字符串中每个字符都是Unicode编码字符。
字符串处理方法
  • str.lower()或str.upper():返回字符串的副本,全部字符小写/大写
    如:“aAzQ”.lower()结果为"aazq"
  • str.split(sep=None):返回一个列表,由str根据sep被分割的部分组成
    如:“A,B,C”.split(“,”)的结果为[‘A’, ‘B’, ‘C’]
  • str.count(sub):返回子串sub在str中出现的次数
    如:“an apple a day”.count(“a”)的结果为4
  • str.replace(old,new):返回字符串str副本,所有old字串被替换为new
    如:“ab”.replace(“b”,“bcdefg”)的结果为’abcdefg’
  • str.center(width,[,filllchar]):字符串str根据宽度width居中,fillchar可选
    如:“hello”.center(20,“-”) 结果为 ‘-------hello--------’
  • str.strip(chars):从str中去掉在其左侧和右侧chars中列出的字符
    如:" = hello “.strip(” =o")的结果为’hell’
  • str.join(iter):在iter变量除最后元素外每个元素后增加一个str(主要用于字符串分隔等)
    如:“,”.join(“12345”)的结果为’1,2,3,4,5’
字符串类型的格式化

格式化是对字符串进行格式表达的方式。
字符串格式化使用.format()方法,用法为<模板字符串>.format(<逗号分隔的参数>)
槽内部对格式化的配置方式:{<参数序号> : <格式控制标记>}

<填充><对齐><宽度><,><.精度><类型>
引导符号用于填充的单个字符<(左对齐);>(右对齐);^(居中对齐)槽设定的输出宽度数字的千位分隔符浮点数小数精度或字符串最大输出长度整数类型b,c,d,o,x,X;浮点数类型e,E,f,%
列表类型
  • 由0个或多个数据组成的有序序列
  • 列表使用 [] 表示,采用逗号分隔各元素
  • 使用保留字 in 可以判断一个元素是否在列表中,返回结果为True 或 False

输入和输出

输入:<变量> = input(<提示信息字符串>),用户输入的信息以字符串类型保存在<变量>中
输出:print(<拟输出字符串或字符串变量>)
print函数的格式化:
例: print(“转换后的温度是{:.2f}F”.format(F)),其中
{}表示槽,后续变量填充到槽中,槽只用在字符串中;
{:.2f}表示将变量F填充到这个位置时取小数点后2位

函数

eval():去掉参数最外侧引号并执行余下语句的函数

turtle库的使用

  • turtle.setup(width,height,startx,starty):设置窗体大小及位置,后两个参数可选,该函数不是必须的

turtle空间坐标体系:

  • 绝对坐标 turtle.goto(x,y)
  • 海龟坐标(右前左上左下右) turtle.fd(d) turtle.bk(d) turtle.circle(r,angle)

turtle角度坐标体系:

  • x轴正方向为0/360度,y轴正方向为90/-270度
  • turtle.seth(angle):改变海龟行进方向,但不前进,angle为绝对度数
  • turtle.left(angle)
  • turtle.right(angle)

画笔控制函数:
turtle.penup(),别名turtle.pu() 抬起画笔,海龟在飞行
turtle.pendown(),别名turtle.pd() 落下画笔,海龟在爬行。这两个函数是成对出现的
turtle.pensize(width) 别名turtle.width(width) 画笔宽度,海龟的腰围
turtle.pencolor(color) color为颜色字符串或r,g,b值 画笔颜色,海龟在涂装,如:turtle.pencolor(“purple”) 、 turtle.pencolor(0.63,0.13,0.94)、turtle.pencolor((0.63,0.13,0.94))

运动控制函数:控制海龟行进
走直线:turtle.forward(d) 别名turtle.fd(d) 向前行进,海龟走直线。d为行进距离,可以为负数
走曲线:turtle.circle(r,extent=None),根据半径r绘制extent角度的弧形,角度默认为360度,r可以为负数,表示向左

方向控制函数:控制海龟面对方向,而并不行动
绝对角度:
turtle.setheading(angle),别名turtle.seth(angle)
海龟角度:
turtle.left(angle)
turtle.right(angle)

循环语句:
for <变量> in range(<参数>)
<被循环执行的语句>
<变量>表示每次循环的计数,0到<次数>-1
range()函数:
产生0到N-1的整数序列,共N个:range(N)
产生M到N-1的整数序列,共N-M个:range(M,N)

turtle.done()函数如果在代码的最后出现,那么程序运行结束之后需要手动退出,如果没有,则会自动退出

print函数中,将拟输出的各种信息之间用逗号分隔,输出之后各种信息之间会有空格

time库

基本介绍

time库是Python中处理时间的标准库,可进行计算机时间的表达、提供获取系统时间并格式化输出功能、提供系统级精确计时功能,用于程序性能分析
import time
time.<b>()

时间获取
  • time():获取当前时间戳,即计算机内部时间值,浮点数
  • ctime():获取当前时间并以易读方式表示,返回字符串
  • gmtime():获取当前时间,表示为计算机可处理的时间格式
时间格式化

将时间以合理的方式展示出来

  • strftime(tpl,ts):tpl是格式化模板字符串,用来定义输出效果,t是计算机内部时间类型变量
import time
t = time.gmtime()
time.strftime("%Y-%m-%d %H:%M:%S",t)
格式化字符串日期/时间说明
%Y年份
%m月份
%B月份英文名称
%b月份英文名称缩写
%d日期
%A星期(英文)
%a星期缩写
%H小时(24h制)
%h小时(12h制)
%p上/下午
%M分钟
%S
  • strptime(str,tpl):str是字符串形式的时间值,tpl是格式化模板字符串,用来定义输入效果
程序计时应用
  • sleep(s):产生时间,s是拟休眠的时间,单位是秒,可以是浮点数
  • perf_counter():测量时间,返回一个CPU级别的精确时间计数值,单位为秒。由于这个计数值起点不确定,连续调用差值才有意义

程序的控制结构

单分支结构
if <条件><语句块>
二分支结构
if <条件><语句块1>
else:
   <语句块2>

紧凑形式(适用于简单表达式的二分支结构):

<表达式1> if <条件> else <表达式2>
多分支结构
if <条件><语句块1>
elif:
   <语句块2>
   ...
else:
   <语句块2>
条件判断及组合

用于条件组合的三个保留字:
逻辑与 and
逻辑或 or
逻辑非 not

程序的异常处理
try :
  <语句块1>
expect <异常类型>:
  <语句块2>

其中<异常类型>可省略
异常处理的高级使用:

try :
  <语句块1>
expect :
  <语句块2>
else :
  <语句块3>
finally :
  <语句块4>

finally对应的语句块4一定执行,else对应的语句块3在不发生异常时执行

程序的循环结构

遍历循环
for <循环变量> in <遍历结构><语句块>

计数循环:

for i in range(N)#遍历由range()函数产生的数字序列,产生循环
	<语句块>
for i in range(M,N,K)#遍历由range()函数产生的由M到N,步长为K的数字序列,产生循环
	<语句块>

字符串遍历循环:

for c in s : #s是字符串,遍历字符串每个字符,产生循环
	<语句块>

列表遍历循环:

for item in ls: #ls是一个列表,遍历其每个元素,产生循环
	<语句块>

文件遍历循环:

for line in fi: #fi是一个文件标识符,遍历其每行,产生循环
	<语句块>
无限循环

while语句

循环控制保留字

bresk
continue

循环的高级用法

循环与else:
当循环没有被break语句退出时,执行else语句块。else语句块作为“正常”完成循环的奖励。

random库的使用

random库是使用随机数的Python标准库

import random
基本随机数函数
  • seed() 初始化给定的随机数种子,默认为当前系统时间
  • random() 生成一个[0.0,1.0]之间的随机小数
扩展随机数函数
  • randint(a,b) 生成一个[a,b]之间的整数
  • getrandbits(k) 生成一个k比特长的随机整数
  • uniform(a,b) 生成一个[a,b]之间的随即小数
  • randrange(m,n[,k]) 生成一个[m,n]之间的以k为步长的随机整数
  • choice(seq) 从序列seq中随机选择一个元素
  • shuffle(seq) 将序列seq中元素随机排列,返回打乱后的序列

函数和代码复用

函数的定义与使用
#函数的定义
def <函数名><参数>):  #参数0个或多个
	<函数体>
	return <返回值>
  • 函数的参数分为 非可选参数 和 可选参数。
  • 函数定义时可以为为某些参数指定默认值,构成可选参数,可选参数必须 在非可选参数之后,
  • 函数定义时可以设计可变数量参数,即不确定参数总数量,定义时在参数后加 *b
  • 函数调用时,参数可以按照位置或名称方式传递
  • return保留字用来传递返回值,可传递0个或多个返回值(逗号分隔)。函数值可以有返回值,也可以没有,可以有return,也可以没有。
  • 局部变量和全局变量:
    (1)函数内部是局部变量,函数外部是全局变量。局部变量和全局变量是不同变量。局部变量是函数内部占位符,与全局变量可能重名但不同。函数运算结束之后,局部变量被释放。可以使用global保留字在函数内部使用全局变量。
    (2)局部变量为组合数据类型(如列表)且未创建,等同于全局变量
  • lanbda函数是一种匿名函数,即没有名字的函数,该函数返回函数名作为结果。lanbda函数用于定义简单的、能够在一行内表示的函数。
## <函数名> = lambda<参数>:<表达式>
f = lambda x,y : x + y
f(10,15

结果为25

f = lambda : "lambda函数"
print(f())

结果为lambda函数
谨慎使用lambda函数,该函数主要用作一些特定函数或方法的参数。

代码复用与函数递归

函数和对象是代码复用的两种主要形式。

  • 函数是将代码命名,在代码层面建立了初步抽象。
  • 对象是一组属性和方法<a>.<b>和<a>.<b>(),是在函数之上再次组织进行抽象

模块内部紧耦合,模块之间松耦合

递归的实现:函数+分支语句

PyInstaller库的使用
  • PyInstaller库是第三方库,可以将.py源代码转换为无需源代码的可执行文件

使用:(cmd命令行)pyinstaller -F <文件名.py>

PyInstaller库常用参数:

参数描述
-h查看帮助
–clean清理打包过程中的临时文件
-D,–onedir默认值,生成dist文件夹
-F,–onefile在dist文件夹中只生成独立的打包文件
-i <图标文件名.ico>指定打包程序使用的图标(icon)文件

组合数据类型

集合类型及操作
  • 集合是多个不相同元素的无序组合,集合元素不可更改。
  • 集合用 {} 表示,元素间用逗号分隔。
  • 建立集合类型用 {} 或 set()
  • 建立空集合类型,必须使用set()

集合操作符:

操作符及应用描述
S | T返回一个包含集合S和T中所有元素的新集合
S - T返回一个在集合S但不在集合T中元素的新集合
S & T返回一个同时在集合S和T中元素的集合
S ^ T返回一个包括集合S和T中的非相同元素的集合
S <= T 或 S < T返回True或False,判断S和T的子集关系
S >= T 或 S >T返回True或False,判断S和T的包含关系
S |= T更新集合S,包括在集合S和T中的所有元素
S -= T更新集合S,包括在集合S但不在T中的元素
S &= T更新集合S,包括同时在集合S和T中的元素
S ^= T更新集合S,包括集合S和T中的非相同元素

集合处理方法:

操作函数或方法描述
S.add(x)如果x不在集合S中,将x增加到S
S.discard(x)移除S中元素x,如果x不在集合S中,不报错
S.remove(x)移除S中元素x,如果x不在集合S中,产生KeyError异常
S.clear()移除S中所有元素
S.pop()随机返回S的一个元素,更新S,若S为空产生KeyError异常
S.copy()返回集合S的一个副本
len(S)返回集合S的元素个数
x in S判断S中元素x,x在集合中,返回True,否则返回False
x not in S判断S中元素x,x不在集合中,返回True,否则返回False
set(x)将其他类型变量x转变为集合类型

集合类型应用场景:

  • 包含关系比较
  • 数据去重:利用集合无重复元素的特点
序列类型及操作
  • 序列是具有先后关系的一组元素
  • 序列是一维元素向量,元素类型可以不同
  • 元素间由序号引导,通过下标访问序列的特定元素
序列类型:

操作符:

操作符及应用描述
x in s如果x是序列s的元素,返回True,否则返回False
x not in s如果x是序列s的元素,返回False,否则返回True
s + t连接两个序列s和t
s*n 或 n*s将序列s复制n次
s[i]索引,返回s中的第i个元素,i是序列的序号
s[i:j] 或 s[i:j:k]切片

函数和方法:

函数和方法描述
len(s)返回序列s的长度
min(s)返回序列s的最小元素,s中元素需要可比较
max(s)返回序列s的最大元素,s中元素需要可比较
s.index(x)或 s.index(x,i,j)返回序列s从i开始到j中第一次出现元素x的位置
s.count(x)返回序列s中出现x的总次数
元组类型:
  • 元组是序列类型的一种扩展,一旦创建就不能被修改
  • 使用小括号() 或 tuple() 创建,元素间用逗号分隔
  • 可以使用或不使用小括号
  • 元组继承序列类型的全部通用操作。因为元组创建后不能修改,因此没有特殊操作。
列表类型:
  • 列表是序列类型的一种扩展,十分常用。创建后可以随意被修改。
  • 使用方括号[] 或 list() 创建,元素间用逗号分隔
  • 列表中各元素类型可以不同,无长度限制
  • 方括号[] 真正创建一个列表,用 “ = ” 赋值仅传递引用(即把一个列表赋予了不同的名字,并不是新创建一个列表)

操作函数和方法:

函数或方法描述
ls[i] = x替换列表ls第i个元素为x
ls[i:j:k] = lt用列表lt替换ls切片后所对应元素子列表
del ls[i]删除列表ls中第i元素
del ls[i:j:k]删除列表ls中第i到第j以k为步长的元素
ls += lt更新列表ls,将列表lt元素增加到列表ls中
ls *= n更新列表ls,其元素重复n次
ls.append(x)在列表ls最后增加一个元素x
ls.clear()删除列表ls中所有元素
ls.copy()生成一个新列表,赋值ls中所有元素
ls.insert(i,x)在列表ls的第i位置增加元素x
ls.pop(i)将列表ls中第i位置元素取出并删除该元素
ls.remove(x)将列表ls中出现的第一个元素x删除
ls.reverse()将列表ls的元素反转
ls.index(x)返回元素x所在列表ls中的索引

序列类型应用场景

  • 元素遍历
  • 数据保护:如果不希望数据被程序所改变,转换成元组类型(元组类型一旦创建不能被改变)
字典类型及操作
  • 字典类型是“映射”的体现
  • 字典是键值对的集合,键值对之间无序
  • 采用大括号{} 和 dict() 创建,键值对用冒号:表示
    {<键1>:<值1>,<键2>:<值2>,…,<键n>:<值n>}

操作函数和方法:

函数或方法描述
del d[k]删除字典d中键k对应的数据值
k in d判断键k是否在字典d中,如果在返回True,否则False
d.keys()返回字典d中所有的键的信息
d.values()返回字典d中所有的值的信息
d.items()返回字典d中所有的键值对信息
d.get(k,<default>键k存在,则返回相应值,不在则返回<default>值
d.pop(k,<default>键k存在,则取出相应值,不在则返回<default>值
d.popitem()随机从字典d中取出一个键值对,以元组形式返回
d.clear()删除所有的键值对
len(d)返回字典d中元素的个数

字典类型应用场景:

  • 映射的表达
  • 元素遍历
jieba库的使用
  • jieba是优秀的中文分词第三方库
  • jieba库提供三种分词模式,最简单只需掌握一个函数
  • jieba利用一个中文词库,确定汉字之间的关联概率。汉字间概率大的组成词组,形成分词结果。除了分词,用户还可以添加自定义的词组。

jieba分词的三种模式:

  • 精确模式:把文本精确的切分开,不存在冗余单词
  • 全模式:把文本中所有可能的词语都扫描出来,有冗余
  • 搜索引擎模式:在精确模式基础上,对长词再次划分
import jieba
jieba.lcut("今天是个好日子")  #精确模式
jieba.lcut("今天是个好日子",cut_all=True)   #全模式
jieba.lcut_for_search("今天是个好日子")  #搜索引擎模式
jieba.add_word("内卷")  #向分词词典增加新词

out:
[‘今天’, ‘是’, ‘个’, ‘好日子’]
[‘今天’, ‘是’, ‘个’, ‘好日子’, ‘日子’]
[‘今天’, ‘是’, ‘个’, ‘日子’, ‘好日子’]

文件和数据格式化

文件的使用
  • 文件是数据的抽象和集合
  • 文件展现形态:文本文件和二进制文件。但本质上所有文件都是二进制形式存储。
  • 文本文件:由单一特定编码组成的文件,如UTF-8编码。适用于.txt文件、.py文件等
  • 二进制文件:直接由比特0和1组成,没有统一字符编码。适用于.png文件 、.avi文件等
  • 文件处理的步骤:打开-操作-关闭
#文件打开:<变量名> = open(<文件名>,<打开模式>)
#文件路径可以用 / 或 \
f = open("f.txt")  #文本形式,只读、默认值
f = open("f.txt""a+")  #文本形式、追加写模式+读文件
f = open("f.txt","b")  #二进制形式,只读模式
f.close()  #文件关闭
文件的打开模式描述
‘r’只读模式,默认值,如果文件不存在,返回FileNotFoundError
‘w’覆盖写模式,文件不存在则创建,存在则完全覆盖
‘x’创建写模式,文件不存在则创建,存在则返回FileExistsError
‘a’追加写模式,文件不存在则创建,存在则在文件最后追加内容
‘b’二进制文件模式
‘t’文本文件模式,默认值
‘+’与r/w/x/a一同使用,在原功能基础上增加同时读写功能
#文件内容的读取
s = f.read()  #读入全部内容,如果括号中给出参数size,读入前size长度
s = f.readline()  #读入一行内容,如果括号中给出参数size,读入该行前size长度
s = f.readlines()  #读入文件所有行,以每行为元素形成列表,如果括号中给出参数hint,读入前hint行
#数据的文件写入
f.write("数据的文件写入")    #向文件写入一个字符串或字节流
ls = ["a","b","c"]
f.writelines(ls)   #将一个元素全为字符串的列表写入文件
f.seek(0)  #回到文件开头
f.seek(1)  #文件当前位置
f.seek(2)  #回到文件结尾
一维数据的格式化和处理
  • 一维数据表示:数据间有序,用列表类型;无序用集合类型。
  • 一维数据存储:空格存储;英文半角逗号分隔;特殊符号分隔
  • 一维数据处理:字符串方法 .split() 和 .join()
二维数据的格式化和处理
  • 二维数据表示:列表类型,其中每一个元素也是一个列表
  • CSV格式:逗号分隔表示一维,按行分隔表示二维
  • 二维数据处理:for循环 + .split() 和 .join()
wordcloud库的使用
  • wordcloud是优秀的词云展示第三方库
  • wordcloud库把词云当作一个WordCloud对象
  • wordcloud.WordCloud()代表一个文本对应的词云
import wordcloud
w = wordcloud.WordCloud()  #生成词云对象w
w.generate("nice to meet you")   #向WordCloud对象w中加载文本txt
w.to_file("out.jpg")   #将词云输出为图像文件,.png 或 .jpg 格式
#参数配置
w = wordcloud.WordCloud(width=600)  #指定词云对象生成图片的宽度,默认为400像素
w = wordcloud.WordCloud(height=400)  #指定词云对象生成图片的高度,默认为200像素
w = wordcloud.WordCloud(min_font_size=10)  #指定词云中字体的最小字号,默认4号
w = wordcloud.WordCloud(max_font_size=20)  #指定词云中字体的最小字号,根据高度自动调节
w = wordcloud.WordCloud(font_step=2)  #指定词云中字体字号的步进间隔,默认为1
w = wordcloud.WordCloud(font_path="msyh.ttc")  #指定字体文件的路径。默认为None
w = wordcloud.WordCloud(max_words=20)  #指定词云显示的最大单词数量,默认为200
w = wordcloud.WordCloud(stop_words={"Python"})  #指定词云的排除词列表,即不显示的单词列表

#指定词云形状,默认为长方形,需要引用imread()函数
from scipy.misc import imread
mk = imread("pic.png")
w = wordcloud.WordCloud(mask=mk) 

w = wordcloud.WordCloud(background_color="white")  #指定词云图片的背景颜色,默认为黑色 

最后

以上就是清脆钢笔为你收集整理的Python语言程序设计学习笔记Python语言程序设计学习笔记的全部内容,希望文章能够帮你解决Python语言程序设计学习笔记Python语言程序设计学习笔记所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(55)

评论列表共有 0 条评论

立即
投稿
返回
顶部