Как определить свою собственную функцию диапазона в Python - PullRequest
0 голосов
/ 28 октября 2019

Ниже я приложил домашнее задание. Пока что мой единственный код:

def myRange(start, stop=None, step=None):

    if stop == None:
        stop = start

    if step == None:
        step = 1

    while True:
        if step > 0 and start >= stop:
            break
        elif step < 0 and start <= stop:
            break
        yield ('%g' % start)
        start = start + step
        break

    lyst = myRange(start, stop=None, step=None)
    for num in lyst:
        print(num)

myRange(0, 10, 2)

Я пытаюсь избавиться от выражения yeild и оператора '% g' и заменить его оператором return, если кто-нибудь знает, как это сделать. ,Кроме того, я пытаюсь сделать так, чтобы это действительно работало как функция, и вы можете передавать в нее переменные и получать диапазон в виде списка, но я тоже не уверен, как это сделать. Любая помощь будет оценена. Я очень потерян на этом.

Определите и протестируйте функцию myRange. Эта функция должна вести себя как стандартная функция диапазона Python с обязательными и необязательными аргументами, но она должна возвращать список. Не используйте функцию диапазона в вашей реализации! (Подсказки: изучите справку Python по диапазону, чтобы определить имена, позиции и что делать с параметрами вашей функции. Используйте значение по умолчанию None для двух необязательных параметров. Если оба параметра равны None, то функция была вызвана с помощьютолько значение остановки. Если только третий параметр равен None, то функция также вызывается со стартовым значением. Таким образом, первая часть кода функции устанавливает, какие значения параметров должны быть или должны быть. код использует эти значения для построения списка путем счета вверх или вниз.)

Ответы [ 2 ]

0 голосов
/ 28 октября 2019
    myRange(start=None, stop=10, step=None):
  1. Работа с stop=10

    Вы устанавливаете значение по умолчанию stop = 10. Тем не менее, вы создали было предложено имитировать встроенную функцию диапазона. Встроенный диапазон не имеет значения по умолчанию stop=10. Поэтому не устанавливайте значение по умолчанию в вашей версии, если в оригинале нет значения по умолчанию

  2. Минимальное количество необходимых аргументов

    У вашего myRange есть 3 значения по умолчаниюаргументы. Вы когда-нибудь видели следующий код?

    for x in range():
        print(x)
    

    Подсказка: range требуется хотя бы один аргумент.

  3. Значение по умолчанию для запуска

    10 - остановка. Какое первое число напечатано следующим кодом? Это 0? Это 1? 2? 5? 10? Что это?

    for x in range(10):
        print(x)
    
  4. Поместите print за пределы myRange

    Блок кода с отступом не должен содержать каких-либо операторов печати

    def myRange(start=None, stop=10, step=None):
        lyst = (list(range(stop)))
        # print (lyst) Noooo!
    
    lyst = myRange()
    print(lyst) # YES!
    
  5. Вам нужен оператор return

Если у функции есть вывод, мы пишем return output Вы должны вернуть list

Эта функция должна вести себя как стандартная функция диапазона Python с обязательными и необязательными аргументами , но должна возвращать список .

    def myRange(start=None, stop=10, step=None):
        lyst = list(range(stop))
        # print (lyst) Noooo!
        return lyst # New feature! return the output:)

    lyst = myRange()
    print(lyst) # YES! 

Редактировать

Я решил дать вам подпись функции. Вам все равно придется заполнить тело. Не беспокойтесь о большей части кода, оставьте его в покое. Просто напишите свой код в самом конце, заменив print("start:", start, "stop:", stop, "step:", step)

is_none = lambda x:\
    x == None

count_non_none = lambda args, *, is_none=is_none: {\
    sum(1 for _ in filter(is_none, args))
}   

def myRange(_a1, _a2=None, _a3=None, *, start=None, stop=None, step=None):
    args_non_none   = count_non_none((_a1, _a2, _a3))
    kwargs_non_none = count_non_none((start, stop, step))
    total_non_none  = args_non_none + kwargs_non_none

    if total_non_none == 1:
        # the one arg represents `stop`
        assert(not start)
        assert(not step)
        stop = stop if stop else _a1            
    elif total_non_none == 2:
        if args_non_none == 2:
            start = _a1
            stop  = _a2
         else # at least one keyword argument
             assert(not (start and step))
             L = [_a1, _a2, _a3]
             while len(L) > 0:
                 if not start:
                     start = L.pop(0)
                 elif not stop:
                     stop = L.pop(0)
                 elif not step:
                     step = L.pop(0)
    elif total_non_none == 3:
        L = [_a1, _a2, _a3]
             while len(L) > 0:
                 if not start:
                     start = L.pop(0)
                 elif not stop:
                     stop = L.pop(0)
                 elif not step:
                     step = L.pop(0)                
    else:
        raise TypeError("more than 3 arguments were passed in")

    if start == None: 
        start = 0 
    if step == None: 
        step = 1 

    print("start:", start, "stop:", stop, "step:", step)         
0 голосов
/ 28 октября 2019

Python позволяет принимать любое количество аргументов и аргументов ключевых слов, например:

def myRange(*args, **kwargs):
    # do something

args будет кортежем, а kwargs - словарем. Например, вызов myRange (21, 'foo', name = 'shado') будет иметь аргументы be (21, 'foo') и kwargs be {'name': 'shado'}. args и kwargs не обязательно должны быть args и kwargs, но условно называть их так. используя это, я полагаю, вы можете построить некоторые условные выражения на основе длины аргументов

def myRange(*args):
    if len(args) == 1:
        start, end, step = 0, args[0], 1
     # conditionals for other cases

другой способ сделать это будет выглядеть так:

def myRange(start, stop=None, step=None):
    if stop == None and step == None:
        start, stop, step = 0, start, 1
    # handle the other conditions

в основном просто обрабатывая каждый случай отдельно

Для составления списка я бы использовал цикл while.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...