Python入门实战:理解Python的数据类型

74 阅读9分钟

1.背景介绍

Python简介

Python是一种高级编程语言,其设计哲学具有清晰、简单和易于阅读的特点。Python被誉为“胶水语言”,可以用它进行许多领域的开发,包括科学计算、Web开发、自动化运维等。它也被称为“Batteries Included”(内置电池)语言,内置了很多非常有用的库,可以让开发者方便地实现一些复杂的功能。

数据类型

Python数据类型指的是变量所存储或处理的数据的种类。在Python中,主要有以下五种基本数据类型:

  1. 整数(integer):整数又叫做整型,是一个不带小数的数字,如 1,2,3,-5,1000等。
  2. 浮点数(floating point number):浮点数就是带小数的数字,如 3.14,-9.01,7.0等。
  3. 字符串(string):字符串是由零个或多个字符组成的序列,如 "hello" , "world!" , "" 。
  4. 布尔值(boolean value):布尔值只有两个取值,True 和 False。
  5. 列表(list):列表是Python中的一个容器数据类型,可以容纳各种数据类型的值,其中可以包括其他列表或者元组。

除此之外,还有如下几种数据类型:

  1. 元组(tuple):元组是另一种有序列表形式,不能修改元素值,如 (1, 'a', True)。
  2. 字典(dictionary):字典是Python中的一种映射类型,字典中的每个键值对用冒号分隔,并通过索引来访问,字典的值可以是任意数据类型,如 {'name': 'Alice', 'age': 25} 。
  3. 集合(set):集合是Python中的无序不重复元素集,可用于快速查找某些特定元素。

除了上面提到的基础数据类型,Python还支持复合数据类型,即序列(sequence)、迭代器(iterator)、生成器(generator)等。

2.核心概念与联系

数字与运算符

数字类型

  1. 整数(int):整数类型表示不带小数点的正负整数,范围根据机器系统不同而定,一般可以达到上万亿。例如:num = -100
  2. 浮点数(float):浮点数类型表示带小数的数字,精度可变,一般占用8字节内存空间,但是Python内部采用二进制浮点数表示法,可以使用科学计数法表示非常大的数字。例如:num = 3.14num = -9.01e-3
  3. 复数(complex):复数类型用来表示带有虚部的数值,一般由实部和虚部构成,以j或J作为虚数单位。例如:c = 3 + 4j

运算符

  1. 算术运算符

    • + 加法运算符,将左右两边的值相加。
    • - 减法运算符,用于从第一个值中减去第二个值。
    • * 乘法运算符,用于计算两个数的乘积。
    • / 除法运算符,返回商和余数。
    • % 求模运算符,求两个数的余数。
    • ** 幂运算符,用于计算某个数的乘方。
  2. 比较运算符

    • == 检查两个对象是否相等。
    • != 检查两个对象是否不相等。
    • < 小于比较运算符。
    • > 大于比较运算符。
    • <= 小于等于比较运算符。
    • >= 大于等于比较运算符。
  3. 赋值运算符

    • = 简单的赋值运算符。
    • += 增量赋值运算符,先将左侧变量的值加上右侧值再赋值给左侧变量。
    • -= 减量赋值运算符,先将左侧变量的值减去右侧值再赋值给左侧变量。
    • *= 乘性赋值运算符,将左侧变量乘以右侧值并赋值给左侧变量。
    • /= 除性赋值运算符,先将左侧变量的值除以右侧值再赋值给左侧变量。
  4. 逻辑运算符

    • and 逻辑与运算符。
    • or 逻辑或运算符。
    • not 逻辑非运算符。

字符串

字符串是一种不可更改的序列数据类型,表示一串文本信息。字符串可以用单引号 ' 或双引号 " 括起来的一系列字符。字符串的截取可以使用方括号 [ ] 来指定需要获取的字符的位置。

s1 = "Hello World"   # 使用双引号括起的字符串
s2 = 'Python is fun' # 使用单引号括起的字符串
print(len(s1))       # 获取字符串长度
print(s1[0])         # 通过索引获取字符串中的第1个字符
print(s1[-1])        # 通过负索引获取字符串中的最后一个字符
print(s1[:5])        # 从开头截取前5个字符
print(s1[6:])        # 从第6个字符开始截取所有字符
print(s1[:-1])       # 从开头截取到倒数第2个字符

字符串也可以用加法运算符 + 将两个字符串连接起来。

s3 = s1 + s2    # 连接字符串
print(s3)

如果字符串中存在特殊字符,可以在字符串前面添加反斜杠 \ 以转义特殊字符。

s4 = "\tThis is a tab.\n\nNext line." # 包含特殊字符的字符串
print(s4)

输出结果:

This is a tab.

Next line.

列表

列表是一种可变序列数据类型,可以容纳任何类型的元素。列表用方括号 [] 来表示,元素之间用逗号 , 分割。列表的索引从0开始,可以通过索引来访问列表中的元素。

