Результаты анализа парамиконов Python [дубликат]

Самое первое, что бросило меня в цикл (не каламбур), было то, что вы ограничивали значение 1-13, когда ему нужно быть 0-52. Также с вашей логикой значение всегда было выше. Лучший подход - это генератор чисел. Вот мой код с использованием генератора чисел (или Java Random):

public static void main(String[] args) {

String[] cards = { "Ace of Clubs", "1 of Clubs", "2 of Clubs",
        "3 of Clubs", "4 of Clubs", "5 of Clubs", "6 of Clubs",
        "7 of Clubs", "8 of Clubs", "9 of Clubs", "10 of Clubs",
        "Queen of Clubs", "King of Clubs", "Ace of Diamonds",
        "1 of Diamonds", "2 of Diamonds", "3 of Diamonds",
        "4 of Diamonds", "5 of Diamonds", "6 of Diamonds",
        "7 of Diamonds", "8 of Diamonds", "9 of Diamonds",
        "10 of Diamonds", "Queen of Diamonds", "King of Diamonds",
        "Ace of Hearts", "1 of Hearts", "2 of Hearts", "3 of Hearts",
        "4 of Hearts", "5 of Hearts", "6 of Hearts", "7 of Hearts",
        "8 of Hearts", "9 of Hearts", "10 of Hearts",
        "Queen of Hearts", "King of Hearts", "Ace of Spades",
        "1 of Spades", "2 of Spades", "3 of Spades", "4 of Spades",
        "5 of Spades", "6 of Spades", "7 of Spades", "8 of Spades",
        "9 of Spades", "10 of Spades", "Queen of Spades",
        "King of Spades" };

Scanner scanner = new Scanner(System.in);
Random rand = new Random();
String response = "";
int index = 0;
int value = 0;  
while (!response.equals("q") && index < 52) {

    // set next card value based on current set of cards in play
    if (cards[index].endsWith("Clubs")) {
        value = rand.nextInt(12);
    }
    if (cards[index].endsWith("Diamonds")) {
        value = rand.nextInt(12) + 13;
    }
    if (cards[index].endsWith("Hearts")) {
        value = rand.nextInt(12) + 26;
    }
    if (cards[index].endsWith("Spades")) {
        value = rand.nextInt(12) + 39;
    }

    // display card too user (NOTE: we use the random number not the index)
    System.out.println("Card is: " + cards[value]);

    // ask user what well the next card be
    System.out.println("Will the next card be higher or lower?, press q if you want to quit");
    response = scanner.nextLine();

    // display if user was right (NOTE: compared the random number to the current index)
    // ignore incorrect response and just continue
    if ((value > index && response.startsWith("h")) || (value < index && response.startsWith("l"))) {
        System.out.println("You answer was right, well done!");
    } else {
        System.out.println("You answer was wrong, try again!");
    }

    // continue loop
    index++;
}
}

Что касается исключения NumberFormatException, я считаю, что Николас Филотто хорошо объяснил это.

0
задан Aaron Couch 17 October 2016 в 19:59
поделиться

3 ответа

Для вашего второго вопроса: хотя я не специалист по paramiko, я вижу, что функция recv, в соответствии с doc , возвращает строку. Если вы примените цикл for к строке, вы получите символы (а не строки, как можно было бы ожидать). Новая строка вызвана использованием вами функции печати, как описано на этой странице, в пункте 6.3 .

Я не изучил, что предлагает парамико. Но почему вы не относитесь к полной строке как к единому объекту? Например, вы можете проверить наличие «вверх» как:

if "up" in output:

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

for line in output.split('\n'): 
2
ответ дан Community 19 August 2018 в 08:59
поделиться
  • 1
    Работает отлично. Теперь мне будет намного легче фильтровать переменную. Большое спасибо за быстрый ответ! – Aaron Couch 17 October 2016 в 20:34

После прочтения всего комментария я сделал следующие изменения:

#!/usr/bin/env python
import paramiko, time

router = 'r2.test.example.com'
password = 'password'
username = 'testuser'

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(router, username=username, password=password)
print('Successfully connected to %s' % router)

remote_conn = ssh.invoke_shell()
output = remote_conn.recv(1000)

# Disable paging on Brocade.
remote_conn.send('terminal length 0\n')
time.sleep(2)
# Clearing output.
if remote_conn.recv_ready():
    output = remote_conn.recv(1000)

# Check interface status.
remote_conn.send('show interfaces ethernet 4/1\n') # I only want output from this command.
time.sleep(2)
# Getting output I want.
if remote_conn.recv_ready():
    output = remote_conn.recv(5000)
print(output)

# Test: Check if interface is up.
for line in output.split('\n'):
    if 'line protocol is up' in line:
        print(line)

Теперь все отлично работает.

Спасибо за помощь.

С наилучшими пожеланиями,

Aaron C.

1
ответ дан Aaron Couch 19 August 2018 в 08:59
поделиться
  • 1
    Приятно, я удивлен, что у этой записи так мало + 1. Действительно полезно. – ArnoVR 19 December 2017 в 14:24

Если вы можете, вызов exec_command() предоставляет более простой механизм для вызова команды. Я видел, что коммутаторы Cisco резко отключают подключения, которые пытаются использовать exec_command(), поэтому их нельзя использовать с устройствами Brocade.

Если вы должны пойти по маршруту invoke_shell(), обязательно очистите все ожидающие выходные данные после подключения и после send('terminal length 0\n'), проверяя recv_ready() перед вызовом recv(), чтобы избежать блокировки при чтении данных, которые, возможно, никогда не были получены. Поскольку вы контролируете интерактивную оболочку, могут потребоваться вызовы sleep(), чтобы дать серверу достаточное время для обработки и отправки данных, или, возможно, потребуется опросить строку вывода, чтобы подтвердить, что ваша последняя команда завершена путем распознавания строки приглашения оболочки .

0
ответ дан PKapp 19 August 2018 в 08:59
поделиться
  • 1
    Я добавил инструкцию if, чтобы проверить, работает ли recv_ready (), и она работает. Теперь я могу получить результат из команд, которые я действительно хочу! Благодарю. – Aaron Couch 17 October 2016 в 20:45
Другие вопросы по тегам:

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