Python:隐藏的功能

liftword3周前 (12-07)技术文章15

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_xget_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 循环也是如此。

相关文章

20种Python数据可视化绘图 直接复制可用

本文介绍20种python数据绘图方法,可直接用于科研绘图或汇报用图。1.折线图 (Line Plot) - 描述数据随时间或其他变量的变化。import matplotlib.pyplot as p...

深入探索Inspect:Python中不可或缺的工具库

在Python编程的旅途中,我们时常会遇到如何检查和分析对象的需求。这时,`inspect`这个Python内置库便成为我们手中的利器。如果你想更好地理解你的代码、调试问题或者进行动态分析,`insp...

超级实用!Python设计模式精粹

# 小伙伴们,大家好!今天猿梦家要带大家探索的是Python中的设计模式。 设计模式就像是一套武功秘籍,能让我们在编程时更加得心应手。 它们是经过前人总结的最佳实践,可以帮助我们解决常见的设计问题,让...