修改内容
This commit is contained in:
parent
33ba4db521
commit
837f87d9be
|
@ -1,90 +1,99 @@
|
|||
今天,正儿八经给大家普及下新知识。
|
||||
|
||||
# Day03:初识循环
|
||||
|
||||
⛽️知识加油站——循环
|
||||
今天,正儿八经给大家普及一下新知识。
|
||||
|
||||
## ⛽️知识加油站 —— 循环
|
||||
|
||||
循环在我们生活中非常普遍,比如我们乘坐旋转木马,旋转木马会一直循环,又比如说月球会一直不停绕着太阳旋转:
|
||||
|
||||

|
||||

|
||||
|
||||
而在编程中循环也是一个非常重要知识,它可以让程序一直重复执行,比如下面这个程序,虽然只输入了一句话,但是通过设置循环次数为5,就能打印5次“我喜欢看海贼王”:
|
||||
而在编程中,循环也是一个非常重要的知识,它可以让程序一直重复执行。
|
||||
|
||||
```plain
|
||||
比如下面这个程序,虽然只输入了一句话,但是通过设置循环次数为5,就能打印5次“我喜欢看海贼王”:
|
||||
|
||||
```python
|
||||
for i in range(5):
|
||||
print('我喜欢看海贼王')
|
||||
```
|
||||
## 循环的格式
|
||||
### 循环的格式
|
||||
|
||||
想使用循环非常简单,只需要按照下面的格式设置就可以了:
|
||||
|
||||
```plain
|
||||
# 括号里填写你想循环的次数,写上冒号后,换行,空4个空格后就可以写循环的内容
|
||||
```python
|
||||
# 括号里填写你想循环的次数,写上冒号后,换行,
|
||||
# 空4个空格后就可以写循环的内容
|
||||
|
||||
for i in range(次数):
|
||||
循环的内容
|
||||
```
|
||||
📺练习1:
|
||||
### 📺练习1
|
||||
|
||||
使用循环画一个正方形。
|
||||
|
||||

|
||||

