anaconda最后一步安装一直不动_anaconda一直处于加载状态

anaconda最后一步安装一直不动_anaconda一直处于加载状态《用Python学大学数学》 第一章:介绍第一章:初步1.1 数据科学概述数据科学,也被称为数据驱动科学,是一个跨学科的领域,研究从各种形式的数据中提取知识或洞见的科学方法、过程和系统,无论是结构化的还是非结构化的,类似于数据库中的知识发现(KDD)。数据科学是一个“统一统计、数

《用Python学大学数学》 第一章:介绍

第一章:初步

1.1 数据科学概述

数据科学,也被称为数据驱动科学,是一个跨学科的领域,研究从各种形式的数据中提取知识或洞见的科学方法、过程和系统,无论是结构化的还是非结构化的,类似于数据库中的知识发现(KDD)。

数据科学是一个“统一统计、数据分析及其相关方法的概念”,目的是用数据“理解和分析实际现象”。它采用了来自数学、统计学、信息科学和计算机科学等广泛领域的技术和理论,特别是来自机器学习、分类、聚类分析、数据挖掘、数据库和可视化等子领域的技术和理论。

—- wikipedia

数据科学是一个跨学科的课题,Drew Conway于2010年9月在自己的博客上首次发表了数据科学韦恩图:


anaconda最后一步安装一直不动_anaconda一直处于加载状态

该图解释了数据科学研究者等所应掌握的三种基本知识:数学与统计知识,黑客知识,领域专家知识。但是如果希望成为一名数据科学家,除了掌握这些基本知识外,还需要具备Jake VanderPlas在《Python数据科学手册》提出的三种领域能力:统计学家的能力——数据建模、数据集合;计算机科学家的能力——算法设计、数据存储、数据分析与数据可视化;领域专家的能力——在细分的学科领域中经过专业的训练,这样既可以提出正确的问题,又可以做出正确的解答。

我们在进行数据科学实践时,会对不同细分领域所涉及到的分类、回归、聚类等问题进行展开讨论。在学习过程中中,我们重在掌握数据科学中的原理与技术,并不要求您对于这些细分领域所涉及到的专业知识进行深度探索,除非您希望成为该领域的专家。

1.2 为什么选择Python

当销售人员向客户推荐产品时,总逃不过回答这样几个问题,“产品是否符合我们的需求?”,“产品相对与其他厂商的有什么优势?”。当我们在向读者推荐Python语言来进行数据科学实现时,也总是绕不开相似的问题,因此我们需要回答“在茫茫多的编程语言中,为什么我们选择了Python。”

“人生苦短,我用Python”作为IT界广泛流传的格言,揭示了Python语言无可比拟的开发效率。Python官方教程所写:“Python是一门既容易上手又强大的编程语言。”不仅反映了Python的开发效率之高,而且也表明,Python作为一门高级动态语言,拥有与C、C++等老牌编程语言同样强大的功能。具体来说,Python有以下特点。

  1. 语法简洁

Python语言中的关键字很少,不需要使用分号,大括号,begin和end标记。可以使用循环和条件语句进行数据结构初始化。相对于C、C++和Java等主流静态类型语言,Python极大地提高了开发者的开发效率:Python代码长度往往只有主流静态类型语言代码长度的1/5\~1/3。且Python语言因无需静态语言所需要的编译、链接等步骤,进一步提高了程序员的效率。

  1. 便于移植

Python语言,作为一种脚本语言,具有跨平台的特性。任何一种计算机操作系统,只要安装了Python解释器,就可以直接在其上运行Python程序,而不需要对其进行任何修改。也就是说,Python程序在各个平台下具有一致性。

  1. 易于扩展

Python语言在设计之初,就将编程语言的可扩展性考虑其中。具体体现在,Python语言可以集成C、C++、Java等所编写的代码,用相关接口和函数库将它们“粘起来”。而且,Python文件(后缀为.py)既等同于可执行文件,又可以作为功能模块来使用。

  1. 类库丰富:

不仅Python标准库提供了丰富的内置类和库函数,还有大量的第三方类库可以使用。不管是科学计算和游戏开发,还是机器学习与图像处理等,Python都可以凭借庞大的第三方类库来与在相关领域具有优势的编程语言一决高下。且Python语言因为其易用性与健壮性,受到越来越多专业与非专业编程人士的广泛欢迎。不仅仅有数量庞大的商业公司在为Python构建功能强大的类库,而且有数不清的Python爱好者通过开源平台为Python社区提供力量。

  1. 高级重用机制:

Python不仅支持面向过程编程方式,而且支持软件开发的高级重用机制,例如面向对象编程(object-oriented,OO)和函数式编程(function programming)。满足不同编程人士对不同编程方式的需求。

简言之,使用Python进行数据科学实践工具,不仅大大提高了编程效率,而且可以获得数不清的Python爱好者的支持。

1.2 安装Python

Python不仅安装和配置开发环境非常简单,而且可以进行跨平台下进行安装和开发。本节将介绍如何下载并在三大主流操作系统(Windows,Linux和Mac OS X)安装Python解释器。

我们在此以安装Python最新版本(Python 3.7.3)为例,进行讲解。因为Python 2.7的安装过程与Python 3.7的相似,Linux下的环境配置与MacOS下的环境配置相似等,因此我们只在必要的地方进行补充说明,不再过多赘述。

但是值得注意的是,因为*nix系统中部分系统文件依赖系统集成的Python 2.x或者Python 3.x,所以如果直接修改或删除,可能导致系统故障!因此,我们不建议对系统自带的Python版本进行任何改动!

1.3 安装Python

1.3.1 Windows下Python的下载和安装

我们可以通过Python官网:python.org/downloads下载Python的各个版本,如图1-1所示。


anaconda最后一步安装一直不动_anaconda一直处于加载状态
图1-1 选择合适的Python版本

我们在此已安装Python最新版本(Python 3.7.3)为例,对会进入如图1-2所示的下载页面,页面下方的表格中提供了各个目标系统对应的下载项。这里选择“Windows x86-64 executable installer”选项。此时会启动安装文件的下载。


anaconda最后一步安装一直不动_anaconda一直处于加载状态
图1-2 选择相应的操作系统

待下载结束后,双击exe文件进行安装,单击Install Now进行安装或自定义安装,这里点击Install Now进行自动安装,如图1-3所示。


