Python:隐藏的功能
1.使用 next()
让看看下面的例子 -
list_of_dicts = [
{'name': 'Alice', 'age': 30},
{'name': 'Bob', 'age': 25},
{'name': 'Charlie', 'age': 35}
]
# Target name to search
target_name = 'Bob'
# Using a for-each loop to find the dictionary
for person in list_of_dicts:
if person['name'] == target_name:
print(f"Found: {person}")
break # Exit the loop once the target is found
else:
print("Target not found.")
因此,在这里使用 for each 循环在字典中查找该目标,如果目标不存在,则使用 else 语句。
有一种非常简洁的方法是使用 next() .
Python 中的 next() 函数是一个内置函数,用于从迭代器中检索下一项。它是 Python 迭代器协议的一部分,该协议还包括从可迭代对象(如列表、元组或字符串)获取迭代器 iter() 的函数。
这是修改后的代码——
list_of_dicts = [
{'name': 'Alice', 'age': 30},
{'name': 'Bob', 'age': 25},
{'name': 'Charlie', 'age': 35}
]
person = next((item for item in list_of_dicts if item.get('name') == 'Bob'), "person not found." )
print(f"Found: {person}")
当调用 next() 迭代器时,它会返回下一个可用项。如果没有更多项目,则会引发 StopIteration 异常,除非提供了默认值,否则它将返回默认指定的值。
当希望在不使用循环的情况下从迭代器获取 next() 项目时,或者在处理数据流时,可能希望通过以下方式优雅地处理流的结尾,它也很方便提供默认值。
但是,理解 next() 和迭代器对于使用更高级的 Python 功能以及某些用例(如自定义迭代模式、处理大型或无限序列或处理数据流)至关重要。
2. 使用 StringIO 而不是 (+) 运算符
由于将字符串与 (+) 连接起来,因此复制字符串。
string_ex = ""
for i in range(50):
string_ex += str(i)
因此,在上面的示例中, for 循环最终将生成 50 个字符串副本。最好使用 StringIO 对象。
import io
string_ex = io.StringIO()
for i in range(50):
string_ex.write(str(i))
new_s = string_ex.getvalue()
因此,这使用内存缓冲区。
getValue() — 返回包含缓冲区全部内容的 str。
3. 使用属性
停止对变量使用 getter 和 setter。
class ObjectDef:
def __init__(self, x):
self._x = x
def get_x(self):
return self._x
def set_(self, x):
self._x = x
def print_values():
obj = ObjectDef(0)
obj.set_x(42)
print(obj.get_x)
以 pythonic 方式执行此操作的一种方法是仅使用 __init__ .
但是,如果真的想做一些与该变量相关的事情,那么使用 set 和 get 方法是有意义的。
因此,为了访问这些值,您必须调用 set_x 和 get_x 。因此,使用属性将是处理此问题的好方法
class ObjectDef:
def __init__(self, x):
self._x = x
@property
def x(self):
return self._x
@x.setter
def x(self, val):
self._x = val
def print_values():
obj = ObjectDef(0)
obj.x = 42
print(obj.x)
所以现在只需要使用'obj.x = 42',这将调用值为42的二传手。
4. list.reverse() 与 list[::-1]
这两种方法都用于颠倒列表中元素的顺序,但它们以不同的方式实现此结果。
让我们了解一下区别——
列表.reverse()
- 就地修改。
- 此方法通过将原始列表的元素反转到位来直接修改原始列表。
- 它不会返回新列表。
list[::-1] (切片)
- 创建一个新列表。
- 此方法使用切片语法以相反的顺序创建原始列表的副本。
- 它返回一个新列表,使原始列表保持不变。
内存使用情况。
- list_reverse() 具有内存效率,因为它直接在列表中工作。
- list[::-1] 创建一个副本,因此它可以使用更多的内存,尤其是对于大型列表。
因此,最好明智地使用这些方法。
5. 在 for/while 循环中使用 else
让看一下下面的例子,我们使用 flag 来查找项目。因此, flag 我们需要将 设置为 true 并在循环的末尾。我们可以使用该标志进行一些操作。
items = [1, 2, 3, 4, 5, 6]
i = 0
found = False
while i < len(items):
item = items [i]
if item == "2":
found = True
break
i += 1
if not found:
print("call some function")
但是,由于 for-else/while-else 语法的原因,我们不需要包含该标志。让我向你展示上述代码的替代方案——
items = [1, 2, 3, 4, 5, 6]
i = 0
while i < len(items):
item = items [i]
if item == "2":
break
i += 1
else:
print("call some function")
所以在这里,我们将转到 else 部分并执行该语句,如果我们不从 break 语句中退出循环,即:e else 语句将运行,如果不从 break 语句中退出循环,for 循环也是如此。