Найти - Пользователи
Полная версия: Проблема с небольшой функцией
Начало » Python для новичков » Проблема с небольшой функцией
1 2
samyray
Здраствуйте товарищи,я новичок в питоне,есть небольшой вопросик(возможно нубовский),но просмотр пары книжек не дал мне ответ на вопрос.
Ест такой код:
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
Я подозреваю что проблема в пространстве имен,но я уже пробовал заранее обьявлять і,но оно использовало глобальное значение и никак не хотело брать локальное.
Ткните пожалуйсте в мою ошибку.
SvartalF
Потому что увидев «global i», интерпретатор пытается найти эту переменную в глобальном пространстве имен, где ее нет.
shiza
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)
Но вообще пользоватьсяы глобальными переменными считается дурным тоном.
Viper
Да и в данном примере глобальные i и j не нужны.
samyray
Viper
Да и в данном примере глобальные i и j не нужны.
А вы не могли бы мне предложить возможность обойтись без них?
А то я сам понимаю что это не хорошо и некрасиво,но альтернативы я не вижу(
shiza
Я честно говоря, не очень понял, в чем задача. Но предполагаю, что ты хочешь получить список спиков размером 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)
shiza
Если планируется использовать разные алгоритмы для вычисления значения ячейки, то можно передавать их в качестве параметра, как функцию:
#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)
samyray
Спасибо большое!
А то в книжках рассказываеться общая теория,а вот хороших красивых исходников явно не хватает)
Думаю тема себя исчерпала.
shiza
Для полноты картины, еще выпендрежный вариант =))
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) ]
samyray
И вправду выпендрежный,я в осадке)
Буду теперь всем показывать как демонстрацию мощи питона)

З.Ы.Только не совсем понятно как такое работает)
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