第二个论点三强制

时间:2018-07-09 16:51:17

标签: python-3.x function python-3.6

我有一个模仿range()的函数。我被困在某一点。我需要能够使第一个(x)和第三个(step)参数为可选,但中间一个 参数(y)是强制性的。在下面的代码中,除了两条注释行之外,其他所有东西都起作用。

如果仅传递一个参数,我该如何构造函数以接受单个传递的参数作为强制(y)参数?

我不能这样做:def float_range(x = 0,y,step = 1.0):

非默认参数不能跟随默认参数。

def float_range(x, y, step=1.0):
    if x < y:
        while x < y:
            yield x
            x += step
    else:
        while x > y:
            yield x
            x += step


for n in float_range(0.5, 2.5, 0.5):
    print(n)

print(list(float_range(3.5, 0, -1)))

for n in float_range(0.0, 3.0):
    print(n)

# for n in float_range(3.0):
#     print(n)

输出:

0.5 1.0 1.5 2.0 [3.5, 2.5, 1.5, 0.5] 0.0 1.0 2.0

1 个答案:

答案 0 :(得分:1)

您必须使用哨兵值:

def float_range(value, end=None, step=1.0):
    if end is None:
        start, end = 0.0, value
    else:
        start = value

    if start < end:
        while start < end:
            yield start
            start += step
    else:
        while start > end:
            yield start
            start += step

for n in float_range(0.5, 2.5, 0.5):
    print(n)
#  0.5
#  1.0
#  1.5
#  2.0

print(list(float_range(3.5, 0, -1)))
#  [3.5, 2.5, 1.5, 0.5]

for n in float_range(0.0, 3.0):
    print(n)
#  0.0
#  1.0
#  2.0

for n in float_range(3.0):
    print(n)
#  0.0
#  1.0
#  2.0

顺便说一句,numpy实现了arange,这实际上是您要重塑的内容,但它不是生成器(它返回一个numpy数组)

import numpy

print(numpy.arange(0, 3, 0.5))
# [0.  0.5 1.  1.5 2.  2.5]