学习日志27 python
1 divmod是什么?
这个单词是 "division"(除法)和 "modulus"(取模 / 取余)两个词的组合~
在 Python 中,divmod()
是一个内置函数,用于同时计算两个数的商和余数。
它接收两个参数 a
(被除数)和 b
(除数),返回一个包含两个元素的元组 (q, r)
,其中:
q
是a
除以b
的整数商(即a // b
的结果)r
是a
除以b
的余数(即a % b
的结果)
例如:
python
运行
print(divmod(10, 3)) # 输出 (3, 1),因为 10 = 3×3 + 1
print(divmod(7, 2)) # 输出 (3, 1),因为 7 = 3×2 + 1
print(divmod(5, 5)) # 输出 (1, 0),因为 5 = 1×5 + 0
使用 divmod(a, b)
等价于同时计算 (a // b, a % b)
,但它是一个原子操作,在某些情况下可能比单独计算商和余数更高效。
需要注意的是,divmod()
的结果遵循 Python 中整除和取余的规则,对于负数也同样适用:
python
运行
print(divmod(-10, 3)) # 输出 (-4, 2)
print(divmod(10, -3)) # 输出 (-4, -2)
2 多态和封装是不同的概念
多态和封装是面向对象编程(OOP)中两个不同但相互关联的核心概念,它们的侧重点和作用各不相同:
封装(Encapsulation)
- 核心思想:将数据(属性)和操作数据的方法捆绑在一起,隐藏对象的内部实现细节,只对外暴露必要的接口(方法)。
- 作用:
- 保护数据不被随意修改,确保数据的安全性和一致性。
- 简化外部使用,使用者无需了解内部实现,只需调用公开方法。
- 示例:
一个Person
类将age
作为私有属性(如__age
),只通过get_age()
和set_age()
方法允许外部访问和修改,避免直接修改age
导致的不合理值(如负数)。
多态(Polymorphism)
- 核心思想:同一操作(方法调用)作用于不同对象时,可产生不同的执行结果。
- 作用:
- 提高代码的灵活性和可扩展性,允许不同类的对象以统一的方式被处理。
- 降低类之间的耦合度,符合 “开闭原则”(对扩展开放,对修改关闭)。
- 示例:
定义一个make_sound()
方法,对于Dog
类执行"汪汪叫"
,对于Cat
类执行"喵喵叫"
,调用时无需区分对象类型,统一使用obj.make_sound()
即可。
总结
- 封装是 “隐藏内部细节”,解决数据安全和接口简化问题;
- 多态是 “统一接口,不同实现”,解决代码灵活性和扩展性问题;
- 二者常结合使用:封装为多态提供了基础(确保对象内部稳定),多态通过封装的接口实现灵活交互。
3 元组注意逗号
在 Python 中,这种逗号正是区分 “单元素元组” 和 “普通括号表达式” 的关键:
- 选项 A 的
a = (1,)
:末尾的逗号是元组的 “标识”,即使只有一个元素,加了逗号就明确表示这是一个元组(类型为tuple
)。 - 选项 B 的
a = (1)
:没有逗号时,括号仅作为数学 / 逻辑上的优先级符号,所以a
其实是整数1
(类型为int
)。
这种设计确实和自然语言里的逗号用法不太一样,编程中这里的逗号更像是一种 “语法标记”,专门用来告诉解释器:“这是一个元组哦”。刚开始可能会觉得有点刻意,但熟悉后会发现这是避免歧义的好办法~
4 Python字典的pop()方法
Python字典的pop()方法需要指定一个键(key)作为参数来删除并返回对应的值。
在 Python 中,字典的 pop()
方法的基本用法是需要指定一个键(key)作为参数,它会删除该键对应的键值对,并返回该键所对应的值。
例如:
python
运行
my_dict = {'name': 'Alice', 'age': 25, 'city': 'New York'}# 删除'age'键并返回其值
age = my_dict.pop('age')
print(age) # 输出: 25
print(my_dict) # 输出: {'name': 'Alice', 'city': 'New York'}
此外,pop()
方法还可以接受第二个可选参数(默认值),当指定的键不存在时,不会抛出错误,而是返回这个默认值:
python
运行
# 尝试删除不存在的键,指定默认值
gender = my_dict.pop('gender', 'unknown')
print(gender) # 输出: unknown(因为'gender'键不存在)
如果不指定默认值且键不存在,则会抛出 KeyError
异常。