Python数据结构与算法(1.2)——Python基础之变量与内置数据类型

Posted 盼小辉丶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python数据结构与算法(1.2)——Python基础之变量与内置数据类型相关的知识,希望对你有一定的参考价值。

0. 学习目标

Python 是简洁、易学、面向对象的编程语言。它不仅拥有强大的原生数据类型,也提供了简单易用的控制语句。本节的主要目标是介绍 Python 基础知识,并为接下来的学习奠定基础,本文并非详尽的 Python 教程,但会完整的介绍学习数据结构和算法所需的 Python 基础知识及基本思想,并给出相应的实战示例及解释。
通过本节学习,应掌握以下内容:

  • 掌握 python 编程基础
  • 掌握 Python 的原生数据类型

1. Python 程序的运行

1.1 Python 交互式解释器

由于 Python 是一门解释型语言,因此对于简单示例只需要通过交互式会话就能进行学习。通过命令行启动 Python 后,可以看到 Python 解释器提示符为 >>>

运行提供的 Python 语句将会返回相应结果。例如, 在命令提示符后使用 print 函数:

>>> print("Data Structures and Algorithms in Python") 
>>> Data Structures and Algorithms in Python

1.2 Python 程序脚本

但是,我们不能所有程序都在 Python 交互式解释器中一行一行的执行,因此我们需要编写程序文件,例如在文件 test_running.py 文件中写入以下语句:

print("Data Structures and Algorithms in Python") 

使用 python 命令执行该脚本文件:

python test_running.py

脚本的运行输出结果如下:

Data Structures and Algorithms in Python

除此之外,我们也可以通过诸如 PyChramVSCode 等编辑器运行调试编写完成的 Python 程序。

2. 变量与赋值

变量的名字在编程语言中也称标识符,Python 中的标识符以字母或者下划线(_)开头,并且区分大小写( VARvar 表示不同变量)。虽然并非必须,但是为了使代码易于理解和阅读,应当使标识符能够表达变量的含义。
当标识符第一次出现在赋值 (assignment) 语句(变量名=值)的左侧时,会创建对应的 Python 变量。赋值语句将变量名与值关联起来。Python 会为这个值分配内存空间,然后让这个变量指向这个值,变量存储指向数据的引用,而不是数据本身。当改变变量的值时,Python 会为这个新的值分配另一个内存空间,然后让这个变量指向这个新值。

>>> var = 12.345
>>> var
12.345
>>> var = var + 2
>>> var
14.345
>>> var = False
>>> var
False

赋值语句 var = 12.345 用于创建变量 var,并且令 var 保存指向数据对象 12.345 的引用。Python 会先计算赋值运算符右边的表达式,然后将指向结果数据对象的引用赋给左边的变量名。如果数据的类型发生改变,例如将布尔值 False 赋值给 var,则变量 var 的类型也会变成布尔类型。这体现了 Python 的动态特性,即赋值语句可以改变变量的引用,同样的变量可以指向不同类型的数据。

3. 数据

由于 Python 是面向对象编程的编程语言,因此,在 Python编程语言中,数据同样是对象,而对象是类的实例。类是对数据的构成以及数据所能进行操作的描述,这与抽象数据类型十分类似。

3.1 原子数据类型

Python 提供 intfloat 类来实现整数类型和浮点数类型,并包含标准数学运算符(可以通过括号改变运算优先级),如下所示:

运算名运算符解释
+加法运算符
-减法运算符
*乘法运算符
/除法运算符,结果为浮点数
**幂运算符
求余%求余(取模)运算符
整除//整除运算符,与 / 不同,// 会截去小数部分,只返回商的整数部分

下面给出整数类型、浮点数类型及运算符的使用示例:

>>> 10 - 5 * 5
-15
>>> (10 - 5) * 5
25
>>> 12.5 * 3.3
41.25
>>> 12 / 2
6.0
>>> 13 / 2
6.5
>>> 13 // 2
6
>>> 3 ** 3
27
>>> 13 % 2
1

Python 通过 bool 类实现布尔数据类型,其可能的状态值包括 TrueFalse,布尔运算符有 andor 以及 not,同时布尔对象也可以用于相等 (==)、大于 (>) 等比较运算符的计算结果:

运算名运算符解释
大于>大于运算符
大于等于>=大于等于运算符
小于<小于运算符
小于等于<=小于等于运算符
相等==相等运算符,判断两个操作数是否相等,如果相等返回 True
不相等!=不相等运算符,判断两个操作数是否不相等,如果不相等返回 True
逻辑与and两个操作数都为 True 时返回 True
逻辑或or任意一个操作数为 True 时返回 True
逻辑非not对操作数取反,False 变为 True,True 变为 False

下面给出布尔类型及运算符的使用示例:

>>> True
True
>>> False or True
True
>>> not (True and False)
True
>>> 11 != 111
True
>>> 1024 <= 1024
True
>>> (1024 >=1000) and (1024 <= 1000)
False

