Форум русскоязычного сообщества Ubuntu


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: Python 3 (Самообучение) - вопросы.  (Прочитано 14470 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн winlox

  • Автор темы
  • Новичок
  • *
  • Сообщений: 14
    • Просмотр профиля
Python 3 (Самообучение) - вопросы.
« : 11 Марта 2013, 00:49:16 »
Учусь по учебнику Саммерфилда.
Появился момент который я не могу понять.
Текст из учебника:
Для доступа к элементам последовательностей, Таким как символы в строках, в языке Python используются квадратные скобки ([ ]).пример кода:
>>>"Hard Times"[5]
'T'
>>>"giraffe"[0]
'g'
Вопрос:
Если я правильно понял, то команда [цифра] после str, покажет тот символ который стоит на том месте куда указывает цифра в [ ]. То есть если цифра [3], то покажет 3ю букву с лева направо.
И вопрос, что мне это дает? как этим можно воспользоваться на практике?

Немного поправлю первый вопрос. Забыл, что индекс начинается с [0].То есть, если после str написать [3] то покажет 4й символ.

Теперь по теме 2го вопроса.
Аргумент:
str - для текста.
int -для цифр.

Мы можем преобразовать используя конструкцию datatype(item).
пример:
>>>int("45")
45
>>>str(912)
'912'
Если я правильно понял, то типы элементов которые программой воспринимаются как текст, я могу преобразовать, чтобы программа элемент воспринимала как цифры и наоборот.
Зачем это нужно, и как это применяется на практике?
Что такое datatype(item)?

Оффлайн Phlya

  • Старожил
  • *
  • Сообщений: 2219
  • Фля, Цыганский барон, Винни Пух
    • Просмотр профиля
Re: Python 3 (Самообучение) - вопросы.
« Ответ #1 : 11 Марта 2013, 01:09:57 »
Ох. Чтобы извлекать элементы из последовательностей?
Чтобы по-разному работать с разными данными и отличать текст от не-текста?

Я не понимаю вопросов, наверное... Зачем понадобиться за тем и используйте.
Ubuntu 14.04 (Unity), MSI GE40

Оффлайн winlox

  • Автор темы
  • Новичок
  • *
  • Сообщений: 14
    • Просмотр профиля
Re: Python 3 (Самообучение) - вопросы.
« Ответ #2 : 11 Марта 2013, 01:16:47 »
Я не понимаю вопросов, наверное... Зачем понадобиться за тем и используйте.
Это мой первый язык программирования.
Я некогда раньше, нечем подобным не занимался.
Если сейчас, я не пойму то, о чем я у вас спрашиваю, какой смысл дальше читать?
Для меня, чтобы запомнить и усвоить материал, необходимо его понимать. Если я материал не связываю с тем, что понимаю, я его просто не запоминаю.

Xanych

  • Гость
Re: Python 3 (Самообучение) - вопросы.
« Ответ #3 : 11 Марта 2013, 01:20:51 »
 Я вот тоже не понимаю.
1. Извлечение элементов. Проход по строке в цикле while. Получения среза последовательности.
2. datatype(item) - это обобщение подобных операторов: int("45"),str(912),float("3.56"). datatype - тип данных(int,str,float,etc), item - элемент("45",912,"3.56",etc).
2.1. А зачем нужно преобразовывать данные между собой?
Ну, вот вам пример:
i=int(input("Введите число:"))
j=i/10
print("{0} разделить на 10 равно {1}".format(i,j))
--------
Вывод программы:

Введите число:20
20 разделить на 10 равно 2
По умолчанию все что вводится в программу имеет тип строки. Если не преобразовать полученное значение в целое число, то в момент выполнения:
j=i/10

Мы получим:
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for /: 'str' and 'int'

Оффлайн winlox

  • Автор темы
  • Новичок
  • *
  • Сообщений: 14
    • Просмотр профиля
Re: Python 3 (Самообучение) - вопросы.
« Ответ #4 : 11 Марта 2013, 01:33:58 »
Я вот тоже не понимаю.
1. Извлечение элементов. Проход по строке в цикле while. Получения среза последовательности.
зачем? для чего нужен этот срез?
2.1. А зачем нужно преобразовывать данные между собой?
Я тоже это спрашиваю. Не я же учебник писал. А из-за того, что не программировал, я не могу представить ситуацию в которой это необходимо.
Ну, вот вам пример:
i=int(input("Введите число:"))
j=i/10
print("{0} разделить на 10 равно {1}".format(i,j))
--------
Вывод программы:

Введите число:20
20 разделить на 10 равно 2
По умолчанию все что вводится в программу имеет тип строки. Если не преобразовать полученное значение в целое число, то в момент выполнения:
j=i/10

Мы получим:
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for /: 'str' and 'int'
То есть, по умолчанию все str? И поэтому нужно преобразовывать в int?

Пользователь решил продолжить мысль 11 Марта 2013, 01:47:00:
Парни, может не там спрашиваю? Может есть форум, для таких нубских вопросов? :idiot2:
« Последнее редактирование: 11 Марта 2013, 01:48:16 от winlox »

Xanych

  • Гость
Re: Python 3 (Самообучение) - вопросы.
« Ответ #5 : 11 Марта 2013, 01:48:21 »
Цитировать
зачем? для чего нужен этот срез?
1.Для чего он нужен вам, как программисту, пишущему программу?
 Ну, например, в фразе "WINE is not emulator" вам нужно получить  подстроку "is not":
>>>s="WINE is not emulator"
>>>s[5:11]
'is not'
Каким образом вы будете использовать полученную подстроку? Можете склеить из нее другую строку:
"
>>>s1="Hello,world!"
>>>s2="Bye,"+s1[6:]
>>>s2
'Bye,world!'
Когда будете работать со строками и другими последовательностями применение само придет.
2. При получении значения с stdin да, все строки. Строка универсальна - она может принять любое значение, хоть 1,хоть "asdaf". А вот тип int нет. "asd" - вызовет исключительную ситуацию.
   
Цитировать
И поэтому нужно преобразовывать в int?
   Если это вам нужно. В приведенном мной примере с делением - да. Нельзя разделить строку на целое число. Да вообще строки делить нельзя. Нет у них такой операции. Поэтому нужно преобразовать тип к целому.

Оффлайн winlox

  • Автор темы
  • Новичок
  • *
  • Сообщений: 14
    • Просмотр профиля
Re: Python 3 (Самообучение) - вопросы.
« Ответ #6 : 11 Марта 2013, 01:51:40 »
Nuclear Device,
все понял, спасибо большое :)

