我有一个密码生成器:
import random, string
def gen_pass():
foo = random.SystemRandom()
length = 64
chars = string.letters + string.digits
return ''.join(foo.choice(chars) for _ in xrange(length))
Run Code Online (Sandbox Code Playgroud)
根据文档,SystemRandom使用os.urandom,它使用/ dev/urandom来丢弃随机的cryto位.在Linux中,您可以从/ dev/urandom或/ dev/random获取随机位,它们都使用内核可以获得的任何熵.可以使用tail/proc/sys/kernel/random/entropy_avail检查可用的熵量,这将返回如下数字:129.可用的熵越多./ dev/urandom和/ dev/random之间的区别在于/ dev/random只会在entropy_avail足够高(如至少60)时吐出位,而/ dev/urandom总是吐出位.文档说/ dev/urandom对加密有好处,你只需要使用/ dev/random来获得ssl证书等.
我的问题是gen_pass是否适合制作强大的加密级密码?如果我尽快调用此函数,我会在某个时刻停止获取强大的cryto位,因为熵池已经耗尽了吗?
这个问题也可能是为什么的/ dev/urandom的总是产生强烈cryto位并不在乎entropy_avail?
有可能设计/ dev/urandom使其带宽受到可以猜测与熵量相关的周期数的限制,但这是猜测,我无法找到答案.
这也是我的第一个stackoverflow问题所以请批评我.我担心当知道答案的人可能知道背景时,我给了很多背景.
谢谢
更新
我写了一些代码来查看熵池,同时/dev/urandom从中读取:
import subprocess
import time
from pygooglechart import Chart
from pygooglechart import SimpleLineChart
from pygooglechart import Axis
def check_entropy():
arg = ['cat', '/proc/sys/kernel/random/entropy_avail']
ps = subprocess.Popen(arg,stdout=subprocess.PIPE)
return int(ps.communicate()[0])
def run(number_of_tests,resolution,entropy = []):
i …Run Code Online (Sandbox Code Playgroud) 作为一个人为的例子:
myset = set(['a', 'b', 'c', 'd'])
mydict = {item: (yield ''.join([item, 's'])) for item in myset}
Run Code Online (Sandbox Code Playgroud)
并list(mydict)给出:
['as', 'cs', 'bs', 'ds', {'a': None, 'b': None, 'c': None, 'd': None}]
Run Code Online (Sandbox Code Playgroud)
这里发生了什么?怎么yield办?无论表达式yield如何,这种行为是否一致?
注意:我知道做的mydict = {item: ''.join([item, 's']) for item in myset}会给字典{'a': 'as', 'b': 'bs', 'c': 'cs', 'd': 'ds'},这似乎是我想在这里做的.
我写了这个并且期望0:
>>> x = range(20)
>>> next(x)
Run Code Online (Sandbox Code Playgroud)
相反,我得到了:
TypeError:'range'对象不是迭代器
但我以为这是一个发电机?
最初的答案产生了我最初对自己说的同样的事情:它是一个可迭代的,而不是一个交互者.但是,如果两者都是简单的生成器,那么这就无法解释为什么会这样做:
>>> x = (i for i in range(30))
>>> next(x)
0
Run Code Online (Sandbox Code Playgroud) 使用ES6生成器,我看到如下代码:
var trivialGenerator = function *(array) {
var i,item;
for(var i=0; i < array.length; i++){
item = array[i];
yield item;
};
};
Run Code Online (Sandbox Code Playgroud)
是否有可能写下更像下面的代码?
var trivialGenerator = function *(array) {
array.forEach(function *(item){
yield item;
});
};
Run Code Online (Sandbox Code Playgroud)
我问,因为经典for循环是令人厌恶的.
我需要一个简单的随机英语句子生成器.我需要用自己的语言填充它,但它需要能够制作更长的句子,至少遵循英语规则,即使它们没有意义.
我希望那里有数百万人,所以不是重新发明轮子,我希望你知道一个人的资源,或者一个资源,它会给我足够的信息,我没有必要追捕我的生锈的英语技能.
我一直在研究Ruby和Python生成器之间的相似之处/差异(Enumerators在Ruby中称为),并且据我所知,它们几乎相同.
然而,我注意到的一个区别是Python Generators支持一种close()方法,而Ruby Generators则不支持.从Python文档中可以看出该close()方法执行以下操作:
在生成器功能暂停的位置引发GeneratorExit.如果生成器函数然后引发StopIteration(通过正常退出,或者由于已经关闭)或GeneratorExit(通过不捕获异常),则关闭返回其调用者.
Ruby Enumerators不支持该close()方法有充分的理由吗?还是意外遗漏?
我还发现Ruby Enumerators支持一种rewind()方法,而Python生成器却没有......这也是有原因的吗?
谢谢
我正在为博士研究编写代码并开始使用Scala.我经常要做文字处理.我已经习惯了Python,其'yield'语句对于在大型(通常是不规则结构化的)文本文件上实现复杂的迭代器非常有用.类似的结构存在于其他语言(例如C#)中,这是有充分理由的.
是的我知道之前有过这样的线索.但它们看起来像是黑客攻击(或至少解释得很糟糕)的解决方案,这些解决方案并不能很好地运作并且通常具有不明确的局限性.我想编写这样的代码:
import generator._
def yield_values(file:String) = {
generate {
for (x <- Source.fromFile(file).getLines()) {
# Scala is already using the 'yield' keyword.
give("something")
for (field <- ":".r.split(x)) {
if (field contains "/") {
for (subfield <- "/".r.split(field)) { give(subfield) }
} else {
// Scala has no 'continue'. IMO that should be considered
// a bug in Scala.
// Preferred: if (field.startsWith("#")) continue
// Actual: Need to indent all following code
if (!field.startsWith("#")) {
val some_calculation = { ... …Run Code Online (Sandbox Code Playgroud) 我很确定我对发电机的理解本质上已被打破.所有在线资源似乎都存在冲突,这会带来令人难以置信的困难和令人困惑的学习体验.
据我所知,该yield关键字使当前正在执行的代码块等待一个值,而不是抛出要在回调中执行的剩余代码.因此,正如大多数教程所指出的那样,您可以使用:
(function *() {
// Wait until users have be got and put into value of `results`
var results = yield db.get("users");
// And continue
view.display(results);
})();
Run Code Online (Sandbox Code Playgroud)
代替:
db.get("user", function(results) {
view.display(results);
});
Run Code Online (Sandbox Code Playgroud)
是的,在我尝试编写自己的发电机之前,这一切都很好.我遇到了几个问题:
.next某个地方,对吗?yield似乎代表值等待最常见的用例,而在实现部分(读取:返回值为/ inside db.get)yield似乎代表将此值发送回当前正在等待的块以恢复执行.举个例子:
function *fn() {
yield 1;
yield "a";
}
var gen = fn();
gen.next(); // 1
gen.next(); // "a";
Run Code Online (Sandbox Code Playgroud)
yield在该上下文中,将值返回而不是等待结果.在上面的第一个示例中,它等待来自db.get和恢复执行的结果,而不是"返回"或发回一个值.如果db.get情况属实,这本身并不是同步的吗?我的意思是,它不完全相同: …
我正在尝试为顺序遍历编写递归生成器.
class Tree {
*inOrderTraversal() {
function* helper(node) {
if (node.left !== null) {
// this line is executed, but helper is not being called
helper(node.left);
}
yield node.value;
if (node.right !== null) {
helper(node.right);
}
}
for (let i of helper(this.root)) {
yield i;
}
}
// other methods omitted
}
Run Code Online (Sandbox Code Playgroud)
我这样称呼发电机:
const tree = new Tree();
tree.add(2);
tree.add(1);
tree.add(3);
for (let i of tree.inOrderTraversal()) {
console.log(i); // only prints 2
}
Run Code Online (Sandbox Code Playgroud)
为什么发电机只能屈服2?为什么它至少没有产生1之前2? …
使用以下代码:
A = [1, 2]
B = [-2, -1]
C = [-1, 2]
D = [0, 2]
ab = (a + b for a in A for b in B)
cd = (c + d for c in C for d in D)
abcd = (e_ab + e_cd for e_ab in ab for e_cd in cd)
Run Code Online (Sandbox Code Playgroud)
该len(abcd)预期是16,但它实际上是4.如果我使用列表理解,问题就会消失.这是为什么?
generator ×10
python ×6
yield ×4
javascript ×3
ecmascript-6 ×2
random ×2
cryptography ×1
enumerator ×1
for-loop ×1
linux ×1
node.js ×1
python-3.x ×1
recursion ×1
ruby ×1
scala ×1