引入大整数常量的最优雅/最具Python风格的方式是什么?
我需要引入大整数常量(Diffie-Hellman密钥交换的素数) 以符合PEP8的方式实现这一点的最具pythonic/pretty方式是什么?最好没有反斜杠 我目前的做法是:引入大整数常量的最优雅/最具Python风格的方式是什么?,python,coding-style,pep8,Python,Coding Style,Pep8,我需要引入大整数常量(Diffie-Hellman密钥交换的素数) 以符合PEP8的方式实现这一点的最具pythonic/pretty方式是什么?最好没有反斜杠 我目前的做法是: N = '''FFFFFFFF FFFFFFFF C90FDAA2 2168C234 C4C6628B 80DC1CD1 29024E08 8A67CC74 020BBEA6 3B139B22 514A0879 8E3404DD EF9519B3 CD3A431B 302B0A6D F25F
N = '''FFFFFFFF FFFFFFFF C90FDAA2 2168C234 C4C6628B 80DC1CD1
29024E08 8A67CC74 020BBEA6 3B139B22 514A0879 8E3404DD
EF9519B3 CD3A431B 302B0A6D F25F1437 4FE1356D 6D51C245
E485B576 625E7EC6 F44C42E9 A637ED6B 0BFF5CB6 F406B7ED
EE386BFB 5A899FA5 AE9F2411 7C4B1FE6 49286651 ECE65381
FFFFFFFF FFFFFFFF'''
PRIME = int('0x{0}'.format(N.replace('\n', '').replace(' ', '')), 16)
不是很漂亮,但比:
PRIME = 179769313486231590770839156793787453197860296048756011706444423684197180216158519368947833795864925541502180565485980503646440548199239100050792877003355816639229553136239076508735759914822574862575007425302077447712589550957937778424442426617334727629299387668709205606050270810842907692932019128194467627007L
编辑:
更改为PRIME=int(re.sub('\s+','',N),16)
但最重要的是:知道什么时候应该前后矛盾——有时是矛盾
样式指南不适用。当有疑问时,运用你的最佳判断。
看看其他的例子,并决定什么看起来最好。不要犹豫
问
因此,保持常量不变,因为它比任何其他不明显的黑客更具可读性
最重要的是,可读性很重要。
没有什么能超越Python的核心原则
但必须有一种更优雅的方式来做素数=
int('0x{0}'。格式(N.replace('\N','').replace('''')),16)
如果你坚持
PRIME=long('17976931348623159077083915679378745319786029604875601'
'17064444236841971802161585193689478337958649255415021805654859805'
'03646440548199239100050792877003355816639229553136239076508735759'
'91482257486257500742530207744771258955095793777842444242661733472'
'7629299387668709205606050270810842907692932019128194467627007L')
如果你想让某些东西看起来好看,也许你可以把字符串转换成整数。虽然这可能不是最佳实践,因为我从未实际看到它在实践中使用,但我认为它比原始方法更清晰,因为转换有限
number = (
"179769313486231590770839156793787453197860296048756011"
"706444423684197180216158519368947833795864925541502180"
"565485980503646440548199239100050792877003355816639229"
"553136239076508735759914822574862575007425302077447712"
"589550957937778424442426617334727629299387668709205606"
"050270810842907692932019128194467627007"
)
number = int(number)
179769313486231590770839156793787453197860296048756011706444423684197180216158519368947833795864925541502180565485980503646440548199239100050792877003355816639229553136239076508735759914822574862575007425302077447712589550957937778424442426617334727629299387668709205606050270810842907692932019128194467627007L
坦率地说,你所拥有的相当不错。唯一明显的变化是您的最终转换:您可以删除
“0x{0}”.format
位,只需传递替换后的字符串,同时给出int
基数16
除此之外,您可以始终将其隐藏为函数:
def PrimeInt(string):
return int(string.replace('\n','').replace(' ',''), 16)
PRIME = PrimeInt("""
FFFFFFFF FFFFFFFF C90FDAA2 2168C234 C4C6628B 80DC1CD1
29024E08 8A67CC74 020BBEA6 3B139B22 514A0879 8E3404DD
EF9519B3 CD3A431B 302B0A6D F25F1437 4FE1356D 6D51C245
E485B576 625E7EC6 F44C42E9 A637ED6B 0BFF5CB6 F406B7ED
EE386BFB 5A899FA5 AE9F2411 7C4B1FE6 49286651 ECE65381
FFFFFFFF FFFFFFFF
''')
+1-但是必须有一种更优雅的方法来做
PRIME=int('0x{0})。格式(N.replace('\N','').replace('''')),16)
…实际上,我自己发现int(re.sub('\s+','',N),16)
并不优雅/顺便提一下,我的评论是针对Abhijit的PRIME=long…
,非re.sub
<0xFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B1B0A6DF25F14374FE1356D65C245E485B57625EC6F44C42E9A67ED6BFF5CB6F406B7EDE86BFA899F5AE9F24117C46486651FFF代码将是PRIME=1797…
。请记住,在正确性之后,源代码的主要目的不是为了美观,而是为了对读者有用。但是,除了其他以外,我更喜欢'.join(N.split())
到N.replace('\N','')。replace(''''),
我会将该值放入文本文件中,并用python读取它。问题解决了。您也可以将int
放在原始作业中。