Python 中有多种内置的数据结构,主要分为以下几种:
1
, -5
, 100
。3.14
, -0.5
。j
或 J
结尾。例如:3 + 4j
。"hello"
。[1, 'a', True]
。(1, 2, 3)
。{1, 2, 3}
。frozenset([1, 2, 3])
。{'name': 'Alice', 'age': 25}
。要点:
不同的数据结构在内存占用和性能表现上有所差异。例如,列表在插入和删除元素时效率相对较低,尤其是在列表头部操作;而集合在查找元素时具有较高的效率,时间复杂度为 O (1)。在实际应用中,需要根据具体的需求选择合适的数据结构。比如,当需要存储有序且可重复的数据时,列表是不错的选择;当需要快速判断元素是否存在时,集合更为合适。
Python 的模块在第一次导入时会被执行,并且会将模块的内容加载到内存中,后续的导入操作都会使用同一个模块对象,因此可以利用这一特性实现单例模式。
python
# singleton.py
class Singleton:
def __init__(self):
pass
singleton_instance = Singleton()
在其他文件中使用:
python
from singleton import singleton_instance
python
def singleton(cls):
instances = {}
def get_instance(*args, **kwargs):
if cls not in instances:
instances[cls] = cls(*args, **kwargs)
return instances[cls]
return get_instance
@singleton
class MyClass:
def __init__(self):
pass
obj1 = MyClass()
obj2 = MyClass()
print(obj1 is obj2) # 输出: True
python
class Singleton:
_instance = None
@classmethod
def get_instance(cls):
if cls._instance is None:
cls._instance = cls()
return cls._instance
obj1 = Singleton.get_instance()
obj2 = Singleton.get_instance()
print(obj1 is obj2) # 输出: True
单例模式在实际开发中有很多应用场景,比如数据库连接池、日志记录器等。在多线程环境下使用单例模式时,需要考虑线程安全问题。例如,使用类方法实现单例模式时,在多线程环境下可能会创建多个实例,需要使用锁机制来保证线程安全。
python
import threading
class Singleton:
_instance = None
_lock = threading.Lock()
@classmethod
def get_instance(cls):
with cls._lock:
if cls._instance is None:
cls._instance = cls()
return cls._instance
例如 -168 --> -861
python
def reverse_integer(x):
sign = -1 if x < 0 else 1
num_str = str(abs(x))
reversed_str = num_str[::-1]
return sign * int(reversed_str)
print(reverse_integer(-168)) # 输出: -861
实现整数反转的关键步骤是先处理符号,然后将绝对值转换为字符串进行反转,最后再加上符号。在处理整数反转时,需要考虑整数溢出的问题。虽然 Python 的整数类型没有大小限制,但在某些需要与其他语言交互或对性能有严格要求的场景下,可能需要考虑溢出问题。另外,可以对输入进行合法性检查,确保输入是有效的整数。
python
print(sum(range(1, 10001)))
使用 sum
函数和 range
函数可以在一行代码中完成 1 到 10000 的求和。同样,对于较大的范围,使用数学公式 n * (n + 1) // 2
可以更高效地计算。另外,可以将这个功能封装成一个函数,方便计算任意范围的整数求和。以下是示例代码:
python
def sum_range(n):
return n * (n + 1) // 2
print(sum_range(10000))
python
original_list = [1, 2, 3, 4, 5]
new_list = [i for i in original_list if i != 3]
print(new_list)
python
original_list = [1, 2, 3, 4, 5]
for i in range(len(original_list) - 1, -1, -1):
if original_list[i] == 3:
del original_list[i]
print(original_list)
正确的做法有使用列表推导式创建新列表和反向遍历列表并删除元素。列表推导式的优点是代码简洁,易于理解,但会创建一个新的列表,占用额外的内存。反向遍历列表的方法不会创建新的列表,但代码相对复杂一些。在处理大型列表时,需要根据具体情况选择合适的方法。另外,还可以使用迭代器和 filter
函数来实现相同的功能。
python
my_list = [1, 2, 3]
my_list.append(4)
print(my_list) # 输出: [1, 2, 3, 4]
python
my_str = "hello"
# 下面这行代码会报错,因为字符串是不可变的
# my_str[0] = 'H'
可变类型和不可变类型在函数参数传递时表现不同。不可变类型作为参数传递时,函数内部对参数的修改不会影响到外部的变量;而可变类型作为参数传递时,函数内部对参数的修改会影响到外部的变量。
python
def modify_immutable(num):
num = num + 1
return num
def modify_mutable(lst):
lst.append(4)
return lst
a = 1
b = [1, 2, 3]
print(modify_immutable(a)) # 输出: 2
print(a) # 输出: 1
print(modify_mutable(b)) # 输出: [1, 2, 3, 4]
print(b) # 输出: [1, 2, 3, 4]
is
和 ==
有什么区别==
用于比较两个对象的值是否相等。python
a = [1, 2, 3]
b = [1, 2, 3]
print(a == b) # 输出: True
is
用于比较两个对象是否是同一个对象,即它们是否指向同一块内存地址。python
a = [1, 2, 3]
b = [1, 2, 3]
print(a is b) # 输出: False
c = a
print(a is c) # 输出: True
在实际应用中,对于简单的数据类型,如整数、字符串等,Python 会对一些常用的值进行缓存,因此在一定范围内使用 is
比较可能会得到意外的结果。
python
a = 100
b = 100
print(a is b) # 输出: True
a = 1000
b = 1000
print(a is b) # 输出: False
python
original_list = [1, 2, 3, 4, 5]
odd_list = [i for i in original_list if i % 2 != 0]
print(odd_list) # 输出: [1, 3, 5]
可以使用列表推导式来筛选出列表中的奇数元素并构建新列表。除了列表推导式,还可以使用 filter
函数和 lambda
表达式来实现相同的功能。
python
original_list = [1, 2, 3, 4, 5]
odd_list = list(filter(lambda x: x % 2 != 0, original_list))
print(odd_list) # 输出: [1, 3, 5]