1.背景介绍
Python简介
Python是一种高级编程语言,其设计哲学具有清晰、简单和易于阅读的特点。Python被誉为“胶水语言”,可以用它进行许多领域的开发,包括科学计算、Web开发、自动化运维等。它也被称为“Batteries Included”(内置电池)语言,内置了很多非常有用的库,可以让开发者方便地实现一些复杂的功能。
数据类型
Python数据类型指的是变量所存储或处理的数据的种类。在Python中,主要有以下五种基本数据类型:
- 整数(integer):整数又叫做整型,是一个不带小数的数字,如 1,2,3,-5,1000等。
- 浮点数(floating point number):浮点数就是带小数的数字,如 3.14,-9.01,7.0等。
- 字符串(string):字符串是由零个或多个字符组成的序列,如 "hello" , "world!" , "" 。
- 布尔值(boolean value):布尔值只有两个取值,True 和 False。
- 列表(list):列表是Python中的一个容器数据类型,可以容纳各种数据类型的值,其中可以包括其他列表或者元组。
除此之外,还有如下几种数据类型:
- 元组(tuple):元组是另一种有序列表形式,不能修改元素值,如 (1, 'a', True)。
- 字典(dictionary):字典是Python中的一种映射类型,字典中的每个键值对用冒号分隔,并通过索引来访问,字典的值可以是任意数据类型,如 {'name': 'Alice', 'age': 25} 。
- 集合(set):集合是Python中的无序不重复元素集,可用于快速查找某些特定元素。
除了上面提到的基础数据类型,Python还支持复合数据类型,即序列(sequence)、迭代器(iterator)、生成器(generator)等。
2.核心概念与联系
数字与运算符
数字类型
- 整数(int):整数类型表示不带小数点的正负整数,范围根据机器系统不同而定,一般可以达到上万亿。例如:
num = -100。 - 浮点数(float):浮点数类型表示带小数的数字,精度可变,一般占用8字节内存空间,但是Python内部采用二进制浮点数表示法,可以使用科学计数法表示非常大的数字。例如:
num = 3.14,num = -9.01e-3。 - 复数(complex):复数类型用来表示带有虚部的数值,一般由实部和虚部构成,以j或J作为虚数单位。例如:
c = 3 + 4j。
运算符
-
算术运算符
+加法运算符,将左右两边的值相加。-减法运算符,用于从第一个值中减去第二个值。*乘法运算符,用于计算两个数的乘积。/除法运算符,返回商和余数。%求模运算符,求两个数的余数。**幂运算符,用于计算某个数的乘方。
-
比较运算符
==检查两个对象是否相等。!=检查两个对象是否不相等。<小于比较运算符。>大于比较运算符。<=小于等于比较运算符。>=大于等于比较运算符。
-
赋值运算符
=简单的赋值运算符。+=增量赋值运算符,先将左侧变量的值加上右侧值再赋值给左侧变量。-=减量赋值运算符,先将左侧变量的值减去右侧值再赋值给左侧变量。*=乘性赋值运算符,将左侧变量乘以右侧值并赋值给左侧变量。/=除性赋值运算符,先将左侧变量的值除以右侧值再赋值给左侧变量。
-
逻辑运算符
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