Форум сайта python.su
UsCrПо-моему короче и понятнее будет через random.choice, как я предлагал. Попробуйте.arr = [string.letters[random.randrange(0,len(string.letters))] \
for i in xrange(0,KolSymb)]
def first(Kol): #Punkt "a"
arr = generate(Kol)
xarr=[]
print arr
if arr[0]==":":print "Array is empty"
else:
for i in range(0,len(arr)):
xarr.append(arr[i])
if arr[i]==":":break
return xarr
Можно ли прервать генерацию по условию? Нечто вроде:Насколько я знаю нет. Но в данном случае это и не нужно.Я знаю, что это синтаксис еррор. Я просто пытаюсь обьяснить, о чём яxarr = [arr[i] for i in range(0,len(arr)) if arr[i]!=":" else:break]
говорю. Может быть выловить исключение? Или есть стандартные способы?
Офлайн
from random import randrange
from string import letters
from copy import copy
def generate(KolSymb):
arr = [letters[random.randrange(0,len(letters))] \
for i in xrange(0,KolSymb)]
for i in range(randrange(2,3)):
arr[randrange(0,KolSymb)] = ":"
return arr
def search(arr, symb0, symb1 = "", PrintOn = 1):
if symb1 == 0 :
symb1 = ""
PrintOn = 0
BefArr = arr[0:(arr.index(symb0) + 1)] #symbols before symb0 and "symb0"
AftArr = arr[arr.index(symb0):len(arr)] #symdols after symb0
BetArr = [] #symbols between symb0 and symb1
if symb1 != "":
CopyArr = copy(arr)
del CopyArr[0:(CopyArr.index(symb0) + 1)]
try:
BetArr = CopyArr[0:CopyArr.index(symb0)]
except ValueError:
BetArr = CopyArr
if PrintOn:
print "Before \""+symb0+"\" i see this - "+str(BefArr)
print "After \""+symb0+"\" i see this - "+str(AftArr)
print "Between \""+symb0+"\" and "+symb1+" i see this - "+str(BetArr)
else:
TrupleStr = (BefArr, AftArr, BetArr)
return TrupleStr
Офлайн
Разве что с пивком :)
Что, надоело? Можем тогда на этом остановиться, я не настаиваю.
Офлайн
Почему надоело? Я жду конструктивной критики. Сейчас например, мне сложно увидеть ошибки в этом варианте. Особенно тяжело пока со стилем. Ещё я не очень знаком с модулями, посему приходиться постоянно ковырять литературу, что отнимает время и не позволяет в полной мере сосредоточиться.
Офлайн
Хорошо, тогда продолжим. Мне наверное просто показалось.
100% конструктивную критику не обещаю, но постараюсь.
arr = [letters[random.randrange(0,len(letters))] \
for i in xrange(0,KolSymb)]
def search(arr, symb0, symb1 = "", PrintOn = 1):
AftArr = arr[arr.index(symb0):len(arr)] #symdols after symb0
BetArr = [] #symbols between symb0 and symb1
if symb1 != "":
CopyArr = copy(arr)
del CopyArr[0:(CopyArr.index(symb0) + 1)]
try:
BetArr = CopyArr[0:CopyArr.index(symb0)]
except ValueError:
BetArr = CopyArr
if PrintOn:
print "Before \""+symb0+"\" i see this - "+str(BefArr)
print "After \""+symb0+"\" i see this - "+str(AftArr)
print "Between \""+symb0+"\" and "+symb1+" i see this - "+str(BetArr)
def main(argv):
....
if __name__ == '__main__':
sys.exit(main(sys.argv))
else:
TrupleStr = (BefArr, AftArr, BetArr)
return TrupleStr
Офлайн
EdЯ просто не совсем понимаю преимуществ random.choice.Это пробовали переписать на random.choice? Если не получается - скажите, а то я уже третий раз предлагаю, а в ответ - тишина.arr = [letters[random.randrange(0,len(letters))] \
for i in xrange(0,KolSymb)]
arr = [random.choice(letters) for i in xrange(0,KolSymb)]
EdНу…Функция возвращает 3 списка. Как иначе?Зачем здесь TrupleStr? По-моему он только мешает.
else:
TrupleStr = (BefArr, AftArr, BetArr)
return TrupleStr
Отредактировано (Ноя. 9, 2009 13:45:14)
Офлайн
UsCrДа, и это дорогого стоит. Впрочем может быть он будет и побыстрее, но я имел в виду именно читабельность.
Так? Просто код станет более читаемым?
Ну…Функция возвращает 3 списка. Как иначе?Просто return BefArr, AftArr, BetArr и все.
Отредактировано (Ноя. 9, 2009 14:16:36)
Офлайн
EdО как… Действительно. Я не так понял фразу “в функции может быть только один return”.
Просто return BefArr, AftArr, BetArr и все.
Офлайн
Такой вот у меня получился код:
from random import choice
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
def main(argv):
....
if __name__ == '__main__':
sys.exit(main(sys.argv))
Офлайн
UsCrПравильно вы ее поняли. Просто конструкция bla, bla1, bla2 не может быть ничем иным, как tuple, поэтому скобки можно не указывать.
О как… Действительно. Я не так понял фразу “в функции может быть только один return”.
Офлайн