anaconda最后一步安装一直不动_anaconda一直处于加载状态
图1-3 选择安装路径

要在控制台中使用Python,还需要将Python的解释器所在目录添加到环境变量当中。选择Add Python 3.7 to PATH,可在安装过程中自动将Python解释器所在目录添加到环境变量中。继续单击“Next”按钮,提示安装成功!如图1-4所示,通过单击Disable path length limit禁用windows系统的Path长度限制,避免在将来开发中可能的一些问题。


anaconda最后一步安装一直不动_anaconda一直处于加载状态
图1-4 Disable path length limit

虽然Python3.7.3安装程序可以自动帮我们解决系统环境变量配置问题,但是在一些特殊的情况,如Python 2.7.11安装程序,不能自动对系统环境变量进行配置,需要人工对系统环境变量进行配置。关于人工环境变量配置方法,详见第二章。

最后,我们需要测试是否配置成功,打开cmd,键入python -V。如果安装成功,应该显示Python的安装版本,如图1-5所示。


anaconda最后一步安装一直不动_anaconda一直处于加载状态
图1-5 在命令提示符中检查Python配置

至此,Windows下的python环境配置工作全部完成。

1.3.3 Linux下Python的下载和安装

Ubuntu 19.04集成python 3.7.3,但是没有集成相应版本包管理工具——pip3,也没有集成python 2与pip2。为了便于满足使用不同Ubuntu发行版的用户的需求。我们在此介绍Ubunut下python 2.7,3.7以及pip2,pip3的安装方法以及相关环境配置方法。

第一步,根据具体需求,我们安装不同版本的python以及pip。

  1. Python 2.7 的安装
Input:sudo apt install python3.7
  1. python 3.7 的安装
Input:sudo apt install python2.7
  1. pip3的安装
Input:sudo apt install python3-pip
  1. pip2的安装
Input:sudo apt install python-pip

第二步,定义别名

在开发中,我们需要对不同版本python与pip定义别名。一般来说,我们让python指向python3,pip指向pip3。

  1. 查找python与pip的位置
Input:whereis pip

Output:pip:/usr/local/bin/pip /usr/local/bin/pip36 /usr/local/bin/pip2.7

Input:whereis python

>   Output:python: /usr/bin/python2.7 /usr/bin/python2.7-config
>   /usr/bin/python3.7m /usr/bin/python3.7 /usr/bin/python3.7m-config
>   /usr/bin/python3.7-config /usr/bin/python /usr/lib/python2.7
>   /usr/lib/python3.7 /usr/lib/python3.7 /etc/python2.7 /etc/python3.7
>   /etc/python /usr/local/lib/python2.7 /usr/local/lib/python3.7
>   /usr/include/python2.7 /usr/include/python3.7m /usr/include/python3.7
>   /usr/share/python /usr/share/man/man1/python.1.gz

可见python3在/usr/bin/python3.7,pip3在 /usr/local/bin/pip3.7

  1. 自定义别名
Input: vim \~/.bashrc
跳转最后一行,输入
alias python=/usr/bin/python3.7

    alias pip=/usr/local/bin/pip3.7

第三步,更新环境

source \~/.bashrc

至此,Ubuntu下的python环境配置工作全部完成。

1.3.4 Mac OS X下Python的下载和安装

MacOS已集成Python 2.x。因为贸然修改系统自带的Python 2.x版本会导致某些系统文件失效,进而造成诸多不必要的麻烦。所以,尽量不要替换或删除系统自带的Python 2.x。

可以通过Python官网:python.org/downloads/release/python-373下载macOS 64-bit Installer,来安装python 3.7.3。也可以通过homebrew安装Python。我们这里以通过Python官网安装为例,进行讲解。

Mac下的Python安装过程相当简单,我们只需一路点击下一步(Continue)即可完成安装。如图1-6所示。


anaconda最后一步安装一直不动_anaconda一直处于加载状态
图1-6 Python安装信息

anaconda最后一步安装一直不动_anaconda一直处于加载状态
图1-7 安装certifi

最后,按照上图提示,我们打开terminal,输入pip3 install certifi来完成网络配置工作,如图1-7所示。

至此Mac OS X下的Python环境配置工作全部完成。

1.4 Python类库

Python语言之所以能成为世界上最受欢迎的语言(至少现在看是这样),其中一个重要的原因,就是Python拥有规模庞大的第三方库,如科学计算中常用的Numpy和SciPy,以及机器学习中常用到的Scikit-Learn和Tensorflow。这些第三方库为Python的流行,做出了决定性的贡献。

然而,在Python发展的早期,第三方库却曾一度成为Python语言发展的绊脚石。之所以会出现这种情况,主要是因为,Python在版本更迭的过程中,由于第三方库由全球开发者分布式维护,缺乏统一管理,进而造成用户缺乏方便快捷的包管理工具,来使其获得第三方库所带来的便利。而随着Python核心团队推出pip包管理工具,这些曾经极大地制约Python发展与推广的困难,都得到了解决。

为了理解类库,首先我们需要了解一些相关概念。

变量(variable):变量来源于数学,是计算机语言中能储存计算结果或能表示值抽象概念。

函数(Function):函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。

类(Class):用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法

模块(Module):Python 模块(Module),是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和Python语句。

包(Package):含有__init
.py文件的目录我们称之为包。可以使用import导入包,或者from + import来导入包中的部分模块。包目录下为首的一个文件便是 __init.py。然后是一些模块文件和子目录,假如子目录中也有 __init__.py 那么它就是这个包的子包了。

库(Library):多个为处理某一类问题的*.py文件

图2.x描述了,上述术语的从属关系。

在后续讲解中,我们不再详细区分函数库(Library)和模块(Module),对于所有使用import导入的代码,我们都统称为“模块“。

1.5 常用Python类库

Python类库分为两种,一种为Python语言内置类库,也即标准库,另一种为第三方库。表1.1和表1.2分别列举了常用的标准库和常用的第三方数据科学类库。

表1.1 Python常用标准库

