необязательный аргумент Python - PullRequest
2 голосов
/ 10 июля 2020

Необходимо написать код, определяющий функцию, которая будет работать с двумя или тремя аргументами.

Функция должна принимать три параметра:

  • температура, число с плавающей точкой
  • weather, строка
  • is_celsius, логическое

Функция должна возвращать True, если температура ниже точки замерзания (32, если is_celsius имеет значение False, 0, если is_celsius равно True) или если погода «снежная». В противном случае он должен вернуть False.

Обратите внимание, однако, что is_celsius должен быть необязательным аргументом. Если вызов функции не предоставляет значение для is_celsius, предположим, что оно истинно.

Я написал это

def snowed_in(temperature, weather, **cels):
    if weather =="snowy":
        return True
    elif weather=="sunny":
        if 'is_celsius = False' in cels:
            if temperature<32:
                return True
    elif 'is_celsius = True' in cels:
        if temperature<0:
            print ('ad')    
            return True
    elif 'is_celsius = True' not in cels:
        if temperature<0:
            return True
    else:
        return False

и для следующих вызовов

print(snowed_in(15, "sunny")) #Should print False
print(snowed_in(15, "sunny",is_celsius = False)) #Should print True
print(snowed_in(15, "snowy",is_celsius = True)) #Should print True

I Я получаю

None
None
True

Может ли кто-нибудь помочь мне найти, что не так с моим кодом?

Ответы [ 2 ]

4 голосов
/ 10 июля 2020

Это не та ситуация, когда имеет смысл использовать **kwargs - который обычно используется для функций-оберток.

Вы должны просто сделать что-то вроде этого, чтобы явно объявить is_celsius как необязательный аргумент :

def snowed_in(temperature, weather, is_celsius=True):
    if weather == "snowy":
        return True
    elif is_celsius:
        return temperature < 0
    else:
        return temperature < 32

Однако, если есть веская причина для фиксации необязательных аргументов в словаре (возможно, вам также нужно передать его функции, которую вы обертываете), тогда вы можете извлечь соответствующий параметр, используя get с любым значением по умолчанию (иначе будет None):

def snowed_in(temperature, weather, **kwargs):
    if weather == "snowy":
        return True
    elif kwargs.get('is_celsius', True):
        return temperature < 0
    else:
        return temperature < 32
2 голосов
/ 10 июля 2020

Здесь есть несколько вещей, поэтому позвольте мне опубликовать правку в вашем коде и пройти через них вместе с вами:)

def snowed_in(temperature, weather, cels=True):
    if weather =="snowy":
        return True
    elif weather=="sunny":
        if not cels:
            if temperature<32:
                return True
    elif cels:
        if temperature<0:
            print ('ad')    
            return True
    else:
        return False

Логические выражения

Вы вводите is_celsius как логическое значение, но оцениваете его как строку, которая более чем немного странна.

Вместо того, чтобы пытаться сопоставить определенную строку c, т.е. 'is_celsius = True' in cels:, вы можете просто проверить состояние логического 'cels' ie if cels:

Аргументы по умолчанию

Если вызов функции не предоставляет значение для is_celsius, предположим, что это имеет значение True. ... python аргументы функции могут иметь значения по умолчанию.

Поэтому использование cels=True предпочтительнее **cels для желаемого поведения.

Теперь, cels=True будет передано в функцию, если cels не указано в вызове функции.

Синтаксис

Если вы новичок в Python проверьте PEP8 . Дело в том, что вы должны стараться не иметь пробелов между именем переменной и ее значением в аргументах функции, т.е. cels=True не cels = True.

Отступ

Я предполагаю, что это было артефактом того, что вы скопировали и вставили свой код. Но! Обратите внимание, что отступ в python очень важен. Обратите внимание на разницу между вашим кодом и моим примером выше ... это хорошая практика, чтобы ваш код имел правильный отступ, если вы копируете вставку его в переполнение стека / где-то еще. Облегчает чтение другим!

Удачи вам!

...