* 在 python 中对 range() 做了什么?

What does * do with range() in python?

我正在做一个 Hackerrank python 问题,任务是打印 123...N(其中 N 是输入) 不使用任何字符串函数。

有人评论了一个解决方案是:

print(*range(1, int(input())+1), sep='')

我的问题是:

  1. 这个 range() 函数这里的 * 有什么用?
  2. 为什么我们不能仅在打印中使用 range() 函数来做到这一点?
  3. 还有其他方法吗?

* "unpacks" 一个可迭代的,这样每个元素都作为一个单独的参数传递,而不是将可迭代对象作为单个参数接收的函数:

>>> print(range(1,3))
range(1, 3)
>>> print(*range(1,3))
1 2
>>> print(1,2)
1 2

range 会给你一个可迭代的,一个现成的对象,当使用它时会给你单独的值。尝试在没有 * 的情况下打印它,它将调用对象 __str__() 魔术方法并打印 range(start, end).

在调用函数时加星号将从可迭代对象中提取所有值并将它们作为 "comma separated" 参数传递给函数。这就是所谓的拆包。

你正在执行这个,本质上,

n = int(input())
print(*range(1, n + 1), sep='')

1.) star *args syntax 允许您从可迭代对象中填充参数。例如,这些都是等价的:

def foo(a, b):
    return a + b

foo(1, 2)
lst = [1, 2]
foo(*lst)
tup = (1, 2)
foo(*tup)

2.) 当然你可以只使用 range 而无需解压 *args。请参阅下一项。

3.) 另一种方法是 printfor 循环中,或者更紧凑地创建字符串 s:

s = "".join(map(str, range(1, n + 1)))
print(s)