Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 2, 2011 16:13:27

jcrow
От:
Зарегистрирован: 2011-10-31
Сообщения: 22
Репутация: +  0  -
Профиль   Отправить e-mail  

Прокомментируйте код новичка

pyuser
попробуйте строку … заменить на …
Что это дает? В чем улучшение?




Подпись - это небольшая приписка (хи-хи).

Офлайн

#2 Ноя. 2, 2011 21:54:49

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

Прокомментируйте код новичка

jcrow
Больше спасибо за ответы. В них (внезапно!) много пользы.
Хм. Даже не знаю как на это реагировать. Если не ожидали пользы, то зачем было писать?

Ладно, поехали дальше.
- Возвращать словарь не нужно - только больше кода получается. Верните два списка.
- Сделайте ваши перекодировки в parse. Хоть будут в одном месте, а не в двух. Кстати, может это из-за вашего name = u'Нет имени' вы потом извращаетесь проверяя строка у вас или уникод?
- использование argparse не дает вашей программе работать под python ниже 2.7. По-моему это искусственное ограничение. Используйте optparse или вообще выкиньте. У вас один параметр, зачем вам этот парсинг?
- По-моему здесь достаточно пары функций, класс не нужен.



Офлайн

#3 Ноя. 2, 2011 23:23:18

jcrow
От:
Зарегистрирован: 2011-10-31
Сообщения: 22
Репутация: +  0  -
Профиль   Отправить e-mail  

Прокомментируйте код новичка

Ed
Хм. Даже не знаю как на это реагировать. Если не ожидали пользы, то зачем было писать?
Просто эмоциональный всплеск. Многие вещи прояснились и упорядочились, потому такая реакция.

Ed
- использование argparse не дает вашей программе работать под python ниже 2.7. По-моему это искусственное ограничение. Используйте optparse или вообще выкиньте. У вас один параметр, зачем вам этот парсинг?
- По-моему здесь достаточно пары функций, класс не нужен.
Это учебная программа. Я учусь.
argparse выбран случайно (http://argparse.googlecode.com/svn/trunk/doc/argparse-vs-optparse.html). В первой версии я вручную проверял наличие урла в argv.
По плану этот класс еще должен уметь чекать внешние ссылки на nofollow и прочие штуки. А все внутренние снова парситься. И в несколько потоков. И через прокси.




Подпись - это небольшая приписка (хи-хи).

Офлайн

#4 Ноя. 3, 2011 01:09:30

pyuser
От:
Зарегистрирован: 2007-05-13
Сообщения: 658
Репутация: +  36  -
Профиль   Отправить e-mail  

Прокомментируйте код новичка

jcrow
Что это дает? В чем улучшение?
Если бы Вы потрудились отобразить распарсенный документ (etree.tostring()), то сразу заметили бы в ЧЕМ разница. :)
Это позволит заменить Ваш блок
                if item.text and item.text.strip():
name = item.text
else:
name = u'Нет имени'
заменить одной строкой
name = item.text if item.text else u"Нет имени"
что касается перекодировок - может я “неправильные” сайты парсил - ни когда, при использовании lxml, не приходилось ничего перекодировать руками.
да и Ваш блок
                if domain == '' or domain.endswith(self.domain):
links_internal.append({'name': name, 'url': url})
else:
links_external.append({'name': name, 'url': url})
я бы заменил на

                if domain and not domain.endswith(self.domain):
links_external.append((name, url))
else:
links_internal.append((name, url))
в Вашем случае словарь - это излишество, используя кортеж Вы выиграете и в скорости и в объеме используемой памяти (на больших количествах ссылок, разумеется)
Ed
использование argparse не дает вашей программе работать под python ниже 2.7
ни что не мешает его установить :), а многие источники даже настоятельно рекомендуют использовать именно argparse.



Отредактировано (Ноя. 3, 2011 03:18:42)

Офлайн

#5 Ноя. 3, 2011 09:17:36

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

Прокомментируйте код новичка

pyuser
Ed
использование argparse не дает вашей программе работать под python ниже 2.7
ни что не мешает его установить :), а многие источники даже настоятельно рекомендуют использовать именно argparse.
Никто не мешает установить и десять внешних модулей, не в этом дело. Чем меньше внешних зависимостей, тем лучше. А пока 2.6 а кое-где и 2.5 еще активно используется, а в 2.7 и 3.2 есть optparse, то я бы не торопился. Тем более в таком тривиальном случае.



