Я решаю задачи из CodeWars и пытаюсь решить одну из них.
У меня есть вопросы относительно одного из моих шагов по решению этой проблемы.
Я хочу превратить строку в список, где каждый элемент списка представляет собой части строки, разделенные запятой.
Вот моя попытка:
strg = "01|15|59, 1|47|6, 01|17|20, 1|32|34, 2|3|17"
def stat(strg):
strg = [x.split() for x in strg.split(',')]
я ожидал
strg[0] = 01|15|59
но я получаю
strg[0] = 0
и я не понимаю почему, ведь я просил разделить на ",".
Дополнительный вопрос: Думая, я запутался... Согласно приведенному выше контексту, может ли кто-нибудь объяснить мне разницу между:
strg[0]
stat(strg[0])
stat[0]
Я распечатал разные результаты, чтобы посмотреть, но поскольку я создаю функцию, у меня возникнет соблазн использовать stat(strg[0]) или stat[0] вместо strg[0] для проверки первого значения списка?
Я предполагал, что это будет то же самое, поскольку я объявляю переменную перед функцией, а затем использую ее внутри этой функции? strg не «обновляется» после входа в функцию? (также новый для Python)
stat(strg)
должен return strg
чтобы вы могли сделать strg_parts = stat(strg)
Вы можете просто использовать strg= strg.split(', ')
(обратите внимание на пробел после запятой). Вы делите его на два раза. Вы также не изменяете исходную строку, потому что ваша функция ничего не возвращает.
По сути, ваш главный вопрос заключается в том, что, я думаю, вы ожидаете, что функция изменит неизменяемую строку strg
. Но Python работает не так.
strg
внутри функции — это совершенно другой объект, чем объект вне функции. Когда вы меняете strg
внутри функции, а затем функция завершает работу, этого strg
вполне может и не быть.
Вероятно, вы захотите вернуться из функции.
def stat(strg):
return [x.split() for x in strg.split(',')]
>>> stat(strg)[0]
['01|15|59']
Главный вывод здесь — именование и привязка, часто называемые областью действия.
Я собираюсь переименовать для вас некоторые переменные, потому что думаю, что имена ваших переменных и область их существования сбивают вас с толку.
original_strg = "01|15|59, 1|47|6, 01|17|20, 1|32|34, 2|3|17"
def stat(temp_strg):
return temp_strg.split(', ') # added a space after the comma
new_strg = stat(original_strg)
print(new_strg)
С тем, что у вас было, вот что пошло не так:
strg = "01|15|59, 1|47|6, 01|17|20, 1|32|34, 2|3|17"
def stat(strg): # this function doesn't return anything
strg = [x.split() for x in strg.split(',')]
# this will end up being strg = [['01|15|59'], ['1|47|6'], ['01|17|20'], ['1|32|34'], ['2|3|17']]
stat(strg) # this is only modifying strg within the stat function NOT the original
print(strg) # so this is printing the original
print(strg[0]) # this is just getting the first character of this original
print(stat(strg[0])) # this will end up being [['0']] because you're only giving it the first character of strg
print(stat[0]) # this isn't valid unless you did stat(strg)[0]
Вы не используете свою функцию stat
. Кроме того, вам следует вернуться, а не изменять локальную переменную напрямую.
Функция split
разбивает строку на список, где каждое слово является элементом списка, поэтому результатом уже является список.
strg = "01|15|59, 1|47|6, 01|17|20, 1|32|34, 2|3|17"
def stat(strg):
return strg.split(',')
Результат функции stat
:
>>> stat(strg)
['01|15|59', ' 1|47|6', ' 01|17|20', ' 1|32|34', ' 2|3|17']
Вы можете забрать первый пункт списка:
>>> stat(strg)[0]
'01|15|59'
Чтобы ответить на Ваши дополнительные вопросы,
strg
— это строковый объект, поэтому он работает как список символов. Если вы наберете strg[0]
, вы получите первый элемент строки.
>>> strg[0]
'0'
Ваша функция stat
разделяет аргумент на ", "
, но strg[0]
не содержит ", "
, поэтому функция stat
возвращает список только с аргументом.
>>> stat(strg[0])
['0']
>>> stat(strg[0])[0]
'0'
Наконец, функцию stat
нужно к чему-то применить. Здесь вы хотите получить первый элемент функционального объекта, что невозможно.
>>> stat
<function stat at 0x00000264A22BB920>
>>> stat[0]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'function' object is not subscriptable
с уважением,
У вас есть
strg
вне функцииstat
, а также внутри нее. Какой из них вы тестируете?