Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 27, 2008 05:17:07

samyray
От:
Зарегистрирован: 2008-09-27
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема с небольшой функцией

Здраствуйте товарищи,я новичок в питоне,есть небольшой вопросик(возможно нубовский),но просмотр пары книжек не дал мне ответ на вопрос.
Ест такой код:

a=[]
b=[]
def create(func, n):

global a,i,j
for i in range(1,n):

for j in range(1,n):

a.append(func)

b.append(a)
a=[]
create((1*i+2*j),10)
И получаем:
NameError: global name 'i' is not defined
Я подозреваю что проблема в пространстве имен,но я уже пробовал заранее обьявлять і,но оно использовало глобальное значение и никак не хотело брать локальное.
Ткните пожалуйсте в мою ошибку.



Офлайн

#2 Сен. 27, 2008 08:24:27

SvartalF
От:
Зарегистрирован: 2008-06-29
Сообщения: 73
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема с небольшой функцией

Потому что увидев «global i», интерпретатор пытается найти эту переменную в глобальном пространстве имен, где ее нет.



Офлайн

#3 Сен. 28, 2008 17:48:21

shiza
От:
Зарегистрирован: 2007-07-03
Сообщения: 1073
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема с небольшой функцией

samyray
В данном коде потому что не объявлены глобальные переменные i и j.
Так работает:

a=[]
b=[]
i = 0
j = 0

def create(func, n):

global a,i,j
for i in range(1,n):

for j in range(1,n):

a.append(func)

b.append(a)
a=[]
create((1*i+2*j),10)
Но вообще пользоватьсяы глобальными переменными считается дурным тоном.



Офлайн

#4 Сен. 29, 2008 13:06:54

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

Проблема с небольшой функцией

Да и в данном примере глобальные i и j не нужны.



Офлайн

#5 Сен. 29, 2008 17:34:59

samyray
От:
Зарегистрирован: 2008-09-27
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема с небольшой функцией

Viper
Да и в данном примере глобальные i и j не нужны.
А вы не могли бы мне предложить возможность обойтись без них?
А то я сам понимаю что это не хорошо и некрасиво,но альтернативы я не вижу(



Офлайн

#6 Сен. 29, 2008 18:06:24

shiza
От:
Зарегистрирован: 2007-07-03
Сообщения: 1073
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема с небольшой функцией

Я честно говоря, не очень понял, в чем задача. Но предполагаю, что ты хочешь получить список спиков размером n*n (квдрат такой). С значениями элементов 1*i+2*j.

Вот простейщий пример:

#coding=utf-8
def create(n):
b = [] #главный список
for i in xrange(n): # кошернее вместо range использовать xrange
a = [] #список - строка
for j in xrange(n): #заполняем строку
a.append( 1*i+2*j )
b.append(a) #добавляем строку в главный список
return b #возвращаем результат
print create(10)



Отредактировано (Сен. 29, 2008 18:07:18)

Офлайн

#7 Сен. 29, 2008 18:12:04

shiza
От:
Зарегистрирован: 2007-07-03
Сообщения: 1073
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема с небольшой функцией

Если планируется использовать разные алгоритмы для вычисления значения ячейки, то можно передавать их в качестве параметра, как функцию:

#coding=utf-8

def count_cell_1(i, j): #функция, подсчитывающая значение ячейки, в зависимости от координат по формуле 1*i+2*j
return 1*i+2*j

def create(count_cell, n):
# входные параметры:
# count_cell - функция, подсчитывающая значение ячейки
# n - размер матрицы
b = [] #главный список
for i in xrange(n): # кошернее вместо range использовать xrange
a = [] #список - строка
for j in xrange(n): #заполняем строку
a.append( count_cell(i, j) )
b.append(a) #добавляем строку в главный список
return b #возвращаем результат

print create(count_cell_1, 10)

#можно передавать не готовую функцию для подсчета ячейки, а создавать ее на лету с помощью конструкции lambda:
print create(lambda x, y: 1*x+2*y, 10)



Отредактировано (Сен. 29, 2008 18:27:41)

Офлайн

#8 Сен. 30, 2008 00:44:29

samyray
От:
Зарегистрирован: 2008-09-27
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема с небольшой функцией

Спасибо большое!
А то в книжках рассказываеться общая теория,а вот хороших красивых исходников явно не хватает)
Думаю тема себя исчерпала.



Офлайн

#9 Сен. 30, 2008 00:54:28

shiza
От:
Зарегистрирован: 2007-07-03
Сообщения: 1073
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема с небольшой функцией

Для полноты картины, еще выпендрежный вариант =))

f = lambda x, y: 1*x+2*y
create = lambda f, n: [ [ f(i,j) for j in xrange(n) ] for i in xrange(n) ]
print create(f, 10)
или без функций:
print [ [ 1*i+2*j for j in xrange(10) ] for i in xrange(10) ]



Отредактировано (Сен. 30, 2008 01:09:41)

Офлайн

#10 Сен. 30, 2008 01:00:13

samyray
От:
Зарегистрирован: 2008-09-27
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема с небольшой функцией

И вправду выпендрежный,я в осадке)
Буду теперь всем показывать как демонстрацию мощи питона)

З.Ы.Только не совсем понятно как такое работает)



Отредактировано (Сен. 30, 2008 01:02:41)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version