commit 5e43c7da3e670b6d7e35492d0b72722f604b084d Author: jackfrued Date: Thu Apr 2 01:54:25 2020 +0800 初始版本 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..34357ff --- /dev/null +++ b/.gitignore @@ -0,0 +1,309 @@ +# Created by https://www.gitignore.io/api/linux,macos,python,pycharm,windows,sublimetext,visualstudiocode +# Edit at https://www.gitignore.io/?templates=linux,macos,python,pycharm,windows,sublimetext,visualstudiocode + +### Linux ### +*~ + +# temporary files which can be created if a process still has a handle open of a deleted file +.fuse_hidden* + +# KDE directory preferences +.directory + +# Linux trash folder which might appear on any partition or disk +.Trash-* + +# .nfs files are created when an open file is removed but is still being accessed +.nfs* + +### macOS ### +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +### PyCharm ### +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and WebStorm +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff +.idea/**/workspace.xml +.idea/**/tasks.xml +.idea/**/usage.statistics.xml +.idea/**/dictionaries +.idea/**/shelf + +# Generated files +.idea/**/contentModel.xml + +# Sensitive or high-churn files +.idea/**/dataSources/ +.idea/**/dataSources.ids +.idea/**/dataSources.local.xml +.idea/**/sqlDataSources.xml +.idea/**/dynamic.xml +.idea/**/uiDesigner.xml +.idea/**/dbnavigator.xml + +# Gradle +.idea/**/gradle.xml +.idea/**/libraries + +# Gradle and Maven with auto-import +# When using Gradle or Maven with auto-import, you should exclude module files, +# since they will be recreated, and may cause churn. Uncomment if using +# auto-import. +# .idea/modules.xml +# .idea/*.iml +# .idea/modules +# *.iml +# *.ipr + +# CMake +cmake-build-*/ + +# Mongo Explorer plugin +.idea/**/mongoSettings.xml + +# File-based project format +*.iws + +# IntelliJ +out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Cursive Clojure plugin +.idea/replstate.xml + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties + +# Editor-based Rest Client +.idea/httpRequests + +# Android studio 3.1+ serialized cache file +.idea/caches/build_file_checksums.ser + +### PyCharm Patch ### +# Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721 + +# *.iml +# modules.xml +# .idea/misc.xml +# *.ipr + +# Sonarlint plugin +.idea/**/sonarlint/ + +# SonarQube Plugin +.idea/**/sonarIssues.xml + +# Markdown Navigator plugin +.idea/**/markdown-navigator.xml +.idea/**/markdown-navigator/ + +### Python ### +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +pip-wheel-metadata/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +.hypothesis/ +.pytest_cache/ + +# Translations +*.mo +*.pot + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# pyenv +.python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# celery beat schedule file +celerybeat-schedule + +# SageMath parsed files +*.sage.py + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# Mr Developer +.mr.developer.cfg +.project +.pydevproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +### SublimeText ### +# Cache files for Sublime Text +*.tmlanguage.cache +*.tmPreferences.cache +*.stTheme.cache + +# Workspace files are user-specific +*.sublime-workspace + +# Project files should be checked into the repository, unless a significant +# proportion of contributors will probably not be using Sublime Text +# *.sublime-project + +# SFTP configuration file +sftp-config.json + +# Package control specific files +Package Control.last-run +Package Control.ca-list +Package Control.ca-bundle +Package Control.system-ca-bundle +Package Control.cache/ +Package Control.ca-certs/ +Package Control.merged-ca-bundle +Package Control.user-ca-bundle +oscrypto-ca-bundle.crt +bh_unicode_properties.cache + +# Sublime-github package stores a github token in this file +# https://packagecontrol.io/packages/sublime-github +GitHub.sublime-settings + +### VisualStudioCode ### +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json + +### VisualStudioCode Patch ### +# Ignore all local history of files +.history + +### Windows ### +# Windows thumbnail cache files +Thumbs.db +Thumbs.db:encryptable +ehthumbs.db +ehthumbs_vista.db + +# Dump file +*.stackdump + +# Folder config file +[Dd]esktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msix +*.msm +*.msp + +# Windows shortcuts +*.lnk + +# End of https://www.gitignore.io/api/linux,macos,python,pycharm,windows,sublimetext,visualstudiocode diff --git a/res/vscode.png b/res/vscode.png new file mode 100644 index 0000000..b17fdee Binary files /dev/null and b/res/vscode.png differ diff --git a/第001课:初识Python.md b/第001课:初识Python.md new file mode 100644 index 0000000..33672d8 --- /dev/null +++ b/第001课:初识Python.md @@ -0,0 +1,53 @@ +## 第001课:初识Python + +### Python简介 + +Python是由荷兰人吉多·范罗苏姆(Guido von Rossum,后面都称呼他为Guido)发明的一种编程语言。 + +#### Python的历史 + +1. 1989年圣诞节:Guido开始写Python语言的编译器。 +2. 1991年2月:第一个Python解释器诞生,它是用C语言实现的,可以调用C语言的库函数。 +3. 1994年1月:Python 1.0正式发布。 +4. 2000年10月:Python 2.0发布,Python的整个开发过程更加透明,生态圈开始慢慢形成。 +5. 2008年12月:Python 3.0发布,引入了诸多现代编程语言的新特性,但并不完全兼容之前的Python代码。 + +> **说明**:目前我使用Python版本为3.7.6。Python的版本号分为三段,形如A.B.C,其中A表示大版本号,一般当整体重写,或出现不向后兼容的改变时,增加A;B表示功能更新,出现新功能时增加B;C表示小的改动(例如:修复了某个Bug),只要有修改就增加C。 + +#### Python的优点 + +Python的优点很多,简单为大家列出几点。 + +1. 简单明确,跟其他很多语言相比,Python更容易上手。 +2. 开放源代码,拥有强大的社区和生态圈。 +3. 能够在Windows、macOS、Linux等各种系统上运行。 + +#### Python的应用领域 + +目前Python在**Web服务器应用开发**、云基础设施开发、**网络数据采集**(爬虫)、**数据分析**、量化交易、**机器学习**、**自动化测试**、**自动化运维**等领域都有用武之地。 + +### 安装Python环境 + +想要开始你的Python编程之旅,首先得在计算机上安装Python环境,简单的说就是得安装运行Python程序的工具,通常也称之为Python解释器。我们强烈建议大家安装Python 3的环境,很明显它是目前更好的选择。 + +#### Windows环境 + +可以在[Python官方网站]()找到下载(download)链接并下载Python 3的安装程序。对于Windows操作系统,可以下载“executable installer”。需要注意的是如果在Windows 7环境下安装Python 3,需要先安装Service Pack 1补丁包(可以通过一些工具软件自动安装系统补丁的功能来安装)。在执行安装向导时,记得勾选“Add Python 3.x to PATH”(将Python 3.x添加到PATH环境变量)选项。安装完成后可以打开Windows的“命令行提示符”工具并输入下面的命令来检查Python解释器是否安装成功。 + +``` +python --version +``` + +> **说明**:如果安装过程显示安装失败或执行上面的命令报错,很有可能是因为你的Windows系统缺失了一些动态链接库文件而导致的问题。如果系统显示api-ms-win-crt\*.dll文件缺失,可以参照[《api-ms-win-crt\*.dll缺失原因分析和解决方法》]()一文讲解的方法进行处理或者直接在[微软官网](https://www.microsoft.com/zh-cn/download/details.aspx?id=48145)下载Visual C++ Redistributable for Visual Studio 2015文件进行修复。如果是因为安装游戏时更新了Windows的DirectX之后导致某些动态链接库文件缺失问题,可以下载一个[DirectX修复工具]()进行修复。 + +#### macOS环境 + +macOS自带了Python 2,可以通过[Python官方网站]()提供的下载链接找到适合macOS的“macOS installer”来安装Python 3,安装过程基本不需要做任何勾选,直接点击“下一步”即可。安装完成后,可以通过在“终端”工具中输入`python3`命令来调用Python 3解释器,因为如果直接输入`python`,将会调用Python 2的解释器。 + +> **说明**:如果对安装Python解释器环境有疑问,可以参考百度云盘上提供的**视频讲解**。链接:https://pan.baidu.com/s/10y7sGM016YBM7gDdauGqLw,密码:4s6r。 + +### 总结 + +到这里,大家已经对Python语言有一个基本的了解,知道它可以做很多的事情,所以也值得我们去学习。要用Python做开发,首先需要在自己的计算机上安装Python环境,上面我们为大家介绍了macOS和Windows两种环境下Python 3环境的安装方法,希望大家都能顺利的安装成功,以便开启我们后续的学习。如果安装过程中遇到任何问题,可以联系博主加入我们的免费体验课或答疑群。 + +> **温馨提示**:大家如果觉得这个专栏还不错,**一定记得点赞收藏哟**! \ No newline at end of file diff --git a/第002课:第一个Python程序.md b/第002课:第一个Python程序.md new file mode 100644 index 0000000..14bf1d1 --- /dev/null +++ b/第002课:第一个Python程序.md @@ -0,0 +1,80 @@ +## 第002课:第一个Python程序 + +在上一课中,我们已经了解了Python这门语言并安装了运行Python程序所需的环境,相信大家已经迫不及待的想开始自己的Python编程之旅了。首先我们来告诉大家在哪些地方可以写Python程序。 + +### 编写代码的工具 + +#### 交互式环境 + +我们打开Windows的“命令行提示符”工具,输入命令`python`然后回车就可以进入到Python的交互式环境中。所谓交互式环境,就是我们输入一行代码回车,代码马上会被执行,如果代码有产出结果,那么结果会被显示在窗口中。例如: + +```Bash +Python 3.7.6 +Type "help", "copyright", "credits" or "license" for more information. +>>> 2 * 3 +6 +>>> 2 + 3 +5 +``` + +> **温馨提示**:使用macOS系统的用户需要打开“终端”工具,输入`python3`进入交互式环境。 + +如果希望退出交互式环境,可以在交互式环境中输入`quit()`,如下所示。 + +```Bash +>>> quit() +``` + +#### 文本编辑器 - Visual Studio Code + +Visual Studio Code(通常简称为VS Code)是一个由微软开发能够在Windows、 Linux和macOS等操作系统上运行的代码编辑神器。它支持语法高亮、自动补全、多点编辑、运行调试等一系列便捷功能,而且能够支持多种编程语言。现阶段,我**强烈建议**大家使用VS Code来编写Python代码。关于VS Code的下载、安装和使用,推荐大家阅读知乎上名为[《VScode安装使用》]()的文章。下图是使用VS Code的用户主界面。 + +![](res/vscode.png) + +#### 集成开发环境 - PyCharm + +如果用Python开发商业项目,我们推荐大家使用专业的工具PyCharm。PyCharm是捷克的JetBrains公司开发的用于Python开发的集成开发环境(IDE),所谓集成开发环境是说这个工具中提供了代码编写、代码运行和调试、代码分析、代码版本控制等各种功能,因此特别适合商业项目的开发。在[JetBrains的官方网站]()上提供了PyCharm的[下载链接](),其中社区版(Community)是免费的但功能相对弱小,专业版(Professional)功能非常强大,但需要按年或月付费使用,新用户可以试用30天时间。关于如何使用PyCharm来进行Python开发,我们在后续的课程中为大家进行讲解。 + +### hello, world + +按照这个行业的惯例,我们学习任何一门编程语言写的第一个程序都是输出`hello, world`,因为这段代码是伟大的丹尼斯·里奇(C语言的发明者)和布莱恩·柯尼汉(awk语言的发明者)在他们的不朽著作*The C Programming Language*中写的第一段代码。 + +```Python +print('hello, world') +``` + +### 运行程序 + +建议大家用VS Code来书写上面的代码,完成代码编辑后将其保存在你容易找到的目录下。接下来,你可以在按住键盘上的`shift`键再点击鼠标右键,这时候鼠标右键菜单中会出现“命令行提示符”选项,点击该选项就可以打开“命令行提示符”工具,我们输入下面的命令。 + +```Shell +python hello.py +``` + +> **提醒**:我们也可以在任意位置打开“命令行提示符”或“终端”工具,然后将需要执行的Python代码通过拖拽的方式拖入到“命令行提示符”或“终端”中,这样相当于指定了文件的绝对路径来运行该文件中的Python代码。再次提醒,macOS系统要通过`python3 hello.py`命令来运行该程序。 + +你可以尝试一下将上面程序单引号中的`hello, world`换成其他的内容;你也可以尝试着多写几个`print`(最好每行只有一个哟),看看会发生什么事情。 + +### 注释你的代码 + +注释是编程语言的一个重要组成部分,用于在源代码中解释代码的作用从而增强程序的可读性。当然,我们也可以将源代码中暂时不需要运行的代码段通过注释来去掉,这样的话在需要这些代码的时候去掉注释符号就可以了。简单的说,**注释会让代码更容易看懂但不会影响程序的执行结果**。 + +1. 单行注释 - 以#和空格开头的部分,可以注释掉一整行代码。 +2. 多行注释 - 三个引号开头,三个引号结尾,通常用于添加大段的说明性内容。 + +```Python +""" +第一个Python程序 - hello, world + +Version: 0.1 +Author: 骆昊 +""" +# print('hello, world') +print("你好,世界!") +``` + +### 总结 + +到这里,我们已经把第一个Python程序运行起来了,是不是很有成就感?只要你坚持继续下去,再学习几节课,我就可以带大家做小游戏、写美女爬虫、开发微信机器人。**写程序本身就是一件很酷的事情**,在未来可能就像英语一样,是**很多人都需要掌握的技能**。 + +> **温馨提示**:大家如果觉得这个专栏还不错,**一定记得点赞收藏哟**!如果学习中遇到困难,可以发私信给我进行交流,也可以看看我们为大家录制的入门视频,视频链接地址:https://pan.baidu.com/s/10y7sGM016YBM7gDdauGqLw,密码:4s6r。 \ No newline at end of file diff --git a/第003课:Python语言元素之变量.md b/第003课:Python语言元素之变量.md new file mode 100644 index 0000000..a44d7f0 --- /dev/null +++ b/第003课:Python语言元素之变量.md @@ -0,0 +1,113 @@ +## 第003课:Python语言元素之变量 + +经常被外行问到两个问题,其一是“什么是(计算机)程序”,其二是“写(计算机)程序能做什么”,这里我们先来回答这两个问题。**程序是指令的集合**,**写程序就是用指令控制计算机做我们想让它做的事情**。那么,为什么要用Python语言来写程序呢?因为**Python语言简单优雅**,相比C、C++、Java这样的语言,**Python对初学者更加友好**,当然这并不是说Python不像其他语言那样强大,**Python几乎是无所不能的**,还能用来粘合其他语言开发的系统,所以也被戏称为“**胶水语言**”。 + +### 一些计算机常识 + +计算机的硬件系统通常由五大部件构成,包括:**运算器**、**控制器**、**存储器**、**输入设备**和**输出设备**。其中,运算器和控制器放在一起就是我们通常所说的**中央处理器**,它的功能是执行各种运算和控制指令。刚才说过了,程序是指令的集合,写程序就是将一系列的指令按照某种方式组织到一起,然后通过这些指令去控制计算机做我们想让它做的事情。今天我们大多数人使用的计算机都是“冯·诺依曼体系结构”的计算机,这种计算机有两个关键点:一是要将**存储设备与中央处理器分开**;二是将**数据以二进制方式编码**。 + +二进制是一种“逢二进一”的计数法,跟我们人类使用的“逢十进一”的计数法没有实质性的区别,人类因为有十根手指所以使用了十进制,因为在数数时十根手指用完之后就只能进位了。当然凡事都有例外,玛雅人可能是因为长年光着脚的原因把脚趾头也算上了,于是他们使用了二十进制的计数法,在这种计数法的指导下,玛雅人的历法就与我们平常使用的历法不一样。按照玛雅人的历法,2012年是上一个所谓的“太阳纪”的最后一年,而2013年则是新的“太阳纪”的开始,后来这件事情被以讹传讹的方式误传为”2012年是玛雅人预言的世界末日“的荒诞说法。今天很多人都在猜测,玛雅文明之所以发展缓慢跟使用了二十进制是有关系的。对于计算机来说,二进制在物理器件上来说是最容易实现的(高电压表示1,低电压表示0)。不是说写程序的人必须都需要知道十进制与二进制如何相互转换,大多数时候我们也用不上这些知识,但是我们必须要知道的是我们的**计算机使用二进制**,不管什么**数据到了计算机内存中都是以二进制形式存在的**。 + +### 变量和类型 + +在程序设计中,**变量是一种存储数据的载体**。简单的说,变量是保存数据的一块内存空间,**变量的值可以被读取和修改**,这是所有计算和控制的基础。计算机能处理的数据有很多种类型,除了数值之外还可以处理文本、图形、音频、视频等各种各样的数据。虽然最终数据都是以二进制的形态存在的,但是我们可以用不同类型的变量来表示数据类型的差异。**Python中的数据类型很多**,而且也**允许我们自定义新的数据类型**(这一点在后面会讲到),我们先介绍几种常用的数据类型。 + +- 整型(int):Python中可以处理任意大小的整数,而且支持二进制(如`0b100`,换算成十进制是4)、八进制(如`0o100`,换算成十进制是64)、十进制(`100`)和十六进制(`0x100`,换算成十进制是256)的表示法。 +- 浮点型(float):浮点数也就是小数,之所以称为浮点数,是因为按照科学记数法表示时,一个浮点数的小数点位置是可变的,浮点数除了数学写法(如`123.456`)之外还支持科学计数法(如`1.23456e2`)。 +- 字符串型(str):字符串是以单引号或双引号括起来的任意文本,比如`'hello'`和`"hello"`。 +- 布尔型(bool):布尔值只有`True`、`False`两种值,要么是`True`,要么是`False`。 + +### 变量命名 + +对于每个变量我们需要给它取一个名字,就如同我们每个人都有属于自己的响亮的名字一样。在Python中,变量命名需要遵循以下这些必须遵守硬性规则和强烈建议遵守的非硬性规则。 + +- 硬性规则: + - 变量名由**字母**(广义的Unicode字符,不包括特殊字符)、数字和**下划线**构成,数字不能开头。 + - **大小写敏感**(大写的`a`和小写的`A`是两个不同的变量)。 + - **不要跟关键字**(有特殊含义的单词,后面会讲到)和系统**保留字**(如函数、模块等的名字)**冲突**。 +- 非硬性规则 + - 用小写字母拼写,多个单词用下划线连接。 + - 受保护的变量用单个下划线开头(后面会讲到)。 + - 私有的变量用两个下划线开头(后面会讲到)。 + +当然,作为一个专业的程序员,给变量(事实上应该是所有的标识符)命名时做到见名知意也是非常重要的。 + +### 变量的使用 + +下面通过几个例子来说明变量的类型和变量使用。 + +```Python +""" +使用变量保存数据并进行加减乘除运算 + +Version: 0.1 +Author: 骆昊 +""" +a = 321 +b = 12 +print(a + b) # 333 +print(a - b) # 309 +print(a * b) # 3852 +print(a / b) # 26.75 +``` + +在Python中可以使用`type`函数对变量的类型进行检查。程序设计中函数的概念跟数学上函数的概念是一致的,数学上的函数相信大家并不陌生,它包括了函数名、自变量和因变量。如果暂时不理解这个概念也不要紧,我们会在后续的内容中专门讲解函数的定义和使用。 + +```Python +""" +使用type()检查变量的类型 + +Version: 0.1 +Author: 骆昊 +""" +a = 100 +b = 12.345 +c = 'hello, world' +d = True +print(type(a)) # +print(type(b)) # +print(type(c)) # +print(type(d)) # +``` + +可以使用Python中内置的函数对变量类型进行转换。 + +- `int()`:将一个数值或字符串转换成整数,可以指定进制。 +- `float()`:将一个字符串转换成浮点数。 +- `str()`:将指定的对象转换成字符串形式,可以指定编码。 +- `chr()`:将整数转换成该编码对应的字符串(一个字符)。 +- `ord()`:将字符串(一个字符)转换成对应的编码(整数)。 + +下面的例子为大家演示了Python中的类型转换。 + +```Python +""" +Python中的类型转换 + +Version: 0.1 +Author: 骆昊 +""" +a = 100 +b = 12.345 +c = 'hello, world' +d = True +# 整数转成浮点数 +print(float(a)) # 100.0 +# 浮点型转成字符串 (输出字符串时不会看到引号哟) +print(str(b)) # 12.345 +# 字符串转成布尔型 (有内容的字符串都会变成True) +print(bool(c)) # True +# 布尔型转成整数 (True会转成1,False会转成0) +print(int(d)) # 1 +# 将整数变成对应的字符 (97刚好对应字符表中的字母a) +print(chr(97)) # a +# 将字符转成整数 (Python中字符和字符串表示法相同) +print(ord('a')) # 97 +``` + +### 总结 + +在Python程序中,我们可以**使用变量来保存数据**,**变量有不同的类型**,**变量可以做运算**(下一课会有详细的讲解),**变量还可以进行类型转换**。 + +>**温馨提示**:大家如果觉得这个专栏还不错,**一定记得点赞收藏哟**!如果学习中遇到困难,可以发私信给我进行交流,也可以看看我们为大家录制的入门视频,视频链接地址:https://pan.baidu.com/s/10y7sGM016YBM7gDdauGqLw,密码:4s6r。 + diff --git a/第004课:Python语言元素之运算符.md b/第004课:Python语言元素之运算符.md new file mode 100644 index 0000000..7e42ebf --- /dev/null +++ b/第004课:Python语言元素之运算符.md @@ -0,0 +1,151 @@ +## 第004课:Python语言元素之运算符 + +Python支持多种运算符,我们先用一个表格为大家列出几乎所有的运算符,然后再选择一些比较重要的运算符为大家进行讲解。 + +| 运算符 | 描述 | +| ------------------------------------------------------------ | ------------------------------ | +| `[]` `[:]` | 下标,切片 | +| `**` | 指数 | +| `~` `+` `-` | 按位取反, 正负号 | +| `*` `/` `%` `//` | 乘,除,模,整除 | +| `+` `-` | 加,减 | +| `>>` `<<` | 右移,左移 | +| `&` | 按位与 | +| `^` `\|` | 按位异或,按位或 | +| `<=` `<` `>` `>=` | 小于等于,小于,大于,大于等于 | +| `==` `!=` | 等于,不等于 | +| `is` `is not` | 身份运算符 | +| `in` `not in` | 成员运算符 | +| `not` `or` `and` | 逻辑运算符 | +| `=` `+=` `-=` `*=` `/=` `%=` `//=` `**=` `&=` `|=` `^=` `>>=` `<<=` | (复合)赋值运算符 | + +>**说明:** 上面这个表格实际上是按照运算符的优先级从上到下列出了各种运算符。所谓优先级就是在一个运算的表达式中,如果出现了多个运算符,应该先执行哪个运算再执行哪个运算的顺序。在实际开发中,如果搞不清楚运算符的优先级,可以使用圆括号来确保运算的执行顺序。 + +### 算术运算符 + +Python中的算术运算符非常丰富,除了大家最为熟悉的加减乘除之外,还有整除运算符、求模(求余数)运算符和求幂运算符。下面的例子为大家展示了算术运算符的使用。 + +```Python +""" +算术运算符 + +Version: 0.1 +Author: 骆昊 +""" +print(321 + 123) # 加法运算 +print(321 - 123) # 减法运算 +print(321 * 123) # 乘法运算 +print(321 / 123) # 除法运算 +print(321 % 123) # 求模运算 +print(321 // 123) # 整除运算 +print(321 ** 123) # 求幂运算 +``` + +### 赋值运算符 + +赋值运算符应该是最为常见的运算符,它的作用是将右边的值赋给左边的变量。下面的例子演示了赋值运算符和复合赋值运算符的使用。 + +```Python +""" +赋值运算符和复合赋值运算符 + +Version: 0.1 +Author: 骆昊 +""" +a = 10 +b = 3 +a += b # 相当于:a = a + b +a *= a + 2 # 相当于:a = a * (a + 2) +print(a) # 算一下这里会输出什么 +``` + +###比较运算符和逻辑运算符 + +比较运算符有的地方也称为关系运算符,包括`==`、`!=`、`<`、`>`、`<=`、`>=`,我相信没有什么好解释的,大家一看就能懂,唯一需要提醒的是比较相等用的是`==`,请注意这个地方是两个等号,因为`=`是赋值运算符,我们在上面刚刚讲到过,`==`才是比较相等的比较运算符。比较运算符会产生布尔值,要么是`True`要么是`False`。 + +逻辑运算符有三个,分别是`and`、`or`和`not`。`and`字面意思是“而且”,所以`and`运算符会连接两个布尔值,如果两个布尔值都是`True`,那么运算的结果就是`True`;左右两边的布尔值有一个是`False`,最终的运算结果就是`False`。相信大家已经想到了,如果`and`左边的布尔值是`False`,不管右边的布尔值是什么,最终的结果都是`False`,所以在做运算的时候右边的值会被跳过(短路处理),这也就意味着在`and`运算符左边为`False`的情况下,右边的表达式根本不会执行。`or`字面意思是“或者”,所以`or`运算符也会连接两个布尔值,如果两个布尔值有任意一个是`True`,那么最终的结果就是`True`。当然,`or`运算符也是有短路功能的,在它左边的布尔值为`True`的情况下,右边的表达式根本不会执行。`not`运算符的后面会跟上一个布尔值,它的作用是得到与该布尔值相反的值,也就是说,后面的布尔值如果是`True`运算结果就是`False`,而后面的布尔值如果是`False`则运算结果就是`True`。 + +```Python +""" +比较运算符和逻辑运算符的使用 + +Version: 0.1 +Author: 骆昊 +""" +flag0 = 1 == 1 +flag1 = 3 > 2 +flag2 = 2 < 1 +flag3 = flag1 and flag2 +flag4 = flag1 or flag2 +flag5 = not (1 != 2) +print('flag0 =', flag0) # flag0 = True +print('flag1 =', flag1) # flag1 = True +print('flag2 =', flag2) # flag2 = False +print('flag3 =', flag3) # flag3 = False +print('flag4 =', flag4) # flag4 = True +print('flag5 =', flag5) # flag5 = False +``` + +> **说明**:比较运算符的优先级高于赋值运算符,所以`flag0 = 1 == 1`先做`1 == 1`产生布尔值`True`,再将这个值赋值给变量`flag0`。`print`函数可以输出多个值,多个值之间可以用`,`进行分隔,输出的内容之间默认以空格分开。 + +### 运算符的例子 + +#### 例子1:华氏温度转换为摄氏温度。 + +> **提示**:华氏温度到摄氏温度的转换公式为:$C=(F - 32) \div 1.8$。 + +```Python +""" +将华氏温度转换为摄氏温度 + +Version: 0.1 +Author: 骆昊 +""" +f = float(input('请输入华氏温度: ')) +c = (f - 32) / 1.8 +print('%.1f华氏度 = %.1f摄氏度' % (f, c)) +``` + +> **说明**:在使用`print`函数输出时,也可以对字符串内容进行格式化处理,上面`print`函数中的字符串`%1.f`是一个占位符,稍后会由一个`float`类型的变量值替换掉它。同理,如果字符串中有`%d`,后面可以用一个`int`类型的变量值替换掉它,而`%s`会被字符串的值替换掉。除了这种格式化字符串的方式外,还可以用下面的方式来格式化字符串,其中`{f:.1f}`和`{c:.1f}`可以先看成是`{f}`和`{c}`,表示输出时会用变量`f`和变量`c`的值替换掉这两个占位符,后面的`:.1f`表示这是一个浮点数,小数点后保留1位有效数字。 +> +> ```Python +> print(f'{f:.1f}华氏度 = {c:.1f}摄氏度') +> ``` + +#### 例子2:输入圆的半径计算计算周长和面积。 + +```Python +""" +输入半径计算圆的周长和面积 + +Version: 0.1 +Author: 骆昊 +""" +radius = float(input('请输入圆的半径: ')) +perimeter = 2 * 3.1416 * radius +area = 3.1416 * radius * radius +print('周长: %.2f' % perimeter) +print('面积: %.2f' % area) +``` + +#### 例子3:输入年份判断是不是闰年。 + +```Python +""" +输入年份 如果是闰年输出True 否则输出False + +Version: 0.1 +Author: 骆昊 +""" +year = int(input('请输入年份: ')) +is_leap = year % 4 == 0 and year % 100 != 0 or year % 400 == 0 +print(is_leap) +``` + +> **说明**:比较运算符会产生布尔值,而逻辑运算符`and`和`or`会对这些布尔值进行组合,最终也是得到一个布尔值,闰年输出`True`,平年输出`False`。 + +### 总结 + +学会了Python程序中可以使用的运算符,就能帮助我们解决很多很实际的问题,就像我们可以写出各种单位转换的程序,也可以轻松的去实现闰年判断那样。 + +> **温馨提示**:大家如果觉得这个专栏还不错,**一定记得点赞收藏哟**!如果学习中遇到困难,可以发私信给我进行交流,也可以看看我们为大家录制的入门视频,视频链接地址:https://pan.baidu.com/s/10y7sGM016YBM7gDdauGqLw,密码:4s6r。 \ No newline at end of file diff --git a/第005课:分支结构.md b/第005课:分支结构.md new file mode 100644 index 0000000..d01d24a --- /dev/null +++ b/第005课:分支结构.md @@ -0,0 +1,146 @@ +## 第005课:分支结构 + +### 应用场景 + +迄今为止,我们写的Python代码都是一条一条语句顺序执行,这种代码结构通常称之为顺序结构。然而仅有顺序结构并不能解决所有的问题,比如我们设计一个游戏,游戏第一关的通关条件是玩家获得1000分,那么在完成本局游戏后,我们要根据玩家得到分数来决定究竟是进入第二关,还是告诉玩家“Game Over”,这里就会产生两个分支,而且这两个分支只有一个会被执行。类似的场景还有很多,我们将这种结构称之为“分支结构”或“选择结构”。给大家一分钟的时间,你应该可以想到至少5个以上这样的例子,赶紧试一试。 + +### if语句的使用 + +在Python中,要构造分支结构可以使用`if`、`elif`和`else`关键字。所谓**关键字**就是有特殊含义的单词,像`if`和`else`就是专门用于构造分支结构的关键字,很显然你不能够使用它作为变量名。下面的例子中演示了如何构造一个分支结构。 + +```Python +""" +用户身份验证 + +Version: 0.1 +Author: 骆昊 +""" +username = input('请输入用户名: ') +password = input('请输入口令: ') +# 用户名是admin且密码是123456则身份验证成功否则身份验证失败 +if username == 'admin' and password == '123456': + print('身份验证成功!') +else: + print('身份验证失败!') +``` + +需要说明的是和C/C++、Java等语言不同,Python中没有用花括号来构造代码块而是**使用了缩进的方式来表示代码的层次结构**,如果`if`条件成立的情况下需要执行多条语句,只要保持多条语句具有相同的缩进就可以了。换句话说**连续的代码如果又保持了相同的缩进那么它们属于同一个代码块**,相当于是一个执行的整体。**缩进**可以使用任意数量的空格,但**通常使用4个空格**,建议大家**不要使用制表键**或者**设置你的代码编辑工具自动将制表键变成4个空格**。 + +当然如果要构造出更多的分支,可以使用`if...elif...else...`结构或者嵌套的`if...else...`结构,下面的代码演示了如何利用多分支结构实现分段函数求值。 + +$$ +f(x)=\begin{cases} 3x-5&\text{(x>1)}\\x+2&\text{(-1}\leq\text{x}\leq\text{1)}\\5x+3&\text {(x<-1)}\end{cases} +$$ + +```Python +""" +分段函数求值 + +Version: 0.1 +Author: 骆昊 +""" +x = float(input('x = ')) +if x > 1: + y = 3 * x - 5 +elif x >= -1: + y = x + 2 +else: + y = 5 * x + 3 +print(f'f({x}) = {y}') +``` + +当然根据实际开发的需要,分支结构是可以嵌套的,例如判断是否通关以后还要根据你获得的宝物或者道具的数量对你的表现给出等级(比如点亮两颗或三颗星星),那么我们就需要在`if`的内部构造出一个新的分支结构,同理`elif`和`else`中也可以再构造新的分支,我们称之为嵌套的分支结构,也就是说上面的代码也可以写成下面的样子。 + +```Python +""" +分段函数求值 + +Version: 0.1 +Author: 骆昊 +""" +x = float(input('x = ')) +if x > 1: + y = 3 * x - 5 +else: + if x >= -1: + y = x + 2 + else: + y = 5 * x + 3 +print(f'f({x}) = {y}') +``` + +> **说明:** 大家可以自己感受和评判一下这两种写法到底是哪一种更好。在**[Python之禅](https://zhuanlan.zhihu.com/p/111843067)**中有这么一句话:“Flat is better than nested”,之所以提倡代码“扁平化”是因为嵌套结构的嵌套层次如果很多,会严重的影响代码的可读性,所以能使用扁平化结构时就不要使用嵌套结构。 + +### 一些例子 + +#### 例子1:英制单位英寸与公制单位厘米互换。 + +```Python +""" +英制单位英寸和公制单位厘米互换 + +Version: 0.1 +Author: 骆昊 +""" +value = float(input('请输入长度: ')) +unit = input('请输入单位: ') +if unit == 'in' or unit == '英寸': + print('%f英寸 = %f厘米' % (value, value * 2.54)) +elif unit == 'cm' or unit == '厘米': + print('%f厘米 = %f英寸' % (value, value / 2.54)) +else: + print('请输入有效的单位') +``` + +#### 例子2:百分制成绩转换为等级制成绩。 + +> **要求**:如果输入的成绩在90分以上(含90分)输出A;80分-90分(不含90分)输出B;70分-80分(不含80分)输出C;60分-70分(不含70分)输出D;60分以下输出E。 + +```Python +""" +百分制成绩转换为等级制成绩 + +Version: 0.1 +Author: 骆昊 +""" +score = float(input('请输入成绩: ')) +if score >= 90: + grade = 'A' +elif score >= 80: + grade = 'B' +elif score >= 70: + grade = 'C' +elif score >= 60: + grade = 'D' +else: + grade = 'E' +print('对应的等级是:', grade) +``` +#### 例子3:输入三条边长,如果能构成三角形就计算周长和面积。 + +```Python +""" +判断输入的边长能否构成三角形,如果能则计算出三角形的周长和面积 + +Version: 0.1 +Author: 骆昊 +""" +a = float(input('a = ')) +b = float(input('b = ')) +c = float(input('c = ')) +if a + b > c and a + c > b and b + c > a: + peri = a + b + c + print(f'周长: {peri}) + half = peri / 2 + area = (half * (half - a) * (half - b) * (half - c)) ** 0.5 + print(f'面积: {area}') +else: + print('不能构成三角形') +``` +> **说明:** 上面通过边长计算三角形面积的公式叫做[海伦公式](https://zh.wikipedia.org/zh-hans/海伦公式)。 + +### 简单的总结 + +学会了Python中的分支结构和循环结构,我们就可以用Python程序来解决很多实际的问题了。这一节课相信已经帮助大家记住了`if`、`elif`、`else`这几个关键字以及如何使用它们来构造分支结构,下一节课我们为大家介绍循环结构,学完这两次课你一定会发现,你能写出很多很多非常有意思的代码。坚持努力,继续加油! + +> **温馨提示**:大家如果觉得这个专栏还不错,**一定记得点赞收藏哟**!如果学习中遇到困难,可以发私信给我进行交流,也可以看看我们为大家录制的入门视频,视频链接地址:https://pan.baidu.com/s/10y7sGM016YBM7gDdauGqLw,密码:4s6r。 \ No newline at end of file diff --git a/第006课:循环结构.md b/第006课:循环结构.md new file mode 100644 index 0000000..6168d19 --- /dev/null +++ b/第006课:循环结构.md @@ -0,0 +1,161 @@ +## 第006课:循环结构 + +### 应用场景 + +我们在写程序的时候,一定会遇到需要重复执行某条或某些指令的场景。例如用程序控制机器人踢足球,如果机器人持球而且还没有进入射门范围,那么我们就要一直发出让机器人向球门方向移动的指令。在这个场景中,让机器人向球门方向移动就是一个需要重复的动作,当然这里还会用到上一课讲的分支结构来判断机器人是否持球以及是否进入射门范围。再举一个简单的例子,如果要实现每隔1秒中在屏幕上打印一次“hello, world”并持续打印一个小时,我们肯定不能够直接把`print('hello, world')`这句代码写3600遍,这里同样需要循环结构。 + +循环结构就是程序中控制某条或某些指令重复执行的结构。在Python中构造循环结构有两种做法,一种是`for-in`循环,一种是`while`循环。 + +### for-in循环 + +如果明确的知道循环执行的次数,我们推荐使用`for-in`循环,例如计算1到100的和,即$\displaystyle \sum \limits_{n=1}^{100}n$。 + +```Python +""" +用for循环实现1~100求和 + +Version: 0.1 +Author: 骆昊 +""" +total = 0 +for x in range(1, 101): + total += x +print(total) +``` + +需要说明的是上面代码中的`range(1, 101)`可以用来构造一个从1到100的范围,当我们把这样一个范围放到`for-in`循环中,就可以通过前面的循环变量`x`依次取出从1到100的整数。当然,`range`的用法非常灵活,下面给出了一个例子: + +- `range(101)`:可以用来产生0到100范围的整数,需要注意的是取不到101。 +- `range(1, 101)`:可以用来产生1到100范围的整数,相当于前面是闭区间后面是开区间。 +- `range(1, 101, 2)`:可以用来产生1到100的奇数,其中2是步长,即每次数值递增的值。 +- `range(100, 0, -2)`:可以用来产生100到1的偶数,其中-2是步长,即每次数字递减的值。 + +知道了这一点,我们可以用下面的代码来实现1~100之间的偶数求和。 + +```Python +""" +用for循环实现1~100之间的偶数求和 + +Version: 0.1 +Author: 骆昊 +""" +total = 0 +for x in range(2, 101, 2): + total += x +print(total) +``` + +### while循环 + +如果要构造不知道具体循环次数的循环结构,我们推荐使用`while`循环。`while`循环通过一个能够产生或转换出`bool`值的表达式来控制循环,表达式的值为`True`则继续循环;表达式的值为`False`则结束循环。 + +下面我们通过一个“猜数字”的小游戏来看看如何使用`while`循环。猜数字游戏的规则是:计算机出一个1到100之间的随机数,玩家输入自己猜的数字,计算机给出对应的提示信息(大一点、小一点或猜对了),如果玩家猜中了数字,计算机提示用户一共猜了多少次,游戏结束,否则游戏继续。 + +```Python +""" +猜数字游戏 + +Version: 0.1 +Author: 骆昊 +""" +import random + +answer = random.randint(1, 100) +counter = 0 +while True: + counter += 1 + number = int(input('请输入: ')) + if number < answer: + print('大一点') + elif number > answer: + print('小一点') + else: + print('恭喜你猜对了!') + break +print(f'你总共猜了{counter}次') +``` + +### break和continue + +上面的代码中使用`while True`构造了一个条件恒成立的循环,也就意味着如果不做特殊处理,循环是不会结束的,这也就是常说的“死循环”。为了在用户猜中数字时能够退出循环结构,我们使用了`break`关键字,它的作用是提前结束循环。需要注意的是,`break`只能终止它所在的那个循环,这一点在使用嵌套循环结构时需要引起注意,下面的例子我们会讲到什么是嵌套的循环结构。除了`break`之外,还有另一个关键字是`continue`,它可以用来放弃本次循环后续的代码直接让循环进入下一轮。 + +### 嵌套的循环结构 + +和分支结构一样,循环结构也是可以嵌套的,也就是说在循环中还可以构造循环结构。下面的例子演示了如何通过嵌套的循环来输出一个乘法口诀表(九九表)。 + +```Python +""" +打印乘法口诀表 + +Version: 0.1 +Author: 骆昊 +""" +for i in range(1, 10): + for j in range(1, i + 1): + print(f'{i}*{j}={i * j}', end='\t') + print() +``` + +很显然,在上面的代码中,外层循环用来控制一共会产生9行的输出,而内层循环用来控制每一行会输出多少列。内层循环中的输出就是九九表一行中的所有列,所以在内层循环完成时,有一个`print()`来实现换行输出的效果。 + +### 循环的例子 + +#### 例子1:输入一个正整数判断它是不是素数。 + +> **提示**:素数指的是只能被1和自身整除的大于1的整数。 + +```Python +""" +输入一个正整数判断它是不是素数 + +Version: 0.1 +Author: 骆昊 +""" +num = int(input('请输入一个正整数: ')) +end = int(num ** 0.5) +is_prime = True +for x in range(2, end + 1): + if num % x == 0: + is_prime = False + break +if is_prime and num != 1: + print(f'{num}是素数') +else: + print(f'{num}不是素数') +``` + +#### 例子2:输入两个正整数,计算它们的最大公约数和最小公倍数。 + +> **提示**:两个数的最大公约数是两个数的公共因子中最大的那个数;两个数的最小公倍数则是能够同时被两个数整除的最小的那个数。 + +```Python +""" +输入两个正整数计算它们的最大公约数和最小公倍数 + +Version: 0.1 +Author: 骆昊 +""" + +x = int(input('x = ')) +y = int(input('y = ')) +if x > y: + x, y = y, x # Python中可以用这样的方式来交换两个变量的值 +for factor in range(x, 0, -1): + if x % factor == 0 and y % factor == 0: + print(f'{x}和{y}的最大公约数是{factor}') + print(f'{x}和{y}的最小公倍数是{x * y // factor}') + break +``` + +### 简单的总结 + +学会了Python中的分支结构和循环结构,我们就可以解决很多实际的问题了。通过这节课的学习,大家应该已经知道了可以用`for`和`while`关键字来构造循环结构。**如果知道循环的次数,我们通常使用**`for`**循环**;如果**循环次数不能确定,可以用**`while`**循环**。在循环中还**可以使用**`break`**来提前结束循环**。 + +> **温馨提示**:大家如果觉得这个专栏还不错,**一定记得点赞收藏哟**!如果学习中遇到困难,可以发私信给我进行交流,也可以看看我们为大家录制的入门视频,视频链接地址:https://pan.baidu.com/s/10y7sGM016YBM7gDdauGqLw,密码:4s6r。 + + + + + + +