Создание строки случайных символов

Я создаю домены со случайными именами. Я использовал функцию карты, потому что она упаковывает результаты в список, который я могу затем join() в строку, но так, как я использовал функцию лямбда может смутить людей, читающих это позже.

def generateHost():
  charSet = 'abcdefghijklmnopqrstuvwxyz1234567890'
  minLength = 5
  maxLength = 30
  length = random.randint(minLength, maxLength)

  return ''.join(map(lambda unused : random.choice(charSet), range(length)))+".com"

Эта функция вызывает generateHost() 'size' и создает массив хостов. Я мог бы написать это, как выше, но это была бы та же проблема. Я написал его с помощью цикла for, который меня все еще не удовлетворяет.

def generateHostList(size):
  result = []
  for i in range(size):
    result += [generateHost()]
  return result
12 голосов | спросил Josh Horowitz 18 AMpFri, 18 Apr 2014 06:04:22 +040004Friday 2014, 06:04:22

3 ответа


12

Ответ на этот вопрос предлагает следующее:

''.join(random.choice(string.ascii_lowercase + string.digits) for _ in range(length))

Это близко к вашему решению, но избегает необходимости вводить весь алфавит с помощью предопределенных значений и избегает использования map () и лямбда.

ответил Tom Barron 18 AMpFri, 18 Apr 2014 06:44:26 +040044Friday 2014, 06:44:26
4

Питоническая идиома заключается в том, чтобы использовать понимание списка, где это возможно:

def generateHostList(size):
    return [ generateHost() for _ in range(size) ]

(обратите внимание на другую идиому использования _ для unused).

Сам код generateHost может показаться запутанным. решение TomBarron лучше.

ответил vnp 18 AMpFri, 18 Apr 2014 08:55:33 +040055Friday 2014, 08:55:33
3

Другие сообщения уже ответили, как создавать случайные строки и случайный список хостов, и они полностью совпадают.

Я бы просто добавил, что если это для генерации имен хостов в сети, они могут быть не очень хорошими именами. Они больше похожи на пароли, которые трудно запомнить и не будут практичными. Я рекомендую другой подход, предложенный этой статьей . Идея состоит в том, чтобы выбрать темы и использовать их как имена серверов. Например, вы можете использовать сочетание имен символов мультфильма, например:

toystory = ('woody', 'buzz', 'jessie', 'rex', 'potato', 'sid')
walle = ('walle', 'eve', 'axiom', 'captain')
'-'.join([random.choice(toystory), random.choice(walle)])

Конечно, в идеале с гораздо более длинными списками. И в конце вы можете добавить числовое число, например:

'-'.join([random.choice(toystory), random.choice(walle), ''.join(random.choice(string.digits) for _ in xrange(3))])

Наконец, посмотрите PEP8, руководство по стилю Python , Пока ваш код в порядке, но рекомендуется отступы с 4 пробелами вместо 2. Существует инструмент командной строки, называемый pep8, который может проверьте свой код на стиль. Когда вы изучаете Python, с самого начала хорошо следовать рекомендованному стилю, проще, чем исправлять вредные привычки позже.

ответил janos 18 AMpFri, 18 Apr 2014 09:43:11 +040043Friday 2014, 09:43:11

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132