这个作业中的逗号是做什么的?
What is the comma doing in this assignment?
我对 Python 语法不是很熟悉,想知道是否有人可以向我解释变量 match
是如何处理在 for
表达式中找到的字符串的这个函数:
def find_project(project_name):
projects = get_projects()
try:
match, = (proj for proj in projects if proj["name"].strip() == project_name)
return match
except ValueError:
return None
Python 允许您一次分配多个变量,如下所示:
a, b = 1, 2
其工作方式是将赋值 a, b
的左侧视为一个元组,并将右侧元组 1, 2
中的每个元素赋值给它。
因为元组只能有一个元素,所以下面的方法也有效:
a, = 1,
多重赋值的右侧不一定是元组。只要每边的元素数量相同,任何迭代都可以:
a, b, c = "three little pigs".split()
如果元素数量不匹配:
a, b, c = "oh", "no"
...你得到一个 ValueError
:
ValueError: not enough values to unpack (expected 3, got 2)
将以上所有内容放在一起,则您的函数:
def find_project(project_name):
projects = get_projects()
try:
match, = (proj for proj in projects if proj["name"].strip() == project_name)
return match
except ValueError:
return None
... 遍历 generator expression
(proj for proj in projects if proj["name"].strip() == project_name)
... 如果结果有一个元素,则将该元素分配给 match
。如果不是,则引发 ValueError
(并被 except
子句捕获),不会发生赋值,并返回 None
。
注意两点:
逗号,
阅读代码时容易漏掉。另一种方法是在左侧使用列表语法:
[match] = (proj for proj in projects if proj["name"].strip() == project_name)
...效果相同
当右侧是生成器表达式(或其他类型的 iterator), you can use next()
且具有默认值时:
def find_project(project_name):
projects = get_projects()
it = (proj for proj in projects if proj["name"].strip() == project_name)
return next(it, None)
...更短且更易读。
我对 Python 语法不是很熟悉,想知道是否有人可以向我解释变量 match
是如何处理在 for
表达式中找到的字符串的这个函数:
def find_project(project_name):
projects = get_projects()
try:
match, = (proj for proj in projects if proj["name"].strip() == project_name)
return match
except ValueError:
return None
Python 允许您一次分配多个变量,如下所示:
a, b = 1, 2
其工作方式是将赋值 a, b
的左侧视为一个元组,并将右侧元组 1, 2
中的每个元素赋值给它。
因为元组只能有一个元素,所以下面的方法也有效:
a, = 1,
多重赋值的右侧不一定是元组。只要每边的元素数量相同,任何迭代都可以:
a, b, c = "three little pigs".split()
如果元素数量不匹配:
a, b, c = "oh", "no"
...你得到一个 ValueError
:
ValueError: not enough values to unpack (expected 3, got 2)
将以上所有内容放在一起,则您的函数:
def find_project(project_name):
projects = get_projects()
try:
match, = (proj for proj in projects if proj["name"].strip() == project_name)
return match
except ValueError:
return None
... 遍历 generator expression
(proj for proj in projects if proj["name"].strip() == project_name)
... 如果结果有一个元素,则将该元素分配给 match
。如果不是,则引发 ValueError
(并被 except
子句捕获),不会发生赋值,并返回 None
。
注意两点:
逗号
,
阅读代码时容易漏掉。另一种方法是在左侧使用列表语法:[match] = (proj for proj in projects if proj["name"].strip() == project_name)
...效果相同
当右侧是生成器表达式(或其他类型的 iterator), you can use
next()
且具有默认值时:def find_project(project_name): projects = get_projects() it = (proj for proj in projects if proj["name"].strip() == project_name) return next(it, None)
...更短且更易读。