>>> c = [1, 2, 3]
>>> print(c, id(c))
[1, 2, 3] 43955984
>>> c += c
>>> print(c, id(c))
[1, 2, 3, 1, 2, 3] 43955984
>>> del c
>>> c = [1, 2, 3]
>>> print(c, id(c))
[1, 2, 3] 44023976
>>> c = c + c
>>> print(c, id(c))
[1, 2, 3, 1, 2, 3] 26564048
Run Code Online (Sandbox Code Playgroud)
有什么不同?是+ =和+不应该仅仅是语法糖?
我知道这个问题有点愚蠢,也许它只是编写代码的一部分,但似乎定义简单的函数真的会严重损害性能......我尝试过这个简单的测试:
def make_legal_foo_string(x):
return "This is a foo string: " + str(x)
def sum_up_to(x):
return x*(x+1)/2
def foo(x):
return [make_legal_foo_string(x),sum_up_to(x),x+1]
def bar(x):
return ''.join([str(foo(x))," -- bar !! "])
Run Code Online (Sandbox Code Playgroud)
这是非常好的风格,使代码清晰,但它的速度可能只是字面上的三倍.对于可能产生副作用的函数来说,这是不可避免的,但实际上几乎无足轻重地定义一些函数,这些函数每次出现时都应该用代码行替换,将源代码转换为只编译.同样我认为对于幻数,它不需要花费很多时间从内存中读取,但是如果它们不应该被更改那么为什么不在代码编译之前用文字替换'magic'的每个实例?
嘿。这个例子非常具体,但我认为它可以适用于广泛的功能。它取自一些在线编程竞赛。
有一个游戏的获胜条件很简单。抽奖是不可能的。游戏不可能永远持续下去,因为每一步都会让你更接近终止条件。在给定状态的情况下,该函数应该确定现在要移动的玩家是否有获胜策略。在示例中,状态是一个整数。玩家选择一个非零数字并将其从数字中减去:新状态是新整数。获胜者是达到零的玩家。
我这样编码:
from Memoize import Memoize
@Memoize
def Game(x):
if x == 0: return True
for digit in str(x):
if digit != '0' and not Game(x-int(digit)):
return True
return False
Run Code Online (Sandbox Code Playgroud)
我认为它是如何工作的很清楚。我也意识到对于这个特定的游戏,可能有一个更聪明的解决方案,但我的问题是笼统的。然而,即使对于相对较小的输入,这也会使 python 变得疯狂。有什么方法可以使此代码与循环一起工作?
谢谢
这就是我所说的转换为循环的意思:
def fac(x):
if x <= 1: return x
else: return x*fac(x-1)
def fac_loop(x):
result = 1
for i in xrange(1,x+1):
result *= i
return result
## dont try: fac(10000)
print fac_loop(10000) % 100 ## works
Run Code Online (Sandbox Code Playgroud) 假设我有一个元素的排序列表,我想生成满足某个条件的所有子集,这样如果给定的集合不满足条件,那么更大的子集也不会满足它,并且一个元素的所有集合都满足它。
例如,给定一个包含所有小于 100 的正整数的列表,确定总和小于 130 的子集:(100,29) (0,1,40)、(0) 等...
我该怎么做(最好是在 Python 中)?
谢谢!:)
嘿.我记得在某个地方读过有关OO的严格限制的程序范例.它完全禁止嵌套ifs和elses,避免与类没有关联的全局命名空间中的函数,以及类似的东西.它应该是非常有名的.有谁知道它是如何调用的?谢谢.
我举个例子.这不应该是一个完全严肃的范例 - 它只是对改善你的"OO风格"的重大限制.例如,一个FizzBuzz程序,你将创建一个继承自整数的对象,并拥有一个方法'representMyself',以及一个对象'FizzBuzzNumbersRange',它使用方法'representAll'或其他东西保存一个FizzBuzz数字数组.等等
python ×4
algorithm ×1
list ×1
oop ×1
operators ×1
paradigms ×1
performance ×1
recursion ×1
refactoring ×1
subset ×1