Python学习的第一周
一、初识Python
Python的应用领域
目前Python在Web服务器应用开发、云基础设施开发、网络数据采集(爬虫)、数据分析、量化交易、机器学习、深度学习、自动化测试、自动化运维等领域都有用武之地。
二、编写代码工具
1.交互式环境
我们打开Windows的“命令提示符”工具,输入命令python
然后回车就可以进入到Python的交互式环境中。所谓交互式环境,就是我们输入一行代码回车,代码马上会被执行,如果代码有产出结果,那么结果会被显示在窗口中。例如:
Python 3.7.6
Type "help", "copyright", "credits" or "license" for more information.
>>> 2 * 3
6
>>> 2 + 3
5
如果希望退出交互式环境,可以在交互式环境中输入quit()
,如下所示。
>>> quit()
2.更好的交互式环境 - IPython
Python默认的交互式环境用户体验并不怎么好,我们可以用IPython来替换掉它,因为IPython提供了更为强大的编辑和交互功能。我们可以使用Python的包管理工具pip
来安装IPython,如下所示。
pip install ipython
温馨提示:在使用上面的命令安装IPython之前,可以先通过
pip config set global.index-url https://pypi.doubanio.com/simple
命令将pip
的下载源修改为国内的豆瓣网,否则下载安装的过程可能会非常的缓慢。
可以使用下面的命令启动IPython,进入交互式环境。
ipython
3.文本编辑器 - Visual Studio Code
Visual Studio Code(通常简称为VS Code)是一个由微软开发能够在Windows、 Linux和macOS等操作系统上运行的代码编辑神器。它支持语法高亮、自动补全、多点编辑、运行调试等一系列便捷功能,而且能够支持多种编程语言。
4.集成开发环境 - PyCharm
PyCharm是由捷克一家名为JetBrains的公司开发的用于Python项目开发的集成开发环境(IDE)。所谓集成开发环境,通常是指工具中提供了编写代码、运行代码、调试代码、分析代码、版本控制等一系列功能,因此特别适合商业项目的开发。在JetBrains的官方网站上提供了PyCharm的下载链接,其中社区版(Community)是免费的但功能相对弱小(其实已经足够强大了),专业版(Professional)功能非常强大,但需要按年或月付费使用,新用户可以试用30天时间。
运行PyCharm,可以看到如下图所示的欢迎界面,可以选择“New”来创建一个新的项目。
PyCharm常用的快捷键如下表所示,我们也可以在“文件”菜单的“设置”中定制PyCharm的快捷键(macOS系统是在“偏好设置”中对快捷键进行设置)。
表1. PyCharm常用快捷键。
快捷键 | 作用 |
---|---|
ctrl + j | 显示可用的代码模板 |
ctrl + b | 查看函数、类、方法的定义 |
ctrl + alt + l | 格式化代码 |
alt + enter | 万能代码修复快捷键 |
ctrl + / | 注释/反注释代码 |
shift + shift | 万能搜索快捷键 |
ctrl + d / ctrl + y | 复制/删除一行代码 |
ctrl + shift + - / ctrl + shift + + | 折叠/展开所有代码 |
F2 | 快速定位到错误代码 |
ctrl + alt + F7 | 查看哪些地方用到了指定的函数、类、方法 |
5.hello, world
按照行业惯例,我们学习任何一门编程语言写的第一个程序都是输出hello, world
,因为这段代码是伟大的丹尼斯·里奇(C语言之父,和肯·汤普森一起开发了Unix操作系统)和布莱恩·柯尼汉(awk语言的发明者)在他们的不朽著作The C Programming Language中写的第一段代码。
print('hello, world') # hello, world
6.计算机常识
在开始系统的学习编程之前,我们先来科普一些计算机的基础知识。计算机的硬件系统通常由五大部件构成,包括:运算器、控制器、存储器、输入设备和输出设备。其中,运算器和控制器放在一起就是我们常说的中央处理器,它的功能是执行各种运算和控制指令。刚才我们提到过程序是指令的集合,写程序就是将一系列的指令按照某种方式组织到一起,然后通过这些指令去控制计算机做我们想让它做的事情。目前,我们使用的计算机基本都是“冯·诺依曼体系结构”的计算机,这种计算机有两个关键点:一是要将存储设备与中央处理器分开;二是将数据以二进制方式编码。
二进制是一种“逢二进一”的计数法,跟我们人类使用的“逢十进一”的计数法本质是一样的。人类因为有十根手指所以使用了十进制,因为在计数时十根手指用完之后就只能用进位的方式来表示更大的数值。当然凡事都有例外,玛雅人可能是因为长年光着脚的原因,把脚趾头也都用上了,于是他们使用了二十进制的计数法。在这种计数法的指导下,玛雅人的历法就与我们平常使用的历法并不相同。按照玛雅人的历法,2012年是上一个所谓的“太阳纪”的最后一年,而2013年则是新的“太阳纪”的开始,后来这件事情被以讹传讹的方式误传为”2012年是玛雅人预言的世界末日“的荒诞说法。今天很多人都在猜测,玛雅文明之所以发展缓慢跟使用了二十进制是有关系的。对于计算机来说,二进制在物理器件上最容易实现的,因为可以用高电压表示1,用低电压表示0。不是所有写程序的人都需要知道十进制与二进制如何转换,大多数时候我们即便不了解这些知识也能写出程序,但是我们必须要知道计算机是使用二进制计数的,不管什么数据到了计算机内存中都是以二进制形式存在的。
三、元素变量
1.变量和类型
在编程语言中,变量是数据的载体,简单的说就是一块用来保存数据的内存空间,变量的值可以被读取和修改,这是所有计算和控制的基础。计算机能处理的数据有很多种类型,最常见的就是数值,除了数值之外还有文本、图形、音频、视频等各种各样的数据。虽然数据在计算机中都是以二进制形态存在的,但是我们可以用不同类型的变量来表示数据类型的差异。Python中的数据类型很多,而且也允许我们自定义新的数据类型(这一点在后面会讲到),这里我们需要先了解几种常用的数据类型。
- 整型(
int
):Python中可以处理任意大小的整数,而且支持二进制(如0b100
,换算成十进制是4)、八进制(如0o100
,换算成十进制是64)、十进制(100
)和十六进制(0x100
,换算成十进制是256)的表示法。 - 浮点型(
float
):浮点数也就是小数,之所以称为浮点数,是因为按照科学记数法表示时,一个浮点数的小数点位置是可变的,浮点数除了数学写法(如123.456
)之外还支持科学计数法(如1.23456e2
)。 - 字符串型(
str
):字符串是以单引号或双引号括起来的任意文本,比如'hello'
和"hello"
。 - 布尔型(
bool
):布尔值只有True
、False
两种值,要么是True
,要么是False
。
2.变量命名
对于每个变量我们需要给它取一个名字,就如同我们每个人都有自己的名字一样。在Python中,变量命名需要遵循以下这些规则,这些规则又分为必须遵守的硬性规则和建议遵守的非硬性规则。
- 硬性规则:
- 规则1:变量名由字母、数字和下划线构成,数字不能开头。需要说明的是,这里说的字母指的是Unicode字符,Unicode称为万国码,囊括了世界上大部分的文字系统,这也就意味着中文、日文、希腊字母等都可以作为变量名中的字符,但是像
!
、@
、#
这些特殊字符是不能出现在变量名中的,而且我们强烈建议大家尽可能使用英文字母。 - 规则2:大小写敏感,简单的说就是大写的
A
和小写的a
是两个不同的变量。 - 规则3:变量名不要跟Python语言的关键字(有特殊含义的单词,后面会讲到)和保留字(如函数、模块等的名字)发生重名的冲突。
- 规则1:变量名由字母、数字和下划线构成,数字不能开头。需要说明的是,这里说的字母指的是Unicode字符,Unicode称为万国码,囊括了世界上大部分的文字系统,这也就意味着中文、日文、希腊字母等都可以作为变量名中的字符,但是像
- 非硬性规则:
- 规则1:变量名通常使用小写英文字母,多个单词用下划线进行连接。
- 规则2:受保护的变量用单个下划线开头(后面会讲到)。
- 规则3:私有的变量用两个下划线开头(后面会讲到)。
当然,作为一个专业的程序员,给变量(事实上应该是所有的标识符)命名时做到见名知意也非常重要。
四、运算符
1.算术运算符
Python中的算术运算符非常丰富,除了大家最为熟悉的加减乘除之外,还有整除运算符、求模(求余数)运算符和求幂运算符。下面的例子为大家展示了算术运算符的使用。
2.赋值运算符
赋值运算符应该是最为常见的运算符,它的作用是将右边的值赋给左边的变量。下面的例子演示了赋值运算符和复合赋值运算符的使用。
3.比较运算符和逻辑运算符
比较运算符有的地方也称为关系运算符,包括==
、!=
、<
、>
、<=
、>=
,我相信没有什么好解释的,大家一看就能懂,需要提醒的是比较相等用的是==
,请注意这里是两个等号,因为=
是赋值运算符,我们在上面刚刚讲到过,==
才是比较相等的运算符;比较不相等用的是!=
,这不同于数学上的不等号,Python 2中曾经使用过<>
来表示不等关系,大家知道就可以了。比较运算符会产生布尔值,要么是True
要么是False
。
逻辑运算符有三个,分别是and
、or
和not
。and
字面意思是“而且”,所以and
运算符会连接两个布尔值,如果两个布尔值都是True
,那么运算的结果就是True
;左右两边的布尔值有一个是False
,最终的运算结果就是False
。相信大家已经想到了,如果and
左边的布尔值是False
,不管右边的布尔值是什么,最终的结果都是False
,所以在做运算的时候右边的值会被跳过(短路处理),这也就意味着在and
运算符左边为False
的情况下,右边的表达式根本不会执行。or
字面意思是“或者”,所以or
运算符也会连接两个布尔值,如果两个布尔值有任意一个是True
,那么最终的结果就是True
。当然,or
运算符也是有短路功能的,在它左边的布尔值为True
的情况下,右边的表达式根本不会执行。not
运算符的后面会跟上一个布尔值,它的作用是得到与该布尔值相反的值,也就是说,not
后面的布尔值如果是True
,运算结果就是False
;而not
后面的布尔值如果是False
,运算结果就是True
。
- 优先级
- 结合性
(1)左结合:从左向右进行计算---->大部分运算符 eg:+ - * /
(2)右结合:从右向左进行计算---->赋值运算符、正负号、索引和切片
五、分支结构
1.if语句
在Python中,要构造分支结构可以使用if
、elif
和else
关键字。所谓关键字就是有特殊含义的单词,像if
和else
就是专门用于构造分支结构的关键字,很显然你不能够使用它作为变量名。
Python中没有用花括号来构造代码块而是使用了缩进的方式来表示代码的层次结构,如果if
条件成立的情况下需要执行多条语句,只要保持多条语句具有相同的缩进就可以了。换句话说连续的代码如果又保持了相同的缩进那么它们属于同一个代码块,相当于是一个执行的整体。缩进可以使用任意数量的空格,但通常使用4个空格,强烈建议大家不要使用制表键来缩进代码,如果你已经习惯了这么做,可以设置代码编辑工具将1个制表键自动变成4个空格,很多的代码编辑工具都支持这项功能。
提示:
if
和else
的最后面有一个:
,它是用英文输入法输入的冒号;程序中输入的'
、"
、=
、(
、)
等特殊字符,都是在英文输入法状态下输入的。有很多初学者经常不注意这一点,结果运行代码的时候就会遇到很多莫名其妙的错误提示。强烈建议大家在写代码的时候都打开英文输入法(注意是英文输入法而不是中文输入法的英文输入模式),这样可以避免很多不必要的麻烦。
如果要构造出更多的分支,可以使用if...elif...else...
结构或者嵌套的if...else...
结构。
六、循环结构
1.for-in循环
-
for-in循环------>知道循环的具体次数
-
for i in range(100): ---->变量值i从0循环到99
如果明确的知道循环执行的次数,我们推荐使用for-in
循环,例如计算1到100的和。 被for-in
循环控制的语句块也是通过缩进的方式来确定的,这一点跟分支结构完全相同,大家看看下面的代码就明白了。
"""
用for循环实现1~100求和
"""
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之间的偶数求和。
"""
用for循环实现1~100之间的偶数求和
"""
total = 0
for x in range(2, 101, 2):
total += x
print(total)
2.while循环
-
while循环----->不知道循环的次数
-
while 条件:------当条件==True,表示恒成立,无休止运行,可用break终止循环,也可设置条件终止循环
如果要构造不知道具体循环次数的循环结构,我们推荐使用while
循环。while
循环通过一个能够产生或转换出bool
值的表达式来控制循环,表达式的值为True
则继续循环;表达式的值为False
则结束循环。
下面我们通过一个“猜数字”的小游戏来看看如何使用while
循环。猜数字游戏的规则是:计算机出一个1到100之间的随机数,玩家输入自己猜的数字,计算机给出对应的提示信息(大一点、小一点或猜对了),如果玩家猜中了数字,计算机提示用户一共猜了多少次,游戏结束,否则游戏继续。
"""
猜数字游戏
"""
import random
# 产生一个1-100范围的随机数
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
# 当退出while循环的时候显示用户一共猜了多少次
print(f'你总共猜了{counter}次')
3.break和continue
上面的代码中使用while True
构造了一个条件恒成立的循环,也就意味着如果不做特殊处理,循环是不会结束的,这也就是常说的“死循环”。为了在用户猜中数字时能够退出循环结构,我们使用了break
关键字,它的作用是提前结束循环。需要注意的是,break
只能终止它所在的那个循环,这一点在使用嵌套循环结构时需要引起注意,下面的例子我们会讲到什么是嵌套的循环结构。除了break
之外,还有另一个关键字是continue
,它可以用来放弃本次循环后续的代码直接让循环进入下一轮。
4.嵌套的循环结构
和分支结构一样,循环结构也是可以嵌套的,也就是说在循环中还可以构造循环结构。下面的例子演示了如何通过嵌套的循环来输出一个乘法口诀表(九九表)。
"""
打印乘法口诀表
"""
for i in range(1, 10):
for j in range(1, i + 1):
print(f'{i}*{j}={i * j}', end='\t')
print()
很显然,在上面的代码中,外层循环用来控制一共会产生9行的输出,而内层循环用来控制每一行会输出多少列。内层循环中的输出就是九九表一行中的所有列,所以在内层循环完成时,有一个print()
来实现换行输出的效果。
七、容器型数据类型------列表
用一个变量可以保存多个数据
列表(list)
list = [a, b, c, d, e]
列表的遍历(把每个元素依次取出来):
列表的索引运算(下标运算):------从0开始数数
取出列表中的指定元素:
print(list[2])------>取出列表list中的第三个元素:c
print(list[0])------>取出列表list中的第一个元素:a
print(list[-5])----->负向索引,取出负向数的第五个元素:a
- list.append()----->在列表结尾追加数据
- list.insert(0,1) ---->在列表的第一个位置[0],插入一个数据[1]
- list.pop()---->默认删掉列表的最后一个数据
取出列表中的所有元素:
for i in range(len(list)): ------>len() 自动计算列表中的元素个数并以此控制循环变量的取值