Офлайн

#6 Ноя. 3, 2011 12:56:34

pyuser
От:
Зарегистрирован: 2007-05-13
Сообщения: 658
Репутация: +  36  -
Профиль   Отправить e-mail  

Прокомментируйте код новичка

Ed
А пока 2.6 а кое-где и 2.5 еще активно
Как я Вас понимаю… У нас боевая версия 2.4 :(
благо под виндовозом, py2exe спасает :)



Офлайн

#7 Ноя. 3, 2011 13:08:27

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Прокомментируйте код новичка

Мое вам сочувствие. У нас 3.2



Офлайн

#8 Ноя. 3, 2011 13:20:13

pyuser
От:
Зарегистрирован: 2007-05-13
Сообщения: 658
Репутация: +  36  -
Профиль   Отправить e-mail  

Прокомментируйте код новичка

Андрей Светлов
на Вашем блоге о 3.2 только восторженные замечания :)
ЗЫ. прошу прощения - не в тему



Отредактировано (Ноя. 3, 2011 13:21:11)

Офлайн

#9 Ноя. 13, 2011 12:36:52

pipl
От:
Зарегистрирован: 2011-11-13
Сообщения: 1
Репутация: +  0  -
Профиль   Отправить e-mail  

Прокомментируйте код новичка

Прокомментируйте мой код, это метод вращений Якоби:

 
import copy
import math
#создать заготовку для матрицы
def nw_matr(dim):
count = 0
Matrix = []
for i in range(dim):
Matrix.append([])
for j in range(dim):
Matrix[i].append([])
return Matrix

#заполнить матрицу
def Mtrx_Gnrt(dim):
count = 1
Matrix = nw_matr(dim)
for i in range(dim):
for j in range(dim):
if(i == j):
Matrix[i][j] = (count + 3)
continue
Matrix[i][j] = Matrix[j][i] = (count)
count += 1
return Matrix

#транспонировать матрицу
def Tran_Mtrx(Matrix, dim):
temp = 0
for i in range(dim):
for j in range(i):
temp = Matrix[i][j]
Matrix[i][j] = Matrix[j][i]
Matrix[j][i] = temp
return Matrix

#умножить матрицу
def Mult_Mtrx(AMatrix, BMatrix, dim):
temp = 0
CMatrix = nw_matr(dim)
for i in range(dim):
for j in range(dim):
temp = 0
for l in range(dim):
temp = temp + AMatrix[i][l]*BMatrix[l][j]
CMatrix[i][j] = temp
return CMatrix

#создать еденичную матрицу
def Idnt_Mtrx(dim):
Matrix = nw_matr(dim)
for i in range(dim):
for j in range(dim):
if(i == j):
Matrix[i][j] = 1;
else:
Matrix[i][j] = 0;
return Matrix

#найти максимальный элемент
def Max_Elem(Matrix, dim):
max = 0
max_i = 0
max_j = 0
for i in range(dim):
for j in range(dim):
if(i == j):
continue
if(abs(Matrix[i][j]) > max):
max = Matrix[i][j]
max_i = i
max_j = j
return [max, max_i, max_j]


#Сам метод
def Jacobi(Matrix, dim, epsilon):
max = 0
max_i = 0
max_j = 0
fi = 0
cosfi = 0
sinfi = 0
AMatrix = copy.deepcopy(Matrix)
while(1):
maxtemp = Max_Elem(AMatrix, dim)
max = maxtemp[0]
max_i = maxtemp[1]
max_j = maxtemp[2]
#условие выхода
if(abs(max)<=epsilon):
break
if((AMatrix[max_i][max_i] == AMatrix[max_j][max_j])):
fi = math.pi/4
else:
fi = math.atan(2.0*max/(AMatrix[max_i][max_i] - AMatrix[max_j][max_j]))/2.0
cosfi = math.cos(fi)
sinfi = math.sin(fi)

LTMatrix = Idnt_Mtrx(dim)

LTMatrix[max_i][max_i] = cosfi
LTMatrix[max_j][max_j] = cosfi
LTMatrix[max_i][max_j] = -sinfi
LTMatrix[max_j][max_i] = sinfi

