невозможно выполнить приращение в цикле python - PullRequest
0 голосов
/ 21 января 2020

Это для печати ip в диапазоне / 28 su bnet (которые являются 16 IP), и я получаю только 1 в качестве вывода. У меня есть фактический вывод для этого кода и ожидаемый, чтобы я мог понять это лучше, пожалуйста, дайте мне знать, какова корректировка, которую я должен сделать здесь.

givenIp = '192.168.2.0/28'
subNet = givenIp.split('/')
ip = subNet[0]
subNetMask = subNet[1]

def totalNoOfHosts(NetMask):

    hosts = (32 - int(NetMask)) * 4
    return hosts

NoOfHost = totalNoOfHosts(subNetMask)

def ipInRange(baseIp):
    print('Number of hosts:' + str(NoOfHost))
    splitIP = baseIp.split('.')
    fourthOctet = splitIP[3]
    for i in str(NoOfHost):
        fourthOctet = int(fourthOctet) + 1
        splitIP[3] = fourthOctet
        newIp = splitIP
        print(newIp)
        return newIp

Вывод:

Number of hosts:16
['192', '168', '2', 1]

Ожидаемый результат:

['192', '168', '2', 1] 
['192', '168', '2', 2]
['192', '168', '2', 3]
.
.
.
.
['192', '168', '2', 16]

Ответы [ 2 ]

1 голос
/ 21 января 2020

Лог c за кодом верен, однако вы сделали 2 ошибки, которые объяснены ниже:

  1. Принятие str (NoOfHost) в l oop не будет повторять значение на количество раз, поскольку значение имеет строковый тип. Поэтому измените его на функцию диапазона, которая является range (0, NoOfHost).
  2. Вторая ошибка - отступ в операторе возврата в for для l oop. так как оператор возврата должен быть частью функции и, поскольку он находится для l oop, он приводит функцию к ее выполнению, таким образом выполняя l oop только один раз. (Отступ в Python относится к (пробелам и табуляциям), которые используются в начале оператора.) См. Код ниже:
    givenIp = '192.168.2.0/28'
    subNet = givenIp.split('/')
    ip = subNet[0]
    subNetMask = subNet[1]

    def totalNoOfHosts(NetMask):

        hosts = (32 - int(NetMask)) * 4
        return hosts

    NoOfHost = totalNoOfHosts(subNetMask)

    def ipInRange(baseIp):
        print('Number of hosts:' + str(NoOfHost))
        splitIP = baseIp.split('.')
        fourthOctet = splitIP[3]
        for i in range(0, NoOfHost):
            fourthOctet = int(fourthOctet) + 1
            splitIP[3] = fourthOctet
            newIp = splitIP
            print(newIp)
        return newIp
    latestIp = ipInRange(ip)
    print("Last IP returned by the function is : ",latestIp)
0 голосов
/ 21 января 2020

Если вы не обязаны выполнять эту работу самостоятельно, вы можете использовать модуль ipaddress, встроенный в Python. Это делает такие задачи, как та, которую вы пытаетесь достичь, очень простой.

import ipaddress

list(ipaddress.ip_network('192.168.10.0/30').hosts())
#[IPv4Address('192.168.10.1'), IPv4Address('192.168.10.2')]

Однако, чтобы достичь того, что вы пытаетесь сделать в своем вопросе, вы можете сделать следующее:

Обратите внимание, это неэффективно и не будет работать, скажем, на / 8 или / 16 su bnet, поскольку вы полагаетесь на изменение только 4-го октета. Я настоятельно рекомендую вам использовать модуль ipaddress.

def ipInRange(baseIp):
    count = int(baseIp.split('.')[3]) + 1
    addresses = []
    for i in range(NoOfHost):
        ip = baseIp.split('.')
        ip[3] = str(count)
        ip = '.'.join(ip)
        count += 1

        addresses.append(ip)

    return addresses

print(ipInRange(ip))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...