简体   繁体   中英

Why does Python 3 for loop output and behave differently?

This is a password generator, I couldn't really determine where the problem is, but from the output, I could say it's around turnFromAlphabet()

The function turnFromAlphabet() converts an alphabetical character to its integer value.

The random module, I think doesn't do anything here as it just decides whether to convert a character in a string to uppercase or lowercase. And if a string is in either, when sent or passed to turnFromAlphabet() it is converted to lowercase first to avoid errors but there are still errors.

CODE:

import random
import re

#variables
username = "oogisjab" #i defined it already for question purposes
index = 0
upperOrLower = []
finalRes = []
index2a = 0
#make decisions
for x in range(len(username)):
    decision = random.randint(0,1)
    if(decision is 0):
        upperOrLower.append(True)
    else:
        upperOrLower.append(False)
#Apply decisions
for i in range(len(username)):
    if(upperOrLower[index]):
        finalRes.append(username[index].lower())
    else:
        finalRes.append(username[index].upper())
    index+=1
s = ""
#lowkey final
s = s.join(finalRes)

#reset index to 0
index = 0

def enc(that):
    if(that is "a"):
        return "@"
    elif(that is "A"):
        return "4"
    elif(that is "O"):
        return "0" #zero
    elif(that is " "):
        # reduce oof hackedt
        decision2 = random.randint(0,1)
        if(decision2 is 0):
            return "!"
        else:
            return "_"
    elif(that is "E"):
        return "3"
    else:
        return that

secondVal = []

for y in range(len(s)):
    secondVal.append(enc(s[index]))
    index += 1

def turnFromAlphabet(that, index2a):
    alp = "abcdefghijklmnopqrstuvwxyz"
    alp2 = list(alp)
    for x in alp2:
        if(str(that.lower()) == str(x)):
            return index2a+1
            break
        else:
            index2a += 1
    else:
        return "Error: Input is not in the alphabet"    
#real final 
finalOutput = "".join(secondVal)

#calculate some numbers and chars from a substring
amount = len(finalOutput) - round(len(finalOutput)/3)
getSubstr = finalOutput[-(amount):]
index = 0
allFactors = {

};
#loop from substring
for x in range(len(getSubstr)):
    hrhe = re.sub(r'\d', 'a', ''.join(e for e in getSubstr[index] if e.isalnum())).replace(" ", "a").lower()
    print(hrhe)
    #print(str(turnFromAlphabet("a", 0)) + "demo")
    alpInt = turnFromAlphabet(hrhe, 0)
    print(alpInt)
    #get factors
    oneDimensionFactors = []
    for p in range(2,alpInt):
        # if mod 0
        if(alpInt % p) is 0:
            oneDimensionFactors.append(p)
    else:
        oneDimensionFactors.append(1)
    indexP = 0
    for z in oneDimensionFactors:
        allFactors.setdefault("index{0}".format(index), {})["keyNumber"+str(p)] = z

    index+=1
print(allFactors)

I think that you are getting the message "Error: input is not in the alphabet" because your enc() change some of your characters. But the characters they becomes (for example '@', '4' or '!') are not in your alp variable defined in turnFromAlphabet() . I don't know how you want to fix that. It's up to you.

But I have to say to your code is difficult to understand which may explain why it can be difficult for you to debug or why others may be reluctant to help you. I tried to make sense of your code by removing code that don't have any impact. But even in the end I'm not sure I understood what you tried to do. Here's what I understood of your code:

import random
import re

#username = "oogi esjabjbb" 
username = "oogisjab" #i defined it already for question purposes

def transform_case(character):
    character_cases = ('upper', 'lower')
    character_to_return = character.upper() if random.choice(character_cases) == 'upper' else character.lower()
    return character_to_return

username_character_cases_modified = "".join(transform_case(current_character) for current_character in username)

def encode(character_to_encode):
    translation_table = {
        'a' : '@',
        'A' : '4',
        'O' : '0',
        'E' : '3',
    }
    character_translated = translation_table.get(character_to_encode, None)
    if character_translated is None:
        character_translated = character_to_encode
    if character_translated == ' ':
        character_translated = '!' if random.choice((True, False)) else '_'
    return character_translated

final_output = "".join(encode(current_character) for current_character in username_character_cases_modified)

amount = round(len(final_output) / 3)
part_of_final_output = final_output[amount:]

all_factors = {}
for (index, current_character) in enumerate(part_of_final_output):
    hrhe = current_character 
    if not hrhe.isalnum():
        continue
    hrhe = re.sub(r'\d', 'a', hrhe)
    hrhe = hrhe.lower()
    print(hrhe)

    def find_in_alphabet(character, offset):
        alphabet = "abcdefghijklmnopqrstuvwxyz"
        place_found = alphabet.find(character)
        if place_found == -1 or not character:
            raise ValueError("Input is not in the alphabet")
        else:
            place_to_return = place_found + offset + 1
        return place_to_return

    place_in_alphabet = find_in_alphabet(hrhe, 0)
    print(place_in_alphabet)

    def provide_factors(factors_of):
        for x in range(1, int(place_in_alphabet ** 0.5) + 1):
            (quotient, remainder) = divmod(factors_of, x)
            if remainder == 0:
                for current_quotient in (quotient, x):
                    yield current_quotient

    unique_factors = set(provide_factors(place_in_alphabet))
    factors = sorted(unique_factors)

    all_factors.setdefault(f'index{index}', dict())[f'keyNumber{place_in_alphabet}'] = factors 

print(all_factors)

Is near what your wanted to do?

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM