酷炫的Python语法技巧

你有没有做过一些事情,让你的朋友看到后说“哇,你是怎么知道的?”
那么,这篇文章旨在帮助你发现(或更好地理解)一些可以显著提升你代码水平的技巧,尤其是如果你之前并不知道这些技巧的话。
其中一些技巧是特定于Python的,而其他一些则存在于其他语言中,但被认为是Pythonic(在Python代码中良好的实践)。

你将学到什么❓

  • 字符串格式化和插值 ✔️
  • 内联条件语句 ✔️
  • 列表推导式 ✔️
  • Lambda函数 ✔️
  • 类型提示 ✔️

⛓️ 字符串格式化和插值

人们通常学习连接值和字符串的第一种方法是连接法:

words = "5"
concat_str = "This string has " + words + " words"

然而,这种方法可读性不高,并且在许多语言中无法使用。

插值字符串是一种将变量和固定字符串以更直观的方式组合的方法,这可以帮助代码的洞察和调试。
此外,它在我们想要表示值的方式上提供了更多的配置能力。
字符串插值的工作方式是将其他值作为字符串或对象插入到原始字符串中。

接下来的三种方法要好得多,并且具有一些有用的特点:

  • f-strings
  • .format()
  • % 运算符
f-strings

在 Python 3.6 及更高版本中,增加了一种新的字符串插值方式,即 f-string。
使用时是在字符串前添加前缀 “f” 或 “F”。

words = 5
concat_str = f"This string has {words} words"

注意,插值的值不必是字符串类型

这种方法提供了一些配置能力,例如:定义浮点数显示的小数位数。

num1 = 3.141592
num2 = 6.6743
concat_str = f"2个小数位: {num1:.2f} 和 4个小数位: {num2:.4f}"
print(concat_str)

-> 输出: “2 位小数: 3.14 和 4 位小数: 6.6743”

.format()

.format() 方法是另一种字符串插值的方式,但它有一个显著的特点:它使用惰性求值
惰性求值和急切求值的概念都值得专门写一篇博客,如果你想看到关于它们的博客,请告诉我😉。

使用它的方法如下:

day = "saturday"
month = "may"
concat_str = "current day and month: {day},{month}".format(day=day,month=month)
print(concat_str)

-> 输出: “当前日期和月份: 星期六, 五月”

模数 (%) 运算符

一种更“原始”的插值方法,在C语言格式化字符串时也会出现。
它通过在我们希望打印值的位置放置 % 图标来使用,旁边是其类型和其他标志,例如要显示的小数位数。

day = "saturday"
hour = 12.06
concat_str = "day: %s, hour: %.2f" % (day, hour)
print(concat_str)

-> 输出: “日期: 星期六, 时间: 12.06”

 

✅-❎ 内联条件

内联条件是一种通过减少行数来简化表达式的酷方法,并消除传统 if 语句的一些冗长。

内联条件的一般语法如下:

expression_if_true if condition else expression_if_false

 

以下是 Python 中内联条件的一个示例:

value = True
print("value is True") if value else print("value is False")

-> 输出: “value is True”

 

另一个示例,操作变量的值:

value = False
num = 1 if value else 0
print(num)

-> 输出: 0

 

[🧾] 列表推导式

列表推导式是一种从另一个可迭代变量中以单行代码创建列表(或其他数据集合类型)的方法。

假设我们有一个名为 fruits 的水果列表

fruits = ["apple", "banana", "pear", "peach"]

我们想要创建另一个列表,包含名称中带有字母 p 的水果,使用的列表推导式如下所示:

fruits_with_p = [fruit for fruit in fruits if "p" in fruit]

上述代码行的含义是:“如果元素fruit中包含字母‘p’,则该元素将是列表fruits的一个fruit元素。”

列表推导通常需要一些关于如何创建内联条件的知识,正如你可能已经看到的那样。

 

另外,需要注意的一点是,列表推导通常比等效的for循环表达式要快。这主要是因为列表推导将计算更有效地转移到C语言,而不是使用Python的计算。

(kudos to u/toastedstapler – https://www.reddit.com/r/learnpython/comments/i28kcn/why_are_list_comprehensions_so_much_faster_than/

❗然而 列表推导式在不加考虑地使用时,已知会降低代码的可读性,因此请勿滥用它们的强大功能。

 

 Lambda 函数

Lambda 函数(也称为匿名函数)基本上是简短、简洁且通常不值得声明为传统函数的函数定义。
它们可以被视为某种内联函数声明。

它们的语法是

lambda arguments : expression

尽管可以像以下示例一样内联声明并在需要时调用 lambda 函数,但这并不是它们的主要用途。

day_and_month = lambda day, month : print(f'day: {day}, month: {month}')
day_and_month("saturday", "may")
-> 输出: “day: saturday, month: may”

 

通常,lambda 函数作为参数用于生成器函数,如 map(),并且在数据科学中经常使用。
以下是使用 lambda 函数作为参数的示例

celsius_temps = [0, 20, 25, 30, 37]
fahrenheit_temps = list(map(lambda c: (c * 9/5) + 32, celsius_temps))
print(fahrenheit_temps)
-> 输出: [32.0, 68.0, 77.0, 86.0, 98.6]

上述代码使用一个匿名函数将摄氏度转换为华氏度,并将其应用于 celsius_temp 列表中的每个元素。

 

通常,lambda 函数可以被列表推导式替代,在这种情况下的代码如下:

celsius_temps = [0, 20, 25, 30, 37]
fahrenheit_temps = [c * 9/5 + 32 for c in celsius_temps]
print(fahrenheit_temps)
-> 输出: [32.0, 68.0, 77.0, 86.0, 98.6]

因此,每种实现的使用取决于程序员和当时的具体需求。

💡 类型提示

类型提示是一种有用的方法,可以使你的代码更具可读性和易于调试。
Python 是一种动态类型语言,这意味着变量在创建时并没有特定的数据类型。

 

类型提示可以帮助IDE或代码检查软件理解代码,并在出现错误或警告时提供更好的洞察。

 

变量在创建时可以进行类型提示,也可以在函数的预期参数中进行类型提示。

 

创建变量时类型提示的示例:

a:int = 5

b:float = 3.5
s:str = "string"
l:list = [a, b, s]

定义函数时类型提示的示例:

# 在列表中搜索一个单词并返回其索引的函数
def search_in_list(original_list:list, word:str) -> int:
    for i,elem in enumerate(original_list):

if elem == word:
    return i 
return -1
使用这种技术,你的代码可读性和调试的便利性将大大提升。

希望你觉得这些知识有用!如果你有任何想法,欢迎评论!
另外,如果你对机器学习、计算机视觉或健身感兴趣,我建议你查看我关于最新副项目 FitVision 的开发日志系列 👀 https://dev.to/ceir/fitvision-devlog-1-3a0i

更多