库类别 库名称 简介
系统 os os模块可以令使用操作系统相关功能变得更加方便。该模块提供了读取,写入文件,操作路径等方法。
shutil shutil提供高级文件和目录处理方法
sys sys模块提供对某些由解释器使用或维护的变量的访问,以及对与解释器强交互的函数的访问。
文件通配符 glob glob 文件名模式匹配,不用遍历整个目录判断每个文件是不是符合。
字符串处理 re re提供了类似于Perl的正则表达式匹配操作。要匹配的模式和字符串可以是Unicode字符串以及8位字符串。
数学 math 数学库,包含基本数学函数如开方(sqrt),平方(square)
互联网 urlib urllib 是一个收集了多个使用URL的模块的软件包:
smtplib smtplib模块定义一个smtp客户机会话对象,该对象可用于使用smtp或esmtp侦听器守护程序向任何Internet计算机发送邮件。有关SMTP和ESMTP操作的详细信息,请参阅RFC821(简单邮件传输协议)和RFC1869(SMTP服务扩展)。
日期和时间 datetime datetime 模块提供了用于以简单和复杂的方式操作日期和时间的类。在支持日期时间数学运算的同时,实现的点更着重于如何能够更有效地解析其属性用于格式化输出和数据操作。相关功能还可以参阅 time 和 calendar 模块。
数据压缩 zlib 此模块为需要数据压缩的程序提供了一系列函数,用于压缩和解压缩。
测试 doctest doctest模块搜索看起来像交互式python会话的文本片段,然后执行这些会话以验证它们是否如图所示工作。

表1.2 数据科学常用类库

库名称 简介
科学计算 Numpy Numpy(Numeric Python)是Python一个开源的科学计算扩展库。NumPy(Numeric Python)提供了许多高级的数值编程工具,如:矩阵数据类型、矢量处理,以及精密的运算库。专为进行严格的数字处理而产生。
SciPy Scipy是一个用于数学、科学、工程领域的常用软件包,可以处理插值、积分、优化、图像处理、常微分方程数值解的求解、信号处理等问题。它用于有效计算Numpy矩阵,使Numpy和Scipy协同工作,高效解决问题。
SymPy Sympy是一个用于符号数学运算的Python库。
Pandas Python Data Analysis Library 或 pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。pandas提供了大量能使我们快速便捷地处理数据的函数和方法。
数据可视化 Matplotlib Matplotlib是一个python 2d绘图库,它以各种硬拷贝格式和跨平台的交互环境生成出版物质量图。matplotlib可以用于python脚本、python和ipython shell(_la matlab或mathematica)、Web应用程序服务器以及各种图形用户界面工具包。
Seaborn Seaborn在matplotlib的基础上进行了更高级的API封装,从而使得作图更加容易,在大多数情况下使用seaborn就能做出很具有吸引力的图,而使用matplotlib就能制作具有更多特色的图。应该把Seaborn视为matplotlib的补充,而不是替代物。
机器学习 GraphLab GraphLab 作为一个基于图处理的并行计算框架,可以高效地运行机器学习相关的数据依赖性强,迭代型算法。
Scikit-Learn Scikit-Learn是一个用Python语言编写的机器学习算法库。Scikit-Learn作为一款机器学习开源框架堪称机器学习库中的瑞士军刀。
Tensorflow TensorFlow是一个端到端的开放源码平台,用于机器学习。它拥有一个由工具、库和社区资源组成的全面、灵活的生态系统,使研究人员能够在ML中推动最先进的技术,开发人员可以轻松地构建和部署基于ML的应用程序。
Keras Keras是一个高层神经网络API,Keras由纯Python编写而成并基Tensorflow、Theano以及CNTK后端。Keras 为支持快速实验而生,能够把研究人员的idea迅速转换为结果。

1.6 Anaconda

Anaconda的中文译名为蟒蛇。它是一个极其流行的,开源的Python发行版本,因包含大量的第三方类库及其依赖项而著名。使用Anaconda可以快速安装、运行和升级包及其依赖项。

此外,开发者在开发过程中经常会遇到Python版本或Python库版本不符合需求的问题,需要对Python版本或Python库版本进行升级或者降级,然而这种操作即有可能产生连锁反应,使得python与库之间,库与库之间产生不兼容问题,进而导致Python环境被污染。这时候,使用Anaconda可以方便开发者对Python环境进行管理。使用Anaconda建立的Python环境与系统Python环境和与Anaconda建立的其他Python环境是完全隔离的。这就保障了不同Python环境之间是相互独立的。Anaconda克服了virtualenv工具的不足,使创建环境变得简单。

所谓一图胜千言,表1.3将conda,pip,virtualenv工具能力对比,同时列出了各种工具常用指令,从中我们也可以看出Anaconda覆盖pip和virtualenv的所有功能,是包和与环境管理方面无可替代的选择。

表1.3 Conda&pip&virtualenv

任务 conda命令 pip命令 virtualenv命令
安装包 conda install $PACKAGE_NAME pip install $PACKAGE_NAME
更新包 conda update –name $ENVIRONMENT_NAME $PACKAGE_NAME pip install –upgrade $PACKAGE_NAME
更新包管理工具 conda update conda Linux/macOS: pip install -U pip Win: python -m pip install -U pip
卸载包 conda remove –name $ENVIRONMENT_NAME $PACKAGE_NAME pip uninstall $PACKAGE_NAME
创建环境 conda create –name $ENVIRONMENT_NAME python cd $ENV_BASE_DIR; virtualenv $ENVIRONMENT_NAME
激活环境 conda activate $ENVIRONMENT_NAME* source $ENV_BASE_DIR/$ENVIRONMENT_NAME/bin/activate
注销环境 source deactivate deactivate
查找可用包 conda search $SEARCH_TERM pip search $SEARCH_TERM
从特定源安装包 conda install –channel $URL $PACKAGE_NAME pip install –index-url $URL $PACKAGE_NAME
列举包 conda list –name $ENVIRONMENT_NAME pip list
创建需求文件 conda list –export pip freeze
列举环境 conda info –envs Install virtualenv wrapper, then lsvirtualenv
安装包管理工具 conda install pip pip install conda
安装python conda install python=x.x
更新python conda update python*

我们先前已经对pip和virtualenv命令进行了讲解,我们将会在2.2.3,2.2.4节对conda命令进行讲解。

1.6.1 Anaconda的安装

Windows

我们通过anaconda.com/distributi下载所需要的版本,如图1-8所示。


anaconda最后一步安装一直不动_anaconda一直处于加载状态
图1-8 Anaconda下载页面

