Python期末复习
Round四舍五入
在Python中,round() 是一个内置函数,用于对浮动数字进行四舍五入。它可以根据指定的小数位数来调整数字。下面是 round() 函数的基本用法和一些详细解释。
基本语法
round(number, ndigits)
- number:要四舍五入的数字。
- ndigits:指定要保留的小数位数(默认为0)。
使用示例
- 不指定小数位 数(四舍五入到最接近的整数)
print(round(3.14159)) # 输出 3
print(round(2.71828)) # 输出 3
- 指定保留的小数位数
print(round(3.14159, 2)) # 输出 3.14
print(round(2.71828, 3)) # 输出 2.718
- 负数的小数位数(四舍五入到指定的十位、百位等)
如果 ndigits 为负数,那么就会对数字的小数点左侧的数字进行四舍五入。
print(round(12345, -1)) # 输出 12340,四舍五入到十位
print(round(12345, -2)) # 输出 12300,四舍五入到百位
特殊情况
- 四舍五入的规则:在Python中,
round()使用的是银行家舍入法(round half to even),即在四舍五入时,如果数字刚好在两个整数的中间,Python会将它四舍五入到最接近的偶数。这样可以减少在大量运算时的累积误差。
print(round(0.5)) # 输出 0(四舍五入到最近的偶数)
print(round(1.5)) # 输出 2(四舍五入到最近的偶数)
小结
round()函数可以四舍五入浮动数字到指定的小数位数。- 默认情况下,它四舍五入到整数(
ndigits=0)。 - 可以通过传递负数的
ndigits来指定四舍五入到小数点左侧。 - 使用银行家舍入法时,数字恰好为中间值时,Python会选择最接近的偶数。
这种用法在处理财务或科学计算时特别有用,可以避免因单次计算中的四舍五入而导致的累计误差。
round(x,6)和.6f 两种四舍五入的区别
主要区别在于 输出格式(有没有固定显示 6 位小数)以及 Python 对浮点数的默认打印行为:
| 方式 | 四舍五入精度 | 输出时是否保留多余的"0" | 例子(假设 s=2.5) |
|---|---|---|---|
s = round(s,6)``print(f"{s}") | 6 位 | 否 | 2.5 |
print(f"{s:.6f}") | 6 位 | 是 | 2.500000 |
细节说明
round(s,6)只是对浮点数做了"数学上"四舍五入到 6 位- 它返回一个
float,值在数学上已经精确到 6 位小数。 - 但 Python 打印一个
float(即str(s))时,会采用"最简洁"表示,不会额外补 "0"。
- 它返回一个
f"{s:.6f}"是格式控制- 它在内部也会 做四舍五入(与
round用同样的"银行家舍入"原则), - 然后保证输出时总共 6 位小数,不足的用"0"补齐。
- 它在内部也会 做四舍五入(与
举例
s = 1.2345
# 你的写法
s = round(s, 6)
print(f"{s}") # 输出: 1.2345
# 我的写法
print(f"{s:.6f}") # 输出: 1.234500
当希望结果严格显示 6 位小数(包括末尾的 0)时,就要用 :.6f;如果只是想数学上保留 6 位精度,但不介意少几个 0,就可以用 round(s,6) 然后默认打印。
格式化字符串
在 Python 中,% 操作符就是所谓的"旧式"字符串格式化(也叫 printf 风格格式化),它的基本思路是:
"格式字符串" % 值或元组或字典
——其中,格式字符串里用一系列 % 开头的格式说明符来表示要插入的变量占位,后面的值会依次(或按名字)填入这些占位符。下面分步讲解它的用法。
1. 基本语法
print("Hello, %s! You have %d messages." % ("Alice", 5))
%s:字符串占位符%d:十进制整数占位符
占位符的顺序要和后面提供的值一致。如果只有一个值,也可以不写元组,直接写单个值:
name = "Bob"
print("Hi, %s!" % name)
2. 常见格式说明符
| 占位符 | 类型 | 说明 |
|---|---|---|
%s | 字符串 | 会把任意对象先用 str() 转为字符串再插入 |
%r | 原始字符串 | 会把任意对象用 repr() 转为带引号的形式插入 |
%d | 十进制整数 | 用于整数 |
%f | 浮点数 | 默认保留 6 位小数 |
%.nf | 浮点数 | 保留 n 位小数,比如 %.1f 保留 1 位小数 |
%x/%X | 十六进制整数 | 小写/大写字母表示 |
%% | 百分号 | 输出一个 % 本身 |
3. 精度与宽度控制
格式说明符可以更进一步指定"宽度"和"对齐":
%[映射键][标志][宽度][.精度]类型
- 宽度(width):指定该字段至少占多少字符,不够则默认左填空格
- 精度(.precision):
- 对浮点数,精度指小数点后保留几位
- 对字符串,精度指最大取多少个字符
- 标志(flags):
-:左对齐+:正数前显示+号0:数字左边补0(在指定宽度时)
num = 3.14159
print("默认:%f" % num) # 默认 6 位小数
print("两位:%.2f" % num) # 小数点后 2 位
print("宽度8:%8.2f" % num) # 总宽度 8(含小数点和小数位),右对齐
print("宽度8左对齐:%-8.2f" % num)
print("补0:%08.2f" % num)
4. 元组与字典格式化
-
元组:按位置依次填充
a, b = 10, 20
print("a=%d, b=%d" % (a, b)) -
字典:用
%(key)s、%(key)d等方式,通过键名填充data = {"name": "小明", "score": 95}
print("学生:%(name)s,分数:%(score)d" % data)
5. 结合你给出的例子
print("BMI=%.1f, 您的体重%s!" % (bmi, weight))
%.1f:表示将bmi(假设是浮点数)格式化为保留 1 位小数%s:将weight(任意类型)转为字符串插入- 注意:这里用的是一个元组
(bmi, weight)来传递两个值
如果想让输出更整齐,还可以加宽度、对齐、符号等:
print("BMI=%+6.1f, 您的体重:%5skg" % (bmi, weight))
6. 小结与进阶
- 优点:简单直观、借鉴 C 语言的 printf
- 缺点:当变量较多、嵌套复杂时可读性差
- 更现代的替代:
.format()方法:"BMI={:.1f}, 体重{}kg".format(bmi, weight)- f-string(Python 3.6+):
f"BMI={bmi:.1f}, 体重{weight}kg"
f-string 不仅语法更简洁,还能直接在花括号里写表达式,更加灵活。
掌握了这些,要点就在于记住常用的格式说明符和可选的宽度/精度/对齐标志,多练习几次,你就能很熟练地用 % 来格式化输出了。
str.join()
在 Python 中,str.join() 是将一个可迭代对象中的多个字符串用指定分隔符连接成一个新字符串的高效方法。下面从基础到进阶、从注意事项到最佳实践,给你一个全方位的讲解。
1. 基本语法
separator.join(iterable)
separator:用来分隔各个元素的字符串(可以是空串""、空格" "、逗号","、换行符"\n"等)。iterable:可迭代对象,其中的每一项都必须是字符串类型(str);如果有非字符串类型,会抛出TypeError。
返回值是一个新的字符串,等于将 iterable 中的各元素,以 separator 依次拼接起来。
2. 最简单的例子
words = ["apple", "banana", "cherry"]
result = ",".join(words)
print(result) # apple,banana,cherry
- 以逗号连结列表中的单词。
如果想在单词之间加一个空格:
" ".join(words) # "apple banana cherry"
若想把字符反转再连回去(也能用于字符串本身,因为字符串也是可迭代的):
s = "hello"
rev = "".join(reversed(s)) # "olleh"
# 或者直接 s[::-1],但这里是 join 的示例
3. 常见用法及场景
-
列表 → 字符串: 把多个单词、数字(先转成字符串)拼成一句话或一个文件路径、URL 参数等。
parts = ["2025", "04", "29"]
date_str = "-".join(parts) # "2025-04-29" -
元组、集合:
tpl = ("a", "b", "c")
result = "|".join(tpl) # "a|b|c"
st = {"x", "y", "z"}
result = ":".join(st) # 可能 是 "y:z:x"(集合无序) -
生成器表达式: 当元素需要动态计算或类型转换时,常和
map()或生成器表达式结合:nums = [1, 2, 3, 4]
s = ",".join(str(n) for n in nums)
# "1,2,3,4" -
文件操作里的换行: 将多行内容一次性写入文件:
lines = ["第一行", "第二行", "第三行"]
with open("out.txt", "w", encoding="utf-8") as f:
f.write("\n".join(lines)) -
拆分(Reverse): 虽然
.join()本身是拼接,但经常和.split()、切片、reversed()配合,完成拆分-处理-重拼接的流程。
4. 性能考量
-
为什么不用简单的
+=?s = ""
for w in words:
s += w + ","这种方式会在每次循环时创建新字符串,时间复杂度和空间开销都更高。
-
join()优势 它在内部先计算出结果长度,只分配一次内存,然后一次性写入,大幅提升效率——尤其当拼接上百、上千个片段时差异尤为明显。
5. 注意事项
-
元素必须是
strdata = ["a", 123, "b"]
"-".join(data)
# TypeError: sequence item 1: expected str instance, int found解决方法:先把非字符串元素转换好:
"-".join(map(str, data)) -
空可迭代对象
",".join([]) # 返回 ""(空字符串) -
在字节序列上
bytes、bytearray类型也有各自的.join(),但它们要求可迭代对象成员都是bytes/bytearray:b",".join([b"foo", b"bar"]) # b"foo,bar" -
大规模拼接 如果遇到极大规模的数据流,可以考虑
io.StringIO或者写文件流中直接拼接,以进一步减少内存峰值。
6. 进阶示例
6.1 只保留奇数位字符并合并
s = "abcdefghijklmnopqrstuvwxyz"
# 取下标为奇数的字符,然后 join
res = "".join(s[i] for i in range(len(s)) if i % 2 == 1)
print(res) # "bdfhjlnprtvxz"
6.2 拼接带 HTML 标签的列表
items = ["apple", "banana", "cherry"]
html = "<li>" + "</li><li>".join(items) + "</li>"
# 结果: "<li>apple</li><li>banana</li><li>cherry</li>"
6.3 用生成器批量拼接日志行
def log_lines():
for i in range(1, 6):
yield f"[{i:03d}] 处理完成"
all_logs = "\n".join(log_lines())
print(all_logs)
7. 小结
- 核心语义:拿一个"分隔符"去"连接"一系列字符串。
- 优势:简洁、内存和速度都优于循环累加。
- 常见陷阱:务必保证可迭代中全是字符串类型;对于大型数据流,注意内存峰值。
掌握了 join(),你就能用最"Pythonic" 的方式,快速高效地完成各种字符串拼接需求!
NumPy基础教程
1. NumPy是什么?
NumPy(Numerical Python)是Python科学计算的核心库,主要用于处理数组和矩阵运算。它提供了比Python列表更高效的数值计算工具。
2. 安装NumPy
pip install numpy
3. 导入NumPy
import numpy as np # 约定俗成的导入方式
4. 创建NumPy数组
4.1 从列表创建数组
# 一维数组
arr1 = np.array([1, 2, 3, 4, 5])
print(arr1) # 输出: [1 2 3 4 5]
# 二维数组
arr2 = np.array([[1, 2, 3], [4, 5, 6]])
print(arr2)
4.2 特殊数组创建
# 创建全0数组
zeros = np.zeros(5) # 一维全0数组
zeros_2d = np.zeros((3, 4)) # 3行4列的二维全0数组
# 创建全1数组
ones = np.ones(5) # 一维全1数组
ones_2d = np.ones((2, 3)) # 2行3列的二维全1数组
# 创建特定范围的数组
# start, stop, step
range_arr = np.arange(0, 10, 2) # [0 2 4 6 8]
# 创建均匀分布的数组
# start, stop, num(元素个数)
linspace_arr = np.linspace(0, 10, 5) # 0到10之间均匀分布的5个数
4.3 随机数组
# 设置随机数种子(保证可重复性)
np.random.seed(42)
# 生成0-1均匀分布的随机数
uniform_arr = np.random.uniform(0, 1, 5)
# 生成标准正态分布的随机数
normal_arr = np.random.normal(0, 1, 5)
# 生成随机整数
random_int_arr = np.random.randint(0, 10, 5) # 0-9之间的5个随机整数
5. 数组属性
arr = np.array([[1, 2, 3], [4, 5, 6]])
# 数组维度
print(arr.ndim) # 输出: 2
# 数组形状
print(arr.shape) # 输出: (2, 3)
# 数组元素类型
print(arr.dtype) # 输出: int64
# 数组元素总数
print(arr.size) # 输出: 6
6. 数组运算
6.1 基本运算
# 数组与标量运算
arr = np.array([1, 2, 3, 4])
print(arr * 2) # 每个元素乘2: [2 4 6 8]
print(arr + 10) # 每个元素加10: [11 12 13 14]
# 数组间运算
arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])
print(arr1 + arr2) # 对应位置相加: [5 7 9]
print(arr1 * arr2) # 对应位置相乘: [4 10 18]
6.2 统计函数
arr = np.array([1, 2, 3, 4, 5])
# 基本统计
print(np.sum(arr)) # 求和:15
print(np.mean(arr)) # 平均值:3.0
print(np.max(arr)) # 最大值:5
print(np.min(arr)) # 最小值:1
print(np.std(arr)) # 标准差
7. 数组切片和索引
# 一维数组
arr1 = np.array([0, 1, 2, 3, 4, 5])
print(arr1[2:5]) # 索引2到4: [2 3 4]
print(arr1[:3]) # 前3个元素: [0 1 2]
print(arr1[::2]) # 每隔2个取一个: [0 2 4]
# 二维数组
arr2 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(arr2[1, 2]) # 第2行第3列的元素:6
print(arr2[:, 1]) # 第2列所有元素: [2 5 8]
print(arr2[0:2, 1:3]) # 前2行,第2-3列
8. 数组重塑
# 改变数组形状
arr = np.arange(6)
reshaped = arr.reshape((2, 3)) # 变成2行3列
print(reshaped)
# 展平数组
flatten = reshaped.flatten() # 变回一维数组
9. 常用实用函 数
# 生成单位矩阵
identity = np.eye(3)
# 对角矩阵
diag = np.diag([1, 2, 3])
# 矩阵转置
arr = np.array([[1, 2], [3, 4]])
print(arr.T)
总结
NumPy提供了强大的数组操作和数值计算工具,是科学计算、数据分析的基础库。
推荐学习路径
- 熟悉基本数组创建
- 掌握数组运算
- 理解切片和索引
- 学习统计函数
- 探索更高级的矩阵操作
练习建议
- 尝试创建不同类型和维度的数组
- 实践各种数组运算
- 解决实际的数值计算问题
NumPy知识
在这行代码里:
points_in_quarter_circle = np.sum(distances <= 1)
你看到了一个非常典型的 NumPy 向量化(vectorization)写法,它背后其实做了两件事:
-
元素级(element-wise)比较,生成布尔数组 表达式
distances <= 1当distances是一个形状为(N,)的 NumPy 数组时,会对数组中每一个元素分别做一次比较,返回一个同样形状的布尔数组:# 举例说明
distances = np.array([0.5, 1.2, 0.8, 1.0, 1.5])
mask = distances <= 1
# mask == array([ True, False, True, True, False])这一步完全是在 C 级别实现的,非常快,比起 Python 的
for循环要高效得多。 -
对布尔数组求和 NumPy 在对布尔类型数组调用
np.sum()时,会把True当作1、False当作0,然后把所有元素加起来。这就恰好给了我们「有多少个点满足条件」的结果:np.sum(mask)
# 等价于 1 + 0 + 1 + 1 + 0 == 3
合起来,np.sum(distances <= 1) 就是:
- 先判断每个
distance是否 ≤ 1,得到一个只有 True/False 的数组; - 再把这些 True/False 当作 1/0 累加,得到满足条件的点的数量。
为什么要这样写?
- 简洁 只用一行就完成了筛选和计数。
- 高效
比起 Python 层面的
for循环和if判断,NumPy 的向量化运算是在底层 C/C++ 实现的,速度快、内存访问连续。 - 可读 逻辑直观:"把所有 ≤1 的点当作 1,加一加就是总数"。
类似的写法
np.count_nonzero(distances <= 1)功能等价,也是统计 Boolean 数组中 True 的个数。(distances <= 1).sum()直接调用布尔 数组的.sum()方法,同样把 True 当成 1。
inside1 = np.sum(distances <= 1)
inside2 = np.count_nonzero(distances <= 1)
inside3 = (distances <= 1).sum()
assert inside1 == inside2 == inside3
扩展:用布尔掩码(mask)做更多事
除了统计个数,你还可以用这个布尔掩码来 选择 或 修改 数组中的元素:
mask = distances <= 1
# 1) 取出所有圆内的距离值
in_distances = distances[mask]
# 2) 把圆外的距离都设为 0
distances_outside_zeroed = distances.copy()
distances_outside_zeroed[~mask] = 0
这样一来,你就可以方便地对符合条件的元素进行各种操作,而不用写任何显式的循环。
列表推导式
当然可以,这一类语法叫做 列表推导式(List Comprehension),它是 Python 中非常常用、简洁且高效的一种写法,用于从一个可迭代对象生成一个新列表。
基本语法结构:
[表达式 for 变量 in 可迭代对象 if 条件]
这等价于下面的传统写法:
result = []
for 变量 in 可迭代对象:
if 条件:
result.append(表达式)
举例说明你提到的代码:
[1 for k in scores if k >= 60]
解释:
scores是一个成绩列表,比如[85, 92, 78, 54, 96]for k in scores:遍历这个列表中的每个成绩,赋值给变量kif k >= 60:只保留那些及格的成绩(大于等于 60)1:对于每一个满足条件的元素,输出一个值1
最终结果:
这个表达式会生成一个新的列表,其中每一个及格的成绩对应一个 1。比如:
scores = [85, 92, 78, 54, 96]
[1 for k in scores if k >= 60] # 结果是 [1, 1, 1, 1]
这个列表长度就 是及格的人数。我们再用 sum() 加起来,就得到了及格人数:
pass_count = sum([1 for k in scores if k >= 60])
更多例子:
- 生成平方数列表
squares = [x**2 for x in range(1, 6)]
# 输出: [1, 4, 9, 16, 25]
- 筛选偶数
evens = [x for x in range(10) if x % 2 == 0]
# 输出: [0, 2, 4, 6, 8]
- 将字符串转为小写
words = ['Hello', 'World']
lower_words = [w.lower() for w in words]
# 输出: ['hello', 'world']
你想我帮你出几个练习题来练习这种写法吗?
Lambda表达式教程
Lambda表达式是Python中一种创建小型匿名函数的方式。这些函数被称为"匿名"是因为它们没有正式的名称,通常用于那些只需使用一次的简短函数。
基本语法
lambda 参数列表: 表达式
Lambda表达式由三部分组成:
lambda关键字(固定的)- 参数列表(可以有0个或多个参数)
- 冒号后的表达式(只能有一个表达式,不能包含多条语句)
与普通函数对比
让我们看一个简单的例子,对比普通函数和lambda表达式:
普通函数:
def add(x, y):
return x + y
result = add(5, 3) # 结果为8
等价的lambda表达式:
add = lambda x, y: x + y
result = add(5, 3) # 结果为8
Lambda表达式的实际应用
1. 简单计算
# 计算平方
square = lambda x: x * x
print(square(5)) # 输出: 25
# 判断是否是偶数
is_even = lambda x: x % 2 == 0
print(is_even(4)) # 输出: True
2. 与内置函数结合使用
与map()函数结合(批量处理):
# 将列表中的每个数字翻倍
numbers = [1, 2, 3, 4, 5]
doubled = list(map(lambda x: x * 2, numbers))
print(doubled) # 输出: [2, 4, 6, 8, 10]
与filter()函数结合(筛选):
# 筛选出列表中的偶数
numbers = [1, 2, 3, 4, 5, 6]
evens = list(filter(lambda x: x % 2 == 0, numbers))
print(evens) # 输出: [2, 4, 6]
与sorted()函数结合(自定义排序):
# 按姓名长度排序
names = ["Alice", "Bob", "Charlie", "David"]
sorted_names = sorted(names, key=lambda name: len(name))
print(sorted_names) # 输出: ['Bob', 'Alice', 'David', 'Charlie']
Lambda的限制
- 只能包含一个表达式,不能包含多条语句
- 不能包含赋值语句
- 表达式的结果自动成为返回值
何时使用Lambda
Lambda表达式最适合用于:
- 需要简单函数的地方,尤其是只使用一次的函数
- 作为高阶函数的参数(如map、filter、sorted等)
- 需要函数作为参数的情况,但函数逻辑很简单
当函数逻辑复杂或需要重复使用时,应该使用普通的命名函数。
实用示例
让我们回到您最初的例子:
list(map(lambda word: translate_word(word, dictionary), words_to_translate))
这里,lambda表达式lambda word: translate_word(word, dictionary)为每个单词创建了一个翻译函数,然后map将这个函数应用到words_to_translate列表的每个单词上。
需要理解的关键点是什么呢?还有其他关于lambda表达式您想了解的内容吗?
字典的get方法
dictionary.get(word, "未知") 是Python字典(dict)对象的get()方法的用法,它有两个非常实用的特点:
基本解释
- 第一个参数
word:这是你想要在字典中查找的键(key) - 第二个参数
"未知":这是默认值,当键不存在时返回这个值
工作原理
- 如果
word在字典中存在,返回对应的值 - 如果
word在字典中不存在,返回第二个参数"未知"
与直接索引的区别
比较这两种访问字典的方式:
# 方式1:直接索引 - 如果键不存在会引发KeyError
value = dictionary[word] # 键不存在时会报错
# 方式2:使用get方法 - 更安全
value = dictionary.get(word, "未知") # 键不存在返回"未知",不会报错
实际例子
# 例子:简单的英汉字典
english_chinese = {
"apple": "苹果",
"banana": "香蕉",
"orange": "橙子"
}
# 查找存在的单词
print(english_chinese.get("apple", "未知")) # 输出: 苹果
# 查找不存在的单词
print(english_chinese.get("grape", "未知")) # 输出: 未知
在翻译场景中,这种方法特别实用,因为它允许程序在遇到未知单词时继续运行,而不是因为找不到某个单词就崩溃。
字符串拼接
是的,在 Python(以及很多其他语言)里,+ 运算符对字符串做的是"拼接"操作,而不是数学意义上的加法。举几个例子说明:
>>> "Hello, " + "world!"
"Hello, world!"
>>> "2" + "2"
"22"
>>> "abc" + ""
"abc"
字符串拼接的原理与注意
-
不可变性(Immutable) 每次做拼接,都会产生一个新的字符串对象:
s = "a"
s = s + "b" # 旧的 "a" 不变,s 绑定到新创建的 "ab"因此,如果在一个很长的循环里重复用
+拼接,性能会受影响(因为不断地分配新对象、复制已有内容)。 -
高效拼接
-
对于少量拼接,用
+最直观,性能影响几乎可以忽略。 -
如果要拼接大量片段,推荐:
-
列表收集 +
''.join()parts = []
for piece in some_iterable:
parts.append(piece)
result = "".join(parts) -
io.StringIO或array.array('u')(不常用)
-
-
-
与数字加法区分
"2" + "3"得到"23"2 + 3得到5若想把字符串数字当数值相加,需要先int()或float()转换:
>>> int("2") + int("3")
5
小结
+用于字符串时,是拼接;- 字符串是不可变类型,频繁用
+拼会额外创建对象; - 大量拼接时,可以用
''.join(...)来优化性能。
Python列表合并详解
在代码中,合并列表的部分是这一行:
result = even_numbers + odd_numbers
这看似简单的操作实际上有很多知识点,我来详细解释:
1. 列表合并的基本语法
Python中合并列表有多种方式,最常见的是使用+运算符:
list1 = [1, 2, 3]
list2 = [4, 5, 6]
combined = list1 + list2 # 结果为 [1, 2, 3, 4, 5, 6]
2. 合并原理
当使用+运算符合并列表时:
- Python会创建一个全新的列表对象
- 第一个列表的所有元素按原顺序被复制到新列表
- 第二个列表的所有元素接着被复制到新列表
- 原始列表保持不变
3. 在题目中的应用
在我们的奇偶分离题目中:
even_numbers = [2, 4, 6, 8]
odd_numbers = [1, 3, 5, 7]
result = even_numbers + odd_numbers # 结果为 [2, 4, 6, 8, 1, 3, 5, 7]
这正好满足题目要求:偶数在前,奇数在后。合并顺序很重要,如果写成odd_numbers + even_numbers,结果就会是奇数在前了。
4. 其他合并列表的方法
4.1 使用extend()方法
result = even_numbers.copy() # 创建副本避免修改原列表
result.extend(odd_numbers) # 在result末尾添加odd_numbers的所有元素
4.2 使用解包运算符(*)
result = [*even_numbers, *odd_numbers] # Python 3.5+
4.3 使用列表推导式
result = [x for x in even_numbers] + [x for x in odd_numbers]
4.4 使用itertools.chain
from itertools import chain
result = list(chain(even_numbers, odd_numbers))
5. 性能和内存考虑
-
+运算符:创建新列表,时间复杂度O(n),需要额外内存 -
extend()方法:直接修改现有列表,可能更节省内存# 如果不再需要保留原始even_numbers列表
even_numbers.extend(odd_numbers)
result = even_numbers -
大型列表:对于非常大的列表,合并操作可能消耗大量内存和时间
6. 实际应用示例
假设我们的输入是1,2,3,4,5,6,7,8:
# 处理后
even_numbers = [2, 4, 6, 8]
odd_numbers = [1, 3, 5, 7]
# 合并
result = even_numbers + odd_numbers # [2, 4, 6, 8, 1, 3, 5, 7]
# 输出
print(','.join(map(str, result))) # "2,4,6,8,1,3,5,7"
对于这道题,使用+运算符是最直观、最简洁的解决方案,因为列表较小,性能和内存消耗不是问题。在实际项目中,可以根据具体需求选择最合适的合并方法。
处理EOF
我来详细解释Python中处理EOF(End of File)的几种方法:
现在我来详细解释Python中处理EOF(End of File)的几种方法:
- try-except方法(方法1)
try:
while True:
line = input()
# 处理输入
except EOFError:
# 到达文件末尾
- 最简单直接的方法
- 当没有更多输入时,
input()会抛出EOFError - 适合交互式输入和文件重定向
info = input().split()
让我详细解释 info = input().split() 中的 info:
input()读取一行输入的字符串.split()将这行字符串按空白字符(空格、制表符)分割成列表
举个具体例子:
# 假设输入: zhangsan 80 75 65
info = input().split()
# info 现在是一个列表:
# info = ['zhangsan', '80', '75', '65']
拆解说明:
info[0]是姓名 'zhangsan'info[1]是第一门课成绩 '80'info[2]是第二门课成绩 '75'info[3]是第三门课成绩 '65'
处理时的常见操作:
# 提取姓名
name = info[0]
# 转换成绩为整数
scores = list(map(int, info[1:]))
# 等价于:
# scores = [int(info[1]), int(info[2]), int(info[3])]
我来做一个详细的代码示例:
关键点总结:
split()默认按空白字符分割输入- 返回一个列表,包含分割后的字符串
- 可以用
map(int, info[1:])快速转换成绩为整数 - 通过索引可以方便地提取姓名和成绩
常见的坑和注意事项:
- 确保输入格式正确
- 使用
try-except处理可能的输入错误 - 注意
split()会去除多余的空白字符
使用 split() 是处理固定格式输入的常用方法,特别适合在编程竞赛和在线评测系统中快速解析输入。
字符串的方法
在 Python 中,字符串(str)是非常常用的数据类型,它有很多内置方法,帮助你快捷地做查找、替换、分割、格式化等操作。下面按功能分组,给你介绍一些最常用的方法,并配上简短示例。
1. 大小写转换
-
.lower()将所有字符都转换成小写。"Hello World".lower() # "hello world" -
.upper()将所有字符都转换成大写。"Hello World".upper() # "HELLO WORLD" -
.title()把每个词的首字母改为大写。"hello world".title() # "Hello World" -
.capitalize()把第一个字符大写,其余小写。"hELLo".capitalize() # "Hello"
2. 查找与判断
-
.find(sub)在字符串中查找子串sub,返回第一次出现的索引;找不到返回-1。"banana".find("na") # 2
"banana".find("xy") # -1 -
.index(sub)类似.find(),但找不到时会抛出ValueError。"banana".index("na") # 2
# "banana".index("xy") # ValueError -
.startswith(prefix)/.endswith(suffix)判断是否以某前缀/后缀开头或结束,返回布尔值。"test.py".startswith("te") # True
"test.py".endswith(".py") # True