Найти - Пользователи
Полная версия: Прокомментируйте код новичка
Начало » Python для новичков » Прокомментируйте код новичка
1 2
jcrow
pyuser
попробуйте строку … заменить на …
Что это дает? В чем улучшение?
Ed
jcrow
Больше спасибо за ответы. В них (внезапно!) много пользы.
Хм. Даже не знаю как на это реагировать. Если не ожидали пользы, то зачем было писать?

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

Ed
- использование argparse не дает вашей программе работать под python ниже 2.7. По-моему это искусственное ограничение. Используйте optparse или вообще выкиньте. У вас один параметр, зачем вам этот парсинг?
- По-моему здесь достаточно пары функций, класс не нужен.
Это учебная программа. Я учусь.
argparse выбран случайно (http://argparse.googlecode.com/svn/trunk/doc/argparse-vs-optparse.html). В первой версии я вручную проверял наличие урла в argv.
По плану этот класс еще должен уметь чекать внешние ссылки на nofollow и прочие штуки. А все внутренние снова парситься. И в несколько потоков. И через прокси.
pyuser
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.
Ed
pyuser
Ed
использование argparse не дает вашей программе работать под python ниже 2.7
ни что не мешает его установить :), а многие источники даже настоятельно рекомендуют использовать именно argparse.
Никто не мешает установить и десять внешних модулей, не в этом дело. Чем меньше внешних зависимостей, тем лучше. А пока 2.6 а кое-где и 2.5 еще активно используется, а в 2.7 и 3.2 есть optparse, то я бы не торопился. Тем более в таком тривиальном случае.
pyuser
Ed
А пока 2.6 а кое-где и 2.5 еще активно
Как я Вас понимаю… У нас боевая версия 2.4 :(
благо под виндовозом, py2exe спасает :)
Андрей Светлов
Мое вам сочувствие. У нас 3.2
pyuser
Андрей Светлов
на Вашем блоге о 3.2 только восторженные замечания :)
ЗЫ. прошу прощения - не в тему
pipl
Прокомментируйте мой код, это метод вращений Якоби:
 
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
baa
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
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