Найти - Пользователи
Полная версия: UnboundLocalError
Начало » Python для новичков » UnboundLocalError
1 2 3 4 5
Ed
def search(arr, symb0, symb1 = ""):
А зачем вам этот symb1? Вроде в задаче у нас только один символ фигурирует.

 
BefArr = arr[:(arr.index(symb0) + 1)] #symbols before symb0
AftArr = arr[(arr.index(symb0)+1):] #symdols after symb0 #symbols between symb0 and symb1
А вот здесь напрашивается использование переменной, чтобы 2 раза не звать index для одного и того же.

    if symb1 != "":                          #BetArr symbols between symb0 and symb1
if symb1 in AftArr: BetArr = AftArr[:arr.index(symb1)]
else: BetArr = arr[:]
else: BetArr = None
if symb1 != “” не pythonic. Обычно пишут if symb1:
Такая конструкция будет работать для всего непусторго - строки, числа(не ноль), boolean(True), непустого списка, непустого словарь и т.д.

BetArr у вас может быть списком и None. Это нехорошо, рекомендую использовать пустой список вместо None.
И не лепите if/else на одну стороку с кодом. Это менее читабельно.

А вот как применить здесь код
def main(argv):
....
if __name__ == '__main__':
sys.exit(main(sys.argv))
я не совсем понял, а вернее, совсем не понял. Насколько я знаю, такие конструкции применяют в случае, если нужно сделать модуль скриптом. Я ошибаюсь?
Нет, не ошибаетесь. А вам был нужен модуль или работающая программа? Я думал, что и то и другое. Вот я и показал, как сделать из вашего модуля работающую программу.
UsCr
from random import choice, randrange
from string import letters
from copy import copy

def generate(KolSymb):
arr = [choice(letters) for i in xrange(0,KolSymb)]

for i in xrange(randrange(2,3)):
arr[randrange(0,KolSymb)] = ":"

return arr

def search(arr, symb0, symb1 = ""):

BefArr = arr[:(arr.index(symb0) + 1)] #symbols before symb0
AftArr = arr[(arr.index(symb0)+1):] #symdols after symb0 #symbols between symb0 and symb1
if symb1 != "": #BetArr symbols between symb0 and symb1
if symb1 in AftArr: BetArr = AftArr[:arr.index(symb1)]
else: BetArr = arr[:]
else: BetArr = None
return BefArr, AftArr, BetArr

if __name__ == '__main__':
print search(generate(10), ":", ":")
Это правильно? Это хорошо?
Ed
Это правильный ход мыслей, если вы насчет if __name__ == ‘__main__’.
Во-первых я не вижу тут исправлений в соответствии с моими предыдущими замечаниями (http://www.python.su/forum/viewtopic.php?pid=36297#p36297).
Во-вторых - generate(10) есть плохо. Количество символов нужно сделать параметром командной строки. 10 можно сделать значением этого параметра по умолчанию, если оно вам так нравится.
UsCr
# -*- coding: cp1251 -*-
from random import choice, randrange
from string import letters
from copy import copy
import sys

def generate(KolSymb):
arr = [choice(letters) for i in xrange(0,KolSymb)]

for i in xrange(randrange(2,3)):
arr[randrange(0,KolSymb)] = ":"

return arr

def search(arr, symb0, symb1 = ""):

temp = arr.index(symb0)
BefArr = arr[:(temp + 1)] #symbols before symb0
AftArr = arr[(temp + 1):] #symdols after symb0 #symbols between symb0 and symb1
if symb1: #BetArr symbols between symb0 and symb1
if symb1 in AftArr:
BetArr = AftArr[:arr.index(symb1)]
else:
BetArr = arr[:]
else:
BetArr = []

return BefArr, AftArr, BetArr

if __name__ == '__main__':
if len(sys.argv) == 1:
print search(generate(10), ":", ":")
if (len(sys.argv) != 4) and (len(sys.argv) != 1):
print("Ошибка ввода!")
else:
Name, Kol, Symb1, Symb2 = sys.argv
print search(generate(int(Kol)), Symb1, Symb2)
Этот кусок не слишком запутан? В некотором роде контроль ввода параметров.
if __name__ == '__main__':
if len(sys.argv) == 1:
print search(generate(10), ":", ":")
if (len(sys.argv) != 4) and (len(sys.argv) != 1):
print("Ошибка ввода!")
else:
Name, Kol, Symb1, Symb2 = sys.argv
print search(generate(int(Kol)), Symb1, Symb2)
Ed
А зачем вам этот symb1? Вроде в задаче у нас только один символ фигурирует.
Это на случай, если условие задачи изменится и речь пойдёт о разных символах.
Ed
Оч хорошо. Выглядит как настоящий питоновый скрипт :)
При проверке параметров используйте elif вместо второго if, тогда проверку len(sys.argv) != 1 можно убрать.
Можно также проверить случай, когда передано 2 параметра - Kol и symb1.
При ошибке в параметрах принято выдавать usage - пояснение по использованию программы. А то получается, что юзеру нужно лезть в исходник, чтобы понять что же вашему скрипту нужно.

Насчет запутанности. Более pythonic код использовал бы принцип EAFP: Easier to ask for forgiveness than permission (проще попросить прощения, чем разрешения).
Тогда ваш код мог бы выглядеть как-нибудь так:
try:
_, Kol, Symb1, Symb2 = sys.argv
except ValueError:
if len(sys.argv) == 1:
Kol = "10"
Symb1 = Symb2 = ":"
else:
print("Ошибка ввода")
print("Usage: %s <number of symbols> <symbol 1> <symbol 2>" % os.path.basename(sys.argv[0]))
sys.exit(1)

print(search(generate(int(Kol)), Symb1, Symb2))
sys.exit(0)
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