2018-08-25 day6 第一周总结

1.python基础

1.1.标识符(专门用来命名的-变量、函数、类)

'''
1)要求
a.是由字母数字下划线组成(只能少不能多)
b.数字不能开头的
c.大小写敏感的(大写和小写不一样,例如:abc和Abc、ABC不一样)
d.python3以后,标识中可以包含非ASCII码(可以包含中文),但是在实际开发中不建议使用

 A.B.C  A-大版本,重大修改

1.2.关键字:

'''
'False', 'None', 'True', 'and',
'as', 'assert', 'break', 'class', 'continue',
'def', 'del', 'elif', 'else', 'except', 'finally', 
'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 
'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while',
 'with', 'yield'
'''

1.3.行与缩进

'''
缩进的要求:
'''
a.同一级的代码必须保持同一缩进。(统一使用tab来产生缩进)
b.通过缩进来产生代码块(类似于其他语言中的{})
'''
行的规范
'''
a.声明函数的前后必须有两个换行
b.声明类的前后也需要两个换行
c.多个功能模块间用换行隔开
'''
 5. 多行显示(一句代码多行显示)
a.在需要换行的地方加\,然后在后面换行。换行后缩进不受限制
'''

1.4.python中的基本数据类型

'''
a.数字相关的
int(整型),float(浮点型),complex(复数)
b.bool(布尔)
只有True和False两个值
c.str(字符串)
d.list(列表)
e.dict(字典)
f.tuple(元祖)
g.set(集合)
h.function(函数)
i.bytes(字节)
'''

2.变量

2.1.定义

'''
声明变量就是在内存中开辟空间存储数据。(变量就是用来存储数据的)
# python是动态语言

2.2.结构

'''
1.怎么声明变量
格式: 变量名 = 值
说明:
a.类型:python声明变量的时候不需要确定类型
b.变量名:标识符,不能是关键字;见名知义,PEP8命名规范(所有的字母都小写,多个单词之间用_隔开)
=:赋值符号,将右边的值赋给左边的变量
值:表达式(就是有结果的,例如:字面量,运算表达式(10+20),其他的变量)
"""
c.声明了一个变量name,赋值为'路飞'。使用name的时候,就相当于在使用'路飞'
name = '路飞'
print(name)


d.python中每条语句结束可以不用分号。但是如果一行要写多条语句,就必须加分号
number1 = 10; number2 = 100

e.2.同时声明两个变量,并且赋一样的值
str1 = str2 = str3 = 'abc'

f.使用print同时打印多个值
print(str1, str2, str3) 

g.id函数
# id(变量) --- 查看变量的地址
# python声明变量,和给变量赋值的原理: 先在内存中开辟空间存数据,然后再将变量名作为数据对应的内存的标签
a = 10
print(id(a))
a = 100
print(id(a))
'''

2.2.数字和布尔

'''
# 1.int(整型)
# 所有的整数都是整型,python3中的整型只有int,python2中有int和long
num1 = 10
num2 = - 100

# 内置函数:type() -- 获取括号中数据的类型
print(type(num1), type(num2))

# 2.float(浮点型)
# 所有带小数点的数,都是浮点型。python中的浮点型只有float
num5 = 2e2
num6 = -3.14

# 3.bool(布尔)
# 布尔就True和False
# True - 1; False - 0
bool1 = True 
bool2 = False
print(type(bool2))

'''

2.3.运算符

