我在学校有一些Ocaml课程,为了练习,我们必须编写函数长度.
我的老师向我们展示了Xavier Leroy如何编写他的功能:
let rec length_aux len = function
[] -> len
| a::l -> length_aux (len + 1) l
let length l = length_aux 0 l
Run Code Online (Sandbox Code Playgroud)
当我的老师向我们解释他为什么这样做长度函数时,他说他不知道为什么Xavier Leroy没有写:
let rec length_aux len = function
a::l -> length_aux (len + 1) l
| [] -> len
let length l = length_aux 0 l
Run Code Online (Sandbox Code Playgroud)
...为了使它更快(因为大多数情况下列表是非空的).
所以如果有人知道为什么第二个并不比第一个好,你能回答我吗?
谢谢.
line-magic命令%load将给定文件的内容加载到当前单元格中,例如,执行:
[cell 1] %load hello_world.py
Run Code Online (Sandbox Code Playgroud)
...将单元格转换为:
[cell 1] # %load hello_world.py
print("hello, world")
Run Code Online (Sandbox Code Playgroud)
我想创建一个%load_nextline-magic 命令,它将将此文件加载到下一个单元格中。例如,在以下笔记本中执行单元 1:
[cell 1] %load_next hello_world.py
[cell 2] print("hello, cruel world") # original content
Run Code Online (Sandbox Code Playgroud)
...将保持单元格 1 不变并使用新内容更新单元格 2:
[cell 1] %load_next hello_world.py
[cell 2] print("hello, world")
Run Code Online (Sandbox Code Playgroud)
我已经尝试过这个:
[cell 1] %load hello_world.py
Run Code Online (Sandbox Code Playgroud)
但它会在当前单元格和下一个单元格之间插入内容:
[cell 1] %load_next hello_world.py
[cell 2] print("hello, world")
[cell 3] print("hello, cruel world") # original content
Run Code Online (Sandbox Code Playgroud)
是否可以使其替换下一个单元格,或在插入下一个单元格之前删除下一个单元格?
假设你想循环遍历两个边界a和b(包括)之间的所有整数,但事先不知道如何a比较b.预期行为:
def run(a, b):
if a < b:
for i in range(a, b + 1):
print i,
elif a > b:
for i in range(a, b - 1, -1):
print i,
else:
print a
print
run(3, 6)
run(6, 3)
run(5, 5)
Run Code Online (Sandbox Code Playgroud)
结果:
3 4 5 6
6 5 4 3
5
Run Code Online (Sandbox Code Playgroud)
有更优雅的解决方案吗?以下内容更简洁,但在以下情况下失败a == b:
def run(a, b):
for i in range(a, b + cmp(b, a), cmp(b, a)):
print i,
print …Run Code Online (Sandbox Code Playgroud) 在Python 2.7中,给定一个内置类型的值t,如何在t不枚举所有情况的情况下计算"零值" ?
def zero_value(x):
if isinstance(x, dict):
return dict()
if isinstance(x, int):
return 0
if isinstance(x, bool):
return False
if x is None:
return None
# ...
assert zero_value({1: 2, 3: 4}) == {}
assert zero_value(3) == 0
assert zero_value(None) == None
assert zero_value(True) == False
Run Code Online (Sandbox Code Playgroud)
不确定"零值"是否是正确的术语,因为我在SO或Google上找不到任何答案......我已经浏览了这个魔术方法列表而没有取得更多成功.
我想向学生们展示MD5与这里给出的两个整数"消息"相冲突.这是我对Python 2.7的原始演示:
from hashlib import md5
m1 = "d131dd02c5e6eec4693d9a0698aff95c2fcab58712467eab4004583eb8fb7f8955ad340609f4b30283e488832571415a085125e8f7cdc99fd91dbdf280373c5bd8823e3156348f5bae6dacd436c919c6dd53e2b487da03fd02396306d248cda0e99f33420f577ee8ce54b67080a80d1ec69821bcb6a8839396f9652b6ff72a70"
m2 = "d131dd02c5e6eec4693d9a0698aff95c2fcab50712467eab4004583eb8fb7f8955ad340609f4b30283e4888325f1415a085125e8f7cdc99fd91dbd7280373c5bd8823e3156348f5bae6dacd436c919c6dd53e23487da03fd02396306d248cda0e99f33420f577ee8ce54b67080280d1ec69821bcb6a8839396f965ab6ff72a70"
# differences ^ ^ ^ ^ ^ ^
print md5(m1.decode("hex")).hexdigest()
print md5(m2.decode("hex")).hexdigest()
Run Code Online (Sandbox Code Playgroud)
正如所料,它打印两次79054025255fb1a26e4bc422aef54eb4.现在,当我尝试将最后两行转换为Python 3.5时:
print(md5(int(m1, 16)).hexdigest())
print(md5(int(m2, 16)).hexdigest())
Run Code Online (Sandbox Code Playgroud)
我得到的只是一条TypeError: object supporting the buffer API required信息.该方法decode在Python 3中不再有效,但我不确定int(m, base)如上所述替换它是个好主意.可能是问题在那里,而不是哈希函数API?