|
||||
|
||||
一起来分析下,要画一个正方形,需要下面这些步骤:
|
||||
一起来分析一下,要画一个正方形,需要下面这些步骤:
|
||||
|
||||
```plain
|
||||
```python
|
||||
向前100
|
||||
旋转90度
|
||||
向右旋转90度
|
||||
向前100
|
||||
旋转90度
|
||||
向右旋转90度
|
||||
向前100
|
||||
旋转90度
|
||||
向前100
|
||||
旋转90度
|
||||
```
|
||||
可以看成,我们要让计算机重复执行4次下面的内容:
|
||||
|
||||
```plain
|
||||
下面的内容要重复执行4次:
|
||||
向右旋转90度
|
||||
向前100
|
||||
向右旋转90度
|
||||
```
|
||||
可以看成,我们要让计算机重复执行4次下面的内容:
|
||||
|
||||
```python
|
||||
下面的内容要重复执行4次:
|
||||
向前100
|
||||
向右旋转90度
|
||||
```
|
||||
这样就就可以写成循环了:
|
||||
|
||||
```plain
|
||||
```python
|
||||
for i in range(4):
|
||||
t.forward(100)
|
||||
t.right(90)
|
||||
```
|
||||
完整代码:
|
||||
|
||||
```plain
|
||||
```python
|
||||
import turtle as t
|
||||
|
||||
t.TurtleScreen._RUNNING = True
|
||||
t.shape(name='turtle')
|
||||
|
||||
#连续画四条边
|
||||
for i in range(4):
|
||||
t.forward(100)
|
||||
t.right(90)
|
||||
|
||||
t.done()
|
||||
```
|
||||
🚀挑战1:
|
||||
## 🚀挑战1
|
||||
|
||||
题目描述:通过循环画出一个边长为100的等边三角形
|
||||
题目描述:通过循环画出一个边长为100的等边三角形。
|
||||
|
||||
备注:等边三角形就是三条边的长度相等、三个角角度都为60度的三角形
|
||||
备注:等边三角形就是三条边的长度相等、三个角角度都为60度的三角形。
|
||||
|
||||

|
||||

|
||||
|
||||
🚀挑战2:
|
||||
## 🚀挑战2
|
||||
|
||||
题目描述:通过循环画出一个正六边形
|
||||
题目描述:通过循环画出一个正六边形。
|
||||
|
||||
备注:正六边形每个角的度数(大小)都一样,6个角总共720度
|
||||
备注:正六边形每个角的度数(大小)都一样,6个角总共720度。
|
||||
|
||||
提示:需要先计算正六边形的每个角大小,再得出图图每次需要转多少度,这是小学三年级除法的难度,你敢说不会?ㄟ(▔︵▔ㄟ)
|
||||
|
||||

|
||||

|
||||
|
||||
🚀挑战3:
|
||||
## 🚀挑战3
|
||||
|
||||
能完成上面两道题,说明你还是很厉害的,那么咱们就提高一点难度吧,这道题你还能做对,那可就非常厉害了。
|
||||
|
||||
|
@ -92,27 +101,27 @@ t.done()
|
|||
|
||||
👽拓展:如果画好了,还可以给五角星加上颜色
|
||||
|
||||

|
||||

|
||||
|
||||
🚀挑战4:
|
||||
## 🚀挑战4
|
||||
|
||||
光阴似箭,日月如梭,一转眼,你,竟然,做到了最后一道题,你,这么,厉害,爸妈知道吗?如果不知道就赶紧告诉他们吧。
|
||||
|
||||
下面是第三天的终极挑战:画一个圆
|
||||
|
||||

|
||||

|
||||
|
||||
提示:画圆其实很简单,虽然你看着是一个圆,但其实,他可以看成是很多短短的边组成的,那么怎么来画圆呢?你可以看一看下面这个视频:
|
||||
|
||||
[https://baike.baidu.com/item/%E5%89%B2%E5%9C%86%E6%9C%AF/595781?secondId=25702197](https://baike.baidu.com/item/%E5%89%B2%E5%9C%86%E6%9C%AF/595781?secondId=25702197)
|
||||
|
||||

|
||||

|
||||
|
||||
看完视频是不是发现啦,古代人通过在圆内画多边形来近似测量圆一周的长度,多边形边越多,形状上就越接近圆,那么基于这个方法,我们可以用图图来帮我们画一个圆,怎么来画呢,我们知道圆有360°,也就是说,如果要画圆,【图图】需要围绕中心走360次,每一次走一步,每走一步向右转1度,画出一个有360边的多边形就可以了。
|
||||
看完视频是不是发现啦,古代人通过在圆内画多边形来近似测量圆一周的长度,多边形边越多,形状上就越接近圆,那么基于这个方法,我们可以用图图来帮我们画一个圆,怎么来画呢,我们知道圆有360°,也就是说,如果要画圆,【图图】需要围绕中心走360次,每一次走一步,每走一步向右转1度,画出一个有360条边的多边形就可以了。
|
||||
|
||||
下面就是画圆的关键,如果你不能理解,那就记住这个有趣的画圆公式吧:
|
||||
|
||||
```plain
|
||||
```python
|
||||
import turtle as t
|
||||
|
||||
t.TurtleScreen._RUNNING = True
|
||||
|
@ -123,5 +132,4 @@ t.shape(name='turtle')
|
|||
|
||||
t.done()
|
||||
```
|
||||
如果你已经画好了圆,再试一试修改forward里面的数字,看看会发生什么变化~
|
||||
|
||||
如果你已经画好了圆,再试一试修改`forward`里面的数字,看看会发生什么变化~
|
|
@ -3,7 +3,7 @@
|
|||
开源内容:https://github.com/datawhalechina/team-learning-program/tree/master/Turtle
|
||||
|
||||
## 基本信息
|
||||
- 贡献人员:王思齐、马燕鹏、王皓月、杨煜、舒敏、赵可
|
||||
- 贡献人员:王思齐、马燕鹏
|
||||
- 学习周期:9天
|
||||
- 学习形式:练习
|
||||
- 人群定位:Turtle初学者
|
||||
|
|
|
@ -1,234 +0,0 @@
|
|||
本篇主要介绍 Python 的安装与环境配置方法。Python作为一门通用型的编程语言,可以通过很多方法完成安装,同时,也可根据实际需求搭建不同类型的开发环境。由于 Jupyter 是最通用的开发环境,同时,Jupyter 本身也是 Notebook 形式的开发环境,非常适合初学者上手使用。因此,本次内容将主要采用 Jupyter Notebook/Jupyter Lab 来进行演示,本篇也将详细介绍如何通过通用科学计算平台 Anaconda 来进行 Python和Jupyter 的安装。
|
||||
|
||||
|
||||
# 1 Anaconda下载与安装
|
||||
|
||||
Anaconda 是一个工具包,将 Python 和许多与科学计算相关的库捆绑在一起,形成了一个方便的科学计算环境,你安装了 Ananconda 就相当于安装了 Python 外加这些库,省去了自己下载和安装各种库的麻烦,方便初学者专注于学习 Python。
|
||||
|
||||