'''
# 1.数学运算符:+(加), -(减), *(乘), /(除), //(整除), %(取余), **(幂运算)
# a.+,-,*,/,%和数学中的加、减、乘、除、求余的功能一模一样
print(10+12.9)
print(100 - 20)
print(2*3.5)
print(5/2)
print(3%2)  

# b.//(整除)
# 求商,商只取整数部分
print(6.3//2)  

# c.**(幂运算)
# x**y -- x的y次方 
print(2**3)
print(9**0.5)  

# 2.比较运算: >(大于), <(小于), ==(等于), !=(不等于), >=(大于等于), <=(小于等于)
# 所有的比较运算的结果都是布尔值
print(10 > 20)
print(10 != 20)
print(20 >= 20)

# 3.逻辑运算符: and(与),or(或), not(非)
# 逻辑运算符操作的数据是布尔值,返回的结果也是布尔
# and(与) -- 和、并且
# 两个都是True结果才是True,只要有一个是False结果就是False
print(True and True)   # True
print(True and False)  # False
print(False and True)  # False
print(False and False) # False
# 什么时候使用:要求两个或者多个条件同时满足

# or(或) -- 或者
# 只要有一个是True结果就是True。两个都是False结果才是False
# 什么时候使用:要求两个或者多个条件只要一个条件满足就行  

# not(非)
# Ture变成False, False就变成True

# 4.赋值运算符:=(赋值),+=, -=, *=, /=, %=, //=, **=
# 赋值符号的左边必须是变量;运算顺序是,先算赋值符号右边的值,然后再将右边的结果赋给左边
# a. 变量 = 值
# b. 变量 += 值 
# 这儿的变量必须是已经声明过的变量
# c.变量 = 变量 (运算符) 值 (a *=b---->a = a * b)



# 5.运算符的优先级
# 正负 > 数学运算符 > 比较运算符 > 逻辑运算符 > 赋值运算符
# 数学运算符中: ** > (*,/,%,//) > (+,-)
# 优先级高的先计算,如果优先级相同就从左往右依次计算。可以通过加括号,改变运算顺序
# 补充: 变量必须先声明,再使用。
'''

2.4.进制

'''
a.进制的表示
二进制:0b101010
八进制:0o23213
十六进制:0x1AB

b.进制之间的转化
转换成二进制:bin(x)
转换成八进制:oct(x)
转换成十进制:int('x',y) ----->x:为需要转换的数(注意加引号),y--->转化的数最初是多少进制
转换成十六进制:hex(x)

c.原码:数据的二进制形式
正数的原码:符号位的值是0,后面是数值大小
负数的原码:符号位的值是1,后面是去掉符号的数值大小

d.反码:
正数的反码:反码和原码一样
负数的反码:符号不变,后面的每一位的值取反(0->1, 1->0)

e.补码:
正数的补码:补码和原码一样
负数的补码:反码+1

3.字符串

3.1.定义:

'''
a.用单引号或者双引号括起来的字符集就是字符串
'ahshu123~!*&&^耍数组', "a k987"
b.字符串中的每个独立的单元我们叫字符,
  例如:字符串'abc123'中'a','b','c','1','2','3'就是字符
'''

3.2.转义字符

'''
说明:python中没有字符类型,如果要表示字符,就是用一个长度是1的字符串表示,例如:'a','1',
长度:指的就是字符串中字符的个数,例如:'abc' - 长度是3 ,'abc123, 你好'-长度是:10


a.通过\将一些特殊的字符转换成一个具有特殊功能或者特殊意义的字符,就是转义字符。

b.常见的转义字符:
\n --- 换行
\t --- 制表符(相当于tab键)
\\ --- \
\' --- '
\" --- "
在计算字符串长度的时候,转义字符的长度是1
'''

3.3.字符编码

'''
# 3.Unicode编码
"""
a.python中字符的编码采用的是Unicode编码
b.Unicode是采用两个字节对一个字符进行编码(2^15),能够将世界上所有的符号进行编码
c.Unicode编码中包含了ascii码

将字符转换成指定的数值,这个过程就是编码。(编码的目的是方便计算机存储)
将数值转换成对应的符号的过程就是反编码(解码)

0 --> 0
'0' --> 48
"""
# 1).将Unicode码转换成字符: chr(解码)
print(chr(0xA001))
print(chr(0xAC00))
print(chr(0x4e60))

# 2).将字符转换成Unicode编码: ord(编码)
code1 = ord('余')  # 结果是10进制的
code2 = ord('婷')
print(hex(code1), hex(code2))

'''

3.4.获取字符

'''
# 字符串实质可以是一个不可变的序列,序列内容是字符。
# 一旦字符串确定,那么里面的字符和字符的位置就不可变了,例如:'abc'
# 1.怎么获取单个字符
'''
python中的字符串,可以通过下标(索引)来获取指定位置上的字符:字符串[索引]
说明:
    a.字符串:可以是字符串值,也可以是字符串变量
    b.[]: 中括号使固定语法
    c.索引:从0开始到字符串长度减1 (0对应第一个字符); 
           -1 ~ -长度(-1对应的是最后一个字符, -2对应的是倒数第2个字符)

注意:索引不能越界,否则会报错(产生异常)
'''
2. 获取部分字符(获取子串) -- 切片
# 字符串[下标1:下标2] : 从下标1开始,获取到下标2前的所有的字符
# (从下标1开始,每次下标值加1,一直加到下标2前)
# 注意:下标1对应的位置,一定要在下标2对应的位置前
str2 = 'hello world'

