首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >密码难题

密码难题
EN

Code Review用户
提问于 2019-07-25 00:49:17
回答 1查看 778关注 0票数 1

我还在学习Python,但我觉得这是一个很酷的项目。请随时批评,并让我知道什么工作或改变。

main.py

代码语言:javascript
复制
# -------- MODULE IMPORTS --------
import random
# -------- CLASS IMPORTS --------
from phrases import Phrases

# -------- GLOBAL VARIABLES --------

p_p = Phrases.phrases
ref = Phrases.phrases[1]
p_a = Phrases.alpha
phrase_picked = 0
p_unique_letters = []
p_unique_nums = []
converted_phrase = ""

""" 
    THIS FUNCTION GENERATES A RANDOM NUMBER BETWEEN 1 & 26
    (NUMBER OF LETTERS IN THE ALPHABET)
"""
def get_rand_num():
    r = random.randint(1, 26)
    return r


"""
    THIS FUNCTION TAKES THE ORIGINAL PHRASE AND
    ITERATES OVER EVERY LETTER AND CHANGES IT TO
    A RANDOM LETTER BASED ON THE RANDOM NUMBER 
    THAT IS ASSIGNED IN THE 'RUN_PUZZLE' FUNCTION
"""
def create_new_p():
    global converted_phrase
    for l in p_p[phrase_picked]:
        if l.lower() in p_unique_letters:
            temp_li = p_unique_letters.index(l.lower())
            temp_ni = p_unique_nums[temp_li] - 1
            converted_phrase = converted_phrase + p_a[temp_ni]

        # IF THERE IS A SPECIAL CHARACTER IN THE PHRASE LIKE A PERIOD
        # OR COLON. THESE STATEMENTS WILL NOT CONVERT THE CHARACTER TO
        # A RANDOM CHARACTER

        elif l == '\'':
            converted_phrase = converted_phrase + "'"
        elif l == '\"':
            converted_phrase = converted_phrase + '"'
        elif l == ' ':
            converted_phrase = converted_phrase + ' '
        elif l == '.':
            converted_phrase = converted_phrase + '.'
        elif l == ',':
            converted_phrase = converted_phrase + ','
        elif l == ':':
            converted_phrase = converted_phrase + ':'
        elif l == '-':
            converted_phrase = converted_phrase + '-'

    """ 
        PRINTS OUT THE FINAL CONVERTED PHRASE TO THE CONSOLE
        ALONG WITH THE VERSES REFERENCE WHICH IS IN IT'S ORIGINAL
        SPELLING
    """
    print("\n" + converted_phrase.upper() + "\n\n" + ref)


"""
    THIS FUNCTION ITERATES OVER THE ORIGINAL PHRASE AND PUTS ONLY THE
    **DIFFERENT** CHARACTERS INTO A LIST. EACH CHARACTER IS THEN ASSIGNED
    A RANDOM NUMBER BETWEEN 1 & 26.
"""
def run_puzzle():
    for l in p_p[phrase_picked]:
        if l.lower() not in p_unique_letters and l.lower() in p_a:
            p_unique_letters.append(l.lower())

    p_len = len(p_unique_letters)

    while len(p_unique_nums) < p_len:
        r = get_rand_num()
        if r not in p_unique_nums:
            p_unique_nums.append(r)

    """ UNCOMENT BELOW LINE TO SEE A MORE CLEAR OUTPUT OF HOW
        THE LETTERS ARE ASSIGNED TO A RANDOM NUMBER
    """
    # print(str(p_unique_letters) + ":" + str(p_unique_nums))

    create_new_p()

phrases.py

代码语言:javascript
复制
# STARTS THE FIRST FUNCTION CALL OF THE PROGRAM
run_puzzle()
class Phrases():

# THIS IS A LIST THAT HOLDS EACH LETTER OF THE ALPHABET INDIVIDUALLY
alpha = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l',
         'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']

# HOLDS THE CURRENT PHRASE(S) IN A LIST.
# THE FIRST ITEM([0]) IS THE PHRASE
# THE SECOND ITEM([1]) IS THE VERSE REFERENCE
phrases = ["Good will come to those who are generous and lend freely, "
           "who conduct their affairs with justice.", "Psalm - 112:5"]
EN

回答 1

Code Review用户

发布于 2019-07-25 05:35:17

一个值得尊敬的程序,供学习用Python编写代码的人使用。

风格

当注释添加有用的信息来帮助某人(很可能是你将来)理解代码时,它们是很好的。模块导入、类导入和全局变量实际上没有添加任何内容。相反,解释全局变量是用于什么以及为什么它需要是全局变量的注释将是有用的。

在这里,类这个短语并没有真正的用途。类属性并没有真正关联到属于一个类。

如果可能,应避免使用全局变量。它们表示函数的接口,这些函数是隐藏的,可能是无文档的。例如,您无法从create_new_p()run_puzzle()末尾的调用中看出您首先需要:

  1. p_p设置为短语列表,
  2. 选择一个短语并将短语的索引存储在phrase_picked中,
  3. p_unique_letters设置为所选短语中唯一字母的列表,
  4. p_unique_nums设置为与p_unique_letters长度相同的1到26之间的随机整数列表,以及
  5. converted_phrase设置为空字符串。

否则该函数将无法正常运行。它也没有显示调用的结果在converted_phrase中返回。

Docstring在函数内部,而不是在函数之前。拜托,别全戴帽子。实际上,所有大写文本都比适当的混合大小写文本更难阅读。

物质

查看对get_rand_num()的调用,如果不检查函数,就不知道它返回了什么。但是,Python程序员很容易理解对random.randint(1, 26)的调用。所以以后再用吧。

从用于create_new_p()的doc字符串(p用于益智?),函数的目的是通过将字母映射到字母的随机排列来获取输入短语并创建拼图短语。例如,'a‘可以映射到'x’,'b‘可以映射到'e’。任何不是字母的东西都是不变的。

代码语言:javascript
复制
def create_new_puzzle(phrase, letter_mapping):
    ''' Makes a cryptogram of `phrase` by replacing letters according to
        letter_mapping.  Other characters are unchanged.
    '''

    puzzle_phrase = []

    for letter in phrase:
        if letter.isalpha():
            puzzle_phrase.append(letter_mapping[letter])
        else:
            puzzle_phrase.append(letter)

    return ''.join(puzzle_phrase)

在python中,字符串是不可变的。因此,将字母复制到字符串中可能需要创建一个新字符串,将旧字符串和新字母复制到新字符串中。您将经常看到通过在列表中添加字母来创建字符串的代码,然后在列表的末尾使用‘’.‘.join()来生成字符串。

有了经验,你将学会把这写成一个理解列表:

代码语言:javascript
复制
def create_new_puzzle(phrase, letter_mapping):
    ''' Makes a cryptogram of `phrase` by replacing letters according to
        letter_mapping.  Other characters are unchanged.
    '''

    puzzle_phrase = [letter_mapping.get(letter,letter) for letter in phrase]

    return ''.join(puzzle_phrase)

或者,使用标准库的特性,比如:

代码语言:javascript
复制
def create_new_puzzle(phrase, letter_mapping):
    ''' Makes a cryptogram of `phrase` by replacing letters according to
        letter_mapping.  Other characters are unchanged.
    '''

    return phrase.translate(str.maketrans(letter_mapping))

请注意create_new_puzzle()的接口是如何独立于函数实现的。短语和映射被传入,密码被返回。这很好,因为您可以在不影响程序其余部分的情况下更改函数的内部结构。

run_puzzle()做了很多工作来构建一个从字母表到随机字母表的映射。它首先收集短语中的唯一字母,然后将一个从1到26的唯一随机数与每个字母相关联。这可以通过认识到没有必要得到唯一的字母或将数字关联起来而得到改进。相反,只需构建一个从字母表到混乱版本的字母表的映射。这也可以成为一个单独的功能:

代码语言:javascript
复制
import random
import string

def create_mapping():
    to_alphabet = list(string.ascii_uppercase)
    random.shuffle(to_alphabet)

    return dict(zip(string.ascii_letters, to_alphabet*2))

我认为短语应该是一个短语列表,这样就可以随机挑选一个词来进行密码拼图。

代码语言:javascript
复制
phrases = [
   ("phrase one", "cite 1"),
   ("phrase two", "cite 2"),
   ... etc.
]

因此,run_puzzle()变成:

代码语言:javascript
复制
import phrases

def run_puzzle():
    phrase, citation = random.choice(phrases)
    mapping = create_mapping()
    puzzle_phrase = create_new_puzzle(phrase, mapping)

    print("\n{}\n\n{}".format(puzzle_phrase, citation))
票数 0
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/224849

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档