下载完成后,双击进行安装,选择路径,我们推荐把Anaconda3加入环境变量,同时把Anaconda默认环境所带解释器作为系统默认的Python解释器,如图2.3所示。


anaconda最后一步安装一直不动_anaconda一直处于加载状态
图1-9 Anaconda3的安装

人工配置环境变量,可遵循以下步骤。

第一步:右击“计算机”(Windows 10操作系统中为“此电脑”),选择“属性”选项,打开“系统”窗口,如图1-10所示。


anaconda最后一步安装一直不动_anaconda一直处于加载状态
图1-10 进入“系统”窗口

第二步:选择“高级系统设置”(Advanced system settings)选项,单击“高级”选项卡的“环境变量”按钮,如图1-6所示。

第三步:将Anaconda的相关安装路径(编者的路径为C:\Users\Johan\Anaconda3)添加到Path变量中,如图1-11所示。


anaconda最后一步安装一直不动_anaconda一直处于加载状态
图1-11 单击“环境变量”按钮

anaconda最后一步安装一直不动_anaconda一直处于加载状态
图1-11 配置Path环境变量

在这里我们将Anaconda的相关安装路径加入了用户环境变量。这样做的好处使,当该PC有多位用户使用时,不会因为用户环境变量不同而发生冲突。

此外,还可以将Anaconda的相关安装路径加入系统环境变量。这样做会对PC上的所有用户都会生效。

Ubuntu

我们通过anaconda.com/distributi下载所需要的版本。在下载所得文件Anaconda3-2019.03-Linux-x86_64.sh所在的目录下键入如下命令:

sudo chmod +x https://zhuanlan.zhihu.com/p/ Anaconda3-2019.03-Linux-x86_64.sh

https://zhuanlan.zhihu.com/p/Anaconda3-2019.03-Linux-x86_64.sh #不要在root下安装

接受许条款后,选择Anaconda的安装路径,我们建议在默认家路径下进行安装。一路确认,即可完成

Ubuntu配置用户环境变量的方法如下:

在terminal中输入

sudo vim \~/.bashrc //ashrc是用户级环境变量,只对当前用户有效

在.bashrc中输入:

export PATH=\~/anaconda3/bin:\$PATH \#将anaconda3加入到用户环境变量前

此外,还可以将anaconda3加入到系统环境变量中,需要修改的文件为/etc/profile,其他操作一致。

Mac OS X

从官网下载Mac OS X 的anaconda安装程序。当安装程序运行时,它会自动将anaconda可执行文件路径附加到.bash_profile中。这位于/users/\$user/.bash_profile。要验证一切正常,请尝试在系统shell中启动ipython(打开终端应用程序以命令提示):

可以采用与Ubuntu相同的人工环境变量配置方法对Mac OS X的环境变量进行人工配置。更多Mac OS X的环境变量配置方法,请参照官方文档。

1.6.2 包管理

查询包

查询已安装的包命令如下:

conda list

模糊查询:

conda serach item_name \#item_name为包的部分拼写

安装包

在安装包的过程中,conda还会自动安装依赖项。例如:scikit-learn需要依赖于Numpy,Scipy如果只安装scikit-learn,则conda还会安装Numpy, Scipy

包安装命令如下:

conda install package_name1 [package_name2 Package_name3 … Package_namen]

卸载包

包卸载命令如下

conda remove package\_name1[ package_name2 Package_name3 … Package_namen]

更新包

包更新命令如下

conda update package_name1[ package_name2 Package_name3 … Package_namen]

更新所有包命令如下:

conda update –all

切换源

熟悉*nix的读者在使用apt或homebrew工具安装软件时往往需要对第三方源进行配置,在一些特殊的情况下,还需要对软件源的优先级进行指定。conda作为一种强大的包管理工具,同样允许使用者自定义安装源。

在安装包一节中,我们使用conda install packge_name的方式,从默认频道中安装或更新包。然而,对某些领域的专业人士来说,官方默认频道(Continuum)往往无法提供他们所需要的包。这是,就需要人工指定conda的安装源。

有两种更改安装频道的方法,一种是每次指定一个频道对包进行安装:

conda install -c some-channel packagename

另一种是,将经常使用的频道,添加到conda配置中。当多个频道均具有特定的安装包时,conda根据配置列表种第三方频道的先后顺序确定频道优先级,进行包的安装。

下述命令将频道some_channel添加到channels配置列表的顶部(最高优先级):

conda config --add channels some-channel

下述命令将频道some_channel添加到channels配置列表的底部(最低优先级):

conda config --append channels some-channel

删除channels配置列表中的频道:

conda config --remove channels some-channel

conda-forge是除了默认频道外最常用的conda频道。conda-forge是为了建立和维护软件包由社区主导的python包的集合,为conda包管理器构建基础结构和发行版。

我们使用conda-forge取代默认频道往往基于以下两方面原因:

  1. conda-forge往往可以提供默认频道不能提供的包
  2. conda-forge往往可以提供更新的包

除了conda-forge源以外,还存在生物信息学常用的binconda源等,在此不再熬述。

1.6.3 环境管理

查询环境

查询环境命令如下:

conda env list

创建环境

创建环境命令如下:

conda create -n env_name package_name1[ package_name2 package_name3 …
package_namen]

此命令会创建包含若干包的Python环境,其中 -n 后边跟环境名称

例如:conda create -n iexkliu pandas matplotlib,这样便会创建包含pands和matplotlib的python运行环境

同时,在创建环境时,可以指定安装在环境中的编程语言

如我们希望在安装环境时同时获得python2,python3,C++语言的支持:

进入环境

进入环境命令如下

activate env_name #对于Linux和Mac用户,键入source activate env_name

注销环境

进入环境命令如下

deactivate env_name #对于Linux和Mac用户,键入source deactivate env_name

共享环境

  1. 导出环境

共享环境可以让他人安装我们的开发环境中所使用的包。且新安装的包的版本与我们所写的代码中用到的包的版本是一致的。

共享环境的命令如下:

conda env export \> environment.yaml

通过这条命令可以将当前环境保存到终端当前目录下。键入type environment.yaml可以查看该环境配置文件的内容,亦可以使用记事本打开。