print(str2[0:4])  # hell
print(str2[2:7])  # llo w
print(str2[2:-1]) # llo worl
print(str2[3:12]) # 切片时下标可以越界,越界的时候就取临界值
'''

字符串[下标1:下标2:步进]
"""
从下标1开始获取,每次下标值增加步进值,没增加一次取一个字符,直到取到下标2前为止
注意:a.步进如果是正数,那么下标1对应的字符的位置一定要下标2对应的位置的前面;
     步进是负数,那么下标1对应的位置一定要在下标2对应的位置的后面
     b.下标2对应字符是取不到的
"""
str3 = 'helloPython'
print(str3[0:5:2])  # hlo   步进:3  hl  
print(str3[-1:5:-1]) # nohty

下标的省略
"""
切片的时候,下标1和下标2是可以省略的

下标1省略:默认从开头开始获取(开头可能是字符串的第一个字符,也可能是字符串的最后一个字符)


下标2省略: 从下标1位置开始获取,获取到结束(结束可能是字符串的最后一个字符,也可能是字符串的第一个字符)

3.5.字符串的相关运算

1. + 运算符
"""
字符串1+字符串2:
python支持两个字符串相加, 其效果就是将两个字符串拼接在一起产生一个新的字符串

注意:如果+的一边是字符串,那么另外一个也必须是字符串
"""
print(10+'abc')  # TypeError: unsupported operand type(s) for +: 'int' and 'str'

2. * 运算符
"""
字符串1*整数: 字符串重复多次
"""
print('abc'*3)

3. 所有的比较运算符
str1 = 'abc'
print('abc' == str1)
print(str1 != 'ab')

比较大小
"""
str1 > str2; str1 < str2
让str1中的每一位的字符,分别和str2中每一位的字符依次比较。
直到不同为止,再看不同字符中谁的编码值大或者小
"""
print('dbcd' > 'abcde')
print('二' > '余婷')
print(ord('二'), ord('余'))   


4.in 和 not in
"""
str1 in str2: 判断str1是否在str2中(str2是否包含str1 / str1是否是str2的子串)

结果是布尔值
"""
print('abc' in 'a1b2cdefg')
print('f' not in 'python')  

5.获取字符串长度
# 字符串的长度,指的是字符串中字符的个数
# len()内置函数
str3 = 'project'
print(len(str3), len('abc 123\n'))

补充:空串
str4 = ''
str5 = ""
print(len(str5))

len1 = len(str3)   # len1 = 7
index = len1 - 1   # 6
print(str3[-1], str3[index])    


6.阻止转义
# 在字符串的最前面添加r/R可以阻止转义
print('a\nb','a\nb\\')
print(len('a\nb\\'))   # 4

print(r'a\nb',R'a\nb\\')
print(len(r'a\nb\\'))  # 6


print('a\\nb\\\\')  # a\nb\\
print('\\\n\\')  # \换行\

print(r'\\\n\\')  # \\\n\\  

3.6 字符串的相关内置方法(略)

4.分支与循环

4.1.数据类型转换

'''
 int, float, bool, str
# 1.数据类型的自动转换
a = 10  # 整型(int)
b = 12.5 # 浮点型(float)
result = a + b  # 会自动将整型a,转换成浮点型,然后再计算
print(type(result))

result2 = a + True   # 会自动将布尔True,转换成整型1
print(result2, type(result2))

# 2.强制转换
# 基本语法:类型名(需要转换的数据)
# a.将其他数据转换成int类型
'''
浮点型、布尔和部分字符串可以转换
'''

print(int(12.55))   # float -> int: 去掉小数点和小数点后面的数
print(int(True), int(False)) # bool -> int: True为1,False为0

去掉字符串的引号后,字符串的内容本身就是一个整数的时候,才能被转换成整型


# b.将其他的数据类型转换成float类型
"""
整数,布尔和部分字符串可以转换
"""
print(float(True), float(False))  #bool-> float: True:1.0, False:0.0

去掉引号后,字符串的内容本身就是一个整数或者浮点数的时候,才能被转换成浮点型
print(float('2e3'), float('-12.5'), float('100'))  


c.将其他的数据类型转换成bool
"""
所有的数据类型的数据都可以转换成bool

数字中:除了0是False,其他的都是True
字符串中:除了空串,其他的都是True

总结:所有为空、为0的值全部是False。否则就是True

"""

print(bool(0.0000))
print(bool(''))
print(bool([]))
print(bool({}))
print(bool(None))

d.其他类型转换成字符串
"""
所有的数据都可以转换成字符串。转换的时候就是在数据的外面加引号
"""
print(str(100), str(18.9), str(True), str([1,2,3]))
'''

4.2 if分支

'''
# python中的分之结构只有一种:if分之结构
"""
1. if

语法:
if 条件语句:
    执行语句块

其他语句

说明:
a. if: python中的关键字,'如果'的意思,用来做判断
b. 条件语句: 最终的结构会被转换成布尔值
c. 冒号: 冒号是固定写法,必须写!
d. 执行语句块:这儿可以是多行语句,但是每行语句必须和前面的if保持一个缩进(一个tab)

执行过程:先判断条件语句的结果是否为True,如果为True就执行冒号后面的执行语句块。
        否则直接执行if模块后的其他语句

"""

age = 10

if age >= 18:
    print('成年')
    print('可以进网吧')  

# 练习:用一个变量保存一个学生的成绩,要求:当学生的成绩大于90的时候,打印优秀。
#      不管成绩是多少,都把成绩打印出来
score = 99

if score > 90:
    print('优秀')

print(score)


"""
2. if-else
语法:
if 条件语句:
    执行语句块1
else:
    执行语句块2

其他语句

说明:
else: 关键字(else后边的冒号不能省)

执行过程:先判断条件语句的结果是否为True,如果为True就执行执行语句块1,
         执行完语句块1后再执行其他语句;如果为False就执行语句块2,
         执行完语句块2后再执行其他语句
"""
# 要求年龄大于等于18就打印成年,否则打印未成年
age = 12

if age >= 18:
    print('成年')
else:
    print('未成年')
    print('不能进网吧')  


"""
3.if-elif-(else)

语法:
if 条件语句1:
    语句块1

elif 条件语句2:
    语句块2

elif 条件语句3:
    语句块3

    ...
else:
    语句块n

其他语句

"""
# 要求成绩大于90分打印优秀,80-90打印良好,60-79及格,60以下不及格
score = 50

if score > 90:
    print('优秀')

elif score >= 80:
    print('良好')

elif score >= 60:
    print('及格')

else:
    print('不及格')



"""
4.if语句的嵌套
每个if分之中都可以嵌套其他的if语句

if 条件1:
    执行语句1
    if 条件2:
        执行语句2
    else:
        执行语句3
else:
    执行语句4


"""
# 成绩和年龄:如果成绩大于等于90并且年龄是18以上就获取 奖金100万,
#           年龄小于18就获取奖金200万。成绩小于90不管多少岁打印没有奖金
score = 90
age = 18
if score >= 90:
    if age >= 18:
        print('100万')
    else:
        print('200万')
else:
    print('没有奖金')

# 练习: 产生一个随机数(0-100),判断随机数是否是偶数,如果是打印偶数,否则打印奇数。
#      如果能够被4整数,再打印能被4整除
import random
number = random.randint(0, 100)
print('随机数是:%d' % (number))

if number % 2 == 0:
    print('偶数')
    if number % 4 == 0:
        print('能够被4整除')
else:
    print('奇数')


# 补充:
# import是python中导入模块或者模块中内容的关键字
# random是python内置的产生随机数的模块

number = random.randint(10, 20)  # 产生一个10到20的随机整数,并且存到number中
print(number)
'''
条件语句的简写
'''
# 判断一个数是否是偶数的两种写法
number = 11

# 初学者
if number % 2 == 0:
    print('偶数')


# 推荐
if not number % 2:
    print('偶数')


if number % 2:
    print('奇数')
else:
    print('偶数')


# 判断一个字符串是否是空串
# 初学者
str1 = 'abc'

if str1 == '':
    print('是空串')
else:
    print('不是空串')


if len(str1) == 0:
    print('是空串')
else:
    print('不是空串')


# 推荐
if str1:
    print('不是空串')
