在最近的Hacker Newsletter问题中,这篇关于Python中装饰器的非常有用的文章已被链接.我喜欢这篇文章,我想我理解了大多数装饰器的例子.但是,在非装饰器的memoization示例中,我对代码非常困惑:
def memoize(fn):
stored_results = {}
def memoized(*args):
try:
# try to get the cached result
return stored_results[args]
except KeyError:
# nothing was cached for those args. let's fix that.
result = stored_results[args] = fn(*args)
return result
return memoized
Run Code Online (Sandbox Code Playgroud)
我很困惑这个函数如何创建一个stored_results附加到的持久字典.重新阅读后,将其复制/粘贴到我的编辑器中并使用它,并在网上寻求帮助,我仍然不明白语法stored_results[args] = fn(*args)是做什么的.
(1)文章建议上面的代码将返回函数,但现在它将在执行新的参数之前首先搜索字典.这是怎么发生的?为什么不stored_results只是当地人memoize?memoized返回时为什么不被销毁?
(2)解释通过这里的论点的其他问题或网络资源的链接*args也会有所帮助.如果*args是参数列表,为什么我们可以使用语法 stored_results[args],通常在尝试索引列表中的字典时会出现不可出错的错误?
感谢任何澄清的想法.
是否有一个内置函数将datetime.date对象转换为datetime.datetime对象,缺少的东西为0?例如,假设
tdate = datetime.date(2012,1,31)
Run Code Online (Sandbox Code Playgroud)
我想写一些类似的东西
tdatetime = datetime.date.datetime()
tdatetime = datetime.datetime(tdate)
Run Code Online (Sandbox Code Playgroud)
我想要输出
datetime.datetime(2012, 1, 31, 0, 0)
Run Code Online (Sandbox Code Playgroud)
但都不起作用.有一个内置函数从datetime.datetime到datetime.date,但我正在寻找相反的操作.
一个非常糟糕的解决方案是写:
datetime.datetime(tdate.year(), tdate.month(), tdate.day(), 0, 0)
Run Code Online (Sandbox Code Playgroud)
我特别想避免这种糟糕的做法.
我已经编写了自己的小函数来执行此操作,但我认为它应该在模块中提供.它使一些系统范围的导入变得混乱以使用我的功能.这是可行的,只是不太Pythonic.
我只想询问是否有人知道是否有一种有效的方法只使用日期时间模块功能.
在iPython中是否有用于撤消键入的键盘命令?注意:我不是在讨论撤消已执行命令的结果.
假设我将一些变量名称作为参数复制并粘贴到一个长函数调用中,然后意识到它们是错误的参数.我可以使用等效的ctrl-z或者撤消粘贴操作吗?
Ctrl-z会杀死iPython会话,因此不推荐使用.
假设我有一些对象x可能是数据类型的单个实例(比方说float),或者它可能是一个float类型列表.
有没有什么我可以确保x包装为一个列表,如果有必要可能是一个单例列表,而不检查其类型或做这样的事情.
我想要list(x)总是工作的东西,无论x是单身还是单身,但这不起作用,因为单身不可迭代.
同时,我不想定义自己的函数来构造来自singeltons的列表,我也不想像这样内联任何内容:
from collections import Iterable
y = [x] if not isinstance(x, Iterable) else list(x)
Run Code Online (Sandbox Code Playgroud)
如果没有比这更简洁的话,那没关系.我正在寻找一些已经内置于语言中的干净方法.
我相信有些人可能认为这种isinstance方法很干净而且很好,但我特别想找到一些更简洁的东西,不要求我先写任何新内容.我在搜索文档页面时找不到任何内容,而且我不确定如何向搜索引擎提出这个问题.
在阅读with声明(链接)的规范时,我有一些我想要玩的东西.这不是任何生产代码或任何东西,我只是在探索,所以如果这是一个坏主意请不要太苛刻.
我想做的是抓住上面链接文档中名为"BLOCK"的文章,并在调用内部实际修补它__enter__.(请参阅链接文档,在动机和摘要部分开始之后.)
我们的想法是创建自己的即时本地命名空间.像这样的东西:
with MyNameSpace(some_object):
print a #Should print some_object.a
x = 4 #Should set some_object.x=4
Run Code Online (Sandbox Code Playgroud)
基本上,我希望with块内的语句从属于局部变量和赋值约定some_object.
在我的具体情况下,some_object可能是一个特殊的数据数组,它有我自己的列式操作或其他东西.在这种情况下说某些东西x = y + 5 if y > 4 else y - 2可能是一些花哨的NumPy矢量化操作,但我不需要显式调用some_object这些方法的接口.在命名空间中,表达式应该"正常工作"(但是我将它们定义为在MyNameSpace类中推断出来).
我的第一个想法是以某种方式中断with进程并获取try块中的代码.然后__enter__在调用时解释该代码,并用try其他东西替换块中的代码(可能pass如果这样可行,但可能会恢复some_object到原始变量作用域并保留其新的已更改变量).
一个简单的测试用例是这样的:
my_dict = {'a':3, 'b':2}
with MyNameSpace(my_dict):
print a # Should print 3
x = 5 # When the …Run Code Online (Sandbox Code Playgroud) 是否有可能在Python中基本执行以下操作:
for elem in my_list if elem:
#Do something with elem...
Run Code Online (Sandbox Code Playgroud)
请注意,我想特别避免使用map,lambdas或filter来创建第二个列表,该列表给出布尔条件,我不想执行以下操作:
for elem in [item for item in my_list if item]:
#Do something...
Run Code Online (Sandbox Code Playgroud)
后一种方法也需要构造布尔列表.在我的代码中,my_list可能非常非常大.
基本上,最简单的方法是写
for elem in my_list:
if elem:
#Do stuff...
Run Code Online (Sandbox Code Playgroud)
但我特别希望这一切都在一条线上.如果一线一线不会使代码实际上与我给出的最后一个例子有任何不同,那也没关系,我将继续使用它.
我知道这是一个基本问题,但我找不到其他 StackOverflow 帖子或任何关于此的好的 API 文档。
假设我有一个像这样的抽象类Appliance,然后我有一些像Toaster和Blender扩展这样的类Appliance。现在假设我想创建一个包含混合元素的 ArrayList,所有这些元素最终都是其成员,Appliance但也可以是Toaster或Blender也是。本Blender类有一个叫做方法turnBlenderOff()和Toaster类有一个方法turnToasterOff(),我会想遍历我ArrayList和调用这些方法,具体取决于哪个子类元素实际上属于。
目前我创建了一个名为的类PowerPoint并尝试:
// Constructor given an ArrayList of appliances.
public PowerPoint(ArrayList<Appliance> initial_list_of_appliances){
int listSize = initial_list_of_appliances.size();
for(int ii = 0; ii < listSize; ii++){
this.applianceList.add(initial_list_of_appliances.get(ii));
}
}
/////
// Method to switch everything in the list OFF simultaneously.
/////
public void switchOff(){
int N = this.applianceList.size();
String cur_name;
for(int ii …Run Code Online (Sandbox Code Playgroud) 在Python Pandas中主要OLS类的代码中,我正在寻求帮助以阐明在执行加权OLS时报告的标准错误和t-stats使用的约定.
这是我的示例数据集,其中一些导入使用Pandas并直接使用scikits.statsmodels WLS:
import pandas
import numpy as np
from statsmodels.regression.linear_model import WLS
# Make some random data.
np.random.seed(42)
df = pd.DataFrame(np.random.randn(10, 3), columns=['a', 'b', 'weights'])
# Add an intercept term for direct use in WLS
df['intercept'] = 1
# Add a number (I picked 10) to stabilize the weight proportions a little.
df['weights'] = df.weights + 10
# Fit the regression models.
pd_wls = pandas.ols(y=df.a, x=df.b, weights=df.weights)
sm_wls = WLS(df.a, df[['intercept','b']], weights=df.weights).fit()
Run Code Online (Sandbox Code Playgroud)
我用%cpaste它在IPython中执行它,然后打印两个回归的摘要:
In …Run Code Online (Sandbox Code Playgroud) 我正在尝试在Ubuntu 14.04上安装PureScript.我有最新版本的Haskell-Platform并且已经运行了cabal update.在cabal install purescript我收到一个错误,说System.IO.UTF8没有找到该模块.谷歌搜索显示,这utf8-string是安装该软件包时暴露模块的一部分,应该是其中一个.
但是,当我安装它时,没有这样的包可用:
ely@eschaton:~$ cabal update
Downloading the latest package list from hackage.haskell.org
ely@eschaton:~$ cabal --reinstall install utf8-string
Resolving dependencies...
In order, the following will be installed:
utf8-string-1 (reinstall)
Warning: Note that reinstalls are always dangerous. Continuing anyway...
Configuring utf8-string-1...
Building utf8-string-1...
Preprocessing library utf8-string-1...
[1 of 5] Compiling Codec.Binary.UTF8.String ( Codec/Binary/UTF8/String.hs, dist/build/Codec/Binary/UTF8/String.o )
[2 of 5] Compiling Codec.Binary.UTF8.Generic ( Codec/Binary/UTF8/Generic.hs, dist/build/Codec/Binary/UTF8/Generic.o )
[3 …Run Code Online (Sandbox Code Playgroud) 考虑两种天真地制作相同的方法bytearray(使用Python 2.7.11,但在3.4.3中也确认了相同的行为):
In [80]: from array import array
In [81]: import numpy as np
In [82]: a1 = array('L', [1, 3, 2, 5, 4])
In [83]: a2 = np.asarray([1,3,2,5,4], dtype=int)
In [84]: b1 = bytearray(a1)
In [85]: b2 = bytearray(a2)
Run Code Online (Sandbox Code Playgroud)
由于两个array.array和numpy.ndarray支持缓冲协议,我希望同时向相同的基础数据导出上转换bytearray.
但是上面的数据:
In [86]: b1
Out[86]: bytearray(b'\x01\x03\x02\x05\x04')
In [87]: b2
Out[87]: bytearray(b'\x01\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00')
Run Code Online (Sandbox Code Playgroud)
起初我认为,bytearray由于数据类型,连续性或其他一些开销数据的原因,对NumPy数组的简单调用可能会无意中获得一些额外的字节.
但即使直接查看NumPy缓冲区数据句柄,它仍然表示大小为40并提供相同的数据:
In [90]: a2.data
Out[90]: <read-write buffer for 0x7fb85d60fee0, size 40, offset 0 at 0x7fb85d668fb0>
In [91]: …Run Code Online (Sandbox Code Playgroud) python ×7
arraylist ×1
buffer ×1
bytearray ×1
cabal ×1
date ×1
datetime ×1
function ×1
haskell ×1
ipython ×1
java ×1
list ×1
memoization ×1
numpy ×1
pandas ×1
purescript ×1
regression ×1
scope ×1
shell ×1
statistics ×1
statsmodels ×1
undo ×1
utf-8 ×1