在 GitHub 上共享代码时,最好同样创建环境文件并将其包括在代码库中。这能让其他人更轻松地安装你的代码的所有依赖项。

  1. 导入环境

首先我们需要激活被导入环境,如我们的被导入环境为inport_env接着,我们使用如下命令将environment.yaml中环境配置导入到当前环境:

conda env update -f=/path/to/enviroment.yml

其中-f表示环境配置导出文件所在的本地路径,结果如图1-12所示。


anaconda最后一步安装一直不动_anaconda一直处于加载状态
图1-12 导出环境

删除环境

删除环境的命令如下:

conda env remove -n env_name 删除指定的环境

1.7 Jupyter

1.7.1 初识Jupyter

Jupyter项目

Jupyter项目是一个非盈利的开放源代码项目,2014年从IPython项目中诞生,因为它发展到支持跨所有编程语言的交互式数据科学和科学计算。Jupyter将始终是100%开源软件,免费供所有人使用,并根据修改后的BSD许可证的自由条款发布。

Jupyter是通过Jupyter社区的共识在Github上公开开发的。Jupyter项目的存在是为了开发开放源代码软件、开放标准和跨几十种编程语言的交互式计算服务。

Ipython

IPython提供了对Python编程语言的扩展,使交互工作变得方便和高效。这些扩展是在ipython内核中实现的,并且在运行这个内核时,可以在所有ipython前端(笔记本、终端、控制台和qt控制台)中使用。

Jupyter Notebook

Jupyter Notebook是一个开源的Web应用程序,允许您创建和共享包含实时代码、公式、可视化和叙述性文本的文档。用途包括:数据清洗和转换、数值模拟、统计建模、数据可视化、机器学习等。

Jupyter项目的一个主要组成部分是笔记本,一种用于代码、文本(带或不带标记)、数据可视化和其他输出的交互式文档。Jupyter笔记本与内核交互,内核是Jupyter交互式计算协议的任何编程语言的实现。python的Jupyter内核使用ipython系统作为其底层行为。

Jupyter Notebook拥有以下优点:

  1. 多种语言支持
    该笔记本支持40多种编程语言,包括python、r、julia和scala。
  2. 共享笔记本
    笔记本可以通过电子邮件、Dropbox、Github和Jupyter笔记本查看器与其他人共享。
  3. 交互式输出
    您的代码可以生成丰富的交互式输出:HTML、图像、视频、乳胶和自定义MIME类型。
  4. 大数据融合
    利用来自python、r和scala的大数据工具,如ApacheShark、Pandas、Scikit Learn、Ggplot2、TensorFlow一起探索相同的数据。
    1.5 Jupyter

JupyterLab是jupyter项目下一代基于Web的用户界面。Jupyter Lab极大地拓展了Jupyter Notebook的功能,提供了更为优秀的用户体验。使用Jupyter Lab,我们可以同实在一个浏览器界面打开并编辑多个Notebook,Jupyter console和cmd终端(对于*nix来说,是terminal),并且支持预览和编辑更多种类的文件,如diamagnetic文件,Markdown文档,json,yml,csv,等,还可以使用Jupyterlab连接Onedrive等云存储服务,极大得提升了生产力。且Jupyter Lab遵循Jupyter社区指南。

1.7.2 IPython

安装

安装Ipython

pip install ipython

安装并在Jupyter中注册Ipython核心:

python -m pip install ipykernel

python -m ipykernel install [--user] [--name \<machine-readable-name\>]
[--display-name \<"User Friendly Name"\>]

更多帮助

python -m ipykernel install --help

基本使用

除了ipython命令外,您可以在命令行上启动ipython shell,就像启动常规的python解释器一样,如图1-13:


anaconda最后一步安装一直不动_anaconda一直处于加载状态
图1-13 ipython shell

您可以通过键入任意的python语句并按回车键(或回车键)来执行这些语句。当只在IPython中键入一个变量时,它将呈现对象的字符串表示形式:

许多种类的python对象的格式都是为了更可读或更美观地打印,这与普通的打印方式不同。如果您在标准的python解释器中打印这些数据变量,那么它们的可读性将大大降低:

print函数

IPython还提供了执行任意代码块(通过某种美化的复制粘贴方法)和整个Python脚本的工具。您也可以使用JupyterNotebook来处理较大的代码块。

从表面上看,ipython外壳看起来像是标准终端python解释器(用python调用)的一个不同版本。与标准的python shell相比,它的一个主要改进是标签完成,在许多IDE或其他交互计算分析环境中都可以找到。在shell中输入表达式时,按tab键将在命名空间中搜索与迄今键入的字符匹配的任何变量(对象、函数等)。、

Ipython是Jupyter Notebook与Jupyter Lab的基础,只要掌握了Ipython的用法,就可以轻松的将开发环境迁移到Jupyter Notebook与Jupyter Lab上来。我们鼓励您在Jupyter Labs上对本节代码进行实践。

读取文档

使用计算机编程技术在科学研究和工程应用中解决问题,最频繁的需求之一就是文档。在Python中,每一个对象都有一个文档字符串(docstring)的引用。该文档字符串,包含了Python对象的概述、用法等相关信息。使用help()函数可以这些对象的使用方法。当help函数作用于函数或者方法时,help函数还可以返回他们的用法。下面让我们使用help()函数abs函数的用法.

In[1]help(abs)

Help on built-in function abs in module builtins:

abs(x, /)

Return the absolute value of the argument.

此外,在Ipython中还可以使用问号”?”文档。让我们在Ipython中试试吧!

In[1]: ?abs

**Signature:** abs**(**x**,** **/)**

**Docstring:** Return the absolute value of the argument.

**Type:** builtin_function_or_method

符号”?”既可以放在行首也可以放至行尾。

在Ipython中列表的文档:

In[1]: list?

**Init signature:** list**(**iterable**=(),** **/)**

**Docstring:**

Built-in mutable sequence.

If no argument is given, the constructor creates a new empty list.

The argument must be an iterable if specified.

**Type:** type

**Subclasses:** \_HashedSeq, StackSummary, SList, \_ImmutableLineList,
FormattedText, NodeList, \_ExplodedList, Stack, \_Accumulator, \_ymd, ...

如果,我们需要创建自己的函数或自定义对象,希望他们的文档,又该怎么做呢?只需要在函数或对象创建语句的第二行以多行注释的形式加入注释,就完成了文档的创建。