Оффлайн Daynin

  • Любитель
  • *
  • Сообщений: 88
    • Просмотр профиля
    • Google+
Re: Python 3 (Самообучение) - вопросы.
« Ответ #7 : 12 Марта 2013, 18:55:32 »
winlox,
кстати, попробуйте реализовать простейший шифратор, использующий шифр Цезаря. Там вам наверняка понадобится работать со строками.

К тому же. Получать элемент строки по индексу - на самом деле это всего лишь частный случай получения элемента коллекции по индексу. Таким же образом можно работать с массивами, например. вот там это достаточно часто применяется.

Допустим, у нас есть строка вида "Мама мыла раму". Попробуйте заменить в ней каждую вторую букву на букву "ё". Конечно, вы снова спросите, а зачем это вообще нужно... Именно это, вряд ли кому-то нужно, поэтому попробуйте создать массив с цифрами от 0 до 100. Затем пройдитесь по этому массиву и выведите на экран квадраты каждого второго числа, каждого пятого числа.

Но и это, по большому счету, не имеет практической пользы. Наиболее часто вызывают элемент по его индексу, когда наверняка знаю его индекс. При этом индекс не обязательно знать самому программисту, его можно получать динамически. Допустим, при реализации шифра Цезаря вам понадобится массив со всеми буквами русского языка. Потом нужно будет по шифруемому тексту пройтись в цикле. Для каждого символа шифруемого текста нам нужно получить индекс этого символа в нашем алфавите, затем к каждому этому индексу прибавить значение сдвига (на сколько будет сдвинут весь наш алфавит(об этому лучше где-то почитайте)) и вызвать по новому индексу новый символ. Когда мы полностью обойдем нашу шифруемую строку, то на выходе получим зашифрованный текст. В общем, я приложу исходник этого шифра с комментариями внутри. Там мы по индексу, вычисляемому динамически, вызываем нужный нам элемент.

(Нажмите, чтобы показать/скрыть)

P.S.
Подобные вопросы возникают только по неопытности. Вернее даже оттого, что перед вами никогда не стояло никаких программистских задач, которые бы потребовали применения средств языка для их решения. Попробуйте написать что угодно. Пусть даже самую простую программу. И когда перед вами появится задача реализации чего-либо, то вы уже сами начнете думать о том, как и какую конструкцию/элемент языка применять. Просто изучая теорию, вы не выучите язык и не разберетесь в нем.

Прошу прощения за некоторую скомканность изложения. Надеюсь, что помог.

P.P.S.

Давно ничего не писал на python, поэтому код может быть не совсем "pythonic".
« Последнее редактирование: 12 Марта 2013, 21:13:36 от Daynin »
Замечательный тут у вас форум! Много интересных людей.

Оффлайн Phlya

  • Старожил
  • *
  • Сообщений: 2219
  • Фля, Цыганский барон, Винни Пух
    • Просмотр профиля
Re: Python 3 (Самообучение) - вопросы.
« Ответ #8 : 12 Марта 2013, 19:40:34 »
% len(alphabet) зачем в конце строки для сдвига самого? Чтобы "зациклить"?
(Если нет, то Вы это упустили =))
Ubuntu 14.04 (Unity), MSI GE40

Оффлайн Daynin

  • Любитель
  • *
  • Сообщений: 88
    • Просмотр профиля
    • Google+
Re: Python 3 (Самообучение) - вопросы.
« Ответ #9 : 12 Марта 2013, 20:30:20 »
% len(alphabet) зачем в конце строки для сдвига самого? Чтобы "зациклить"?
(Если нет, то Вы это упустили =))

Сори, там была ошибка:
Код: (python) [Выделить]
new_shifted_symbol = alphabet[(source_text.index(s) + shift_value) % len(alphabet)]

нужно так:
Код: (python) [Выделить]
new_shifted_symbol = alphabet[(alphabet.index(s) + shift_value) % len(alphabet)]

А % len(alphabet) эта штука нужна для того, чтобы когда мы напишем слово с буквой "ё", например, и зададим значение сдвига равное 3, то не вывалится IndexError. В общем, да, чтобы "зациклить".
« Последнее редактирование: 12 Марта 2013, 20:32:38 от Daynin »
Замечательный тут у вас форум! Много интересных людей.

Оффлайн Phlya

  • Старожил
  • *
  • Сообщений: 2219
  • Фля, Цыганский барон, Винни Пух
    • Просмотр профиля
Re: Python 3 (Самообучение) - вопросы.
« Ответ #10 : 12 Марта 2013, 20:38:04 »
Классно, не знал про "зацикливание"! Всегда в таких случаях делал пробег в обратную сторону, потому что отрицательная нумерация работает.
Ubuntu 14.04 (Unity), MSI GE40

Оффлайн Daynin

  • Любитель
  • *
  • Сообщений: 88
    • Просмотр профиля
    • Google+
Re: Python 3 (Самообучение) - вопросы.
« Ответ #11 : 12 Марта 2013, 20:46:36 »
Классно, не знал про "зацикливание"! Всегда в таких случаях делал пробег в обратную сторону, потому что отрицательная нумерация работает.
Но в случае с отрицательными индексами, мы все равно не избавляемся от проблемы выхода за границы массива

Пользователь решил продолжить мысль 12 Марта 2013, 21:06:31:
winlox,
а вот еще вспомнил: в гугле при собеседовании на должность python-программиста одно время задавали задачки на знание языка и алгоритмов, так вот одной из таких задачек была задача по развороту строки. То есть, допустим дана строка "мама мыла раму", нужно получить полностью развернутую строку. В питоне это можно элегантно сделать при помощи срезов вот так:

Код: (python) [Выделить]
source = "мама мыла раму"
print(source[::-1])
« Последнее редактирование: 12 Марта 2013, 21:06:31 от Daynin »
Замечательный тут у вас форум! Много интересных людей.

Оффлайн Phlya

  • Старожил
  • *
  • Сообщений: 2219
  • Фля, Цыганский барон, Винни Пух
    • Просмотр профиля
Re: Python 3 (Самообучение) - вопросы.
« Ответ #12 : 12 Марта 2013, 21:23:30 »
Но в случае с отрицательными индексами, мы все равно не избавляемся от проблемы выхода за границы массива
Нет, избавляемся, потому что alphabet[1-3]=alphabet[-2] - валидное выржаение, в отличие от alphabet[len(alphabet)+1], которое мы можем получить при прямой итерации.
Ubuntu 14.04 (Unity), MSI GE40

Оффлайн Daynin

  • Любитель
  • *
  • Сообщений: 88
    • Просмотр профиля
    • Google+
Re: Python 3 (Самообучение) - вопросы.
« Ответ #13 : 12 Марта 2013, 23:07:35 »
Но в случае с отрицательными индексами, мы все равно не избавляемся от проблемы выхода за границы массива
Нет, избавляемся, потому что alphabet[1-3]=alphabet[-2] - валидное выржаение, в отличие от alphabet[len(alphabet)+1], которое мы можем получить при прямой итерации.
А откуда мы получим это самое [1-3]?То есть, как мы узнаем сколько нужно отнимать? Допустим я передал в качестве значения сдвига 500, что нужно сделать, чтобы получить корректный отрицательный индекс? Разницы ведь нет никакой получим мы IndexError в результате выполнения alphabet[len(alphabet) + 1] или в результате выполнения alphabet[-(len(alphabet) + 1)]
Замечательный тут у вас форум! Много интересных людей.

Оффлайн Phlya

  • Старожил
  • *
  • Сообщений: 2219
  • Фля, Цыганский барон, Винни Пух
    • Просмотр профиля
Re: Python 3 (Самообучение) - вопросы.
« Ответ #14 : 13 Марта 2013, 01:06:21 »
Любой сдвиг больший длины алфавита можно эквивалентно представить, как сдвиг меньший ее. Тогда ошибки с отрицательным индексом не будет.
Ubuntu 14.04 (Unity), MSI GE40

 

Страница сгенерирована за 0.061 секунд. Запросов: 25.