else:
    print('是空串')

if not str1:
    print('空串')
else:
    print('不是空串')
'''

4.3.for 循环

'''
# 1+2+3+4+5+....+100
# 在完成某个功能的时候,如果需要重复某个操作,就可以使用循环。
# python中循环结构有两种:for循环和while循环

"""
1.for循环的结构:
for 变量名 in 序列:
    循环体

说明:
a.for: 关键字
b.变量名: 和声明变量时的变量名的要求一样
c.in: 关键字
d.序列: 容器(数据本身是由多个数据组成),
       例如:字符串、列表、字典、元祖、集合、range、生成式和生成器(迭代器)
e.循环体:需要重复执行的代码

执行过程:
    让变量去序列中取数据,一个一个的取,取完为止。每取一个数据,执行一次循环体

# range函数是python中内置函数,作用是产生指定范围中的数字
# xrange是python2中的函数,python3中用range来代替了
"""
range(N): 产生0 ~ N-1的所有整数
range(N,M): 产生 N ~ M-1的所有整数
range(N,M,step): 产生从 N开始,每step产生一个整数,到M之前
"""


'''

4.4.while循环

'''
"""
1.结构:
while 条件语句:
    循环体

2.说明:
while: 关键字
条件语句: 结果是True或者False
循环体: 要重复执行的代码

3.执行过程:
判断条件语句的结果是否为True, 如果为True就执行循环体,
执行完循环体再判断条件语句是否为True,如果为True就执行循环体....
直到条件语句的结果为False为止
"""

# for循环和while循环的比较:
# for循环循环次数是有限的,并且是固定(确定); while循环的循环次数不确定
# for循环: 1.遍历序列中的值 2.循环次数确定
# while: 1.死循环  2.循环次数不确定
'''

4.5.break和continue

'''
"""
break和continue放到循环体有特殊的功能

break: 程序执行到break, 整个循环直接结束,然后执行循环外面的其他的语句
continue: 循环体中遇到continue,结束当次循环,进入到下次循环的判断。

for x in 序列:
    语句1
    语句2
    continue/break
    语句3

其他语句

while 条件:
    语句1
    语句2
    continue/break
    语句3

其他语句

"""
'''

补充

'''
```python
'''
input()
1.程序遇到input,会停下来,等待输入完成后才会执行后面的代码(阻塞线程)
2.输入结束,遇到return就结束
3.获取到的内容是字符串(无论输入什么)
'''
break,continue,else
'''
break:程序过程中,只要遇到break,
就结束/跳出包含break的最近的一个循环

'''
#练习:随机生成一个整数,然后去猜,猜中为止
import random

random_number = random.randint(0,100)

while True:
    input_number = int(input('请输入一个0~100的数:'))
    if input_number == random_number:
        print('恭喜猜对了')
        break
    elif input_number > random_number:
        print('输入的数字大了')
    else:
        print('输入的数字太小了')
'''
请输入一个0~100的数:22
输入的数字太小了
请输入一个0~100的数:66
输入的数字大了
请输入一个0~100的数:44
输入的数字大了
请输入一个0~100的数:33
输入的数字大了
请输入一个0~100的数:36
输入的数字大了
请输入一个0~100的数:25
恭喜猜对了结果:

'''
sum = 0
for x in range(0,1001):
    if not x % 15:
        continue
    sum += x
print(sum)
'''
else:python中的循环的最后可以添加else语句,代表循环结构后要执行的代码
注意:写到else里面的语句,和卸载循环外面你的区别是。break的时候,else里面的不会执行
'''
(1)
for x in range(6):
    print(x)
else:
    print('else的作用')

(2)
n = 1
while n <= 5:
    print(n)
    n +=1
else:
    print('else的作用')
'''
0
1
2
3
4
5
else的作用
'''

2.print的使用

a.print(内容一)

print('内容') #打印完会换行
print(变量)
print(str,a,b,c) # 多个内容,每个内容空格隔开

b.打印后换行

print(内容,end='\n')  #默认是end='\n',所以产生了换行
print(内容,end='')   #不换行
print(内容,end=',')   #不换行,以逗号分隔

c.设置同时打印多个内容,内容之间的样式

print(a,b,c,sep='')  #默认是sep='',每个以空格隔开
print(a,b,c,sep='x') #每个内容以x隔开
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容