Уведомления

Группа в Telegram: @pythonsu

#1 Март 23, 2017 21:23:11

Bilbo
Зарегистрирован: 2017-03-23
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

"" in string = true

Начинаю изучай Python и случайно столкнулся с такой ситуацией. Пользователь вводит букву, далее его эта буква ищется в строке. Случайно пользователь ввел пустую строку и… она нашлась в строке!

 >>>"" in "строка"
True

Не могу понять почему такая рекация? Так и должно быть?
При этом
 >>>"" in ("строка1")
True
Но
 >>>"" in ("строка1", "строка2")
False

Офлайн

#2 Март 23, 2017 22:42:18

4kpt_V
От: Харьков
Зарегистрирован: 2017-02-19
Сообщения: 299
Репутация: +  12  -
Профиль   Отправить e-mail  

"" in string = true

Частью строки является символ, часть набора является его элемент.

Вот тут вот набор не создается

 "" in ("строка1")

Это равносильно

 "" in "строка1"

Чтобы сделать набор из одного элемента, нужно

 "" in ("строка1",)

Офлайн

#3 Март 24, 2017 03:15:46

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9726
Репутация: +  843  -
Профиль   Отправить e-mail  

"" in string = true

Bilbo
Не могу понять почему такая рекация? Так и должно быть?
Да, потому что, например, строка “ab” содержит три пустые строки: перед a, между a и b, после b.


Bilbo
Но
  
>>>"" in ("строка1", "строка2")
False
Это поиск в кортеже. Операция in применима почти ко всем встроенным типам. В строке операция in ищет строку, а в кортеже операция in ищет элемент.


Чтобы проверить своё условие, тебе надо сначала убедиться, что строка не пустая, а потом уже, если она не пустая, искать её в другой строке.
  
>>> s = ''
>>> if s and s in 'abc':
...   True
... else:
...   False
... 
False
>>> 
>>> s = 'b'
>>> if s and s in 'abc':
...   True
... else:
...   False
... 
True
>>>



Отредактировано py.user.next (Март 24, 2017 03:18:08)

Офлайн

#4 Март 24, 2017 06:22:11

Bilbo
Зарегистрирован: 2017-03-23
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

"" in string = true

С кортежами понял, спасибо. А вот со словами, как последовательностями символов все равно не разобрался.
Например, так:

 s = "привет"
if "" in s:
    print ("True")

Как я понимаю логику работы, Python последовательно сравнивает пустую строку “” (элемент) с каждым символом (элементом) слова “привет”. Но:
 "" != "п"
"" != "р"
"" != "и"
...
"" != "т"

Ни один символ строки не равен пустой строке.

Мне кажется логичным, что если “” in “привет” дает положительный результат, то я должен иметь возможность сослаться (получить индекс) на элемента “” в строке “привет”. Поэтому попробовал сделать так:
 s.find("")
и получил ответ
 0
Потом сделал так:
 s.find("п")
и получил тот же ответ
 0
Получается странная вещь, одной позиции в строке соответствует одновременно два элемента.

ИМХО, мне кажется, что здесь ошибка в логике работы Python и поиск пустой строки в строке должен всегда давать False.

Отредактировано Bilbo (Март 24, 2017 06:32:25)

Офлайн

#5 Март 24, 2017 06:38:13

Shaman
Зарегистрирован: 2013-03-15
Сообщения: 1369
Репутация: +  88  -
Профиль   Отправить e-mail  

"" in string = true

что по-вашему должны возвращать

 '' in ''
?
 'aaa'.split('a')
?

Офлайн

#6 Март 24, 2017 06:56:13

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9726
Репутация: +  843  -
Профиль   Отправить e-mail  

"" in string = true

Bilbo
 s = "привет"
пустота п пустота р пустота и пустота в пустота е пустота т пустота

Bilbo
  s.find("")
и получил ответ
0
Эта пустая строка там есть, но в неё не входит ни один символ.
  
>>> ''[0]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: string index out of range
>>>



Офлайн

#7 Март 24, 2017 09:07:34

Bilbo
Зарегистрирован: 2017-03-23
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

"" in string = true

Shaman, py.user.next, спасибо. Мой уровень пока не высок, разобраться даже в ответах сложно. Пример со сплитом мне показался очень показательным. Как написал py.user.next, до и после каждого символа - пустота. Спасибо.

Офлайн

#8 Март 24, 2017 09:09:59

wallet
Зарегистрирован: 2016-02-21
Сообщения: 50
Репутация: +  2  -
Профиль  

"" in string = true

Bilbo
Мне кажется логичным, что если “” in “привет” дает положительный результат, то я должен иметь возможность сослаться (получить индекс) на элемента “” в строке “привет”.

 >>> "привет"[0:0] == ''
True
>>> 
"привет"[1:1] == ''
True
...

Если представить работу оператора in в виде цикла проверяющего все возможные значения, срезами на основании длины строки которую необходимо найти

 p = ''
s = "привет"
for i,n in enumerate(s):
    if s[i:i + len(p)] == p:
        print(True)
        break

так как длина пустой строки равна “0” проверяется
  s[0:0+0]=='', s[1:1+0]=='', s[2:2+0]=='' ....

Отредактировано wallet (Март 24, 2017 09:10:31)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version