【Python3】练习一

copy

题目 将一个列表的数据复制到另一个列表中

python 复制代码
import copy
a = [1,2,3,4,['a','b']]

b = a					# 赋值
c = a[:]				# 浅拷贝
d = copy.copy(a)		# 浅拷贝
e = copy.deepcopy(a)	# 深拷贝

a.append(5)
a[4].append('c')

print('a=',a)
print('b=',b)
print('c=',c)
print('d=',d)
print('e=',e)

什么叫浅拷贝

浅拷贝(Shallow Copy)是复制对象的一种方式,它只复制对象本身,而不复制对象中的子对象。换句话说,浅拷贝创建了一个新的对象,但这个新对象中的子对象仍然是原对象中子对象的引用。

在Python中,可以使用内建的 copy 模块中的 copy() 方法来创建浅拷贝。例如:

python 复制代码
import copy

original = [[1, 2], [3, 4]]
shallow_copy = copy.copy(original)

在这个例子中,original 是一个包含两个列表的列表。通过调用 copy.copy() 方法,我们创建了一个新的列表 shallow_copy,它包含了original中的所有元素,但它们仍然是 original 中的子对象的引用。

python 复制代码
original[0][0] = 'a'
print(shallow_copy)  # 输出:[['a', 2], [3, 4]]

可以看到,shallow_copy 中的第一个子列表也被修改了,因为它是 original 中第一个子列表的引用。

什么叫深拷贝

深拷贝(Deep Copy)是复制对象的一种方式,它不仅复制对象本身,还复制对象中的所有子对象。换句话说,深拷贝创建了一个新的对象,并且这个新对象中的所有子对象都是新创建的,而不是原对象中子对象的引用。 在Python中,可以使用内建的 copy 模块中的deepcopy()方法来创建深拷贝。例如:

python 复制代码
import copy

original = [[1, 2], [3, 4]]
deep_copy = copy.deepcopy(original)

在这个例子中,original 是一个包含两个列表的列表。通过调用copy.deepcopy()方法,我们创建了一个新的列表 deep_copy,它包含了 original 中的所有元素,并且这些元素都是新创建的,而不是 original 中的子对象的引用。

python 复制代码
original[0][0] = 'b'
print(deep_copy)  # 输出:[[1, 2], [3, 4]]

可以看到,deep_copy中的第一个子列表没有被修改,因为它是新创建的,而不是 original 中第一个子列表的引用。

九九乘法表

题目 输出 9*9 乘法口诀表

python 复制代码
# 外层循环,控制行数
for i in range(1,10):
    # 内层循环,控制每行的列数
    for j in range(1,i+1):
        # 打印乘法表
        print('%d*%d=%2ld '%(i,j,i*j),end='')
    print()

字符串格式化

字符串格式化方法:'%d*%d=%2ld '%(i,j,i*j) 使用的是旧式的字符串格式化方法,通过在字符串中使用占位符(例如%d%2ld)来指定数据应该插入的位置和格式。

占位符解释:

%d:这是一个整数占位符,用于插入整数类型的变量。在这里,%d 会被 i j 的值替换。 %2ld:这是一个长整数占位符,l 表示长整数(在Python 3中,整数没有长整短整之分,都是 int 类型),2 表示输出的最小宽度是2个字符,如果数值的字符数少于2,则前面补空格。在这里,%2ld 会被 i*j 的值替换。 变量替换:(i,j,i*j) 是一个元组,包含了三个变量 ij i*j 的值,这些值会依次替换字符串中的 %d %2ld 占位符。

输出结果:假设 i=3 j=4,那么这段代码会生成字符串 '3*4=12 ',其中 3 和 4 分别替换了前两个 %d,12 替换了 %2ld

end='' 的作用:这是 print 函数的一个参数,用于指定输出的结束字符。默认情况下,print 函数会在输出的末尾添加一个换行符。通过设置 end='',可以避免添加换行符,使得下一次的输出可以接在这一行的末尾。

用途:这种格式化方法常用于生成表格、报告等需要精确控制输出的场合。例如,在打印乘法表时,可以使用这种格式化方法来对齐各个乘积。

注意事项:

在Python 3中,%ld 和 %d 都可以用来格式化整数,因为Python 3中的整数类型是统一的,没有长整型和短整型的区别。 使用 %2ld 时,如果数值的字符数超过2,则不会截断,而是会完整显示。 这种旧式的字符串格式化方法在Python 3中仍然可以使用,但推荐使用更现代的格式化方法,如 str.format() 或 f-string(格式化字符串字面值),因为它们更直观、更强大。 综上所述,这段代码的目的是生成一个格式化的字符串,用于显示两个整数相乘的结果,并且控制输出的格式和对齐方式。

如何使用str.format()进行字符串格式化?

str.format() 是 Python 中一种现代且强大的字符串格式化方法。它允许你通过花括号 {} 作为占位符,并在format()方法中提供相应的值来替换这些占位符。这种方法比旧式的 % 操作符更加灵活和易读。

下面是 str.format() 方法的一些基本用法:

python 复制代码
# 基本用法
name = "Alice"
age = 30
formatted_string = "My name is {} and I am {} years old.".format(name, age)
print(formatted_string)
# 输出: My name is Alice and I am 30 years old.

你可以通过在花括号中指定位置来控制替换的顺序:

python 复制代码
# 指定位置
formatted_string = "First: {0}, Second: {1}".format("apple", "banana")
print(formatted_string)
# 输出: First: apple, Second: banana

你也可以使用关键字参数来提高代码的可读性:

python 复制代码
# 使用关键字参数
formatted_string = "My name is {name} and I am {age} years old.".format(name="Alice", age=30)
print(formatted_string)
# 输出: My name is Alice and I am 30 years old.

str.format() 还支持格式说明符,用于控制输出的格式,例如数字的格式、日期的格式等:

python 复制代码
# 格式说明符
number = 123.456
formatted_string = "The number is {:.2f}".format(number)
print(formatted_string)
# 输出: The number is 123.46

在这个例子中,{:.2f} 是一个格式说明符,其中 : 后面跟着格式说明。.2f 表示将数字格式化为小数点后两位的浮点数。 你还可以使用填充和对齐选项来控制字符串的输出格式:

python 复制代码
# 填充和对齐
formatted_string = "{:<10}|{:^10}|{:>10}".format("left", "center", "right")
print(formatted_string)
# 输出: left      |  center  |     right

在这个例子中,{:<10} 表示左对齐并填充到10个字符宽,{:^10} 表示居中对齐并填充到10个字符宽,{:>10} 表示右对齐并填充到10个字符宽。 你可以结合使用位置参数、关键字参数和格式说明符:

python 复制代码
# 结合使用
formatted_string = "Hello, {name:.3}. You have {notifications:03d} new messages.".format(name="Alice", notifications=5)
print(formatted_string)
# 输出: Hello, Ali. You have 005 new messages.

在这个例子中,{name:.3} 将 name 的值格式化为最多3个字符的字符串,{notifications:03d} 将 notifications 的值格式化为至少3个字符的整数,前面不足的部分用0填充。

如何使用f-string进行字符串格式化?

f-string(格式化字符串字面值)是 Python 3.6 引入的一种新的字符串格式化方法,它允许你在字符串中直接嵌入表达式,并自动计算表达式的值。f-string 是一种非常简洁和直观的字符串格式化方式,它比旧式的 % 操作符和 str.format() 方法更加简洁和易读。

下面是 f-string 的一些基本用法:

python 复制代码
# 基本用法
name = "Alice"
age = 30
formatted_string = f"My name is {name} and I am {age} years old."
print(formatted_string)

F-string 在性能上也比 str.format() 更快,因为它在运行时直接将表达式嵌入到字符串中,而不需要调用 format() 方法。

总之,str.format() 提供了一种强大且灵活的方式来格式化字符串,适用于各种复杂的格式化需求。

优化

python 复制代码
# 外层循环,控制行数
for i in range(1, 10):
    # 内层循环,控制每行的列数
    for j in range(1, i + 1):
        # 使用str.format()打印乘法表
        print("{}*{}={:2d} ".format(i, j, i * j), end='')
    print()

在这段优化后的代码中,print 函数中的字符串使用了 str.format() 方法来格式化输出。{} 是占位符,会被 format 方法中的参数依次替换。{:2d} 是一个格式说明符,表示将整数格式化为至少2位宽,如果不足2位,则在前面补空格。

这样写的好处是代码更加现代化,可读性也更高。此外,str.format() 方法比旧式的 % 格式化方法更加灵活,可以更方便地处理复杂的格式化需求。

相关推荐
鬼火儿14 小时前
SpringBoot】Spring Boot 项目的打包配置
java·后端
cr7xin15 小时前
缓存三大问题及解决方案
redis·后端·缓存
间彧16 小时前
Kubernetes的Pod与Docker Compose中的服务在概念上有何异同?
后端
间彧16 小时前
从开发到生产,如何将Docker Compose项目平滑迁移到Kubernetes?
后端
间彧16 小时前
如何结合CI/CD流水线自动选择正确的Docker Compose配置?
后端
间彧16 小时前
在多环境(开发、测试、生产)下,如何管理不同的Docker Compose配置?
后端
间彧16 小时前
如何为Docker Compose中的服务配置健康检查,确保服务真正可用?
后端
间彧16 小时前
Docker Compose和Kubernetes在编排服务时有哪些核心区别?
后端
间彧16 小时前
如何在实际项目中集成Arthas Tunnel Server实现Kubernetes集群的远程诊断?
后端
brzhang17 小时前
读懂 MiniMax Agent 的设计逻辑,然后我复刻了一个MiniMax Agent
前端·后端·架构