Python:隐藏的功能

摘要:list_of_dicts = [ {'name': 'Alice', 'age': 30}, {'name': 'Bob', 'age': 25}, {'name': 'Charlie', 'age': 35}]# Target name to search

让看看下面的例子 -

list_of_dicts = [ {'name': 'Alice', 'age': 30}, {'name': 'Bob', 'age': 25}, {'name': 'Charlie', 'age': 35}]# Target name to searchtarget_name = 'Bob'# Using a for-each loop to find the dictionaryfor person in list_of_dicts: if person['name'] == target_name: print(f"Found: {person}") break # Exit the loop once the target is foundelse: 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 功能以及某些用例(如自定义迭代模式、处理大型或无限序列或处理数据流)至关重要。

由于将字符串与 (+) 连接起来,因此复制字符串。

string_ex = ""for i in range(50): string_ex += str(i)

因此,在上面的示例中, for 循环最终将生成 50 个字符串副本。最好使用 StringIO 对象。

import iostring_ex = io.StringIOfor i in range(50): string_ex.write(str(i))new_s = string_ex.getvalue

因此,这使用内存缓冲区。
getValue — 返回包含缓冲区全部内容的 str。

停止对变量使用 getter 和 setter。

class Objectdef: def __init__(self, x): self._x = x def get_x(self): return self._x def set_(self, x): self._x = xdef 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 = valdef print_values: obj = ObjectDef(0) obj.x = 42 print(obj.x)

所以现在只需要使用'obj.x = 42',这将调用值为42的二传手。

这两种方法都用于颠倒列表中元素的顺序,但它们以不同的方式实现此结果。
让我们了解一下区别——

- 就地修改。
- 此方法通过将原始列表的元素反转到位来直接修改原始列表。
- 它不会返回新列表。

- 创建一个新列表。
- 此方法使用切片语法以相反的顺序创建原始列表的副本。
- 它返回一个新列表,使原始列表保持不变。

内存使用情况。
- list_reverse 具有内存效率,因为它直接在列表中工作。
- list[::-1] 创建一个副本,因此它可以使用更多的内存,尤其是对于大型列表。

因此,最好明智地使用这些方法。

让看一下下面的例子,我们使用 flag 来查找项目。因此, flag 我们需要将 设置为 true 并在循环的末尾。我们可以使用该标志进行一些操作。

items = [1, 2, 3, 4, 5, 6]i = 0found = Falsewhile i

但是,由于 for-else/while-else 语法的原因,我们不需要包含该标志。让我向你展示上述代码的替代方案——

items = [1, 2, 3, 4, 5, 6]i = 0while i

所以在这里,我们将转到 else 部分并执行该语句,如果我们不从 break 语句中退出循环,即:e else 语句将运行,如果不从 break 语句中退出循环,for 循环也是如此。

来源:自由坦荡的湖泊AI一点号

相关推荐