Найти - Пользователи
Полная версия: Логика.
Начало » Python для новичков » Логика.
1
Alexey_mne31
Привет всем. Осваиваю программирование недавно.
Вопрос по питону (вообще наверное по логике)
Есть код, элементарный:
 def get_extension(filename):
    filename_parts = filename.split('.')
    if len(filename_parts) < 2:  # filename has no dots
        raise ValueError('the file has no extension')
    first, *middle, last = filename_parts
  :)  if not last or not first and not middle: :)
        # example filenames: .filename, filename., file.name.
        raise ValueError('the file has no extension')
    return filename_parts[-1]
print(get_extension('abc.py'))
print(get_extension('abc'))  # raises ValueError
print(get_extension('.abc'))   # raises ValueError
print(get_extension('.abc.def.'))   # raises ValueError

Строчка, выделенная смайликами, непонятна. Как я понял, python выполняет по иерархии not - and - or.
Назначение строки ясно интуитивно, отсекаем всякие лишние моменты.
А вот код в голове осознать не могу.
Как пытаюсь понимать сам:
Если не последний или (не первый и не средний) то….
С не последний все понятно, значит в строке нет точки, либо точка в конце, все разделилось в первый элемент - значит расширения нет.
А вот дальше: (не первый и не средний) как вообще может быть? Я ее понимаю как не существует первого элемента и не существует среднего элемента одновременно. Но так же не будет…
Строкой выше
first, *middle, last = filename_parts
мы в первую очередь растасовываем элементы списка в первый элемент, он же всегда будет….
Может кто разъяснит порядок интерпретации этой строки именно.
P.S. Файл возвращает расширение по названию, если кто не понял.
AD0DE412
Л.
doza_and
Alexey_mne31
Может кто разъяснит порядок интерпретации этой строки именно.
Все вы правильно понимаете.
   
(not last) or ((not first) and (not middle))

пишите проще и будет вам счастье. Не бойтесь экспериментировать.
  
for fp in [["",""],["a",""],["","a"],["a","a"]]:
    first, *middle, last = fp
    if not last:
        print("last",fp)
    if not first and not middle:
        print("strange",fp)
last ['', '']
strange ['', '']
last ['a', '']
strange ['', 'a']

Вроде все ясно.
py.user.next
Alexey_mne31
А вот дальше: (не первый и не средний) как вообще может быть? Я ее понимаю как не существует первого элемента и не существует среднего элемента одновременно. Но так же не будет…
  
>>> filename_parts = '.abc'.split('.')
>>> 
>>> first, *middle, last = filename_parts
>>> 
>>> first, middle, last
('', [], 'abc')
>>> 
>>> not last or not first and not middle
True
>>> (not last) or ((not first) and (not middle))
True
>>>

Alexey_mne31
мы в первую очередь растасовываем элементы списка в первый элемент, он же всегда будет….
Это в Windows он всегда будет. Она тебе не даст создать файл без имени и будет давать советы, как тебе файл называть. А ты поставь себе Linux и учись программировать там. В Linux, во-первых, нет расширений (расширения - это просто части имени), а во-вторых, в Linux очень часто бывает точка в начале имени, так как это сообщает файловому менеджеру или командной оболочке, что файл скрытый и не нужно его показывать. Поэтому, чтобы скрыть файл/директорию в Linux, достаточно добавить точку в начало его/её имени. Отвыкай от Windows.
Alexey_mne31
doza_and
Блин, старик, и точно все элементарно…спасибо тебе!
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB