Как определить, является ли переменная int или списком для l oop in Python - PullRequest
1 голос
/ 21 февраля 2020

Я хочу написать функцию, которая принимает в качестве параметра int или список int и обрабатывает эти значения.

что-то вроде этого:

def func(input):
  if isinstance(input, int):
    print(input)
  else:
    for i in input:
      print(i)

это не выглядит очень pythoni c для меня, но я не знаю, как сделать это лучше. Есть ли способ "l oop" над int или "упаковать" int в список, который обрабатывает обе опции

Спасибо

Ответы [ 5 ]

3 голосов
/ 21 февраля 2020

Вы также можете следовать принципу pythoni c EAFP ( Проще просить прощения, чем разрешение )

def func(your_input):
    try:
        for i in your_input:
            print(i)
    except TypeError:
        print(your_input)

Вы пытаетесь повторить для записей в введите и распечатайте их. Если тип ввода не повторяется (например, int ), то при попытке выполнить итерацию по не повторяемому объекту возникает исключение TypeError. В предложении except вы можете затем напечатать ввод.

EDIT : Как отметил @buran, input является зарезервированным ключевым словом для Python, поэтому вам следует избегать его.

2 голосов
/ 21 февраля 2020

Ради полноты, в дополнение к ответу @jcf, вы можете использовать functoools.sigledispatch (или functools.singledispatchmethod если в классе) позволяет перегрузить функцию с другой реализацией в зависимости от типа первого аргумента

from functools import singledispatch

@singledispatch
def func(foo):
    print(foo)

@func.register(list)
def _(foo):
    for item in foo:
        print(item)

func(1)
func([2, 3, 4])

Теперь вопрос в том, что вы будете делать, если вы получите что-то отличное от списка, например, кортеж или генератор и т. д. c. Возможно, вы захотите использовать абстрактные классы из collection.ab c вместо list

На заметку на стороне - не используйте input в качестве имени - это встроенный в функции.

2 голосов
/ 21 февраля 2020

Я бы не стал так сильно беспокоиться о том, что Pythoni c или нет. Но вот еще один способ, которым вы могли бы сделать это, который не ограничивает вас списками или целочисленными значениями, а проверяет, есть ли у вас итерация или нет:

def func(input):
    if not hasattr(input, '__iter__'):
        input = [input]

    for i in input:
        print(i)

Но другой потенциально более чистый вариант для рассмотрения может быть следующим :

def func(*inputs):
    for i in inputs:
        print(i)

Вы бы назвали эту функцию немного по-другому: func(5) для скаляров и func(*lst) для итераций.

0 голосов
/ 21 февраля 2020
if type(input) == int:
    print('Integer')
    # Do integer operation
elif isinstance(input, list):
    print('List')
    # Do list operation 
0 голосов
/ 21 февраля 2020
def func(input):
    for i in ([input] if isinstance(input, int) else input):
        print(i)

"упаковывает" int в список так, как вы хотели, но я не думаю, что он более элегантен, чем ваш оригинальный код.

...