|
||||
|
||||
此处,我们采用 Anaconda 进行 Python 安装和开发环境搭建。
|
||||
|
||||
|
||||
## 1.1 下载Anaconda
|
||||
|
||||
访问Anaconda官网(https://www.anaconda.com),在下拉菜单中的 Products 里选择 Individual Edition,个人版,同时也是免费版。此版本中不涉及付费内容,可供个人用户使用。
|
||||
|
||||

|
||||
|
||||
进入页面后,点击Download,会自动跳转到操作系统选择的界面。
|
||||
|
||||

|
||||
|
||||
此时,可根据自身操作系统进行选择和下载。
|
||||
|
||||

|
||||
|
||||
当然,windows 64的用户也可直接通过下述网盘连接进行下载,该版本为 Anaconda3-2020.11-Windows-x86_64。
|
||||
|
||||
- 链接:https://pan.baidu.com/s/1IEasB0epWpPRhgYdgSCHaA
|
||||
- 提取码:i6zj
|
||||
|
||||
## 1.2 安装Anaconda
|
||||
|
||||
下载完成后,即可开始安装。双击安装文件,进入欢迎界面,点击 Next。
|
||||
|
||||

|
||||
|
||||
点击同意,进入到下一步。
|
||||
|
||||

|
||||
|
||||
选择软件使用权限,是指针对当前登录用户还是所有用户,二者都行,无特殊要求。
|
||||
|
||||

|
||||
|
||||
选择安装位置,完成安装。
|
||||
|
||||

|
||||
|
||||
如果出现此页面,需要勾选配置环境变量选项。
|
||||
|
||||

|
||||
|
||||
无需安装VS Code,直接跳过即可。
|
||||
|
||||

|
||||
|
||||
安装完成后,在开始菜单栏,或者软件安装位置,找到 Anaconda Navigator 并打开。
|
||||
|
||||

|
||||
|
||||
进入到如下界面。
|
||||
|
||||

|
||||
|
||||
我们能看到 Anaconda 中集成了非常多数据科学计算相关的功能,并且,在安装过程中,也完成了 Python 的安装和环境变量的设置,以及 Jupyter和PyCharm 的安装。其中 Jupyter 是本次学习将用到的代码编辑工具,而 PyCharm 则是一款集成开发环境(IDE),本次学习并不涉及。
|
||||
|
||||
|
||||
## 1.3 启动Jupyter
|
||||
|
||||
我们能够看到,在 Anaconda 中有两个 Jupyter 组件,一个是**Notebook**,一个是**JupyterLab**。其中,Lab 是 Notebook 的升级版,用户交互界面更加友好,并且拥有许多额外辅助功能,例如代码框分屏、文件管理系统等,但相比 Notebook,Lab 并不支持第三方插件,因此如果是想使用 Jupyter 丰富的插件,则只能选择 Notebook。不过二者在实际编程的功能使用上没有区别,本次学习推荐使用 JupyterLab。
|
||||
|
||||
点击 JupyterLab,启动相关服务,系统会自动打开浏览器并进入到 JupyterLab 界面。
|
||||
|
||||

|
||||
|
||||
能够成功弹出浏览器窗口,则说明安装成功。如果浏览器关闭,再次点击 Anaconda 中 Jupyter Lab 组件中的 Launch 即可再次打开 Jupyter 界面。
|
||||
|
||||

|
||||
|
||||
或者在浏览器里直接输入 http://localhost:8890/lab。
|
||||
|
||||
|
||||
---
|
||||
# 2 Jupyter基本操作
|
||||
|
||||
接下来,简单介绍 Jupyter 的基本操作。
|
||||
|
||||
## 2.1 简单代码编写尝试
|
||||
|
||||
在 JupyterLab 主界面中,左边是文件目录,右边是编程界面,首次登陆时,点击 Python3 即可创建一个新的编程文件。
|
||||
|
||||

|
||||
|
||||
如下所示:
|
||||
|
||||

|
||||
|
||||
同时,在左侧文件目录,也会出现一个新的`ipynb`文件,也就是正在编辑的代码文件。
|
||||
|
||||
> ipynb 文件是 ipython Notebook 的简写,Jupyter 脱胎于 ipython 编辑器,因此 Jupyter 文件仍然保留了 ipynb 的文件类型命名方式。
|
||||
|
||||
接下来,简单尝试在右侧代码框中输入 Python 代码。点击右侧代码框(cell)中输入`a = 1`。
|
||||
|
||||
|
||||
|
||||

|
||||
|
||||
也就是令`a = 1`,然后`shift+enter`执行该代码。执行完成后,会自动新生成一个 cell,接下来的代码就可以在新生成的 cell 中执行。在新生成的 cell 中,输入`a`能够看到,返回结果就是`a`的赋值。
|
||||
|
||||

|
||||
|
||||
至此,我们就完成了一次简单的 Python 代码编写和运行。
|
||||
|
||||
## 2.2 Notebook式编辑环境
|
||||
|
||||
将代码写入一个个**cell**,代码文件由一个个cell组成,书写代码时就像一行一行在记笔记,就是所谓的 Notebook 式的代码编辑环境。Notebook 式代码编辑环境其实也是 REPL(Read Eval Print Loop)环境的一种,即交互式编译。简单来说,交互式编译就是指允许用户逐行输入代码、逐行查看结果,从而逐行进行调试。这无疑是大幅降低了代码编写的难度,这也是建议 Python 初学者使用 Jupyter 的原因。
|
||||
|
||||
## 2.3 Jupyter的基本操作
|
||||
|
||||
由于后续 Jupyter 将作为主力代码编辑器,因此我们有必要深入了解 Jupyter 的一些常用功能。当然,Jupyter 本身也是一个独立的软件,具体软件的功能介绍可以查看 [Jupyter](https://jupyter.org/) 官网(https://jupyter.org),里面有 Jupyter 所有功能的完整介绍。
|
||||
|
||||

|
||||
|
||||
此处先介绍实际学习过程中常用的功能。
|
||||
|
||||
### 2.3.1 cell类型选择
|
||||
|
||||
在 Jupyter 中,每个 cell 除了代码以外,还可以使用 Markdown 语法输入文本内容,以及尚未确定格式的草稿。
|
||||
- 选定一个 cell 后,选择 code 则是代码内容;
|
||||
- 选择 Markdown 则是使用 Markdown 语法输入文本内容;
|
||||
- 选择 Raw 则是草稿内容,不会输出任何结果。
|
||||
|
||||

|
||||
|
||||
例如,使用Markdown语法打印标题:
|
||||
|
||||

|
||||
|
||||
同样,是`shift+enter`执行 Markdown 语法。
|
||||
|
||||

|
||||
|
||||
可以看出,jupyter 还是个不错的笔记工具,同时,也非常适合编写数据分析报告。
|
||||
|
||||
### 2.3.2 cell不同模式及快捷键
|
||||
|
||||
cell 有两种不同模式,选中 cell 时是 **command(命令)** 模式,而单击 cell 内,出现光标闪烁时,则是进入了 cell 内容的 **edit(编辑)** 模式,在编辑模式下,可以进行内容输入,而在命令模式下,则可使用一些 cell 快捷键对其进行操作。
|
||||
|
||||
|
||||
快捷键 | 操作| 快捷键 | 操作
|
||||
:---:|---|:---:|---
|
||||
a | 在上方插入一个cell | b | 在下方插入一个cell
|
||||
x | 剪切该cell | c | 复制该cell
|
||||
v | 在cell下方粘贴复制的cell | m | 转为markdown模式
|
||||
y | 转为code模式 | r | 转为raw模式
|
||||
z | 撤销操作 | 双击d | 删除该cell
|
||||
|
||||
|
||||
### 2.3.3 JupyterLab 文件管理系统
|
||||
|
||||
相比 Notebook,JupyterLab 拥有非常便捷的文件管理系统,我们前面已经尝试,当创建一个新的`ipy`文件时,左侧文件栏将出现对应文件。JupyterLab 左侧就是其文件管理界面,在其中,我们可以进行文件创建、文件夹创建、文件上传等操作。
|
||||
|
||||

|
||||
|
||||
|
||||
### 2.3.4 JupyterLab 文件系统主目录及修改方式
|
||||
|
||||
那么,我们创建的`ipy`文件存在哪呢?<br>
|
||||
在 Anaconda 中,一般系统会默认 Jupyter 的主目录就是系统的文档目录。但文档目录在 C 盘下,如果是首次安装 Jupyter,并希望单独设置一个文件夹作为默认主目录,可以按照如下步骤进行操作:
|
||||
|
||||
|
||||
**(1)在 Anaconda 中打开 CMD.exe Prompt,进入命令行界面**
|
||||
|
||||

|
||||
|
||||
当然,此处也可以`win+r`,然后输入`cmd`进入命令行。
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
|
||||
**(2)生成 Jupyter 配置文件**
|
||||
|
||||
在命令行中,输入
|
||||
|
||||
```python
|
||||
jupyter notebook --generate-config
|
||||
```
|
||||
|
||||

|
||||
|
||||
注意上述配置文件的保存路径。若已有配置文件,再次输入命令将可选择是否覆盖原配置文件。当然,覆盖原配置文件将导致原配置失效。
|
||||
|
||||

|
||||
|
||||
**(3)修改主目录配置**
|
||||
|
||||
接下来,按照命令行中提示的配置文件路径,找到配置文件。
|
||||
|
||||

|
||||
|
||||
可以用文本编辑器打开,能够看到所有的 Jupyter 可选配置。
|
||||
|
||||

|
||||
|
||||
`ctrl+f`进入搜索栏,搜索`c.NotebookApp.notebook_dir`
|
||||
|
||||

|
||||
|
||||
将对应位置的#号删除,使其配置生效,并在等号后面输入新的主目录文件夹位置(自行选择文件位置),保存退出,并在**重启Jupyter后生效**。
|
||||
|
||||
|
||||
**(4)查看新的主目录**
|
||||
|
||||
进入对应文件夹位置,查看文件夹内文件和 JupyterLab 内显示文件是否一致。
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
至此,新的主目录文件设置成功。当然,任何对主目录文件的操作都会同步至 JupyterLab 的文件栏页。
|
||||
|
||||
> 不难发现,Jupyter文件系统主目录就类似于其他编程语言的操作空间概念。
|
||||
|
||||
### 2.3.5 停止`ipy`进程
|
||||
|
||||
由于 Python 代码在运行过程中,对象都存储在内存中,因此,为了合理控制内存,在必要的情况下需要手动终止 Jupyter 进程。此时可以使用左侧栏的 KERNEL SESSIONS 功能,进行操作。
|
||||
|
||||

|
||||
|
||||
点击 SHUT DOWN 即可关闭对话。
|
||||
|
|
@ -0,0 +1,134 @@
|
|||
|
||||
# 如何在Windows中安装Python?
|
||||
|
||||
## 1. Python的安装
|
||||
|
||||
官网下载:https://www.python.org/downloads/windows/
|
||||
|
||||
点开上面的链接,会发现有很多版本。
|
||||
|
||||

|
||||
|
||||
|
||||
首先看版本,64-bit是64位版本,32-bit是32位版本,你需要下载跟你电脑系统一致的版本。
|
||||
怎么看自己的电脑是什么版本?
|
||||
|
||||
<b>右键计算机-属性</b>
|
||||
|
||||

|
||||
|
||||
<b>查看一下系统类型</b>
|
||||
|
||||

|
||||
|
||||
<b>然后再看文件类型</b>
|
||||
|
||||

|
||||
|
||||
- 嵌入式程序包(Embeddedable)是压缩包版本,即便携版,解压可用。
|
||||
- 安装程序(Installer)是可执行的安装版本,即离线版,下载到本地后可以直接安装。
|
||||
|
||||
建议使用离线安装版(Installer),这样软件会帮你设置系统变量,否则需要自己添加,对新手来说当然越傻瓜化越好。
|
||||
|
||||
下载完后打开
|
||||
|
||||

|
||||
|
||||
|
||||
出现这个界面的话,说明你的电脑已经安装过Python了,直接关掉窗口,跳到IDLE部分。
|
||||
|
||||
第一次安装的话,是这个界面。
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
安装成功!
|
||||
|
||||
测试一下,能否调用,同时按下win+R(win就是开始菜单的那个键)
|
||||
|
||||

|
||||
|
||||
进入命令行,输入python,出现这样的界面则表示成功安装
|
||||
|
||||

|
||||
|
||||
这样我们第一步已经完成了。
|
||||
|
||||
输入`print('Hello World!')`,写下你的第一句Python代码。
|
||||
|
||||

|
||||
|
||||
Welcome To Python's World!!
|
||||
|
||||
欢迎来到Python的世界里,不过我们不会在这个黑框框里面写代码的,而是使用Python自带的编辑器IDLE。
|
||||
|
||||
输入`exit()`后,回车即退出Python环境。另外,我们还要测试一下pip是否安装完毕,它是用来安装第三方库的神器,我们以后会接触到。
|
||||
|
||||
退出Python环境后,我们直接在这里面输入pip,然后回车。
|
||||
|
||||

|
||||
|
||||
这样就是安装完毕的意思了。
|
||||
|
||||
## 2. IDLE的使用
|
||||
|
||||
IDLE是在Python安装时自动安装的一个集成开发环境(IDE),事实上,这也是我目前见过的最最轻量的集成开发环境了。
|
||||
|
||||
刚运行时会以交互模式进入,界面如下图所示:
|
||||
|
||||
|
||||

|
||||
|
||||
|
||||
```python
|
||||
for x in range(5):
|
||||
print(x)
|
||||
```
|
||||
|
||||
先来简单说明一下这个程序是什么意思,它的功能很简单就是在屏幕上打印出从0到4这5个数字,每打印完一个数字就换一行,所以它的输出结果如下:
|
||||
|
||||

|
||||
|
||||
你可以在交互模式下直接输入这两行,按下两次回车就可以看到这5个数字了。
|
||||
|
||||
<b>在这里我说一下怎么打开IDLE自带的文本编辑器</b>。
|
||||
|
||||
没错!跟其他软件差不多,选择左上角的“File”键,然后选择New File,新建一个文件,也可以直接快捷键Ctrl+N。
|
||||
|
||||
要打开一个文件,在File里选择Open,然后选择要打开的文件即可,快捷键Ctrl+O。
|
||||
|
||||
新建文件后,把两行程序输入到文件中,然后看菜单栏,如图:
|
||||
|
||||

|
||||
|
||||
写完了之后要保存,跟office软件一样,保存选项就在File里面,直接去找就可以了,或是快捷键Ctrl+S。
|
||||
|
||||
写完代码之后我们就要知道怎么运行了,找到菜单栏中的Run按钮,选择`run module`,就可以在一开始看到的交互模式中显示运行结果了。
|
||||
|
||||
<b>写完代码能运行还不行,我们还得会调试,下面说一说怎么调试</b>:
|
||||
|
||||
选中要设置断点的一行,单击鼠标右键,选择`set breakpoint`,就会看到设置断点的那一行被黄色高亮。
|
||||
|
||||

|
||||
|
||||
然后,回到 IDLE Shell(就是刚打开时的那个交互模式),选择`Debug --> debuggeer`,启动调试器,这时会弹出一个调试窗口。
|
||||
|
||||

|
||||
|
||||
调试器启动后,`run --> run module`运行代码,但不同的是,这次程序会停止在设置断点的那一行,而不是全部运行完毕,在调试窗口中选择“Go”就可以使程序继续向下执行一行。在执行过程中,程序中所有的变量的值都会显示在下面的会话框中。
|
||||
|
||||

|
||||
|
||||
这样一步一步调试,观察每一个变量就可以找到程序中的逻辑错误了。
|
||||
|
||||
## 3. 写在最后
|
||||
|
||||
如果第一次打开IDLE时,发现交互模式的字体和字号大小有辣眼睛的话,可以在`Option --> Configure IDLE`中更改。
|
||||
|
||||

|
||||
|
Loading…
Reference in New Issue