我们创建一个计算平方数的函数,并创建文档

In[]:def square(x):

'''  Return the square of x'''

return x\*x

square(3.14)

Out[]:9.8596

查看square函数的文档

In[]:? square

**Signature:** square**(**x**)**

**Source:**

**Signature:** square**(**x**)**

**Docstring:** Return the square of x

**File:** d:\\jupyterdo\\\<ipython-input-74-563ca1869869\>

**Type:** function

我们创建一个狗的基类,并创建文档

In[]:class Dog:

'''  dogs' base class  '''

dogCount=0

def \_\_init\_\_(self, name, age):

self.name = name

self.age = age

Dog.dogCount += 1

def showcount(self):

print("Total dogs %d" % dogCount.dogcount)

def showage(self):

print("Name : ", self.name, ", Age: ", self.age)

In[]:? Dog

**Init signature:** Dog**(**name**,** age**)**

**Docstring:** dogs' base class

**Type:** type

**Subclasses:**

查看Dog类的文档:

In[]:? Dog

**Init signature:** Dog**(**name**,** age**)**

**Docstring:** dogs' base class

**Type:** type

**Subclasses:**

读取源代码

在Ipython中可以使用双问号”??”源代码。

查看square函数的源代码:

In[]:?? square

**Signature:** square**(**x**)**

**Source:**

**def** square**(**x**):**

**'''**

**Return the square of x'''**

**return** x**\***x

**File:** d:\\jupyterdo\\\<ipython-input-74-563ca1869869\>

**Type:** function

查看Dog.showage方法的源代码:

In[]:?? Dog.showage

**Signature:** Dog**.**showage**(**self**)**

**Docstring:** \<no docstring\>

**Source:**

**def** showage**(**self**):**

print**("Name : ",** self**.**name**,** **", Age: ",** self**.**age**)**

**File:** d:\\jupyterdo\\\<ipython-input-67-b51896ab7fa6\>

**Type:** function

快捷键

Ipython中的快捷键分为四类:导航快捷键、文本输入快捷键、命令历史快捷键与其他快捷键。表1.4对这些快捷键进行了简要的介绍。掌握这些快捷键会使编程工作事半功倍。如果您拥有*nix下shell或者文本编辑器(Vim、Emacs等)的使用经验,您将会很快上手。

表1.4 Ipython常用快捷键


anaconda最后一步安装一直不动_anaconda一直处于加载状态

I/O记录

除了使用Ctrl+p和Ctrl+n快捷键历史命令。Ipython还提供了多种历史命令的而输出方式。我们将会在本节对这些命令进行介绍。

IPython输入输出对象

经过前边简单的例子,您可能已经熟悉了IPython的输入输出提示符In[]和Out[]。这些In/Out提示符实际上就是本节所讲的IPython输入输出对象。它们不仅形式美观,还提供了输入和输出历史的功能。只需输入希望查看的代码所在的输入或输出提示符,就可以查看输入输出历史:

In[10]: In[1]

Out[10]:help(abs)

Out:[11]: Out[22]

Out[11]: help(abs)

但不是所有的In[]对象都有一个与之配对的Out[]对象,

还可以使用不带编号的In与Out对象,查看所有输入和输出记录。其中In是一个列表,按照命令的运行顺序记录命令。Out对象是一个字典,字典的键是输入对象的序号,字典的值是输入对象的输出。

In[12]:In

Out[12]: ['', 'help(abs)', "get_ipython().run_line_magic('pinfo', 'abs')",
"get_ipython().run_line_magic('pinfo', 'list')",



'In[1]', 'Out[10]', 'In']

In[12]:Out

Out[12]: {4: 9.8596, 10: 'help(abs)', 11: 'help(abs)', 12: ['', 'help(abs)',
"get_ipython().run_line_magic('pinfo', 'abs')",



'In[1]',

'Out[10]',

'In',

'Out']}

输出历史

除了使用Out[]与Outdui想输出历史外,还可以通过下划线符号”_”历史输出。

使用单下划线,可以查看前一条历史输出,使用双下划线,可以查看前两条历史输出。使用三下划线则可以查看前三条历史输出。

In[]:print(\_)

Out[]:{4: 9.8596, 10: 'help(abs)', 11: 'help(abs)', 12: ['', 'help(abs)',
"get_ipython().run_line_magic('pinfo', 'abs')",



'In[1]',

'Out[10]',

'In',

'Out']}

In[]:print(\__)

Out: ['', 'help(abs)', "get\_ipython().run_line_magic('pinfo', 'abs')",
"get_ipython().run_line_magic('pinfo', 'list')",



'In[1]', 'Out[10]', 'In']

In[]:print(\_\_\_)

Out[]:help(abs)

IPython至多支持三条下划线查看历史输出。当需要查看超过三条以上的历史输出时,请使用Out[]对象。

抑制输出

如果不希望某句代码的输出保存在输出历史中,就需要对某一句代码的进行输出抑制。最简单的输出抑制方法就是在代码行末加入一个分号”;”。

In[]:3+2;

值得注意的是,分号仅仅抑制了Ipython的输出,但是并没有抑制代码的运算。

shell命令

Python作为一种解释语言的一大优势在于它的可交互性。就像*nix用户与shell交互的的那样,shell不断将用户命令解释送入内核后运行。然而标准Python解释器下,无法输入shell命令。如果有同时使用python和shell进行开发的需求,那么用户就不得不在标准python解释器与shell之间来回切换。

令人惊喜的是,Ipython提供了执行shell命令的功能。通过在感叹号”!”键入shell命令,Ipython可以像在*nix terminal下那样执行shell命令。

如果读者使用的是windows操作系统,也大可不必沮丧。这得多亏了Bash On windows计划,现在在windows系统中运行*nix shell命令。Bash On Windows是微软的“Microsoft Love Linux”计划中重要的一环,目的是能让Windows用户能在系统中运行Linux子系统(Windows Subsystem for Linux, WSL)。用户只需要将计算机升级到windows10 1709版本之后,就可以直接在Windows中获得原生Linux Bash级别的体验。

魔法命令

我们在前面已经学习了许多Ipython命令,但是最精彩命令的当属于我们本节所讲的 魔法命令(函数)了!您或许能从其他开发工具上使用之前讲过的普通命令,但是Ipython的魔法命令却独树一帜,拥有强大的功能!

