В Python обычно используются 4 скобки ()
.
\
. Это в основном стилистика.
decision = (is_female and under_30 and single
or
is_male and above_35 and single)
, скобка является альтернативным синтаксисом, чтобы избежать попадания в столбик 80 и использовать \
для продолжения инструкции.
В любых других случаях, например, внутри предикатов if
, while
, for
и return
я настоятельно рекомендую не использовать ()
, если это необходимо или удобство чтения (определяется 4 пунктами выше). Один из способов получить эту точку в том, что в математике (1)
и просто 1
означает точно то же самое. То же самое справедливо и в Python.
Люди, идущие из языков C-семейства, немного привыкнут к этому, потому что ()
необходимы в предикатах потока управления на этих языках по историческим причинам .
Последнее слово для операторов return
, если вы только возвращаете 1 значение, опустите ()
. Но если вы возвращаете несколько значений, нормально использовать ()
, потому что теперь вы возвращаете группировку, а ()
обеспечивает визуальную визуализацию. Однако этот последний момент стилистичен и подчинен предпочтению. Помните, что ключевые слова return
возвращают результат инструкции. Поэтому, если вы используете только ,
в своих операторах множественного присваивания и конструкциях кортежей, опустите ()
, но если вы используете ()
для распаковки значений и кортежей, используйте ()
, когда вы возвращаете несколько значений в return
. Держите его согласованным.
Вы могли бы сделать:
if [[ " ${arr[*]} " == *" d "* ]]; then
echo "arr contains d"
fi
Это даст ложные срабатывания, например, если вы ищете «a» - эта подстрока находится в объединенной строке, но не как элемент массива.
Самый безопасный способ - перебрать массив, пока не найдете элемент:
array_contains () {
local seeking=$1; shift
local in=1
for element; do
if [[ $element == $seeking ]]; then
in=0
break
fi
done
return $in
}
arr=(a b c "d e" f g)
array_contains "a b" "${arr[@]}" && echo yes || echo no # no
array_contains "d e" "${arr[@]}" && echo yes || echo no # yes
Вот «чистая» версия, в которой вы просто передайте имя массива, а не все его элементы
array_contains2 () {
local array="$1[@]"
local seeking=$2
local in=1
for element in "${!array}"; do
if [[ $element == $seeking ]]; then
in=0
break
fi
done
return $in
}
array_contains2 arr "a b" && echo yes || echo no # no
array_contains2 arr "d e" && echo yes || echo no # yes
FWIW, вот что я использовал:
expr "${arr[*]}" : ".*\<$item\>"
Это работает там, где нет разделителей в любом элементе массива или в целевой цели поиска. Мне не нужно было решать общий случай для моего приложения.
Вот еще один способ, который может быть быстрее, с точки зрения времени вычисления, чем повторение. Не уверен. Идея состоит в том, чтобы преобразовать массив в строку, усечь его и получить размер нового массива.
Например, чтобы найти индекс 'd':
arr=(a b c d)
temp=`echo ${arr[@]}`
temp=( ${temp%%d*} )
index=${#temp[@]}
Вы можете превратить это в функцию, подобную:
get-index() {
Item=$1
Array="$2[@]"
ArgArray=( ${!Array} )
NewArray=( ${!Array%%${Item}*} )
Index=${#NewArray[@]}
[[ ${#ArgArray[@]} == ${#NewArray[@]} ]] && echo -1 || echo $Index
}
. Тогда вы могли бы вызвать:
get-index d arr
, и она будет откликнуться назад 3, что было бы назначено с помощью:
index=`get-index d arr`
Если элементы массива не содержат пробелов, другое (возможно, более читаемое) решение будет:
if echo ${arr[@]} | grep -q -w "d"; then
echo "is in array"
else
echo "is not in array"
fi
1) Инициализировать массив arr
и добавить элементы
2) задать переменную для поиска SEARCH_STRING
3) проверить, содержит ли ваш массив элемент
arr=()
arr+=('a')
arr+=('b')
arr+=('c')
SEARCH_STRING='b'
if [[ " ${arr[*]} " == *"$SEARCH_STRING"* ]];
then
echo "YES, your arr contains $SEARCH_STRING"
else
echo "NO, your arr does not contain $SEARCH_STRING"
fi
BASH_ARGV
, чтобы проверить, было ли задано определенное слово в качестве аргумента, для которого требуется другое одноразовое настроение, без необходимости делать какой-то argparse
, который является излишним для Это дело.
– dragon788
1 June 2018 в 14:13
array=("word" "two words") # let's look for "two words"
grep
и printf
: (printf '%s\n' "${array[@]}" | grep -x -q "two words") && <run_your_if_found_command_here>
for
: (for e in "${array[@]}"; do [[ "$e" == "two words" ]] && exit 0; done; exit 1) && <run_your_if_found_command_here>
Для not_found результатов добавьте || <run_your_if_notfound_command_here>
Очевидные предостережения в стороне, если ваш массив действительно похож на тот, что указан выше, вы можете сделать
if [[ ${arr[*]} =~ d ]]
then
do your thing
else
do something
fi
d
будет соответствовать xdy
.
– Olaf Dietsche
16 January 2013 в 22:20
if [[ ${arr[*]} =~ $(echo '\<d\>') ]]
( source )
– Stefan van den Akker
9 August 2014 в 13:51
shift
требуется здесь – Lorinc Nyitrai 11 July 2014 в 12:43