- 学习网站
- 运行环境
- 基础知识:
-
- 简介
- **异常**
- 内置函数
- 语法结构
- 数据类型
- 运算符
- 输入和输出
- 流程控制语句
- 迭代器与生成器
- 函数与模块
-
- 函数定义与实现
- 模块与包
- 标准模块
-
- 概述
- 内置函数
- 内置常量
- 内置类型
- 内置异常
- 文本处理服务
- 二进制数据服务
- 数据类型
- 数字和数学模块
- 函数式编程模块
- 文件和目录访问
- 数据持久化
- 数据压缩和存档
- 文件格式
- 加密服务
- 通用操作系统服务
- 并发执行
- [contextvars 上下文变量](https://docs.python.org/zh-cn/3/library/contextvars.html)
- 网络和进程间通信
- 互联网数据处理
- 结构化标记处理工具
- 互联网协议和支持
- 多媒体服务
- 国际化
- 程序框架
- Tk图形用户界面(GUI)
- 开发工具
- 调试和分析
- 软件打包和分发
- Python运行时服务
- [自定义 Python 解释器](https://docs.python.org/zh-cn/3/library/custominterp.html)
- 导入模块
- [Python 语言服务](https://docs.python.org/zh-cn/3/library/language.html)
- 杂项服务
- [Unix 专有服务](https://docs.python.org/zh-cn/3/library/unix.html)
- 被取代的模块
- 未创建文档的模块
- 第三方模块
- 文件读写
- 装饰器decorator
- 深拷贝和浅拷贝
- 面向对象
- [os.path --- 常用路径操作](https://docs.python.org/zh-cn/3/library/os.path.html)
- [sys --- 系统相关的参数和函数](https://docs.python.org/zh-cn/3/library/sys.html)
- [re --- 正则表达式操作](https://docs.python.org/zh-cn/3/library/re.html)
- [datetime --- 基本的日期和时间类型](https://docs.python.org/zh-cn/3/library/datetime.html)
- Counter({'l': 9, 'h': 6, 'f': 5, 'a': 4, ';': 4, 'j': 3, 'd': 3, 's': 2, ':': 2, 'k': 1, 'g': 1, 'b': 1})
- pandas
- sklearn
- matplotlib
- jieba 中文文档处理包
- 待解决
前言
想学会一门语言不是一朝一夕的事情,本文是按照业务数据分析师/商业分析师 的路线来讲 Python 的学习路径。若大家想成为技术型的分析师,或者未来往数 据挖掘发展,建议你要比文章内容学得更深,所有的代码最好都手打一遍,这是 最有效的学习方式。
学习网站
https://www.liaoxuefeng.com/wiki/1016959663602400
https://www.runoob.com/python/python-tutorial.html
https://python3-cookbook.readthedocs.io/zh_CN/latest/chapters/p08_classes_and_objects.html
运行环境
IDE集成开发环境(Integrated Development Environment )工具。用 Anaconda 足矣。Anaconda是专业的数据科学计算环境,包含180+的科学包及其依赖项的发行版本。其包含的科学包包括:conda, numpy, scipy, ipython notebook等。不需要多余的安装和调试。
Anaconda
Anaconda(官方网站)就是可以便捷获取包且对包能够进行管理,同时对环境可以统一管理的发行版本。Anaconda包含了conda、Python在内的超过180个科学包及其依赖项。
Mac 版本只有一个 Navigator 导航。数 据分析最常用的程序叫 Jupyter,以前被称为 IPython Notebook,是一个交互式的 笔记本,能快速创建程序,支持实时代码、可视化和 Markdown 语言。 点击 Jupyter 进入,它会自动创建一个本地环境 localhost。
特点
- 开源
- 安装过程简单
- 高性能使用Python和R语言
- 免费的社区支持
适用平台
Anaconda可以在以下系统平台中安装和使用:
- Windows
- macOS
- Linux(x86 / Power8)
安装条件
- 系统要求:32位或64位系统均可
- 下载文件大小:约500MB
- 所需空间大小:3GB空间大小(Miniconda仅需400MB空间即可)
安装步骤
1.1 macOS系统安装Anaconda
① 图形界面安装
-
前往官方下载页面下载。有两个版本可供选择:Python 3.6 和 Python 2.7,我下载的是前者。选择版之后点击“64-Bit Graphical Installer”进行下载。
-
完成下载之后,双击下载文件,在对话框中“Introduction”、“Read Me”、“License”部分可直接点击下一步。
-
“Destination Select”部分选择“Install for me only”并点击下一步。
注意:若有错误提示信息“You cannot install Anaconda in this location”则重新选择“Install for me only”并点击下一步。
-
“Installation Type”部分,可以点击“Change Install Location”来改变安装位置。标准的安装路径是在用户的家目录下。在这一步我没有改变安装位置。若选择默认安装路径,则直接点击“Install”进行安装。
-
等待“Installation”部分结束,在“Summary”部分若看到“The installation was completed successfully.”则安装成功,直接点击“Close”关闭对话框。
-
在mac的Launchpad中可以找到名为“Anaconda-Navigator”的图标,点击打开。
-
若“Anaconda-Navigator”成功启动,则说明真正成功地安装了Anaconda;如果未成功,请务必仔细检查以上安装步骤。
-
“Anaconda-Navigator”中已经包含“Jupyter Notebook”、“Jupyterlab”、“Qtconsole”和“Spyder”。(图中的“Rstudio”是我后来安装的,但它默认出现在“Anaconda-Navigator”的启动界面,只需要点击“Install”便可安装。)
-
完成安装。
1.2mac命令行安装
-
前往官方下载页面下载。有两个版本可供选择:Python 3.6 和 Python 2.7,我下载的是前者。选择版之后点击“64-Bit Command-Line Installer”进行下载。
-
完成下载之后,在mac的Launchpad中找到“其他”并打开“终端”。
- 安装Python 3.6:bash ~/Downloads/Anaconda3-5.0.1-MacOSX-x86_64.sh
- 安装Python 2.7:bash ~/Downloads/Anaconda2-5.0.1-MacOSX-x86_64.sh
-
注意:
- 首词bash也需要输入,无论是否用的Bash shell。
- 如果你的下载路径是自定义的,那么把该步骤路径中的~/Downloads替换成你自己的下载路径。
- 如果你将第1步下载的.sh文件重命名了,那么把该步骤路径中的Anaconda3-5.0.1-MacOSX-x86_64.sh或Anaconda2-5.0.1-MacOSX-x86_64.sh替换成你重命名后的文件名。
- 强烈建议:不要修改文件名。如果重命名,使用英文进行命名。
-
安装过程中,看到提示“In order to continue the installation process, please review the license agreement.”(“请浏览许可证协议以便继续安装。”),点击“Enter”查看“许可证协议”。
-
在“许可证协议”界面将屏幕滚动至底,输入“yes”表示同意许可证协议内容。然后进行下一步。
-
安装过程中,提示“Press Enter to confirm the location, Press CTRL-C to cancel the installation or specify an alternate installation directory.”(“按回车键确认安装路径,按’CTRL-C’取消安装或者指定安装目录。”)如果接受默认安装路径,则会显示“PREFIX=/home//anaconda<2 or 3>”并且继续安装。安装过程大约需要几分钟的时间。
- 建议:直接接受默认安装路径。
-
安装器若提示“Do you wish the installer to prepend the Anaconda install location to PATH in your /home//.bash_profile ?”(“你希望安装器添加Anaconda安装路径在/home//.bash_profile文件中吗?”),建议输入“yes”。
注意:
- 路径/home//.bash_profile中“”即进入到家目录后你的目录名。
- 如果输入“no”,则需要手动添加路径。添加export PATH="/
/bin:$PATH"在“.bashrc”或者“.bash_profile”中。其中,“ ”替换为你真实的Anaconda安装路径。
-
当看到“Thank you for installing Anaconda!”则说明已经成功完成安装。
-
关闭终端,然后再打开终端以使安装后的Anaconda启动。
-
验证安装结果。可选用以下任意一种方法:
- 在终端中输入命令condal list,如果Anaconda被成功安装,则会显示已经安装的包名和版本号。
- 在终端中输入python。这条命令将会启动Python交互界面,如果Anaconda被成功安装并且可以运行,则将会在Python版本号的右边显示“Anaconda custom (64-bit)”。退出Python交互界面则输入exit()或quit()即可。
- 在终端中输入anaconda-navigator。如果Anaconda被成功安装,则Anaconda Navigator的图形界面将会被启动。
1.3Windows系统安装Anaconda
- 前往官方下载页面下载。有两个版本可供选择:Python 3.6 和 Python 2.7,选择版之后根据自己操作系统的情况点击“64-Bit Graphical Installer”或“32-Bit Graphical Installer”进行下载。
- 完成下载之后,双击下载文件,启动安装程序。注意:
- 如果在安装过程中遇到任何问题,那么暂时地关闭杀毒软件,并在安装程序完成之后再打开。
- 如果在安装时选择了“为所有用户安装”,则卸载Anaconda然后重新安装,只为“我这个用户”安装。
- 选择“Next”。
- 阅读许可证协议条款,然后勾选“I Agree”并进行下一步。
- 除非是以管理员身份为所有用户安装,否则仅勾选“Just Me”并点击“Next”。
- 在“Choose Install Location”界面中选择安装Anaconda的目标路径,然后点击“Next”。注意:
- 目标路径中不能含有空格,同时不能是“unicode”编码。
- 除非被要求以管理员权限安装,否则不要以管理员身份安装。
- 在“Advanced Installation Options”中不要勾选“Add Anaconda to my PATH environment variable.”(“添加Anaconda至我的环境变量。”)。因为如果勾选,则将会影响其他程序的使用。如果使用Anaconda,则通过打开Anaconda Navigator或者在开始菜单中的“Anaconda Prompt”(类似macOS中的“终端”)中进行使用。
- 除非你打算使用多个版本的Anaconda或者多个版本的Python,否则便勾选“Register Anaconda as my default Python 3.6”
- 然后点击“Install”开始安装。如果想要查看安装细节,则可以点击“Show Details”。
- 点击“Next”。
- 进入“Thanks for installing Anaconda!”界面则意味着安装成功,点击“Finish”完成安装。注意:如果你不想了解“Anaconda云”和“Anaconda支持”,则可以不勾选“Learn more about Anaconda Cloud”和“Learn more about Anaconda Support”。
- 验证安装结果。可选以下任意方法:
- “开始 → Anaconda3(64-bit)→ Anaconda Navigator”,若可以成功启动Anaconda Navigator则说明安装成功。
- “开始 → Anaconda3(64-bit)→ 右键点击Anaconda Prompt → 以管理员身份运行”,在Anaconda Prompt中输入conda list,可以查看已经安装的包名和版本号。若结果可以正常显示,则说明安装成功。
1.4 Linux系统安装Anaconda
- 前往官方下载页面下载。有两个版本可供选择:Python 3.6 和 Python 2.7。
- 启动终端,在终端中输入命令md5sum /path/filename或sha256sum /path/filename注意:
- 将该步骤命令中的/path/filename替换为文件的实际下载路径和文件名。其中,path是路径,filename为文件名。
- 强烈建议:
- 路径和文件名中不要出现空格或其他特殊字符。
- 路径和文件名最好以英文命名,不要以中文或其他特殊字符命名。
- 根据Python版本的不同有选择性地在终端输入命令:
- Python 3.6:bash ~/Downloads/Anaconda3-5.0.1-Linux-x86_64.sh
- Python 2.7:bash ~/Downloads/Anaconda2-5.0.1-Linux-x86_64.sh
- 注意:
- 首词bash也需要输入,无论是否用的Bash shell。
- 如果你的下载路径是自定义的,那么把该步骤路径中的~/Downloads替换成你自己的下载路径。
- 除非被要求使用root权限,否则均选择“Install Anaconda as a user”。
- 安装过程中,看到提示“In order to continue the installation process, please review the license agreement.”(“请浏览许可证协议以便继续安装。”),点击“Enter”查看“许可证协议”。
- 在“许可证协议”界面将屏幕滚动至底,输入“yes”表示同意许可证协议内容。然后进行下一步。
- 安装过程中,提示“Press Enter to accept the default install location, CTRL-C to cancel the installation or specify an alternate installation directory.”(“按回车键确认安装路径,按’CTRL-C’取消安装或者指定安装目录。”)如果接受默认安装路径,则会显示“PREFIX=/home//anaconda<2 or 3>”并且继续安装。安装过程大约需要几分钟的时间。建议:直接接受默认安装路径。
- 安装器若提示“Do you wish the installer to prepend the Anaconda<2 or 3> install location to PATH in your /home//.bashrc ?”(“你希望安装器添加Anaconda安装路径在/home//.bashrc文件中吗?”),建议输入“yes”。注意:
- 路径/home//.bash_rc中“”即进入到家目录后你的目录名。
- 如果输入“no”,则需要手动添加路径,否则conda将无法正常运行。
- 安装器若提示“Do you wish the installer to prepend the Anaconda<2 or 3> install location to PATH in your /home//.bashrc ?”(“你希望安装器添加Anaconda安装路径在/home//.bashrc文件中吗?”),建议输入“yes”。注意:
- 当看到“Thank you for installing Anaconda<2 or 3>!”则说明已经成功完成安装。
- 关闭终端,然后再打开终端以使安装后的Anaconda启动。或者直接在终端中输入source ~/.bashrc也可完成启动。
- 验证安装结果。可选用以下任意一种方法:
- 在终端中输入命令condal list,如果Anaconda被成功安装,则会显示已经安装的包名和版本号。
- 在终端中输入python。这条命令将会启动Python交互界面,如果Anaconda被成功安装并且可以运行,则将会在Python版本号的右边显示“Anaconda custom (64-bit)”。退出Python交互界面则输入exit()或quit()即可。
- 在终端中输入anaconda-navigator。如果Anaconda被成功安装,则Anaconda Navigator将会被启动。
管理conda
-
写在前面
接下来均是以命令行模式进行介绍,Windows用户请打开“Anaconda Prompt”;macOS和Linux用户请打开“Terminal”(“终端”)进行操作。
-
验证conda已被安装
conda --version
终端上将会以conda 版本号的形式显示当前安装conda的版本号。如:conda 3.11.0
注意:如果出现错误信息,则需核实是否出现以下情况:
- 使用的用户是否是安装Anaconda时的账户。
- 是否在安装Anaconda之后重启了终端。
-
更新conda至最新版本
conda update conda
执行命令后,conda将会对版本进行比较并列出可以升级的版本。同时,也会告知用户其他相关包也会升级到相应版本。
当较新的版本可以用于升级时,终端会显示Proceed ([y]/n)?,此时输入y即可进行升级。
-
查看conda帮助信息
conda --help 或 conda -h
-
卸载conda
-
Linux 或 macOS
rm -rf ~/anaconda2 或 rm -rf ~/anaconda3 。即删除Anaconda的安装目录。根据安装的Anaconda版本选择相应的卸载命令。
-
Windows
控制面板 → 添加或删除程序 → 选择“Python X.X (Anaconda)” → 点击“删除程序”
-
-
注意:
- Python X.X:即Python的版本,如:Python 3.6。
- Windows 10的删除有所不同。
管理环境
-
写在前面
接下来均是以命令行模式进行介绍,Windows用户请打开“Anaconda Prompt”;macOS和Linux用户请打开“Terminal”(“终端”)进行操作。
-
创建新环境
conda create --name <env_name> <package_names>注意:
- <env_name>即创建的环境名。建议以英文命名,且不加空格,名称两边不加尖括号“<>”。
- <package_names>即安装在环境中的包名。名称两边不加尖括号“<>”。
-
如果要安装指定的版本号,则只需要在包名后面以=和版本号的形式执行。如:conda create --name python2 python=2.7,即创建一个名为“python2”的环境,环境中安装版本为2.7的python。
-
如果要在新创建的环境中创建多个包,则直接在<package_names>后以空格隔开,添加多个包名即可。如:conda create -n python3 python=3.5 numpy pandas,即创建一个名为“python3”的环境,环境中安装版本为3.5的python,同时也安装了numpy和pandas。
- –name同样可以替换为-n。
- 提示:默认情况下,新创建的环境将会被保存在/Users/<user_name>/anaconda3/env目录下,其中,<user_name>为当前用户的用户名。
-
切换环境
① Linux 或 macOS
source activate <env_name>
② Windows
activate <env_name>
③ 提示
- 如果创建环境后安装Python时没有指定Python的版本,那么将会安装与Anaconda版本相同的Python版本,即如果安装Anaconda第2版,则会自动安装Python 2.x;如果安装Anaconda第3版,则会自动安装Python 3.x。
- 当成功切换环境之后,在该行行首将以“(env_name)”或“[env_name]”开头。其中,“env_name”为切换到的环境名。如:在macOS系统中执行source active python2,即切换至名为“python2”的环境,则行首将会以(python2)开头。
-
退出环境至root
① Linux 或 macOS
source deactivate
② Windows
deactivate
③ 提示
当执行退出当前环境,回到root环境命令后,原本行首以“(env_name)”或“[env_name]”开头的字符将不再显示。
-
显示已创建环境
conda info --envs 或
conda info -e或 conda env list 结果中星号“*”所在行即为当前所在环境。macOS系统中默认创建的环境名为“base”。
-
复制环境
conda create --name <new_env_name> --clone <copied_env_name>注意:
- <copied_env_name>即为被复制/克隆环境名。环境名两边不加尖括号“<>”。
- <new_env_name>即为复制之后新环境的名称。环境名两边不加尖括号“<>”。
- 如:conda create --name py2 --clone python2,即为克隆名为“python2”的环境,克隆后的新环境名为“py2”。此时,环境中将同时存在“python2”和“py2”环境,且两个环境的配置相同。
-
删除环境
conda remove --name <env_name> --all
- 注意:<env_name>为被删除环境的名称。环境名两边不加尖括号“<>”。
管理包
-
查找可供安装的包版本
① 精确查找
conda search --full-name <package_full_name> 注意:
-
–full-name为精确查找的参数。
-
<package_full_name>是被查找包的全名。包名两边不加尖括号“<>”。
例如:conda search --full-name python即查找全名为“python”的包有哪些版本可供安装。
-
-
模糊查找
conda search
注意: -
是查找含有此字段的包名。此字段两边不加尖括号“<>”。 例如:conda search py即查找含有“py”字段的包,有哪些版本可供安装。
-
-
获取当前环境中已安装的包信息
conda list 。执行上述命令后将在终端显示当前环境已安装包的包名及其版本号。
-
安装包
① 在指定环境中安装包
conda install --name <env_name> <package_name> 注意:
-
<env_name>即将包安装的指定环境名。环境名两边不加尖括号“<>”。
-
<package_name>即要安装的包名。包名两边不加尖括号“<>”。
例如:conda install --name python2 pandas即在名为“python2”的环境中安装pandas包。
② 在当前环境中安装包
conda install <package_name> 注意:
-
<package_name>即要安装的包名。包名两边不加尖括号“<>”。
-
执行命令后在当前环境中安装包。
例如:conda install pandas即在当前环境中安装pandas包。
③ 使用pip安装包
使用场景当使用conda install无法进行安装时,可以使用pip进行安装。例如:see包。→ 命令pip install <package_name> 注意:<package_name>为指定安装包的名称。包名两边不加尖括号“<>”。 如:pip install see即安装see包。注意
- pip只是包管理器,无法对环境进行管理。因此如果想在指定环境中使用pip进行安装包,则需要先切换到指定环境中,再使用pip命令安装包。
- pip无法更新python,因为pip并不将python视为包。
- pip可以安装一些conda无法安装的包;conda也可以安装一些pip无法安装的包。因此当使用一种命令无法安装包时,可以尝试用另一种命令。
④ 从Anaconda.org安装包
- 使用场景当使用conda install无法进行安装时,可以考虑从Anaconda.org中获取安装包的命令,并进行安装。 注意
- 从Anaconda.org安装包时,无需注册。
- 在当前环境中安装来自于Anaconda.org的包时,需要通过输入要安装的包在Anaconda.org中的路径作为获取途径(channel)。查询路径的方式如下:
- 在浏览器中输入:http://anaconda.org,或直接点击Anaconda.org
- 在新页面“Anaconda Cloud”的上方搜索框中输入要安装的包名,然后点击右边“放大镜”标志。
- 搜索结果中有数以千计的包可供选择,此时点击“Downloads”可根据下载量进行排序,最上面的为下载最多的包。(图中以搜索bottleneck包为例)
- 选择满足需求的包或下载量最多的包,点击包名。
- 复制“To install this package with conda run:”下方的命令,并粘贴在终端中执行。
- 完成安装。
-
-
卸载包
① 卸载指定环境中的包
conda remove --name <env_name> <package_name> 注意:
- <env_name>即卸载包所在指定环境的名称。环境名两边不加尖括号“<>”。
- <package_name>即要卸载包的名称。包名两边不加尖括号“<>”。 例如:conda remove --name python2 pandas即卸载名为“python2”中的pandas包。
② 卸载当前环境中的包
conda remove <package_name> 注意:
- <package_name>即要卸载包的名称。包名两边不加尖括号“<>”。
- 执行命令后即在当前环境中卸载指定包。例如:conda remove pandas即在当前环境中卸载pandas包。
-
更新包
-
更新所有包 conda update --all 或 conda upgrade --all
- 建议:在安装Anaconda之后执行上述命令更新Anaconda中的所有包至最新版本,便于使用。
-
更新指定包
conda update <package_name>或 conda upgrade <package_name>
注意:
- <package_name>为指定更新的包名。包名两边不加尖括号“<>”。
- 更新多个指定包,则包名以空格隔开,向后排列。如:conda update pandas numpy matplotlib即更新pandas、numpy、matplotlib包。
-
参考资料
- 知乎“初学python者自学anaconda的正确姿势是什么??”猴子的回答
- Anaconda Cheat Sheet
- Anaconda官方网站
- conda官方网站
- pip维基百科
- pip官方网站
- YouTube视频:Pip vs Conda: Differences and Comparisons
- virtualenv官方网站
- macOS系统安装Anaconda的官方教程
- Windows系统安装Anaconda的官方教程
- Linux系统安装Anaconda的官方教程
- Conda Official User Guide
Jupyter Notebook
灰色框是输入程序的地方,回车是换行,shift+回车执 行灰色区域的代码,它的结果会直接在下面空白处出现。这就是 Jupyter 交互式 的强大地方,将 Python 脚本分成片段式运行,尤其适合数据分析的摸索调整工 作
提示 x
- 按tab键查看提示信息或者补全命令
- 在一个库、方法或变量前加上 ?,就可以获得它的一个快速语法说明
- 使用分号可以阻止该行函数的结果输出
界面速查表
Pycharm
Pycharm安装
用community版就可以;了解PyCharm的界面布局; 设置PyCharm的解释器 ; 调整PyCharm的界面主题与样式
macOS Mojave安装PyCharm 2018.x 最新版
Pycharm 解释器
pyCharm 快速上手指南
pyCharm 快捷键
PyCharm项目
PyCharm采用“项目(Project)”的方式管理源代码;一个项目通常就是一个完整的程序,包含多个源代码文件 ; 通常项目是以目录的方式保存。
快捷键
win | mac | |
---|---|---|
快速注释-块注释 来自 | 注释 ctrl+/ | |
格式化代码 | ctrl+alt+L | |
运行 | shift+ctrl+f10 | |
复制行 | ctrl+d | |
调试 | ||
开始调试 | shift+alt+f9 | |
逐行执行 | F7 | |
停止调试 | ctrl + f2 | |
调节格式 | alt + enter | |
快速查看函数的格式 | 按住ctrl键,将鼠标放到函数上,就会显示函数信息,点击进去可以查看函数源码。 |
pip
-
pip是用于安装和管理软件包的包管理器。
pip名称的由来:pip采用的是递归缩写进行命名的。其名字被普遍认为来源于2处:
“Pip installs Packages”(“pip安装包”)
“Pip installs Python”(“pip安装Python”)
-
pip编写语言:仅适用于Python
-
Python中默认安装的版本:
Python 2.7.9及后续版本:默认安装,命令为pip
Python 3.4及后续版本:默认安装,命令为pip3
-
特点
- 不一定会展示所需其他依赖包。
- 安装包时或许会直接忽略依赖项而安装,仅在结果中提示错误
- 维护多个环境难度较大。
- 在系统自带Python中包的**更新/回退版本/卸载将影响其他程序。
虚拟环境 virtualenv
-
虚拟环境
python 的虚拟环境可以为一个 python 项目提供独立的解释环境、依赖包等资源,既能够很好的隔离不同项目使用不同 python 版本带来的冲突,而且还能方便项目的发布。
- 解决问题:
- 当一个程序需要使用Python 2.7版本,而另一个程序需要使用Python 3.6版本,如何同时使用这两个程序?
- 如果将所有程序都安装在系统下的默认路径,如:/usr/lib/python2.7/site-packages,当不小心升级了本不该升级的程序时,将会对其他的程序造成影响。
- 如果想要安装程序并在程序运行时对其库或库的版本进行修改,都会导致程序的中断。
- 在共享主机时,无法在全局site-packages目录中安装包。
- 。
- 解决问题:
-
virtualenv 包
virtualenv可用于创建独立的 Python 环境,它会创建一个包含项目所必须要的执行文件。virtualenv将会为它自己的安装目录创建一个环境,这并不与其他virtualenv环境共享库;同时也可以选择性地不连接已安装的全局库
- 安装 virtualenv**
- pip install virtualenv
- 安装 virtualenv**
-
pycharm配置本地python虚拟环境
配置环境变量
配置环境变量-MAC
mac安装python3.7,配置环境变量。因mac自带python2.7环境,平时用的比较多的是python3.7,下面将安装及配置过程需要注意,避免这些坑。
-
安装软件包python3.7.pkg
-
进入终端,配置Python3环境变量
-
open ~/.bash_profile
-
在文件末尾添加:
export PATH=${PATH}:/Library/Frameworks/Python.framework/Versions/3.7/bin
alias python=“/Library/Frameworks/Python.framework/Versions/3.7/bin/python3.7”
-
让文件生效
source ~/.bash_profile
-
进入终端,检查python版本
python -v
-
配置环境变量-WIN
-
配置环境变量
-
快捷键ctrl + R 输入cmd进入命令行界面
-
命令行中输入python,可以看到已经进入了python环境。
在这个步骤中,如果输入python提示命令未找到,说明环境变量配置失败。我们开始来配置环境变量。
-
-
配置环境变量:
方法一:使用命令行配置。
在cmd下输入:path=%path%;后面加上python安装路径。按enter回车即可。
方法二:使用图形界面配置。
-
桌面我的计算机,右键选择属性
-
属性里面选择高级,点下面的环境变量
-
在系统变量值中找到“path”,在系统变量值中输入python的安装路径。(记得先加;分号隔开)配置完成之后确定退出。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FiWmAzaR-1614984312160)(/Users/wu/Library/Application Support/typora-user-images/image-20210123215459993.png)]
-
再次打开cmd,输入python,即可进入python环境,大功告成!
-
基础知识:
简介
Python是一种面向对象的解释型计算机程序设计语言,总特点: 语言简洁,上手轻松 ;Python是最好的大数据、人工智能语言 ;庞大的用户群体,成熟的技术体系,遍及人工智能、科学计算、Web开发、系统运维、大数据及云计算、金融、游戏开发等。
特点
-
解释型语言: 这意味着开发过程中没有了编译这个环节。类似于PHP和Perl语言。
-
交互式语言: 这意味着,您可以在一个Python提示符,直接互动执行写你的程序。
-
面向对象语言: 面向对象的语言,拥有各种功能方法即method。意思就是把要处理的对象按照格式放到对应的括号里。这意味着Python支持面向对象的风格或代码封装在对象的编程技术。
-
**1.易于学习:**Python有相对较少的关键字,结构简单,和一个明确定义的语法,学习起来更加简单。适用于短平快的日常任务
-
**2.易于阅读:**Python代码定义的更清晰。
-
**3.易于维护:**Python的成功在于它的源代码是相当容易维护的。
-
4.一个广泛的标准库:实现其强大功能的前提,就是Python具有数量庞大且功能相对完善的标准库和第三方库。
-
**5.互动模式:**互动模式的支持,您可以从终端输入并获得结果的语言,互动的测试和调试代码片断。
-
**6.便携式:**Python可以运行在多种硬件平台和所有平台上都具有相同的接口。
具有跨平台的特点,可以在Linux、macOS以及Windows系统中搭建环境并使用,其编写的代码在不同平台上运行时,几乎不需要做较大的改动,使用者无不受益于它的便捷性。
-
7.可扩展**(开源)****:**可以添加低层次的模块到Python解释器。这些模块使程序员可以添加或定制自己的工具,更有效。
-
**8.数据库:**Python提供所有主要的商业数据库的接口。
-
**9.GUI编程:**Python支持GUI可以创建和移植到许多系统调用。
-
**10.可扩展性:**相比 shell 脚本,Python 提供了一个更好的结构,且支持大型程序。
发展历史
Python是由Guido van Rossum在八十年代末和九十年代初,在荷兰国家数学和计算机科学研究所设计出来的。
Python 本身也是由诸多其他语言发展而来的,这包括ABC、Modula-3、C、C++、Algol-68、SmallTalk、Unix shell 和其他的脚本语言等等。像Perl语言一样, Python 源代码同样遵循 GPL(GNU General Public License)协议。现在Python是由一个核心开发团队在维护,Guido van Rossum 仍然占据着至关重要的作用,指导其进展。
执行原理
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pomMTJ7g-1614984312162)(/Users/wu/Library/Application Support/typora-user-images/image-20210123212608467.png)]
python执行过程:源代码 –编译–> 字节码(特定python的表现形式.pyc) –解释–> 机器码
程序执行方式
-
交互式
-
定义:在命令行输入指令,回车即可得到结果。
-
步骤:
- 打开终端
- 输入:python3
- 输入: print(“Hello World”)
- 退出:exit()
-
-
文件式
1. 定义:将指令编写到.py文件中,可以重复运行程序。 2. 步骤: 1. 创建文件:/home/tarena/1902/month01/day01/hello.py 2. 打开终端进入指定目录 cd /1902/month01/day01 3. 运行python程序 python3 hello.py
Python 版本
建议 3.0 以上,不要选择 2.7 的版本,否则你会被无尽的中文编码问 题困扰。
2.7安装
3.8帮助文档
python2和 python3区别?列举5个
- Python3使用 print必须要以小括号包裹打印内容,比如 print(h)Python2既可以使用带小括号的方式,也可以使用一个空格来分隔打印内容,比如 print"hi
- python2 range(1,10)返回列表, python3中返回迭代器,节约内存
- python2中使用asci编码, python中使用utf-8编码
- python2中 unicode表示字符串序列,str表示字节序列
python3中st表示字符串序列,byte表示字节序列 - python2中为正常显示中文,引入 coding声明, python3中不需要
- python2中是 raw input()函数, python3中是 input(函数
程序调整Debug
-
调试目的
理解程序执行过程、排除逻辑错误(不是Error)
-
方式
pycharm:
加断点(程序运行到本行停止,没有执行本行)
开始调试shift+alt+f9
逐行执行 F7
停止调试ctrl + f2
GIL全局解释器锁
GIL是 python的全局解释器锁,进程中假如有多个线程运行,一个线程在运python程序的时候会霸占 python解释器(加了一把锁即G),使该进程内的其他线程无法运行,等该线程运行完后其他线程才能运行。如果线程运行过程中遇到耗时操作解释器锁解开,使其他线程运行。所以在多线程中,线程的运行仍是有先后顺序的,并不是同时进行。多进程中因为每个进程都能被系统分配资源,相当于每个进程有了一个 python解释器所以多进程可以实现多个进程的同时运行,缺点是进程系统资源开销大
提高python运行效率的方法?
- 使用生成器,因为可以节约大量内存
- 循环代码优化,避免过多重复代码的执
- 核心模块用 Cthon PyPy等,提高效率
- 多进程、多线程、协程
- 多个elf条件判断,可以把最有可能先发生的条件放到前面写,这样可以减少程序判断的次数,提高效率
异常
什么是异常?
异常即是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行。
一般情况下,在Python无法正常处理程序时就会发生一个异常。
异常是Python对象,表示一个错误。
当Python脚本发生异常时我们需要捕获处理它,否则程序会终止执行。大多数的异常都不会被程序处理,都以错误信息的形式展现在这里
异常的类别
标准异常
异常类名 | 描述 |
---|---|
Exception | 常规错误的基类,几乎所有的异常都是由此派生而来 |
BaseException | 所有异常的基类 |
AttributeError | 对象没有这个属性,引用属性或者赋值失败 |
SyntaxError | 代码语法错误 |
TypeError | 对类型无效的操作,将内置函数或者操作用于类型不正确时 |
OSError | 操作系统错误类,有多个子类。操作系统不能执行指定的任务时引发 |
LookupError | 无效数据查询的基类 |
IndexError | 序列中没有此索引(index)。为lookupError的子类 |
ZeroDivisionError | 除(或取模)零 (所有数据类型) |
NameError | 未声明/初始化对象 (没有属性) |
ValueError | 传入无效的参数,类型正确但值不合适 |
StopIteration | 迭代器没有更多的值 |
SystemExit | 解释器请求退出 |
KeyboardInterrupt | 用户中断执行(通常是输入^C) |
GeneratorExit | 生成器(generator)发生异常来通知退出 |
StandardError | 所有的内建标准异常的基类 |
ArithmeticError | 所有数值计算错误的基类 |
FloatingPointError | 浮点计算错误 |
OverflowError | 数值运算超出最大限制 |
AssertionError | 断言语句失败 |
EOFError | 没有内建输入,到达EOF 标记 |
EnvironmentError | 操作系统错误的基类 |
IOError | 输入/输出操作失败 |
WindowsError | 系统调用失败 |
ImportError | 导入模块/对象失败 |
KeyError | 映射中没有这个键 |
MemoryError | 内存溢出错误(对于Python 解释器不是致命的) |
UnboundLocalError | 访问未初始化的本地变量 |
ReferenceError | 弱引用(Weak reference)试图访问已经垃圾回收了的对象 |
RuntimeError | 一般的运行时错误 |
NotImplementedError | 尚未实现的方法 |
IndentationError | 缩进错误 |
TabError | Tab 和空格混用 |
SystemError | 一般的解释器系统错误 |
UnicodeError | Unicode 相关的错误 |
UnicodeDecodeError | Unicode 解码时的错误 |
UnicodeEncodeError | Unicode 编码时错误 |
UnicodeTranslateError | Unicode 转换时错误 |
Warning | 警告的基类 |
DeprecationWarning | 关于被弃用的特征的警告 |
FutureWarning | 关于构造将来语义会有改变的警告 |
OverflowWarning | 旧的关于自动提升为长整型(long)的警告 |
PendingDeprecationWarning | 关于特性将会被废弃的警告 |
RuntimeWarning | 可疑的运行时行为(runtime behavior)的警告 |
SyntaxWarning | 可疑的语法的警告 |
UserWarning | 用户代码生成的警告 |
自定义异常
通过创建一个新的异常类,程序可以命名它们自己的异常。异常应该是典型的继承自Exception类的自定义类**
异常处理try…except
-
捕捉异常可以使用try/except语句。
try/except语句用来检测try语句块中的错误,从而让except语句捕获异常信息并处理。如果你不想在异常发生时结束你的程序,只需在try里捕获它。
-
异常的传递
如果异常在产生的地方不被捕获,异常会一层层向外抛出,各层调用程序后的程序则不会执行。
-
语法:以下为简单的try…except…else的语法:
try:
<语句> #运行别的代码
except <名字>:
<语句> #如果在try部份引发了’name’异常
except <名字>,<数据>:
<语句> #如果引发了’name’异常,获得附加的数据
else:
<语句> #如果没有异常发生 -
try的工作原理是
- 当开始一个try语句后,python就在当前程序的上下文中作标记,这样当异常出现时就可以回到这里,try子句先执行,接下来会发生什么依赖于执行时是否出现异常。
- 如果当try后的语句执行时发生异常,python就跳回到try并执行第一个匹配该异常的except子句,异常处理完毕,控制流就通过整个try语句(除非在处理异常时又引发新的异常)。
- 如果在try后的语句里发生了异常,却没有匹配的except子句,异常将被递交到上层的try,或者到程序的最上层(这样将结束程序,并打印默认的出错信息)。
- 如果在try子句执行时没有发生异常,python将执行else语句后的语句(如果有else的话),然后控制流通过整个try语句。
-
实例
下面是简单的例子,它打开一个文件,在该文件中的内容写入内容,但文件没有写入权限,发生了异常:
\#!/usr/bin/python
\# -*- coding: UTF-8 -*-
try:
fh = open("testfile", "w")
fh.write("这是一个测试文件,用于测试异常!!")
except IOError:
print "Error: 没有找到文件或读取文件失败"
else:
print "内容写入文件成功"
fh.close()
# 在执行代码前为了测试方便,我们可以先去掉 testfile 文件的写权限,命令如下:
chmod -w testfile
# 再执行以上代码:
$ python test.py
Error: 没有找到文件或读取文件失败
- 拓展
- 使用except而不带任何异常类型
- 使用except而带多种异常类型
- 使用多个except而带多种异常类型
- try-finally 语句
- 异常的参数
抛出异常 raise
-
定义:可以在程序的指定位置手动抛出一个异常,使用 raise 语句即可。
-
作用:我们从来都是想方设法地让程序正常运行,为什么还要手动设置异常呢?首先要分清楚程序发生异常和程序执行错误,它们完全是两码事,程序由于错误导致的运行异常,是需要程序员想办法解决的;但还有一些异常,是程序正常运行的结果,比如用 raise 手动引发的异常。引发的异常通常用 try except(else finally)异常处理结构来捕获并进行处理。
-
raise 语句的基本语法格式为:
raise [Exception [, args [, traceback]]]
- Exception 是异常的类型(例如,NameError)参数标准异常中任一种
- args 是自已提供的异常参数。
- 最后一个参数是可选的(在实践中很少使用),如果存在,是跟踪异常对象。
- 用 [] 括起来的为可选参数,其作用是指定抛出的异常名称,以及异常信息的相关描述。如果可选参数全部省略,则 raise 会把当前错误原样抛出;如果仅省略 (reason),则在抛出异常时,将不附带任何的异常描述信息。可以通过创建一个新的exception类来拥有自己的异常。
-
raise 语句有如下三种常用的用法:
-
-
raise:单独一个 raise。该语句引发当前上下文中捕获的异常(比如在 except 块中),或默认引发 RuntimeError 异常。
如果你只想知道这是否抛出了一个异常,并不想去处理它,那么一个简单的 raise 语句就可以再次把它抛出。
- 默认引发的是 RuntimeError 异常
当在没有引发过异常的程序使用无参的 raise 语句时,它默认引发:RuntimeError 异常
-
raise 异常类名称:raise 后带一个异常类名称,表示引发执行类型的异常。
-
raise 异常类名称(描述信息):在引发指定类型的异常的同时,附带异常的描述信息。
-
遇到bug如何处理?
-
细节错误
细节上的错误,通过 print()打印,能执行到 print()说明一般上面的代码没有问
题,分段检测程序是否有问题,如果是js的话可以 alert或 console. log -
第三方框架
如果涉及一些第三方框架,会去查官方文档或者一些技术博客
-
bug的管理
对于bug的管理与归类总结,一般测试将测试出的bug用 teambin等bug管理工具进
行记录,然后我们会一条一条进行修改,修改的过程也是理解业务逻辑和提高自己编程逻
辑缜密性的方法,我也都会收藏做一些笔记记录 -
其他问题
导包问题、城市定位多音字造成的显示错误问题
内置函数
68个内置函数综合整理为12大类。
数字相关
1. 数据类型
- bool : 布尔型(True,False)
- int : 整型(整数)
- float : 浮点型(小数)
- complex : 复数
2. 进制转换
-
bin() 将给的参数转换成二进制
-
otc() 将给的参数转换成八进制
-
hex() 将给的参数转换成十六进制
print(bin(10)) # 二进制:0b1010 print(hex(10)) # 十六进制:0xa print(oct(10)) # 八进制:0o12
3. 数学运算
-
abs() 返回绝对值
-
divmode() 返回商和余数
-
round() 四舍五入
-
pow(a, b) 求a的b次幂, 如果有三个参数. 则求完次幂后对第三个数取余
-
sum() 求和
-
min() 求最小值
-
max() 求最大值
print(abs(-2)) # 绝对值:2 print(divmod(20,3)) # 求商和余数:(6,2) print(round(4.50)) # 五舍六入:4 print(round(4.51)) #5 print(pow(10,2,3)) # 如果给了第三个参数. 表示最后取余:1 print(sum([1,2,3,4,5,6,7,8,9,10])) # 求和:55 print(min(5,3,9,12,7,2)) #求最小值:2 print(max(7,3,15,9,4,13)) #求最大值:15
序列相关
1.列表和元组
-
list() 将一个可迭代对象转换成列表
-
tuple() 将一个可迭代对象转换成元组
print(list((1,2,3,4,5,6))) #[1, 2, 3, 4, 5, 6] print(tuple([1,2,3,4,5,6])) #(1, 2, 3, 4, 5, 6)
2.相关内置函数
-
reversed() 将一个序列翻转, 返回翻转序列的迭代器
-
slice() 列表的切片
lst = "你好啊" it = reversed(lst) # 不会改变原列表. 返回一个迭代器, 设计上的一个规则 print(list(it)) #['啊', '好', '你'] lst = [1, 2, 3, 4, 5, 6, 7] print(lst[1:3:1]) #[2,3] s = slice(1, 3, 1) # 切片用的 print(lst[s]) #[2,3]
3.字符串
-
str() 将数据转化成字符串’
当对象为字典、类别等类型时的括号、引号一并转化为字符类型
print(str(123)+'456') #123456
-
format() 与具体数据相关, 用于计算各种小数, 精算等.
s = "hello world!" print(format(s, "^20")) #剧中 print(format(s, "<20")) #左对齐 print(format(s, ">20")) #右对齐 \# hello world! \# hello world! \# hello world! print(format(3, 'b' )) # 二进制:11 print(format(97, 'c' )) # 转换成unicode字符:a print(format(11, 'd' )) # ⼗进制:11 print(format(11, 'o' )) # 八进制:13 print(format(11, 'x' )) # 十六进制(⼩写字母):b print(format(11, 'X' )) # 十六进制(大写字母):B print(format(11, 'n' )) # 和d⼀样:11 print(format(11)) # 和d⼀样:11 print(format(123456789, 'e' )) # 科学计数法. 默认保留6位小数:1.234568e+08 print(format(123456789, '0.2e' )) # 科学计数法. 保留2位小数(小写):1.23e+08 print(format(123456789, '0.2E' )) # 科学计数法. 保留2位小数(大写):1.23E+08 print(format(1.23456789, 'f' )) # 小数点计数法. 保留6位小数:1.234568 print(format(1.23456789, '0.2f' )) # 小数点计数法. 保留2位小数:1.23 print(format(1.23456789, '0.10f')) # 小数点计数法. 保留10位小数:1.2345678900 print(format(1.23456789e+3, 'F')) # 小数点计数法. 很大的时候输出INF:1234.567890
-
bytes() 把字符串转化成bytes类型
bs = bytes("今天吃饭了吗", encoding="utf-8") print(bs) #b'\xe4\xbb\x8a\xe5\xa4\xa9\xe5\x90\x83\xe9\xa5\xad\xe4\xba\x86\xe5\x90\x97
-
bytearray() 返回一个新字节数组. 这个数字的元素是可变的, 并且每个元素的值得范围是[0,256)
ret = bytearray("alex" ,encoding ='utf-8') print(ret[0]) #97 print(ret) #bytearray(b'alex') ret[0] = 65 #把65的位置A赋值给ret[0] print(str(ret)) #bytearray(b'Alex')
-
ord() 输入字符找带字符编码的位置
-
chr() 输入位置数字找出对应的字符
-
ascii() 是ascii码中的返回该值 不是就返回u
print(ord('a')) # 字母a在编码表中的码位:97 print(ord('中')) # '中'字在编码表中的位置:20013 print(chr(65)) # 已知码位,求字符是什么:A print(chr(19999)) #丟 for i in range(65536): #打印出0到65535的字符 print(chr(i), end=" ") print(ascii("@")) #'@'
-
repr() 返回一个对象的string形式
s = "今天\n吃了%s顿\t饭" % 3 print(s)#今天# 吃了3顿 饭 print(repr(s)) # 原样输出,过滤掉转义字符 \n \t \r 不管百分号% \#'今天\n吃了3顿\t饭'
4. 数据集合
-
字典:dict 创建一个字典
-
集合:set 创建一个集合4
有去重和排序的功能,因为集合是无序不重复元素
-
frozenset() 创建一个冻结的集合,冻结的集合不能进行添加和删除操作。
5. 集合相关内置函数
-
len() 返回一个对象中的元素的个数
-
sorted() 对可迭代对象进行排序操作 放回新的列表
-
语法:sorted(Iterable, key=函数(排序规则), reverse=False)
-
Iterable: 可迭代对象
-
key: 排序规则(排序函数), 在sorted内部会将可迭代对象中的每一个元素传递给这个函数的参数. 根据函数运算的结果进行排序
-
reverse: 是否是倒叙. True: 倒叙, False: 正序
lst = [5,7,6,12,1,13,9,18,5] lst.sort() # sort是list里面的一个方法, print(lst) #[1, 5, 5, 6, 7, 9, 12, 13, 18] ll = sorted(lst) # 内置函数. 返回给你一个新列表 新列表是被排序的 print(ll) #[1, 5, 5, 6, 7, 9, 12, 13, 18] l2 = sorted(lst,reverse=**True**) #倒序 print(l2) #[18, 13, 12, 9, 7, 6, 5, 5, 1] \#根据字符串长度给列表排序 lst = ['one', 'two', 'three', 'four', 'five', 'six'] def f(s): returnlen(s) l1 = sorted(lst, key=f ) print(l1) #['one', 'two', 'six', 'four', 'five', 'three']
-
-
enumerate() 获取集合的枚举对象
lst = ['one','two','three','four','five'] for index, el in enumerate(lst,1): # 把索引和元素一起获取,索引默认从0开始. 可以更改 print(index) print(el) \# 1 \# one \# 2 \# two \# 3 \# three \# 4 \# four \# 5 \# five
-
all() 可迭代对象中全部是True, 结果才是True
-
any() 可迭代对象中有一个是True, 结果就是True
print(all([1,'hello',**True**,9])) #True print(any([0,0,0,**False**,1,'good'])) #True
-
zip() 函数用于将可迭代的对象作为参数, 将对象中对应的元素打包成一个元组, 然后返回由这些元组组成的列表. 如果各个迭代器的元素个数不一致, 则返回列表长度与最短的对象相同
lst1 = [1, 2, 3, 4, 5, 6] lst2 = ['醉乡民谣', '驴得水', '放牛班的春天', '美丽人生', '辩护人', '被嫌弃的松子的一生'] lst3 = ['美国', '中国', '法国', '意大利', '韩国', '日本'] print(zip(lst1, lst1, lst3)) #<zip object at 0x00000256CA6C7A88> for el in zip(lst1, lst2, lst3): print(el) \# (1, '醉乡民谣', '美国') \# (2, '驴得水', '中国') \# (3, '放牛班的春天', '法国') \# (4, '美丽人生', '意大利') \# (5, '辩护人', '韩国') \# (6, '被嫌弃的松子的一生', '日本')
-
reduce
-
Reduce(fun,seq[,initial])
-
按照指定的方法将序列中的元素缩减为一个值,最终是一个元素类型。
-
-
lamada
-
匿名函数.又称lambda表达式,用于处理简单业务的函数,不需要显式地定义函数,直接传入匿名函数。用匿名函数有个好处,因为函数没有名字,不必担心函数名冲突。
-
注意:
- 并非是一个代码块,没有函数名,只有一行代码
- 传入的参数可以有很多,
- 返回值只能由一个,不用写return,返回值就是该表达式的结果
-
案例
以map()函数为例,计算f(x)=x2时,除了定义一个f(x)的函数外,还可以直接传入匿名函数:
list(map(lambda x: x * x, [1, 2, 3, 4, 5, 6, 7, 8, 9])) # [1, 4, 9, 16, 25, 36, 49, 64, 81] # 匿名函数赋值 f = lambda x: x * x f # <**function** <lambda> at 0x101c6ef28> f(5) # 25 # 作为返回值 def build(x, y): return lambda: x * x + y * y sum = lambda a,b : a*b print(sum(7,9))
-
匿名函数也是一个函数对象,也可以把匿名函数赋值给一个变量,再利用变量来调用该函数:
-
把匿名函数作为返回值返回,比如:
-
-
-
filter() 过滤 (lamda)
-
对(序列)可迭代对象进行过滤,返回一个迭代器对象。过滤条件为布尔类型的函数,过滤掉的元素是:执行函数结果为0,留下结果为1的函数。
-
注意:描述中可迭代对象和序列的描述,输出结果 时要确定对象类型,tumple/list,否返回的是迭代器所在的位置
-
语法:filter(function. Iterable)
function: 用来筛选的函数. 在filter中会自动的把iterable中的元素传递给function. 然后根据function返回的True或者False来判断是否保留留此项数据 , Iterable: 可迭代对象
def func (i): # 判断奇数 return i % 2 == 1 lst = [1,2,3,4,5,6,7,8,9] l1 = filter(func, lst) #l1是迭代器 print(l1) #<filter object at 0x000001CE3CA98AC8> print(list(l1)) #[1, 3, 5, 7, 9]
-
-
map()
和作用域相关
- locals() 返回当前作用域中的名字
- globals() 返回全局作用域中的名字
def func ():
a = 10
print(locals()) # 当前作用域中的内容
print(globals()) # 全局作用域中的内容
print("今天内容很多")
func()
\# {
'a': 10}
\# {
'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__':
\# <_frozen_importlib_external.SourceFileLoader object at 0x0000026F8D566080>,
\# '__spec__': None, '__annotations__': {
}, '__builtins__': <module 'builtins'
\# (built-in)>, '__file__': 'D:/pycharm/练习/week03/new14.py', '__cached__': None,
\# 'func': <function func at 0x0000026F8D6B97B8>}
\# 今天内容很多
和迭代器生成器相关
-
range() 生成数据
- 左闭右开
- python2返回列表, python3返回迭代器,节约内存
-
next() 迭代器向下执行一次, 内部实际使⽤用了__ next__()⽅方法返回迭代器的下一个项目
-
iter() 获取迭代器, 内部实际使用的是__ iter__()⽅方法来获取迭代器
for i in range(15,-1,-5): print(i) \# 15 \# 10 \# 5 \# 0 lst = [1,2,3,4,5] it = iter(lst) # __iter__()获得迭代器 print(it.__next__()) #1 print(next(it)) #2 __next__() print(next(it)) #3 print(next(it)) #4
字符串类型代码的执行
-
eval() 执行字符串类型的代码. 并返回最终结果
-
exec() 执行字符串类型的代码
-
compile() 将字符串类型的代码编码. 代码对象能够通过exec语句来执行或者eval()进行求值
s1 = input("请输入a+b:") #输入:8+9 print(eval(s1)) # 17 可以动态的执行代码. 代码必须有返回值 s2 = "for i in range(5): print(i)" a = exec(s2) # exec 执行代码不返回任何内容 \# 0 \# 1 \# 2 \# 3 \# 4 print(a) #None \# 动态执行代码 exec(""" def func(): print(" 我是周杰伦") """ ) func() #我是周杰伦 code1 = "for i in range(3): print(i)" com = compile(code1, "", mode="exec") # compile并不会执行你的代码.只是编译 exec(com) # 执行编译的结果 \# 0 \# 1 \# 2 code2 = "5+6+7" com2 = compile(code2, "", mode="eval") print(eval(com2)) # 18 code3 = "name = input('请输入你的名字:')" #输入:hello com3 = compile(code3, "", mode="single") exec(com3) print(name) #hello
输入输出
-
print() : 打印输出
-
input() : 获取用户输出的内容
print("hello", "world", sep="*", end="@") # sep:打印出的内容用什么连接,end:以什么为结尾,end=' '意思是末尾不换行,加空格 \#hello*world@
内存相关
hash() : 获取到对象的哈希值(int, str, bool, tuple). hash算法:(1) 目的是唯一性 (2) dict 查找效率非常高, hash表.用空间换的时间 比较耗费内存
s = 'alex'print(hash(s)) #-168324845050430382lst = [1, 2, 3, 4, 5]print(hash(lst)) #报错,列表是不可哈希的 id() : 获取到对象的内存地址s = 'alex'print(id(s)) #2278345368944
文件操作相关
- open() : 用于打开一个文件, 创建一个文件句柄
- with():with方法帮我们实现了 finally中 f.close.打开文件在进行读写的时候可能会出现一些异常状况,如果按照常规的f.open写法,我们需要try, except; final!y,做异常判断,并且文件最终不管遇到什么情况,都要执行 finally ,f.close0关闭文件
(当然还有其他自定义功能,有兴趣可以研究with方法源码)
f = open('file',mode='r',encoding='utf-8')
try:
f.read()
except:
pass
finally:
f.close()
模块相关
- __ import__() : 用于动态加载类和函数
# 让用户输入一个要导入的模块
**import** os
name = input("请输入你要导入的模块:")
__import__(name) # 可以动态导入模块
帮 助
-
Type()
查询变量所指的对象类型
-
help() : 函数用于查看函数或模块用途的详细说明
-
isinstance :判断对象的类别
print(help(str)) #查看字符串的用途
>>> isinstance('abc', Iterator)
False
>>> isinstance('abc', Iterable)
True
调用相关
-
callable() : 用于检查一个对象是否是可调用的. 如果返回True, object有可能调用失败, 但如果返回False. 那调用绝对不会成功
a = 10 print(callable(a)) #False 变量a不能被调用 \# **def** **f**(): print("hello") print(callable(f)) # True 函数是可以被调用的
断言相关
assert
-
assert()
“断言”是一个心智正常的检查,确保代码没有做什么明显错误的事情。这些心智正常的检查由 assert 语句执行。如果检查失败,就会抛出异常。在代码中,assert语句包含以下部分:
• assert 关键字;
• 条件(即求值为 True 或 False 的表达式);
• 逗号;
• 当条件为 False 时显示的字符串。
查看内置属性
- dir() : 查看对象的内置属性, 访问的是对象中的__dir__()方法
print(dir(tuple)) #查看元组的方法
语法结构
1.规范 PEP8
PEP8是 Python Enhancement Proposal 8的缩写,翻译过来就是 Python增强建议书,也就是Python编码规范。例如:缩进,注释,行限字数,每行之间的空行,空格的使用等
2.注释
对代码进行标注,增加可读性.
-
单行注释采用 # 开头
注释可以在语句或表达式行末。实际的应用中会对代码本身注释,不执行进行调试
# 第一个注释
print "Hello, Python!"; # 第二个注释
- 多行注释使用三个单引号(‘’')或三个双引号(“”")。
'''
这是多行注释,使用单引号。
这是多行注释,使用单引号。 这是多行注释,使用单引号。
'''
"""
这是多行注释,使用双引号。
这是多行注释,使用双引号。
这是多行注释,使用双引号。
"""
3.转义字符
定义:可以改变原有字符含义的特殊字符
常用的:
\’ \” \””” \n
\t 水平制表格 \0 空字符 \
4.行和缩进
-
行
- 物理行:程序员编写代码时的行。
- 逻辑行:python解释器需要执行的指令。 建议一个物理行对应一个逻辑行。
示例: print(“ok”); print(“no”) 一个物理行,两个逻辑行。
-
隐式换行:所有括号的中的内容都可以换行。
x = 1 + (2+ 3+
-
显示换行:通过折行符 \ 换行
x = 1 + 2+ 3