my_list = [1, 2, 3]          # 创建包含三个整数的列表
print(type(my_list))         # 查看列表的数据类型
print(my_list[1])            # 通过索引获取列表中的第二个元素
print(len(my_list))          # 获取列表的长度

列表也支持切片操作,即选择列表的一段连续元素。

print(my_list[1:3])           # 获取列表中第二到第三个元素组成的子列表
print(my_list[:2])            # 获取列表中前两个元素组成的子列表
print(my_list[::2])           # 获取列表中偶数索引的元素组成的子列表

列表还可以进行拼接操作,即合并两个或多个列表。

my_list += [4, 5]             # 在末尾追加两个元素
new_list = my_list + [6, 7]   # 合并两个列表

列表中的元素也可以是不同的数据类型。

my_list.append('a')     # 添加一个字符串元素
my_list.insert(2, 0.5)  # 插入一个浮点数元素

列表元素的删除、修改和遍历都很容易。

del my_list[1]                # 删除索引值为1的元素
my_list.remove(2)              # 根据值删除元素,如果有多个相同值的元素,只会删除第一次出现的元素
my_list[1] = 'b'               # 修改索引值为1的元素值为'b'
for item in my_list:           # 遍历列表中的所有元素
    print(item)

元组

元组也是一种不可变序列数据类型,与列表类似,只是元组的元素不能修改。元组用圆括号 () 来表示,元素之间用逗号 , 分割。

my_tuple = ('apple', 123, True)      # 创建元组
print(type(my_tuple))                 # 查看元组的数据类型
print(my_tuple[0], my_tuple[1])       # 访问元组中的元素
print(len(my_tuple))                  # 获取元组的长度

元组也可以转换为列表。

my_list = list(my_tuple)             # 转换为列表
print(my_list)                        # 打印列表

字典

字典是一种映射数据类型,它将键-值对组成,键必须是唯一的。字典用花括号 {} 来表示,键-值对之间用冒号 : 分割,键与值之间用逗号 , 分割。

my_dict = {'name': 'Alice', 'age': 25, 'city': 'Beijing'}   # 创建字典
print(type(my_dict))                                       # 查看字典的数据类型
print(my_dict['name'], my_dict['age'])                      # 访问字典中的元素
print(len(my_dict))                                        # 获取字典的长度

字典的键可以是任何不可变类型,但值只能是不可变类型,也就是说值可以是字符串、数字、元组等不可变类型,但不能是列表、字典、集合这样的可变类型。

字典可以用键来访问值,也可以用值来搜索键。

value = my_dict['name']                                  # 通过键访问值
key = 'age'                                              # 指定要搜索的键
if key in my_dict:                                       # 如果键在字典中,则输出对应的值
    print(my_dict[key])                                 
else:                                                     # 如果键不在字典中,则输出错误消息
    print("Key not found.")                             

字典的添加、删除、修改操作都很容易。

my_dict['gender'] = 'Female'                             # 添加新键值对
del my_dict['city']                                      # 删除键值对
my_dict['age'] = 26                                      # 修改已有键值对

字典的遍历方式也很简单。

for key in my_dict:                                      # 遍历字典的所有键
    print(key, ':', my_dict[key])                       # 输出每个键及其对应的值

集合

集合是一种无序且无重复元素集,可以快速判断元素是否存在或计算交集、并集、差集等。集合用尖括号 < > 来表示,元素之间用逗号 , 分割。

my_set = {1, 2, 3, 4, 4, 3, 2, 1}                     # 创建集合
print(type(my_set))                                    # 查看集合的数据类型
print(len(my_set))                                     # 获取集合的长度

集合只能包含不可变类型,所以集合中不允许出现列表、字典、集合这些可变类型。集合可以进行交集、并集、差集等运算。

other_set = {3, 4, 5, 6}                               # 创建另一个集合
intersection = my_set & other_set                      # 交集运算
union = my_set | other_set                             # 并集运算
difference = my_set - other_set                        # 差集运算
symmetric_difference = my_set ^ other_set              # 对称差运算
print(intersection)                                    # 输出交集元素
print(union)                                           # 输出并集元素
print(difference)                                      # 输出差集元素
print(symmetric_difference)                            # 输出对称差元素

3.核心算法原理和具体操作步骤以及数学模型公式详细讲解

四则运算

四则运算包括加法、减法、乘法和除法。四则运算的优先级和结合律依据运算符的顺序确定。

