python - 仅将循环返回的值发送给 print() 一次

标签 python python-3.x loops iteration string-length

当尝试检索第二个选项的解密密码时,无论输入的网站是否真实,我都无法阻止程序打印不计算。当它不真实时,它会打印两次,所以这让我相信它正在打印 for i in the range(len(passwords)) ,即 2。

如何让它只打印密码或不计算一次而不让它再次迭代?我正在尝试检查输入是否等于网站,但它仍然打印迭代两次。

import csv
import sys

# The password list - We start with it populated for testing purposes
passwords = [["yahoo", "XqffoZeo"], ["google", "CoIushujSetu"]]
# The password file name to store the passwords to
passwordFileName = "samplePasswordFile"
# The encryption key for the caesar cypher
encryptionKey = 16
# Caesar Cypher Encryption
def passwordEncrypt(unencryptedMessage, key):
    # We will start with an empty string as our encryptedMessage
    encryptedMessage = ""
    # For each symbol in the unencryptedMessage we will add an encrypted symbol into the encryptedMessage
    for symbol in unencryptedMessage:
        if symbol.isalpha():
            num = ord(symbol)
            num += key
            if symbol.isupper():
                if num > ord("Z"):
                    num -= 26
                elif num < ord("A"):
                    num += 26
            elif symbol.islower():
                if num > ord("z"):
                    num -= 26
                elif num < ord("a"):
                    num += 26
            encryptedMessage += chr(num)
        else:
            encryptedMessage += symbol
    return encryptedMessage


def loadPasswordFile(fileName):
    with open(fileName, newline="") as csvfile:
        passwordreader = csv.reader(csvfile)
        passwordList = list(passwordreader)
    return passwordList


def savePasswordFile(passwordList, fileName):
    with open(fileName, "w+", newline="") as csvfile:
        passwordwriter = csv.writer(csvfile)
        passwordwriter.writerows(passwordList)


prompt_msg = """
What would you like to do:
 1. Open password file
 2. Lookup a password
 3. Add a password
 4. Save password file
 5. Print the encrypted password list (for testing)
 6. Quit program
Please enter a number (1-4)
"""

while True:
    print(prompt_msg)
    choice = input()

    if choice == "1":  # Load the password list from a file
        passwords = loadPasswordFile(passwordFileName)

    elif choice == "2":  # Lookup at password
        print("Which website do you want to lookup the password for?")
        for keyvalue in passwords:
            print(keyvalue[0])
        print("----")
        passwordToLookup = input()
        for i in range(len(passwords)):
            print(f"i={i}, store_info={passwords[i]}, website={passwords[i][0]}")
            if passwordToLookup == passwords[i][0]:
                password = passwordEncrypt(passwords[i][1], -(encryptionKey))
                print(f"=> The password is {password}.")
            else:
                print("=> Does not compute!")

    elif choice == "3":
        print("What website is this password for?")
        website = input()
        print("What is the password?")
        unencryptedPassword = input()
        unencryptedPassword = passwordEncrypt(unencryptedPassword, encryptionKey)
        newList = [website, unencryptedPassword]
        passwords.append(newList)
        print("Your password has been saved.")

    elif choice == "4":  # Save the passwords to a file
        savePasswordFile(passwords, passwordFileName)

    elif choice == "5":  # print out the password list
        for keyvalue in passwords:
            print(", ".join(keyvalue))

    elif choice == "6":  # quit our program
        sys.exit()

    print()
    print()
    ####### YOUR CODE HERE ######
    # You will need to find the password that matches the website
    # You will then need to decrypt the password
    #
    # 1. Create a loop that goes through each item in the password list
    #  You can consult the reading on lists in Week 5 for ways to loop through a list
    #
    # 2. Check if the name is found.  To index a list of lists you use 2 square backet sets
    #   So passwords[0][1] would mean for the first item in the list get it's 2nd item (remember, lists start at 0)
    #   So this would be 'XqffoZeo' in the password list given what is predefined at the top of the page.
    #   If you created a loop using the syntax described in step 1, then i is your 'iterator' in the list so you
    #   will want to use i in your first set of brackets.
    #
    # 3. If the name is found then decrypt it.  Decrypting is that exact reverse operation from encrypting.  Take a look at the
    # caesar cypher lecture as a reference.  You do not need to write your own decryption function, you can reuse passwordEncrypt
    #
    #  Write the above one step at a time.  By this I mean, write step 1...  but in your loop print out every item in the list
    #  for testing purposes.  Then write step 2, and print out the password but not decrypted.  Then write step 3.  This way
    #  you can test easily along the way.
    #

最佳答案

似乎只有当存储的密码都不与输入匹配时,您才想打印不计算;但事实上,您正在为每个不匹配的密码打印该消息(即使其他密码确实匹配)。

我已经修改了循环,以便在找到匹配项时中断,并且仅在未找到匹配项时才打印消息(通过向 for 循环添加一个 else 子句,该子句仅在以下情况下执行)循环使其一直到最后。)

    passwordToLookup = input()
    for i in range(len(passwords)):
        if passwordToLookup == passwords[i][0]:
            webSite = passwordEncrypt(passwords[i][1],-(encryptionKey))
            print()
            print('The password is ' + webSite+'.')
            print(i)
            print(passwords[i])
            print(passwords[i][0])
            break
    else:
        # if we got to the end of the loop, no passwords matched
        print('Does not compute!')

关于python - 仅将循环返回的值发送给 print() 一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51869463/

相关文章:

python - 在方法中编辑字典值

python-3.x - TkFiledialog.askopenfilename() 在 Windows 10 中启动 "save as"的窗口

Python嵌套for循环向下计数

javascript - 在javascript中使用for循环重复初始化变量

jquery - 如何在jquery数据:中添加(for循环)

java - 需要帮助更改按钮背景

python - 如何获取flask中html标签内变量的值?

python - vSphere 中的虚拟交换机保存在哪里? (通过 pyVmomi)

python - 需要帮助来修复 Python 中的递归二分搜索函数

python - 如何将我的结果打印为列表?