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)
是一个元组,包含了三个变量 i
、j
和 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() 方法比旧式的 % 格式化方法更加灵活,可以更方便地处理复杂的格式化需求。