魔法命令有两种形式:行魔法(line magic)和单元魔法(cell magic)。行魔法命令使用单个百分号“%“字符作为前缀,作用域为单行代码;单元魔法命令使用两个百分号”%%”作为前缀,作用于多行输入。

表1.5 对常见的Ipython魔法命令进行了简要的介绍。

表1.5 Ipython常用魔法命令


anaconda最后一步安装一直不动_anaconda一直处于加载状态

接下来我们将对上述部分魔法命令进行介绍。

粘贴代码块

传统的C/C++语言使用括号来控制代码的作用域,在Python中则采用缩进的表示形式来决定代码的作用域。因此,在从其他软件向Ipython解释器粘贴多行代码时,可能会出现缩进错误等错误。使用Ipython的%paste魔法命令可以很好的解决这个问题。而#cpaste则可以打开一个交互式多行输入提示。

shell魔法

当我们通过Ipython操作shell时会发现,我们并不能cd命令来改变的工作路径。这是因为,Ipython中的shell命令都是在一个临时的shell中执行的。例如:

In[]:! cd \#查看当前工作目录

C:\\

In[]: ! cd D:\\JupyterDo\\source_code_of_.py

In[]: !cd

C:\\

如果希望更改Ipython工作目录,可以使用%cd 魔法命令。

In[]: % cd \#查看当前工作目录

C:\\

In[]: % cd D:\\JupyterDo\\source_code_of_.py

In[]: % cd

D:\\JupyterDo\\source_code_of_.py

除了%cd魔法名另外,Ipython中还可以使用%ls, %man, %cp, %mv, % cat, %mkdir, %pwd, %dir等*nix shell相关的魔法命令

如果想要省略百分号”%”直接使用shell魔法,可以通过%automagic魔法函数进行翻转,翻转后,Ipython工作环境将变为shell环境,无法进行Python代码交互,但是若在代码前加入”%”后,Ipython将会认为此代码为Python代码,会按照Python语言的解释方法对代码进行解释。

对于一些常见的*nix 命令,不需要调用”%”号,就可以实现对应魔法命令的功能。

执行外部代码

在实际开发中,有时出于代码重用等需要,我们还要使用到.py文件存储的代码。使用%run魔法命令,可以在IPython会话中运行这些代码,而不需要使用标准Python解释器对他们进行执行。让我们使用魔法命令执行例3.1Bubble_sort.py文件(假设该文件位于D:/JupyterDo/source_code_of_.py下)。该文件的功能是:对10个随机数进行排序。

In[]:%cd D:/JupyterDo/pycode

%run 3.1Bubble_Sort.py

Out[]:D:\\JupyterDo\\pycode

排序前: [0.465243390293376, 0.701488505240007, 0.7796559068947894,
0.6495607567281101, 0.4003995588286813, 0.7207742339736103, 0.5812010361696163,
0.6222503023701531, 0.8460218550960557, 0.3789957134672691]

排序后: [0.8460218550960557, 0.7796559068947894, 0.7207742339736103,
0.701488505240007, 0.6495607567281101, 0.6222503023701531, 0.5812010361696163,
0.465243390293376, 0.4003995588286813, 0.3789957134672691]

代码分析

IPython提供了许多代码分析魔法命令,如代码计时命令%time,内存分析命令:%memit等。下面我们对这些代码进行逐一介绍。

使用%timeit或%%timeit可以让重复运行单行或整个多行代码来计算代码的平均运行时间。

In[]:%timeit sum(range(100))

Out[]:52.2 µs ± 731 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

使用%time或%%time可以计算一次单行或整个多行代码的平均运行时间

In[]:%time sum(range(1000))

Wall time: 0 ns

Out[]:499500

在大部分情况下,重复操作计魔法命令%timeit时可以提高计算代码运行时间的精度,但是在某些情况下,却会引入额外的误差。如,对一个列表进行排序,第一次运行排序程序时,列表中的元素已经有序,因此接下来的排序操作要比第一次排序操作都要快。

但是这并不意味着%time魔法命令%timeit魔法命令更加精确。%timeit命令会在底层阻止系统调用对于计时过程的干扰操作,如Python的垃圾回收。而time却并不会这么做。因此,如果代码运行时间较长而较短的系统延迟对计时影响较小的话,可以使用%time魔法命令。在一般情况下,%timeit要比%time得出的代码运行时间更少。

魔法命令文档

Ipython中的魔法命令也有文档。可以在魔法命令行首或行末加上问号“?“来目标魔法命令的文档:

In[]:?%time



使用%lsmagic魔法命令可以获得所有可用的魔法命令的列表

In[]:%lsmagic

