我还在学习Python,但我觉得这是一个很酷的项目。请随时批评,并让我知道什么工作或改变。
main.py
# -------- 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
# 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"]发布于 2019-07-25 05:35:17
一个值得尊敬的程序,供学习用Python编写代码的人使用。
当注释添加有用的信息来帮助某人(很可能是你将来)理解代码时,它们是很好的。模块导入、类导入和全局变量实际上没有添加任何内容。相反,解释全局变量是用于什么以及为什么它需要是全局变量的注释将是有用的。
在这里,类这个短语并没有真正的用途。类属性并没有真正关联到属于一个类。
如果可能,应避免使用全局变量。它们表示函数的接口,这些函数是隐藏的,可能是无文档的。例如,您无法从create_new_p()在run_puzzle()末尾的调用中看出您首先需要:
p_p设置为短语列表,phrase_picked中,p_unique_letters设置为所选短语中唯一字母的列表,p_unique_nums设置为与p_unique_letters长度相同的1到26之间的随机整数列表,以及converted_phrase设置为空字符串。否则该函数将无法正常运行。它也没有显示调用的结果在converted_phrase中返回。
Docstring在函数内部,而不是在函数之前。拜托,别全戴帽子。实际上,所有大写文本都比适当的混合大小写文本更难阅读。
查看对get_rand_num()的调用,如果不检查函数,就不知道它返回了什么。但是,Python程序员很容易理解对random.randint(1, 26)的调用。所以以后再用吧。
从用于create_new_p()的doc字符串(p用于益智?),函数的目的是通过将字母映射到字母的随机排列来获取输入短语并创建拼图短语。例如,'a‘可以映射到'x’,'b‘可以映射到'e’。任何不是字母的东西都是不变的。
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()来生成字符串。
有了经验,你将学会把这写成一个理解列表:
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)或者,使用标准库的特性,比如:
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的唯一随机数与每个字母相关联。这可以通过认识到没有必要得到唯一的字母或将数字关联起来而得到改进。相反,只需构建一个从字母表到混乱版本的字母表的映射。这也可以成为一个单独的功能:
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))我认为短语应该是一个短语列表,这样就可以随机挑选一个词来进行密码拼图。
phrases = [
("phrase one", "cite 1"),
("phrase two", "cite 2"),
... etc.
]因此,run_puzzle()变成:
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))https://codereview.stackexchange.com/questions/224849
复制相似问题