Найти - Пользователи
Полная версия: Оцените код новичка
Начало » Python для новичков » Оцените код новичка
1 2 3 4
CHAOS
Нет, нет, я никуда не исчезал и Python не бросал, просто, иногда приходится работать:(
Ed
Бывает :)
CHAOS
Доброго времени и с прошедшими праздниками! Прошел уже целый месяц с момента последней публикации! Извиняюсь за эту паузу. Работа, а затем праздники - это страшное дело. Несколько моментов, Ed:

Пункт 2. total = len(matches). По старой привычке - это некий кэш. В Python в таких вещах нет необходимости?
3. Эти строчки, видимо, остались из какой-то старой версии. Никакого смысла сейчас в них нет, это правда.
5. Какая разница в наличии скобок? Кортеж - он и есть кортеж.
6. Длинных строк нет - проверяется с помощью pylint.

Плюс я попробовал перенести все это хозяйство на третью версию “Питона”. Код:

# -*- coding: utf-8 -*-

"""Не секрет, что сервис imagevenue.com меняет адрес картинки каждый раз
при обновления страницы. Не так-то просто загрузить несколько картинок
сразу в данной ситуации. Эта программа призвана упростить данный процесс.

Также с ее помощью можно загружать материалы с imageshack.us и по прямым
ссылкам. Пример:

linkshop.py -l '<a href="imagevenue.com"></a><a href...' -d /каталог

"""

import re
import os
from sys import stderr
from urllib.request import urlopen, urlretrieve
from optparse import OptionParser
from urllib.parse import urlparse


def get_options():
"""Получает опции и аргументы командной строки."""
parser = OptionParser()
parser.add_option('-d', '--dir', default='', help='каталог для загрузки')
options, args = parser.parse_args()

if not args:
parser.error('неверное количество аргументов')

return options, args


def download(options, args):
"""Получает адреса страниц из href-атрибутов аргумента,
который должен быть обычным HTML-кодом. Используя адреса,
загружает страницы, находит там картинки и их тоже загружает.

"""

matches = re.findall('href="(.+?)"', args)

if not matches:
return

for (key, url) in enumerate(matches):
print('\n%s из %s (%s)\nПолучение страницы...' % (key + 1,
len(matches), url))

try:
url_open = urlopen(url)
except ValueError:
stderr.write('Неверный формат ссылки\n')
continue

try_again = 'y'

while try_again == 'y':
url_open = urlopen(url)
content = url_open.read()
url_open.close()

if not content:
try_again = input('ERROR. Попробовать еще раз? (y or n)')
else:
break

url_parsed = urlparse(url)
netloc = url_parsed.netloc

if 'imageshack' in netloc:
matches = re.search('<link rel="image_src" href="(.+?)"',
content)
url = matches.group(1)
elif 'imagevenue' in netloc:
matches = re.search('SRC="(.+?)"', content)
url = 'http://%s/%s' % (netloc, matches.group(1))

print('Загрузка картинки...')
url_parsed = urlparse(url)
file_name = url_parsed.path.split('/')[-1]
down_name, _headers = urlretrieve(url,
os.path.join(options.dir, file_name))

if os.path.isfile(down_name):
print('OK')
else:
stderr.write('ERROR\n')


if __name__ == '__main__':
OPTIONS, ARGS = get_options()
download(OPTIONS, ARGS[0])
FishHook
def get_options():
"""Get command-line options"""
parser = OptionParser()
parser.add_option('-l', '--links')
parser.add_option('-d', '--dir', default='/media/sda5/tmp/images')
(options, args) = parser.parse_args()
return options
Может я что-то не так понял, но зачем этот код помещать в функцию?
CHAOS
Можно и не помещать. Просто это какая-то привычка: все помещать в какую-то обвертку…
FishHook
CHAOS
Можно и не помещать. Просто это какая-то привычка: все помещать в какую-то обвертку…
Вызов пользовательской функции - дорогая операция
from __future__ import print_function
from timeit import Timer
time=Timer()

def f():
pass

t1=time.timer()
for i in xrange(1000000):
f()

t2=time.timer()-t1
print ('def',t2)

t1=time.timer()
for i in xrange(1000000):
pass

t2=time.timer()-t1
print ('not def',t2)
def 0.246202945709
not def 0.0379729270935
CHAOS
Спасибо, обязательно сделаю подобный тест у себя!
CHAOS
Скоростной тест проведен. Результаты близки до безобразия. С функцией:

0.000495910644531
0.00039005279541
0.000401020050049
0.000391960144043
0.000403881072998
0.000396966934204

Без:

0.000401973724365
0.000499963760376
0.000385999679565
0.000396013259888
0.000398874282837
0.000473022460938
FishHook
CHAOS
Скоростной тест проведен. Результаты близки до безобразия. С функцией:

0.000495910644531
0.00039005279541
0.000401020050049
0.000391960144043
0.000403881072998
0.000396966934204

Без:

0.000401973724365
0.000499963760376
0.000385999679565
0.000396013259888
0.000398874282837
0.000473022460938
1. Запусти мой пример и проверь
2. Покажи свой скрипт, которым тестил
CHAOS
Отдельно тест провел - бесспорно быстрее (в три раза), но в моем случае разницы нет. С вызовом функции:

if __name__ == '__main__':
timer = Timer()
start = timer.timer()
OPTIONS, ARGS = get_options()
print(timer.timer() - start)
Соответственно:

if __name__ == '__main__':
timer = Timer()
start = timer.timer()
parser = OptionParser()
parser.add_option('-d', '--dir', default='', help='каталог для загрузки')
options, args = parser.parse_args()

if not args:
parser.error('неверное количество аргументов')

print(timer.timer() - start)
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