![](https://zhuanlan.zhihu.com/media/ba865d30fa7fce1df575a0a0f57acf93.png)Out[]:

使用%magic魔法命令可以获得可用魔法命令的通用描述及实例

%magic

1.7.3 Jupyter Notebook

安装

激活python环境,若使用conda安装,则键入:

conda install jupyter notebook

若使用pip安装,则键入:

pip install jupyterlab

使用

要启动Jupyter,请在终端运行命令Jupyter notebook:


anaconda最后一步安装一直不动_anaconda一直处于加载状态
图1-14 Jupyter Notebook

在许多平台上,Jupyter将在默认的Web浏览器中自动打开(除非您以无浏览器启动它)。否则,您可以导航到启动笔记本时打印的httpaddress,这里是http://localhost:8888/。如图1-15所示。


anaconda最后一步安装一直不动_anaconda一直处于加载状态
图1-15 Jupyter Notebook目录

要创建新笔记本,请单击“新建”按钮并选择“python 3”。您应该看到类似图2-2的内容。在Jupyter Notebook中,一对In Out会话被称作一个代码单元(Cell)。单击空代码“cell”并输入一行python代码。然后按shift enter即可执行。


anaconda最后一步安装一直不动_anaconda一直处于加载状态
图1-16 Jupyter Notebook代码单元

Jupyter Server

许多人使用jupyter作为本地计算环境,但它也可以部署在服务器上并远程访问。下面我们设置Jupyter远程服务器。

打开终端,键入以下命令:

jupyter notebook --generate-config

打开ipython,键入以下命令:

from notebook.auth import passwd

passwd()

输入密码,保存获得加密有的密码

修改家目录下,https://zhuanlan.zhihu.com/p/jupyter/jupyter_notebook_config.py中的配置,在文件最后添加以下代码:

c.NotebookApp.ip = '0.0.0.0' \#所有绑定服务器的IP都能访问若想只在特定ip访问输入ip地址即可  c.NotebookApp.port = 6666 \#将端口设置为自己喜欢的吧默认是8888  c.NotebookApp.open_browser = False \#我们并不想在服务器上直接打开Jupyter Notebook所以设置成False  c.NotebookApp.notebook_dir = '/home/zwj/jupyter3_projects' \#这里是设置Jupyter的根目录若不设置将默认root的根目录不安全  >   c.NotebookApp.allow_root = True \# >   为了安全Jupyter默认不允许以root权限启jupyter  >   c.NotebookApp.terminals_enabled = False \# 关闭terminal  c.NotebookApp.password = u'sha1:508ebedea861:ffd1d5bd358d7d812fba3094dea7b5b461a81870'

在本地计算机浏览器中键入http://\<JupyterServerIP>:\<Port> ,即可访问Jupyter Server,进行远程开发。

虽然jupyter笔记本可以感觉到与ipython shell不同的体验,但是本章中的几乎所有命令和工具都可以在任何一个环境中使用。

1.7.4 Jupyter Lab

安装

激活python环境,若使用conda安装,则键入:

conda install -c conda-forge jupyterlab \#使用conda安装

若使用pip安装,则键入:

pip install jupyterlab

使用

相较于Jupyter Notebook,Jupyter Lab提供了大量编程实用功能,如分屏操作,终端操作等,还可以对主题进行修改。

Jupter Lab是Jupyter Notebook的进阶,提供超越Jupyter Notebook的体验,极大地提高了生产效率。Jupyter Lab是Python数据科学方面最强大的生产工具。我们强烈建议,在Jupyter Lab上完成数据科学的学习。图1-16是Jupyter Lab的开发界面。


anaconda最后一步安装一直不动_anaconda一直处于加载状态
图1-16 Jupyter Lab开发环境

本章对各主流IDE进行介绍。受制于篇幅,只对IDLE进行详细讲解,其他IDE的配置流程大致相同,即:添加Python环境设置默认Python环境,仅仅两步,就可完成这些IDE下,Python环境的搭建。故我们在这里只对除IDLE以外的IDE的配置过程进行大致概括,不会讨论它们的细节,但是鼓励您在internet上探索与您的需求相关的主题。

1.8 IDE

1.8.1 IDLE

配合Python进行开发的工具有很多,其中一些是文本编辑器,还有一部分集成开发环境(Integrated Development Environment, IDE),IDE是用于程序开发的软件,一般包括代码编辑器、解释器、调试器和图形用户界面工具。IDE为用户编程语言开发项目提供了很

IDLE 是开发Python程序的基本IDE,在安装Python环境后,IDLE可自动被装入系统,具备基本的IDE功能。IDLE使用平Python的Tkinter模块编写,基本功能包括语法加亮、段落缩进、基本文本编辑、Tab键控制、调试程序等。

IDLE打开后是一个增强的交互命令行解释器窗口(具有比基本的交互命令提示符更好的剪切-粘贴、回行等功能),如图1-17所示。除此之外,还有一个针对Python的编辑器(无代码合,但有语法标签加亮和代码自动完成功能、类浏览器和调试器。


anaconda最后一步安装一直不动_anaconda一直处于加载状态
图1-17 IDLE主界面

如果希望在用户自定义环境下进行调试,只需要在终端中激活环境后,输入IDLE即可。

IDLE为编写Python程序提供了基本的集成环境,但它的功能还不够强大,下醒项目管理、版本控制、智能提示等方面远不如其他IDE。因此,如果要开发比较大型的Python项目,则不建议使用IDLE。

1.8.2 PyCharm

PyCarm是一款非常好用的平台Python IDE,使用Java语言开发,有收费版本和社区免费版本。读者可以到jetbrains.com/pycharm/d下载其社区免费(Community)版本。

首先,Python具有一般IDE具备的功能,如调试、语法加亮、project管理、代码跳转、智能提示、自动完成、单元测试、版本控制等。此外,PyCarm还提供了一些很好的用于Django开发功能,同时,其支持Google APP Engine和IronPython。

下载pycharm的安装包并安装,选择设置主题等操作后程序会自动启动并打开pycharm程序。Pycharm的主界面如图1-18所示。


anaconda最后一步安装一直不动_anaconda一直处于加载状态
图1-18 PyCharm主界面

选择file-new—Python file选项即可新建文件,并在其中编写代码。编写完成后选择run-run选项或安装alt-shift-F10快捷键即可运行代码。

1.8.3 Visual Studio

Microsoft Visual Studio是VS的全称。VS是美国微软公司的开发工具包系列产品。VS是一个基本完整的开发工具集,它包括了整个软件生命周期中所需要的大部分工具,如UML工具、代码管控工具、集成开发环境(IDE)等等。所写的目标代码适用于微软支持的所有平台,包括Microsoft Windows、Windows Mobile、Windows CE、.NET Framework、.Net Core、.NET Compact Framework和Microsoft Silverlight 及Windows Phone。

Visual Studio作为“宇宙第一IDE”,集成了智能感知、Azure开发、概要分析等功能,是一款功能强大的Python开发环境。如图1-19所示为使用visual studio 2019搭建的Python开发环境。


anaconda最后一步安装一直不动_anaconda一直处于加载状态
图1-19 Visual Studio主界面

1.8.4 Eclipse

Eclipse是用Java语言开发的一个集成开发环境,而且是一个开源项目。Eclipse具有很好的扩展性,不但其原生程序可以作为Java的IDE,还有大量的插件来支持其他语言的开发。在eclipse平台上安装pydev插件就可以运行Python的开发工作了。


anaconda最后一步安装一直不动_anaconda一直处于加载状态
图1-20 Eclipse 主界面

Ecplise也非常强大,实现了Python代码的语法加亮、代码提示和代码补全等智能化功能。如图1-20所示为使用eclipse加pydev插件搭建的Python开发环境。

2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/9805.html

(0)
上一篇 2024年 5月 11日 20:21
下一篇 2024年 5月 11日

相关推荐

关注微信