Есть ли способ передать массив-диапазон в качестве аргумента функции? Что-то вроде:Передача массива в качестве аргумента функции?
> blah(ary,arg1=1:5)
def blah(ary,arg1): print ary[arg1]
Есть ли способ передать массив-диапазон в качестве аргумента функции? Что-то вроде:Передача массива в качестве аргумента функции?
> blah(ary,arg1=1:5)
def blah(ary,arg1): print ary[arg1]
Python принимает 1:5
синтаксис только в квадратных скобках. Интерпретатор преобразует его в объект slice
. Затем метод __getitem__
объекта применяет срез.
Посмотрите на numpy/lib/index_tricks.py
для некоторых функций, которые используют это. На самом деле это не функции, а классы, которые определяют свои собственные методы __getitem__
. Этот файл может дать вам идеи.
Но если вы не до этого, то возможности включают в себя:
blah(arr, slice(1, 5))
blah(arr, np.r_[1:5])
nd_grid
, mgrid
, ogrid
расширить понятие 'срез', чтобы принять воображаемую 'шаг' значение:
mgrid[-1:1:5j]
# array([-1. , -0.5, 0. , 0.5, 1. ])
Просто имейте в виду, что все, что расширяется на фрагменте перед передачей его функции blah
, не знает о форме другого аргумента. Так np.r_[:-1]
просто возвращает []
.
И None
может использоваться в slice
: например. slice(None,None,-1)
эквивалентен [::-1]
.
Как проверить, является ли аргумент, который я получил, slice() по сравнению с обычным номером? Я получил это isststance (x, slice) – user1019129
вы можете попробовать, как это:
def blah(ary, arg):
arg = map(int, arg.split(":"))
print ary[arg[0]:arg[1]]
blah([1,2,3,4,5,6],"2:5")
выход:
[3, 4, 5]
Вы можете использовать функцию slice
>>> def blah(ary,arg1):
... print ary[arg1]
>>> blah(range(10), slice(1, 5))
[1, 2, 3, 4]
['slice (1, 5)'] (https://docs.python.org/2/library/functions.html#slice) - это то, что вы ищете. –