Python 从入门到实践(一)
在当今的环境下 Python 逐渐成为一门热门的语言,作为一门有着 30 年发展历史的编程语言,其在数据分析领域以及人工智能领域发挥着重要作用。Python 是基于 C 语言,一诞生就具备了完善的语法,其给程序员最直观的印象是——它的简洁性。
Python 特点
- 语法简单灵活;
 - 规范化代码;
 - Python 是一个开源项目,有着广泛的开发支持;
 - Python 是一门面向对象的编程语言;
 - Python 具有强大的可移植性;
 - Python 属于解释性的编程语言;
 - Python 是一个“胶水语言”;
 - Python 拥有良好的并发处理支持。
 
搭建 Python 学习环境
前往 Python 官网下载最新版 Python,需要说明的是,Python2.x 和 Python3.x 之间存在较大差异,在开发中一般都使用 Python3.x,本次使用的版本为 3.8.1。

下载完成后运行安装程序,勾选 Add Python 3.8 to PATH,点击 Customize installation,点击 Next,点击 Install,等待安装完成。按下 Windows+R 组合键,输入 CMD 进入命令行窗口,输入 python,发现可进入 Python 交互式环境,如下图。

文本编辑器到底哪家强?我推荐 Visual Studio Code。前往官网,点击 Download for Windows,下载完成后运行安装程序,下一步即可,建议到下图这一步时勾选上这三个选项,等待安装完成。

安装完成后进入 Visual Studio Code,进入扩展市场(左侧第五个图标),搜索 chinese,如下图,点击 Install 安装简体中文包,安装完成后点击 Restart Now,。

仍然点击左侧第五个图标,搜索 python,第一个就是微软官方的,如下图,安装。

Python 学习起步
虽然 Python 拥有交互式环境,但是无论如何,程序是需要定义在源文件之中的,Python 源文件的后缀为 py。新建一个文件夹,名字自定义,例如 Python Learning,VS Code 中打开该文件夹,如下图(也可以直接右键点击 Python Learning,选择通过 Code 打开),VS Code 中新建文件,命名为 hello_world.py,文件中输入以下一行代码,Ctrl+S 保存。
1  | print("Hello,world!")  | 

点击右上角运行图标,可看到学习任何一门编程语言时第一个编写的程序的运行结果,如下图。

注释
- 单行注释:
# [注释内容] - 多行注释:
'''[多行注释内容]'''或"""[多行注释内容]""" 
变量(对象)
Python 中的变量不需要声明,每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。
范例:使用变量(修改文件 hello_world.py)
1  | message = "Hello,world!"  | 
打印结果:
1  | Hello,world!  | 
可以同时为多个变量赋值。
范例:为多个变量赋值(修改文件 hello_world.py)
1  | message1, message2 = "Hello,world!", "Hello,ql!"  | 
打印结果:
1  | Hello,world!  | 
值得说明的是,如果我们比较熟悉面向对象的编程的话,Python 语言里面所有的变量严格意义上来讲应该被称为“对象”;
范例:定义变量但是不设置内容(新建文件 None.py)
1  | message = None # 空引用  | 
打印结果:
1  | None  | 
很多编程语言都会使用;作为每行程序的完结符,然而;在 Python 中被设计为可选符号,如果希望在一行定义多个变量,可用;。
范例:使用;对一行中的多个变量进行区分(新建文件 hello_ql.py)
1  | message = "Hello,world" ;print(message) ;message = "Hello,ql!" ;print(message)  | 
打印结果:
1  | Hello,world!  | 
和其他语言一样,Python 中,我们在命名变量时也需要遵守一些规则和指南,违反规则将导致错误,遵守指南让你编写的代码更容易阅读和理解:
- 变量名只能包含字母、数字和下划线。变量名可以以字母或下划线开头但不能以数字开头;
 - 变量名不能包含空格,但可用下划线代替;
 - 不要将 Python 关键字用做变量名,注意将 Python 内置函数用做变量名时,虽然不会导致错误但将覆盖这些函数;
 - 变量名应即简短又具有描述性。例如:name 比 n 好,student_name 比 s_n 好,name_length 比 length_of_persons_name;
 - 慎用小写字母 i 和大写字母 O,因为它们可能被人错看成数字 1 和 0。
 