3.2 结构数据类型

除了上述原子数据类型外,Python 还包含许多原生的结构数据类型:1) 有序结构数据类型——列表、字符串以及元;2) 无序结构数据类型——集和与字典。
需要注意的是这里的有序是指在插入的时候,保持插入的顺序性:

>>> # 保持插入的顺序性
>>> list([1,2,3,7,5])
[1, 2, 3, 7, 5]
>>> # 未保持插入的顺序性
>>> set([1,2,3,7,5])
1, 2, 3, 5, 7

3.2.1 通用的序列运算

有序数据结构也可以称为序列。序列在处理系列值时非常有用,例如我们有一个购物清单,如果使用列表来表示(所有元素都放在方括号内,元素间用逗号分隔),形式如下:

>>> shopping = ['cabbage', 'apple', 'beef']

序列可以包含其他序列,例如上示列表中,每个元素就由字符串序列组成,同时列表中也可以包含列表:

>>> shopping = [['cabbage', 2], ['apple', 5], ['beef',50]]

序列支持一系列 Python 运算,如下所示:

运算名运算符解释
索引[]获取序列中的某一元素
切片[:]获取序列中的指定部分元素
连接+将序列进行连接
重复*重复序列N次
成员in查询序列中是否含有某一元素
成员not in查询序列中是否不包含某一元素
长度len查询序列的元素个数

🔍 索引
序列中的所有的每个元素都有其索引 (indexing),索引是从 0 开始递增的,利用索引就可以访问序列中的每个元素了:

>>> shopping = ['cabbage', 'apple', 'beef']
>>> shopping[0]
'cabbage'

Python 中也可以使用负数索引,用于从右向左进行编号,即 -1 是序列最后一个元素的位置,这在我们仅需取序列末尾元素时非常有用:

>>> shopping[-2]
'apple'

序列也可以直接进行索引操作,而无需首先将其赋值给变量:

>>> ['cabbage', 'apple', 'beef'][-1]
'beef'

同样如果函数的返回结果为一个序列,我们也可以直接对其进行索引操作 (关于 input 函数将在 4.1 节详细描述):

>>> example = input('Please enter your name: ')[1]
Please enter your name: alice
>>> example
'l'

🔍 切片
索引的作用是用来访问单个元素,而切片 (slicing) 则可以用于访问序列中指定范围内的元素,切片使用两个冒号分隔的两个索引:

>>> number = [1, 2, 3, 4, 5]
>>> number[1:4]
[2, 3, 4]
>>> number[1:-1]
[2, 3, 4]

从以上示例可以看出,第一个索引指向的元素包含在切片内,第二个索引指向的元素不在切片内。
使用切片语法时,如果省略第二个索引,则切片会取到序列末尾;如果省略第一个索引,则切片会从序列开头开始取;如果两个索引都省略,则会取整个序列:

>>> url = 'https://www.python.org'
>>> sever = url[12:-4]
>>> sever
'python'
>>> domain = url[12:]
>>> domain
'python.org'
>>> protocol = url[:5]
>>> protocol
'https'
>>> copy_url = url[:]
>>> copy_url
'https://www.python.org'

除此之外,切片运算还支持使用步长,即从起点和终点之间每隔若个元素提取一个元素,默认情况下,步长为 1,若步长为负数,即从终点到起点提取元素:

>>> numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>>> numbers[0:10:1]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> numbers[0:10:2]
[0, 2, 4, 6, 8]
>>> numbers[0:6:3]
[0, 3]
>>> numbers[::3]
[0, 3, 6, 9]
>>> numbers[10::-1]
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
>>> numbers[10::-2]
[9, 7, 5, 3, 1]

🔍 连接
可使用加法运算符将多个序列连接为一个,但需要注意的是,不同类型的序列不能进行连接:

>>> ['a', 'b', 'c'] + ['d', 'e'] + ['f']
['a', 'b', 'c', 'd', 'e', 'f']
>>> 'Hello ' + 'world!'
'Hello world!'
>>> 'Hello' + ['a', 'b', 'c']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can only concatenate str (not "list") to str

🔍 重复
可使用乘法运算符将一个序列重复多次来创建一个新序列:

>>> 'love you!' * 3
'love you!love you!love you!'
>>> [1,2] * 5
[1, 2, 1, 2, 1, 2, 1, 2, 1, 2]
>>> [None] * 5
[None, None, None, None, None]

🔍 成员
使用运算符 innot in 可以检查特定值是否包含或不包含在序列中,并返回指示是否满足的布尔值:满足时返回 True, 不满足时返回 False

>>> names = ['root', 'xiaohui', 'xiaohuihui']
>>> 'root' in names
True
>>> 'hui' in names
False
>>> 'hui' not in names
True

🔍 长度
内置函数len返回序列包含的元素个数:

>>> names = ['root', 'xiaohui', 'xiaohuihui']
>>> len(names)
3

3.2.2 列表

除了可以应用通用的序列操作外,列表有很多特有的方法:

方法名用法解释
indexlistA.index(item)返回 item 在列表中首次出现的下标
countlistA.count(item)返回 item 在列表中出现的次数
appendlistA.append(item)在列表末尾添加新元素 item
extendlistA.extend(listB)将列表 listB 附加到列表 listA 末尾
insertlistA.insert(i, item)在列表的第 i 个位置插入元素 item
poplistA.pop(i)删除并返回列表中第 i 个位置的元素,如果不指定参数 i,则删除并返回列表中最后一个元素
removelistA.remove(item)移除在列表中首次出现的 item
sortlistA.sort()将列表元素排序
reverselistA.reverse()将列表元素按相反的顺序排列
deldel listA[i]删除列表中第 i 个位置的元素
clearlistA.clear()清空列表 listA 的内容
copylistA.copy()复制列表 listA

1 基本列表操作
接下来将介绍用于创建、修改列表的方法。
🔍 list 函数
使用函数 list 可以将创建空列表或将任何序列转换为列表:

>>> empty_list = list()
>>> []
>>> string_test = list('Python')
>>> string_test
['P', 'y', 't', 'h', 'o', 'n']

range 是一个常见的 Python 函数,它常与列表一起讨论。使用 range 可以生成值序列的范围对象,然后利用 list 函数,能够以列表形式看到范围对象的值,同时也和切片语法类似,其支持使用步长参数:

>>> list(range(10))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> list(range(1, 10))
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> list(range(1, 10, 2))
[1, 3, 5, 7, 9]

🔍 修改列表元素
修改列表只需结合索引使用普通赋值语句即可,使用索引表示法可以修改特定位置的元素:

>>> numbers[0] = 11
>>> numbers
[11, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>>

使用切片语法可以同时给多个元素赋值,通过使用切片赋值,可将切片替换为长度与其不同的序列,或者插入、删除元素:

>>> fruits = ['apple', 'orange', 'banana', 'pear', 'strawberry']
>>> fruits[2:] = ['lemon', 'watermelon']
>>> fruits
['apple', 'orange', 'lemon', 'watermelon']
>>> fruits[1:1] = ['grape']
>>> fruits
['apple', 'grape', 'orange', 'lemon', 'watermelon']
>>> fruits[1:3] = []
>>> fruits
['apple', 'lemon', 'watermelon']

🔍 删除元素
从列表中删除元素可以使用 del 语句:

>>> fruits = ['apple', 'orange', 'banana', 'pear', 'strawberry']
>>> del fruits[0]
>>> fruits
['orange', 'banana', 'pear', 'strawberry']
>>> del fruits[1:3]
>>> fruits
['orange', 'strawberry']

2 列表方法
方法是与对象紧密联系的函数,方法调用与函数类似,需要在方法名前加上了对象和句点:

object.method(arg)

🔍 index 方法
index 方法在列表中查找指定值第一次出现的索引:

>>> fruits = ['apple', 'orange', 'banana', 'pear', 'strawberry']
>>> fruits.index('orange')
1
>>> fruits.index('lemon')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: 'lemon' is not in list

查找单词“orange”时,返回其索引 4,但是当搜索列表中不存在的单词“lemon”时,会引发异常。
🔍 count 方法
count 方法用于统计指定元素在列表中的数量:

>>> fruits = ['apple', 'orange', 'banana', 'apple', 'orange', ['apple']]
>>> fruits.count('apple')
2
>>> fruits.count(['apple'])
1

🔍 append 方法
append 方法用于将一个对象添加到列表末尾:

>>> fruits = ['apple', 'orange', 'banana', 'pear', 'strawberry']
>>> fruits.append('lemon')
>>> fruits
['apple', 'orange', 'banana', 'pear', 'strawberry', 'lemon']

需要注意的是,与其他修改列表的方式类似,append 方法也是原地操作的,它不会返回修改后的新列表,而是直接在旧列表上进行修改。
🔍 extend 元素
extend 方法可以在一个列表末尾添加另一个列表,可使用一个列表来扩展原列表:

>>> fruits_1 = ['apple', 'orange']
>>> fruits_2 = ['banana', 'pear']
>>> fruits_1.extend(fruits_2)
>>> fruits_1
['apple', 'orange', 'banana', 'pear']

与拼接运算符 + 不同的是,extend 方法是原地执行的,而 + 会返回得到的新列表,并非原地执行:

>>> fruits_1 = ['apple', 'orange']
>>> fruits_2 = ['banana', 'pear']
>>> fruits = fruits_1 + fruits_2
>>> fruits
['apple', 'orange'以上是关于Python数据结构与算法(1.2)——Python基础之变量与内置数据类型的主要内容,如果未能解决你的问题,请参考以下文章

Python数据结构与算法(1.7)——算法分析

Python数据结构与算法(1.7)——算法分析

Python数据结构与算法(3.3)——队列

Python数据结构与算法(3.1)——栈

Python数据结构与算法(4.1)——递归

Pytho怎样自学?