Найти - Пользователи
Полная версия: выход из цикла
Начало » Python для новичков » выход из цикла
1 2 3 4 5
AD0DE412
 for i in range(3):
    print(f"чета 3 раза. №{i}")
ffrr
Спасибо, действительно else не было в конце скрипта. Теперь у меня почему-то в бесконечном цикле печатает:
 print('вот здеся обработка первого if')
AD0DE412
 #!/usr/bin/env python3.8
import getpass                          
import pymysql
import hashlib                       
import uuid                                            
import re
import time                             
import pyinputplus as pyip
import os
from uuid import getnode as mac
t = 4                                                                  
print("-------------------------")   
print("<<<<<<<<<Welcome>>>>>>>>>")                           
print("-------------------------")
print("Please enter a username (after 3 unlucky attempts system will reboot)")
while True:                                                               
    t -= 1                                             
    if t > 0:                            
        username = pyip.inputNum('Username (must be 12 numbers): ', min=111111111111, max=999999999999, limit=3)
        db = pymysql.connect("hostname","user","pass","db")
        # prepare a cursor object using cursor() method
        cursor = db.cursor()          
        cursor.execute("SELECT userID, password from permissions")                                              
        data = cursor.fetchone()                                                                                
        dbuser, dbpass = data                                                                                   
        #dbuser, dbpass = str(data[0]), data[1]                                                                 
        # disconnect from server                                                                                
        db.close()                                                                                              
        if username == dbuser :                                                                         
            while True:                                                                                     
                password = getpass.getpass(prompt="Enter secret password:")                     
                if (hashlib.sha1(password.encode()).hexdigest() == dbpass):                             
                    print("Authentication success")                                                 
                    break                                                                           
                else:                                                                                   
                    print("Bad password")                                                           
                t -= 1                                                                                  
                if t > 0:                                                                               
                    print('Left attempts=>', t)                                                     
                else:                                                                                   
                    print('System will reboot now...')                                              
                    time.sleep(3)                                                                   
                    #os.system("reboot")                                                             
                    break                                                                           
        else:                                                                                                   
            print ("please try another username. This username is incorrect")                               
            continue                                                           
        break
    else:
        print('вот здеся обработка первого if')
        break
в общем виде если известно количество циклов лучше использывать for
 for i in range(3):
    print(f"чета 3 раза. №{i}")
else:
    print('все')
else для наглядность не более т.е. так писать не надо кхм как правило
ffrr
А как тогда можно посчитать и выводить количество оставшихся попыток ввода? ранее было
 print('Left attempts=>', t)
AD0DE412
 #вариант 1
test = 0
for i in range(3):
    test += 1 
    print(f"чета 3 раза. №{i}")
    #предположим получилось со 2 попытки сча сэмулируем это
    if test == 2:
        print(test)
        break
#вариант 2
test = 0
for i in range(3):
    test = i
    print(f"чета 3 раза. №{i}")
    #предположим получилось со 2 попытки сча сэмулируем это
    if test == 1:
        print(test)
        break
#вариант 3
for i in range(3):
    print(f"чета 3 раза. №{i}")
    #предположим получилось со 2 попытки сча сэмулируем это
    if i == 1:
        print(i)
        break
upd поправка 2 и 3 варианта копипаста блин
ffrr
А что здесь означает
 {i}

в блоке
 for i in range(3):
    print(f"чета 3 раза. №{i}")
else:
    print('все')
?
AD0DE412
clik
ffrr
 ................................
def user():
        username = pyip.inputNum('Username (must be 12 numbers): ', min=111111111111, max=999999999999, limit=3)
        return username
def pazz():
        password = getpass.getpass(prompt="Enter secret password:")
        return password
        
for i in range(3):
        test += 1
#       username = pyip.inputNum('Username (must be 12 numbers): ', min=111111111111, max=999999999999, limit=3)
        user()
        db = pymysql.connect("hostname","user","pass","db")
        # prepare a cursor object using cursor() method
        cursor = db.cursor()
        cursor.execute("SELECT userID, password from permissions")
        data = cursor.fetchone()
        dbuser, dbpass = data
        if username == dbuser :
#               password = getpass.getpass(prompt="Enter secret password:")
          pazz()
.........................

при запуске ошибка
 # ./auth.py
-------------------------
<<<<<<<<<Welcome>>>>>>>>>
-------------------------
Please enter a username (after 3 unlucky attempts system will reboot)
Username (must be 12 numbers): 659605758501
Traceback (most recent call last):
  File "./auth.py", line 58, in <module>
    if username == dbuser :
NameError: name 'username' is not defined

получается как-то особо нужно оглашать переменную username после запуска функции user()? или неверно сама функция user() написана?
AD0DE412
https://nuancesprog.ru/p/9211/
xam1816
ffrr
для того, чтобы и username и пароль спрашивало по 3 раза, дальше выполнялся бы reboot машины…
а если пользователь в строчке

 username = pyip.inputNum('Username (must be 12 numbers): ', min=111111111111, max=999999999999, limit=3)

3 раза введет меньше 12 чисел,или как-нибудь еще исчерпает limit=3,как поведет себя программа?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB