Pull to refresh

Comments 12

Только не понятен смыл генерации IP адресов без учета хотя бы выделенных значений для локальных сетей…
Да и 4 рандома — крайне сомнительное решение. При достаточно большом наборе адресов будут дубли (смотрим бездей парадокс), не говоря уже о попытке создать список всех возможных IP адресов. В таком списке никогда всего диапазона не получить указанным методом.

Как казалось бы — в параметрах в первую очередь должна быть маска подсети в которой будут генерироваться адреса.
Что-то прямо вспомнилось, как в универе подсети считали методом квадратов на бумажке.
Представление адреса компьютера по протоколу IPv4 являет собой четыре десятизначных числа (от 0 до 255), разделённых точками. Именно такие десятичные ip-адреса мы и будем генерировать и записывать текстовый файл.
У вас неправильно генерируются IP адреса.

У генератора слишком много сайдэффектов. И какая разница, быстрее выполняется for, чем while? Пишите понятный код, а скорость придет естественным образом. Сравните ваш генератор и:


import logging
from itertools import islice
from pathlib import Path
from random import randrange

logging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger(__name__)

def ips():
    while True:
        a = randrange(256)
        b = randrange(256)
        c = randrange(256)
        d = randrange(256)

        yield f'{a}.{b}.{c}.{d}'

def write_out(filename, lines):
    with Path(filename).open('a', encoding='utf8') as fp:
        for line in lines:
            fp.write(f'{line}\n')

write_out('ip-addresses.txt', islice(ips(), 100))
logger.info('Complete!')

Теперь можно и поддержку подсетей в ips() реализовать, и ничего не сломается, и https://docs.python.org/3/library/ipaddress.html использовать, да и вообще, немного чище все стало :)

f.write(str(a)+'.'+str(b)+'.'+str(c)+'.'+str(d)+port+'\n')

Вас Borland Delphi покусал?
f = open('ip-addresses.txt', 'a', encoding='utf-8')

Контекстные менеджеры не нужны.
однако для начальной практики по Python сойдет и такой простой генератор

Не пойдет, потому что это скорее практическое руководство как НЕ надо делать… уж простите за такую резкую критику.
отличная статья, так держать!
    for n in range(amount):
        a = randint(0,255)
        b = randint(0,255)
        c = randint(0,255)
        d = randint(0,255)


У меня смутные подозрения о валидности некоторых адресов.
У Вас собственно генерация идет в цикле. И писать процент в каждой новой строке реально не комильфо. В одну строчку будет симпатичнее и нагляднее. Скажем, хотябы так:
def progressbar(position, max):
    total_points = 50  # длина прогрессбара, выберите по вкусу
    current_points = int(position / max * total_points)
    percent = int(current_points / total_points * 100)
    
    print(f'\r[ {"█" *  current_points}{"░" * (total_points-current_points)} ] {percent}%', end='', flush=True)
Замечательный пример как делать не надо.
Но зачем городить такой огород ради генерации рандомных адресов, не несущих никакого практического смысла?
Используем цикл for, так как он выполняется гораздо быстрее while'a.

Более эффективно будет, если вы выведете постоянное открытие и закрытие файла из тела цикла. Прям в разы наверное.
реализуем простенький прогресс-бар.

Сразу хочу сказать: Tkinter не подойдёт для этой цели.

Какая интрига… Заставили в 5 утра за комп сесть.
Если сделать так:
def generator(amount, port=''):
    ...
    for n in range(amount):
        ...
        prc = int(n//(amount/100.0))

        frame.update()
        prgs.set(prc)
        ... 
    prgs.set(100)
    print('Success!')

...

prgs = IntVar()
pb = ttk.Progressbar(frame, orient='horizontal', length=320, mode='determinate', variable=prgs)
pb.grid(row=4, column=0, columnspan = 8)

root.mainloop()

то все получится. Можно еще времени выиграть на генераторе, прорядив обновление прогрессбара только при увеличении процентов.
Sign up to leave a comment.

Articles