RTMatrix = copy.deepcopy(LTMatrix)

RTMatrix = Tran_Mtrx(RTMatrix, dim)

TempMatrix = Mult_Mtrx(LTMatrix, AMatrix, dim)
AMatrix = Mult_Mtrx(TempMatrix, RTMatrix, dim)
Matrix = copy.deepcopy(AMatrix)
return Matrix


dim = 4
epsilon = 0.001
Matrix = Mtrx_Gnrt(dim)
for i in Matrix:
print i

print
Matrix = Jacobi(Matrix, dim, epsilon)
for i in Matrix:
print i



Офлайн

#10 Ноя. 28, 2011 06:06:28

baa
От:
Зарегистрирован: 2011-11-25
Сообщения: 25
Репутация: +  0  -
Профиль   Отправить e-mail  

Прокомментируйте код новичка

import copy
import math
#создать заготовку для матрицы
def nw_matr(dim):
return map(list,[[0]*dim]*dim) # так проще и сразу создается "нулевая" матрица

#заполнить матрицу
def Mtrx_Gnrt(dim):
count = 1
Matrix = nw_matr(dim)
for i in range(dim):
for j in range(i,dim): # здесь важное изменение получается совсем другая матрица
if i == j:
Matrix[i][j] = count + 3
continue
Matrix[i][j] = Matrix[j][i] = count
count += 1
return Matrix

#транспонировать матрицу
def Tran_Mtrx(Matrix, dim):
for i in range(dim):
for j in range(i):
Matrix[i][j],Matrix[j][i] = Matrix[j][i],Matrix[i][j] # упрощение кода, уход от лишних переменных
return Matrix

#умножить матрицу
def Mult_Mtrx(AMatrix, BMatrix, dim):
CMatrix = nw_matr(dim) # лишняя переменная temp = 0
for i in range(dim):
for j in range(dim):
temp = 0
for l in range(dim):
CMatrix[i][j] = temp = temp + AMatrix[i][l]*BMatrix[l][j]
return CMatrix

#создать еденичную матрицу
def Idnt_Mtrx(dim):
Matrix = nw_matr(dim)
for i in range(dim):
Matrix[i][i] = 1 # нулями наша матрица уже заполнена / далее по мелочи лишние скобки, пробелы и т.п.
return Matrix

#найти максимальный элемент
def Max_Elem(Matrix, dim):
max = 0
max_i = 0
max_j = 0
for i in range(dim):
for j in range(dim):
if i == j:
continue
if abs(Matrix[i][j]) > max:
max = Matrix[i][j]
max_i = i
max_j = j
return [max, max_i, max_j]


#Сам метод
def Jacobi(Matrix, dim, epsilon):
max = 0
max_i = 0
max_j = 0
fi = 0
cosfi = 0
sinfi = 0
AMatrix = copy.deepcopy(Matrix)
while(1):
maxtemp = Max_Elem(AMatrix, dim)
max = maxtemp[0]
max_i = maxtemp[1]
max_j = maxtemp[2]
#условие выхода
if abs(max) <= epsilon:
break
if AMatrix[max_i][max_i] == AMatrix[max_j][max_j]:
fi = math.pi/4
else:
fi = math.atan(2.0*max/(AMatrix[max_i][max_i] - AMatrix[max_j][max_j]))/2.0
cosfi = math.cos(fi)
sinfi = math.sin(fi)

LTMatrix = Idnt_Mtrx(dim)

LTMatrix[max_i][max_i] = cosfi
LTMatrix[max_j][max_j] = cosfi
LTMatrix[max_i][max_j] = -sinfi
LTMatrix[max_j][max_i] = sinfi

RTMatrix = copy.deepcopy(LTMatrix)

RTMatrix = Tran_Mtrx(RTMatrix, dim)

TempMatrix = Mult_Mtrx(LTMatrix, AMatrix, dim)
AMatrix = Mult_Mtrx(TempMatrix, RTMatrix, dim)
Matrix = copy.deepcopy(AMatrix)
return Matrix


dim = 4
epsilon = 0.001
Matrix = Mtrx_Gnrt(dim)
for i in Matrix:
print i

print
Matrix = Jacobi(Matrix, dim, epsilon)
for i in Matrix:
print i



Отредактировано (Ноя. 28, 2011 09:13:53)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version