Pull to refresh

Comments 17

UFO just landed and posted this here

или так:


pathlib.Path(filename).suffix
numitus2 Спасибо за пример, пример такого рода хорошо дополняет статью
А если у файла нет расширения?
Так наверное лучше:

>>> import os
>>> filename, file_extension = os.path.splitext('/path/to/somefile.ext')
>>> print(os.path.splitext('/path/to/somefile.ext'))
('/path/to/somefile', '.ext')
>>> print(os.path.splitext('/path/to/somefile'))
('/path/to/somefile', '')


Какая-то жесть:
Почему нет реально правильного примера

numitus2 почему же жесть? Код работает на своих тестовых данных, для иллюстрации годится.
Выше была ссылка, кому надо будет учиться дальше.
А еще вы можете воспользоваться стандартной библиотекой os.path.splitext().
Ознакомиться с ней вы можете здесь.

По итогу у меня впечатление, что автору удалось объяснить проблему XY на примере, а научить работе с пакетом os или тем более pathlib он не собирался ;) Это лишь моя догадка.

«Мне нужно получить последние три символа в строке.»
«Нет, не нужно! Тебе нужно получить расширение файла.»


numitus2 еще раз спасибо, мне было бы лень внимательно читать статью без вашего замечания, а так я тоже начал приглядываться, возможно найдем еще неточности, поможем автору с качеством и при удачном стечении обстоятельств переводная статья станет точнее оригинала.
возможно найдем еще неточности
Ну вот
например:
И это еще не конец. Вы можете использовать filter, чтобы получить тот же результат.

def get_numbers(input_char):
    if not isinstance(input_char,str):
        return True
    return False

my_list = [1,2,3,'a','b','c']
check_list = filter(get_numbers, my_list)
for items in check_list:
    print(items)
image
Какой «тот же результат» мне не очень понятно, но как минимум, следующая за этой программой картинка с якобы результатом работы этой программы явно к ней не относится: цифры там должны быть (а не буквы) судя по тексту программы.
PS. Поначалу я думал, что при переводе перепутали, но нет — в оригинале статьи та же фигня путаница…

К спискам я бы еще добавил крутые возможности по преобразованию их в множество (set). Т.к. после этого можно находить разность (пересечение) и сумму (объединение) множеств:
list( set(listA) — set(ListB) ) — выдай элемента списка А, отсутствующие в списке Б.
UFO just landed and posted this here
Несомненно. Я и не говорил, что подходит везде и всегда. Но само применение очень удобно, когда надо найти «что изменилось» между старой и новой копией списка.
Во других языках мне приходилось перебирать элементы для этого.

Можно с помощью сетов найти "что изменилось" между этими списками?


[1, 2, 3, 1, 5]
[1, 2, 3, 1, 1, 5, 2]

Нет, конечно. Потому что второй список не преобразовать в множество без потерь.
print (my_list.sort())

Опытный будет проверять свой код, прежде чем штамповать необязательные обучающие материалы.
>>> type(a.sort())
NoneType
Посмотрите, как мы их перемешали. Если мы попробуем отсортировать полученный список, то получим ошибку.

Возврат в точности как в статье:
$ python3
Python 3.8.0 (v3.8.0:fa919fdf25, Oct 14 2019, 10:23:27)
[Clang 6.0 (clang-600.0.57)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> my_list = ['a' , 'b' , 'n' , 'x' , 1 , 2 , 3, 'a' , 'n' , 'b']

>>> my_list.sort()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: '<' not supported between instances of 'int' and 'str'

Объясните, CrazyOpossum что не так с интерпретатором python3?
Опытный будет проверять свой код, прежде чем штамповать необязательные обучающие материалы.

Я неприятно удивлен вашим комментом и не понимаю его ценности. Что у вас CrazyOpossum
в «a» лежит, что вы сортируете?
В статье можно было опустить print(), и просто написать my_list.sort(). Этого хватит для вызова ошибки. CrazyOpossum указывает на то, что если сортировка пройдет успешно, то print выведет None. Так как my_list.sort() ничего не возвращает.
Но пассаж про «необязательные обучающие материалы» осуждаю.
Я вижу, что человек обращается с методом, модифицирующем объект, как с методом, возвращающим данные. Это обычная ситуация в Питоне, когда не помнишь (и не нужно помнить), работают ли in-place list.sort, list.reverse, set.update и другие методы, или же конструируют новый объект. У автора эту попытку print(mylist.sort()) я воспринимаю именно как небрежность и самоуверенность, что в образовательных материалах недопустимо. Кстати, статья называется «9 навыков...», а рассказывает про 8.
Таки 9. Но в переводе нумерация совсем пропала, а в оригинале автор перестал нумеровать после семи :)
def get_numbers(input_char):
    if not isinstance(input_char,str):
        return True
    return False

А можно сразу сделать так (без условного оператора)?


return not isinstance(input_char,str)

Про процедуры и функции — вы раньше с 1С случайно не работали? :)
Процедура — та же функция, только тип возвращаемого значения у нее свой. :)

или


return isinstance(input_char, int)

раз функция get_numbers, а не not_strings

print(f'{each}')

Серьезно? Давайте пихать f-строки везде. Этот код абсолютно эквивалентен следующему:


print(each)

А по подводу PEP8: ну расставьте в примерах пустые строки как рекомендовано что ли

Sign up to leave a comment.