a = 1 + 2 * 3 / 4                                # 计算表达式的值
result = 2 ** 3 % 4 + (-2 // 3)                   # 计算表达式的值

条件语句

条件语句包括 if、elif、else 和 while 结构,if 语句用于执行满足一定条件的代码块;elif 用于指定一个备选的条件,当第一个条件不满足时执行这个备选条件;else 可用于当所有的条件都不满足时的默认执行代码块。while 循环用于重复执行指定的代码块直到条件满足。

x = int(input())                                   # 用户输入一个整数
y = x % 2                                          # 判断奇偶性
if y == 0:                                         # 若x是偶数
    print("{} is even.".format(x))                  # 输出提示信息
elif y!= 0 and x >= 0:                            # 若x是正奇数
    print("{} is positive odd integer.".format(x))  
else:                                               # 若x不是偶数也不是正奇数
    print("{} is negative odd integer.".format(x))  

count = 0                                          # 初始化计数器
sum = 0                                            # 初始化求和变量
while count < 10:                                  # 只需10次循环即可完成求和
    sum += count                                   # 每次循环累加当前计数值
    count += 1                                     # 迭代计数值
print("The sum of the first {} integers is {}".format(count, sum))  # 输出结果

函数

函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码块。函数通常拥有一个名称,该名称标识了它的功能,参数,返回值等属性。函数可以被定义一次,然后在不同的地方调用,使得程序更加模块化、可维护。

def calculate():                                    # 定义函数
    num1 = float(input("Enter the first number: "))  # 接收用户输入第一个数字
    operator = input("Enter an operator (+,-,* or /): ")   # 接收用户输入运算符
    num2 = float(input("Enter the second number: ")) # 接收用户输入第二个数字
    
    if operator == '+':
        return num1 + num2                          # 返回计算结果
    elif operator == '-':
        return num1 - num2                         # 返回计算结果
    elif operator == '*':
        return num1 * num2                         # 返回计算结果
    else:
        if num2 == 0:
            raise ValueError("Cannot divide by zero!")  # 当除数为零时,触发异常
        else:
            return num1 / num2                    # 返回计算结果
    
try:                                                  # 使用try-except捕获异常
    result = calculate()                              # 调用calculate()函数
    print("Result:", result)                           # 输出结果
except Exception as e:                               # 捕获所有异常
    print("An error occurred:", str(e))               # 输出错误信息

列表解析

列表解析是一种简洁有效的方法来创建列表。列表解析的语法是在方括号 [] 后面的一系列表达式,这些表达式会被计算出来并作为列表元素加入新的列表中。

numbers = [i for i in range(1, 11)]          # 用range函数生成1到10之间的数字列表
squares = [(i**2) for i in numbers]         # 生成 squares 列表,其中每项为对应的数字平方值
pairs = [(i, j) for i in range(1, 4) for j in range(1, 3)]     # 生成 pairs 列表,其中每项为对应数字的笛卡尔积
matrix = [[1, 2, 3], [4, 5, 6]]              # 生成 matrix 列表
transposed = [[row[i] for row in matrix] for i in range(3)]   # 矩阵转置

生成器表达式

生成器表达式是列表解析的一种简化版本。生成器表达式不会立刻创建一个完整的列表,而是按需生成列表元素。生成器表达式的语法是 () 的后面跟着一系列表达式,这些表达式会被逐个计算并返回一个生成器对象。

numbers = (i for i in range(1, 11))             # 用range函数生成1到10之间的数字生成器
squares = (i**2 for i in numbers)               # 生成 squares 生成器,其中每项为对应的数字平方值
pairs = ((i, j) for i in range(1, 4) for j in range(1, 3))    # 生成 pairs 生成器,其中每项为对应数字的笛卡尔积
matrix = ((1, 2, 3), (4, 5, 6))                  # 生成 matrix 元组
transposed = ([row[i] for row in matrix] for i in range(3))  # 矩阵转置生成器

4.具体代码实例和详细解释说明

时间戳转换为日期

import time

timestamp = 1621368123      # 假设的时间戳

datestr = time.strftime("%Y-%m-%d", time.localtime(timestamp))   # 将时间戳转换为日期格式字符串

print(datestr)  # 输出日期格式字符串 2021-05-18

随机生成验证码

import random
import string

length = 6  # 设置验证码长度

captcha_chars = string.ascii_uppercase + string.digits  # 设置验证码字符集

captcha_text = ''.join(random.choice(captcha_chars) for _ in range(length))   # 随机选取length个字符组合生成验证码

print(captcha_text)  # 输出验证码

"""
例子运行结果示例:
7EJXUW
"""

字符串中找出最长回文子串

def longest_palindrome(s):
    n = len(s)
    dp = [[False]*n for _ in range(n)]   # 建立一个二维数组dp,用于记录子串s[i:j+1]是否为回文串
    max_len = 1                          # 默认最大回文串长度为1
    start = end = 0                      # 默认最长回文串开始位置为0
    for length in range(2, n+1):        # 枚举子串长度,从2到n
        for i in range(n-length+1):     # 枚举子串起始位置
            j = i + length - 1          # 枚举子串结束位置
            if s[i] == s[j] and (j-i <= 2 or dp[i+1][j-1]):  # 判断子串是否为回文
                dp[i][j] = True          # 更新dp状态
                if length > max_len:    # 记录最长回文串
                    max_len = length
                    start = i
                    end = j
    return s[start:end+1]                # 返回最长回文子串

s = "babad"
print(longest_palindrome(s))             # bab 或 aba

s = "cbbd"
print(longest_palindrome(s))             # bb