常用数据类型
在 Python 之中常用的数据类型包括:整数、浮点数、复数、布尔、字符串、列表、元组、字典和日期。
范例:通过 type() 函数查看数据类型(新建文件 type.py)
1  | message = "Hello,world!"  | 
打印结果:
1  | <class 'str'>  | 
"<class ‘str’>"表示 message 变量为字符串类型。
整数和浮点数
范例:两个整数相除(新建文件 num.py)
1  | num_a = 10  | 
打印结果:
1  | 2.5  | 
范例:获取数据类型(修改文件 num.py)
1  | num_a = 10  | 
打印结果:
1  | <class 'int'>  | 
复数
复数数据类型不能直接使用,需要通过 complex() 函数。
范例:使用复数(一)(新建文件 complex.py)
1  | num = complex(10,2) # 实部为10,虚部为2  | 
打印结果:
1  | (10+2j)  | 
范例:使用复数(二)(修改文件 complex.py)
1  | num = complex(10,2) # 实部为10,虚部为2  | 
打印结果:
1  | (10+2j)  | 
布尔
“布尔”是 19 世纪一位英国数学家的名字,Python 中布尔的取值:True和False。
范例:使用布尔(一)(新建文件 boolean.py)
1  | flag = True # Python中的True是首字母大写的  | 
打印结果:
1  | Hello,world!  | 
Python 是通过 C 语言开发的,Python 继承了布尔型值为 0 表示假,为非 0 表示真的特性。
范例:使用布尔(二)(修改文件 boolean.py)
1  | flag = 1 # 非0  | 
打印结果:
1  | Hello,world!  | 
字符串
字符串是一个开发中最为重要的的概念,Python 中直接使用单引号''或双引号""进行字符串的定义,使用哪一种引号定义字符串都是一样的,但需统一,不同的引号可以嵌套。
范例:引号嵌套(新建文件 quotation_mark.py)
1  | message = '"Hello,world!"' # 使用单引号定义字符串  | 
打印结果:
1  | "Hello,world!"  | 
可使用+进行字符串的拼接操作。
范例:字符串的拼接(新建文件 string.py)
1  | message = "Hello,world!,"+"Hello,ql!"  | 
打印结果:
1  | Hello,world!,Hello,ql!  | 
常用转义字符串
| 符号 | 描述 | 符号 | 描述 | 
|---|---|---|---|
| \ | 续航符,实现字符串多行定义 | \n | 换行 | 
| \\ | 等价于“\” | \v | 纵向制表符 | 
| \’ | 等价于单引号 | \t | 横向制表符 | 
| \" | 等价于双引号 | \r | 回车 | 
| \000 | 空字符串 | \f | 换页 | 
| \b | 退格 | \oyy | 八进制字符,如“\o12:”为换行 | 
| \e | 转义 | \xyy | 十进制字符,如“\x0a”为换行 | 
范例:使用转义字符串(新建文件 escape.py)
1  | message = "Python:\"Hello,world!\"\n\tPython:\"Hello,ql!\""  | 
打印结果:
1  | Python:"Hello,world!"  | 
函数 input()
利用函数 input(),Python 可以接受通过键盘输入的字符串类型的数据
范例:通过键盘输入数据(新建文件 input.py)
1  | input_data = input("你的名字:") # 给出提示字符串  | 
打印结果:
1  | 你的名字:ql  | 
1  | 你的名字:ql  | 
范例:获取输入类型(修改文件 input.py)
1  | input_data = input("你的名字:") # 给出提示字符串  | 
打印结果:
1  | 你的名字:ql  | 
1  | 你的名字:ql  | 
数据类型转换函数
| 函数 | 描述 | 
|---|---|
| int(数据) | 将指定数据转为整形数据 | 
| float(数据) | 将指定数据转为浮点型数据 | 
| bool(数据) | 将指定数据转为布尔型数据 | 
| str(数据) | 将指定数据转为字符串型数据 | 
范例:int() 函数(一)(新建文件 int.py)
1  | str = "155"  | 
打印结果:
1  | 155  | 
如果字符串不是由规定字符组成,int.py 就会产生异常。
范例:字符串不是由规定字符组成(修改文件 int.py)
1  | str = "2BC9"  | 
打印结果:
1  | Traceback (most recent call last):  | 
范例:int() 函数(二)(修改文件 int.py)
1  | str = "199"  | 
打印结果:
1  | 399  | 
范例:int() 函数(三)(修改文件 int.py)
1  | num_a = int(input("请输入第一个整数:"))  | 
打印结果:
1  | 请输入第一个整数:12  | 
1  | 请输入第二个整数:13  | 
1  | 请输入第一个整数:12  | 
使用+拼接任何数据与字符串时都需要先将任何数据转为字符串类型。
范例:改正以上错误(修改文件 int.py)
1  | num_a = int(input("请输入第一个整数:"))  | 
打印结果:
1  | 请输入第一个整数:12  | 
1  | 请输入第二个整数:13  | 
1  | 请输入第一个整数:12  | 
格式化输出
在使用+拼接字符串时总是得先将所有数据转为字符串实在是太麻烦。Python 沿用了传统的格式化输出标记和格式化输出辅助标记。
格式化输出标记
| 标记 | 描述 | 标记 | 描述 | 
|---|---|---|---|
| %c | 输出单个字符字符串 | %s | 输出字符串 | 
| %d | 输出整形 | %f | 输出浮点型,可设置精度 | 
| %e | 以科学计数法格式输出,使用小写字母 e | %E | 以科学计数法格式输出,使用大写字母 E | 
| %g | %f 和 %e 的简写 | %G | %f 和 %E 的简写 | 
| %u | 输出无符号整型 | %o | 输出无符号八进制数 | 
| %x | 输出无符号十六进制数 | %X | 输出无符号十六进制数(大写字母) | 
范例:格式化输出标记(新建文件 format1.py)
1  | age = 23  | 
打印结果:
1  | ql 今年 23 岁,我的个人博客地址:https://ql-isaac.github,io,我的 qq 号码(十六进制):0X31BD0667。  | 
格式化输出辅助标记
| 标记 | 描述 | 标记 | 描述 | 
|---|---|---|---|
| * | 定义宽度或小数点精度 | # | 在八进制数前面显示零(0),在十六进制数前面显示“0x”或“0X” | 
| - | 左对齐 | 0 | 显示位数不足时填充 0 | 
| + | 在正数前面显示加号 | m.n | m 设置显示总长度,n 设置小数位数 | 
| 空格 | 显示位数不足时填充空格 | ||
| (var) | 映射变量(字典参数) | 
范例:格式化输出辅助标记(一)(新建文件 format2.py)
1  | num_a = 192.121231311121231  | 
打印结果:
1  | 192.121231,98.230000  | 
范例:格式化输出辅助标记(二)(修改文件 format2.py)
1  | num_a = 192.121231311121231  | 
打印结果:
1  | 192.121231,98.230000  | 
函数 print()
默认情况下使用函数 print() 都会进行换行,如果不希望换行,可以使用“end“参数。
范例:使用“end“参数(新建文件 print.py)
1  | print("Python:Hello,world",end="!")  | 
打印结果:
1  | Python:Hello,world!Hello,ql!  | 
运算符
数学运算符
| 运算符 | 描述 | 范例 | 
|---|---|---|
| + | 加法计算 | 20 + 15 = 35 | 
| - | 减法计算 | 20 - 15 = 5 | 
| * | 乘法计算 | 20 * 15 = 300 | 
| / | 除法计算 | 20 / 15 = | 
| % | 取模计算 | 10 % 3 = 1 | 
| ** | 幂运算 | 10 ** 3 = 1000 | 
| // | 整除计算 | 10 // 3 = 3 | 
范例:数学运算符(一)(新建文件 arithmetic.py)
1  | result = (1 + 2) * (4 / 2)  | 
打印结果:
1  | 6.0  | 
范例:数学运算符(二)(修改文件 arithmetic.py)
1  | result = (1 + 2) * (4 // 2)  | 
打印结果:
1  | 6  | 
简化赋值运算符
| 运算符 | 范例 | 形如 | 
|---|---|---|
| += | a += b | a = a + b | 
| -= | a -= b | a = a - b | 
| *= | a *= b | a = a * b | 
| /= | a /= b | a = a / b | 
| %= | a %= b | a = a % b | 
| **= | a **= b | a = a ** b | 
| //= | a //= b | a = a // b | 
范例:字符串上使用乘法(新建文件 multiplication.py)
1  | message = "Hello,world!"  | 
打印结果:
1  | Hello,world!Hello,world!Hello,world!  | 
Python 中没有自增(++)和自减(--)运算符,因为 Python 中所有的变量都为对象,所有的数据类型都为引用数据类型,而自增(++)和自减(--)运算符是只适用于基本数据类型的。
关系运算符
| 运算符 | 描述 | 范例 | 
|---|---|---|
| == | 相等比较 | 1 == 1(True) | 
| != | 不等比较 | 1 != 1(False) | 
| > | 大于比较 | 10 > 5(True) | 
| < | 小于比较 | 10 < 20(True) | 
| >= | 大于等于比较 | 10 >= 10(True) | 
| <= | 小于等于比较 | 20 <= 20(True) | 
关系运算符除了能针对数值型数据进行比较之外,还能比较字符串,比较字符串实际上就是依次比较字符的编码。
范例:比较字符串(新建文件 string.py)
1  | print("ql" == "ql")  | 
打印结果:
1  | True  | 
如果想知道某单个字符字符串的编码,可使用 ord() 函数。
范例:查看某单个字符字符串的编码(新建文件 ord.py)
1  | print("小写的“l”的编码:%d,大写的“L”的编码:%d"%(ord("l"),ord("L")))  | 
打印结果:
1  | 小写的“l”的编码:108,大写的“L”的编码:76  | 
顺便说明一下数字和大小写字母的编码范围:
- 数字:”0“(48) ~ ”9“(57)
 - 大写字母:”A“(65) ~ ”Z“(90)
 - 小写字母:”a“(97) ~ “z”(122)
 
逻辑运算符
| 运算符 | 描述 | 
|---|---|
| and | 逻辑与 | 
| or | 逻辑或 | 
| not | 逻辑非 | 
位运算符
| 运算符 | 描述 | 
|---|---|
| & | 位与 | 
| | | 位或 | 
| ^ | 位异或 | 
| ~ | 位非 | 
| << | 左移运算符 | 
| >> | 右移运算符 | 
进制转换函数
| 函数 | 描述 | 
|---|---|
| bin(数据) | 转换为二进制数据 | 
| oct(数据) | 转换为八进制数据 | 
| int(数据) | 转换为十进制数据 | 
| hex(数据) | 转换为十六进制数据 | 
身份运算符
Python 中所有的数据类型都为引用数据类型,id() 函数可以获取相应的内存地址。
范例:id() 函数(新建文件 id.py)
1  | num_a = 2  | 
打印结果:
1  | num_a 变量的地址:1757145024  | 
Python 中相等比较运算符==类似于 Java 中的equals()。
范例:内容相等比较(新建文件 equals.py)
1  | num_a = 2 # 整形  | 
打印结果:
1  | 整形变量地址:1757145024,浮点型变量地址:11878208,两者内容是否相等:True  | 
那么 Java 中的==在 Python 中用什么运算符替代呢?答案是身份运算符。
| 运算符 | 描述 | 
|---|---|
| is | 判断是否引用同一内存 | 
| is not | 判断是否引用不同内存 | 
范例:内存地址相等比较(修改文件 equals.py)
1  | num_a = 2 # 整形  | 
打印结果:
1  | 整形变量地址:1757145024,浮点型变量地址:16400192,两者内容是否相等:False  | 
分支结构
针对分支结构的实现,Python 里有三个关键字:if、elif(Python 单独提供了该关键字,同 else if)和else,三种语法:
- if 判断
 
1  | if <布尔表达式>:  | 
- if…else 判断
 
1  | if <布尔表达式>:  | 
- 多条件判断
 
1  | if <布尔表达式>:  | 
不得不说说 Python 中的缩进,Python 根据缩进来判断代码行与前一个代码行的关系,类似于 C 和 Java 语言的大括号,PEP8 建议每级缩进都使用四个空格,这既可提高可读性,又留下了足够多的多级缩进空间。
范例:判断闰年(新建文件 leap_year.py)
1  | year = int(input("请输入一个年份:"))  | 
循环结构
循环结构指的就是某段代码重复地执行,在循环结构之中需要定义一个循环的条件,只有在满足循环条件时代码才执行,Python 中循环结构有两种:while 循环和 for 循环。
while 循环
1  | while <循环条件>:  | 
或
1  | while <循环条件>:  | 
范例:进行 1~100 的自然数的累加(新建文件 accumulation.py)
1  | sum = 0  | 
打印结果:
1  | 5050  | 
范例:打印 1000 以内的斐波那契数列(新建文件 fibonacci_sequence.py)
1  | num_a = 0  | 
for 循环
| for 循环 | for…else 循环 | 
|---|---|
| for <变量> in <序列> | 
<循环语句> | for <变量> in <序列>
<循环语句>
else:
<循环语句执行完毕后的语句> |
序列
Python 在设计的过程中强调的一直是简洁性。在许多的编程语言中,都是首先利用了数组去描述多数据的存储,但是数组有长度固定,插入麻烦等缺点,因而才有了许多数据结构来满足我们的各种需求,Python 则帮我们封装了数组和许多数据结构,相应着重提出了序列这一概念,将能动态修改的内容统一称为序列,在 Python 之中字符串、列表、元组、字典都属于序列。
列表
直接使用一对中括号定义列表,可使用索引访问列表元素,从 0 开始。
范例:定义列表(新建文件 list.py)
1  | infos = ["C/C++","Java","Python"]  | 
打印结果:
1  | C/C++、Java、Python  | 
特性
范例:空列表不等同于 None(新建文件 None.py)
1  | list_a = []  | 
打印结果:
1  | list_a的地址为 13626696,类型为 <class 'list'>  | 
范例:在进行索引访问时不能越界(修改文件 list.py)
1  | infos = ["C/C++","Java","Python"]  | 
打印结果:
1  | C/C++、Java、Python  | 
范例:列表除了可以正向索引访问之外,还可以反向索引访问(修改文件 list.py)
1  | infos = ["C/C++","Java","Python"]  | 
打印结果:
1  | C/C++、Java、Python  | 
范例:通过列表保存多种数据类型(新建文件 python.py)
1  | infos = ["Python","简洁",["列表元素 1","列表元素 2","列表元素 3"]] # 数据的意义:编程语言(Python),特点(简洁),举例(列表)  | 
打印结果:
1  | 编程语言:Python、特点:简洁、举例:['列表元素 1', '列表元素 2', '列表元素 3']  | 
范例:使用 for 循环迭代输出(修改文件 list.py)
1  | infos = ["C/C++","Java","Python"]  | 
打印结果:
1  | C/C++  | 
范例:使用 for 循环索引访问输出(修改文件 list.py)
1  | infos = ["C/C++","Java","Python"]  | 
打印结果:
1  | C/C++  | 
范例:根据索引修改数据内容(修改文件 list.py)
1  | infos = ["C/C++","Java","Python"]  | 
打印结果:
1  | C/C++、PHP、Python  | 
范例:使用乘法(新建文件 multiply.py)
1  | infos = ["C/C++","Java","Python"] * 3  | 
打印结果:
1  | ['C/C++', 'Java', 'Python', 'C/C++', 'Java', 'Python', 'C/C++', 'Java', 'Python']  | 
范例:使用加法(新建文件 add.py)
1  | infos = ["C/C++","Java","Python"] + ["PHP"]  | 
打印结果:
1  | ['C/C++', 'Java', 'Python', 'PHP']  | 
数据分片
列表的数据分片,即截取列表的一部分:
- 指定截取范围:
<列表>[<开始索引>:<结束索引>]; - 从指定索引一直截取到结尾:
<列表>[<开始索引>:]; - 从开头一直截取到指定索引:
<列表>[:<结束索引>]; - 设置截取步长:
<列表>[<开始索引>:<结束索引>:<步长>]。 
元组
序列统计函数
函数
函数深入
lambda 表达式
lambda 表达式即 lambda 函数,
主函数
callable()
callabl()
1  | print("input()是否可以调用:%s" % callable(input))  |