def no_six_in_range(start, end): print(sum('6' not in str(i) for i in range(start, end + 1))) no_six_in_range(6, 12)
“sum()函数返回一个数字,即可迭代对象中所有项的总和.”所以我的问题是,在这个方程中求和是如何工作的,因为求和是把迭代加在一起的,但是当你运行代码的时候,它给出的数字比给定的数字要小,如果有人能给我解释一下,我会很感激的。
ozxc1zmp1#
这里只计算没有任何数字的数字"6"。注意,这里的可迭代对象是整个生成器表达式expr_a for expr_b in expr_c。这里求和的值(expr_a)
"6"
expr_a for expr_b in expr_c
expr_a
'6' not in str(i)
是bool值(True或False)。bool是int的子类,因此对它们求和就是对一串1和0求和。比较,例如:
bool
True
False
int
1
0
>>> True + True 2
jk9hmnmh2#
如果运行以下代码:
def no_six_in_range(start, end): print(list('6' not in str(i) for i in range(start, end + 1))) no_six_in_range(6, 12)
您将获得:
[False, True, True, True, True, True, True]
因此,如果将它们相加,则会得到6,因为每个True为1,False为0
t5zmwmid3#
根据Python文档,5.1.3.列表解析列表解析提供了一种简洁的方法来创建列表,常见的应用是创建新的列表,其中每个元素都是对另一个序列或可迭代序列的每个成员进行某些操作的结果,或者创建满足特定条件的元素的子序列。列表解析求值为一个列表,就像求和函数声明的那样,它是一个可迭代的。语法通常为:
l = [ iterator for iterator in iterable ]
例如:
my_list_comprehension = [ i for i in range(10) ]
在本例中,代码实际上使用了一个 * Generator * 解析,它生成一个生成器而不是一个列表。生成器也可以被迭代。生成器解析的语法与列表的语法相同,只是用[]替换了()。所以
'6' not in str(i) for i in range(start, end + 1)
当 * i * 经过 * range(start,end +1)* 时,将(不在str(i)中的"6")追加到生成器正如其他答案所解释的那样,你可以打印出这些论点来弄清楚到底发生了什么,就像这样:
最后一个布尔数组通过求和转换成整数,然后相加。关于generators in python的更多信息。
3条答案
按热度按时间ozxc1zmp1#
这里只计算没有任何数字的数字
"6"
。注意,这里的可迭代对象是整个生成器表达式expr_a for expr_b in expr_c
。这里求和的值(expr_a
)是
bool
值(True
或False
)。bool
是int
的子类,因此对它们求和就是对一串1
和0
求和。比较,例如:
jk9hmnmh2#
如果运行以下代码:
您将获得:
因此,如果将它们相加,则会得到6,因为每个True为1,False为0
t5zmwmid3#
根据Python文档,
5.1.3.列表解析列表解析提供了一种简洁的方法来创建列表,常见的应用是创建新的列表,其中每个元素都是对另一个序列或可迭代序列的每个成员进行某些操作的结果,或者创建满足特定条件的元素的子序列。
列表解析求值为一个列表,就像求和函数声明的那样,它是一个可迭代的。
语法通常为:
例如:
在本例中,代码实际上使用了一个 * Generator * 解析,它生成一个生成器而不是一个列表。生成器也可以被迭代。生成器解析的语法与列表的语法相同,只是用[]替换了()。
所以
当 * i * 经过 * range(start,end +1)* 时,将(不在str(i)中的"6")追加到生成器
正如其他答案所解释的那样,你可以打印出这些论点来弄清楚到底发生了什么,就像这样:
最后一个布尔数组通过求和转换成整数,然后相加。
关于generators in python的更多信息。