据我所知,该range()函数实际上是Python 3中的一个对象类型,它可以动态生成其内容,类似于生成器.
在这种情况下,我预计下面的行会花费大量的时间,因为为了确定1千万亿是否在该范围内,必须生成一个千万亿的值:
1000000000000000 in range(1000000000000001)
Run Code Online (Sandbox Code Playgroud)
此外:似乎无论我添加多少个零,计算或多或少都需要相同的时间(基本上是瞬时的).
我也试过这样的事情,但计算仍然几乎是即时的:
1000000000000000000000 in range(0,1000000000000000000001,10) # count by tens
Run Code Online (Sandbox Code Playgroud)
如果我尝试实现自己的范围功能,结果就不那么好了!!
def my_crappy_range(N):
i = 0
while i < N:
yield i
i += 1
return
Run Code Online (Sandbox Code Playgroud)
range()在引擎盖下做的对象是什么让它如此之快?
选择Martijn Pieters的答案是因为它的完整性,但也看到了abarnert的第一个答案,可以很好地讨论在Python 3中range成为一个完整的序列意味着什么,以及关于__contains__Python实现中函数优化的潜在不一致的一些信息/警告.abarnert的另一个答案更详细,并为那些对Python 3中的优化背后的历史感兴趣的人提供了链接(并且缺乏xrangePython 2中的优化).poke和wim的答案为感兴趣的人提供了相关的C源代码和解释.
我想了解更多iterators,所以如果我错了请纠正我.
迭代器是一个对象,它具有指向下一个对象的指针,并被读取为缓冲区或流(即链接列表).它们特别有效,因为它们只是通过引用而不是使用索引来告诉您接下来的内容.
但是我仍然不明白为什么会发生以下行为:
In [1]: iter = (i for i in range(5))
In [2]: for _ in iter:
....: print _
....:
0
1
2
3
4
In [3]: for _ in iter:
....: print _
....:
In [4]:
Run Code Online (Sandbox Code Playgroud)
在通过迭代器(In [2])的第一个循环后,它就好像被消耗并留空,所以第二个循环(In [3])不打印任何内容.
但是我从未为iter变量赋予新值.
在for循环的引擎下真正发生了什么?
我有形式的字符串Version 1.4.0\n和Version 1.15.6\n,我想从他们身上抽取三个数字的简单方法.我知道我可以使用format方法将变量放入字符串中; 我基本上想要倒退,像这样:
# So I know I can do this:
x, y, z = 1, 4, 0
print 'Version {0}.{1}.{2}\n'.format(x,y,z)
# Output is 'Version 1.4.0\n'
# But I'd like to be able to reverse it:
mystr='Version 1.15.6\n'
a, b, c = mystr.unformat('Version {0}.{1}.{2}\n')
# And have the result that a, b, c = 1, 15, 6
Run Code Online (Sandbox Code Playgroud)
我找到的其他人问了同样的问题,但回复是针对他们的特定情况的: 反向使用Python格式字符串进行解析
一般答案(如何format()反向)会很棒!我的具体案例的答案也会非常有用.
我正在按照这些步骤学习烧瓶http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-i-hello-world/page/0#comments
我运行此命令来创建虚拟环境:
python virtualenv.py flask
Run Code Online (Sandbox Code Playgroud)
当我尝试使用项目脚本目录中的python.exe文件启动烧瓶时,它说
No module named flask
Run Code Online (Sandbox Code Playgroud)
我的PATH设置为virtualenv安装的python目录.为什么找不到烧瓶?
我最初开始使用官方的Flask快速入门指南,并且能够运行web服务器,但是使用这个虚拟的env安装它不起作用.
几周前我花了一些时间调查这个collections.namedtuple模块.该模块使用工厂函数将动态数据(新namedtuple类的名称和类属性名称)填充到一个非常大的字符串中.然后exec使用字符串(表示代码)作为参数执行,并返回新类.
有没有人知道为什么这样做,当有一种特定的工具可供现有的这种东西,即元类?我自己没有尝试过这样做,但似乎namedtuple模块中发生的一切都可以使用namedtuple元类轻松完成,如下所示:
class namedtuple(type):
Run Code Online (Sandbox Code Playgroud)
等等
它已经钻入我的头,以避免错误,并提供良好的用户体验,最好避免使用.Select,.Activate,ActiveSheet,ActiveCell,等.
记住这一点,有没有办法在不使用上述其中一个的情况.ExportAsFixedFormat下Sheets在工作簿的子集上使用该方法?到目前为止,我能够做到这一点的唯一方法是:
For Each; 但是,这导致单独的PDF文件,这是不好的.使用类似于宏录制器生成的代码,使用.Select和ActiveSheet:
Sheets(Array("Sheet1", "Chart1", "Sheet2", "Chart2")).Select
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
"exported file.pdf", Quality:=xlQualityStandard, _
IncludeDocProperties:=True, IgnorePrintAreas:=False, openafterpublish:= True
Run Code Online (Sandbox Code Playgroud)也许不可能不使用ActiveSheet,但我能不能以.Select某种方式使用?
我试过这个:
Sheets(Array("Sheet1", "Chart1", "Sheet2","Chart2")).ExportAsFixedFormatType:= _
xlTypePDF, Filename:= "exported file.pdf", Quality:=xlQualityStandard, _
IncludeDocProperties:=True, IgnorePrintAreas:=False, openafterpublish:= _
True
Run Code Online (Sandbox Code Playgroud)
这会产生:
错误438:对象不支持此属性或方法
有多种函数可以传递两种对象非常有用:表示路径的对象(通常是字符串),以及表示某种流的对象(通常是派生的东西)来自IOBase但并非总是如此.这种功能如何区分这两种对象,以便适当处理?
假设我有一个函数用于从某种对象文件生成器方法写入文件:
spiff = MySpiffy()
def spiffy_file_makerA(spiffy_obj, file):
file_str = '\n'.join(spiffy_obj.gen_file())
file.write(file_str)
with open('spiff.out', 'x') as f:
spiffy_file_makerA(spiff, f)
...do other stuff with f...
Run Code Online (Sandbox Code Playgroud)
这有效.好极了.但我宁愿不必担心首先打开文件或传递流,至少有时...所以我重构能够采取像对象的文件路径而不是像对象这样的文件,并且return声明:
def spiffy_file_makerB(spiffy_obj, file, mode):
file_str = '\n'.join(spiffy_obj.gen_file())
file = open(file, mode)
file.write(file_str)
return file
with spiffy_file_makerB(spiff, 'file.out', 'x') as f:
...do other stuff with f...
Run Code Online (Sandbox Code Playgroud)
但是现在我认为有一个第三个函数组合其他两个版本会有用,这取决于file文件是否像文件路径一样,但是将f目标文件像对象一样返回给上下文管理器.这样我就可以编写这样的代码:
with spiffy_file_makerAB(spiffy_obj, file_path_like, mode = 'x') as f:
...do other stuff with f...
Run Code Online (Sandbox Code Playgroud)
......但也像这样:
file_like_obj = get_some_socket_or_stream()
with spiffy_file_makerAB(spiffy_obj, file_like_obj, mode = …Run Code Online (Sandbox Code Playgroud) 我正在给Python typing模块一个镜头.
我知道指定List以下*的长度是有效的:
List[float, float, float] # List of 3 floats <-- NOTE: this is not valid Python
Run Code Online (Sandbox Code Playgroud)
是否有更长的名单的简写?如果我想将它设置为10个花车怎么办?
List[float * 10] # This doesn't work.
Run Code Online (Sandbox Code Playgroud)
如果这是可能的,任何想法,这将是方便的.
*注意:事实证明Sequence[]以这种方式向(及其子类)提供多个参数当前不是有效的Python.此外,目前不可能以这种方式Sequence使用typing模块指定长度.
编辑:标题已更改为清晰.
快速摘要:我想知道工作簿范围,工作表依赖命名公式(我将在下面描述)的行为是否是Excel中的文档功能.如果是这样,请指出我某处某些文件的方向 - 我似乎无法在网上找到任何关于此的信息(也许我使用的是错误的搜索条件......?)并且不想使用实际的东西一个bug,可能会在以后的版本中消失!
严格来说,这不是一个关于VBA的问题; 但是,命名公式是我和其他人一直在VBA代码中使用的东西,所以它仍然适用于我认为的主题.
编辑:请注意下面的VBA代码可能不完全正确 - 我还没有测试过.
对于工程/科学计算,我经常需要在同一工作簿中多次使用相同的命名公式/范围,但是在不同的工作表上.作为一个简化的例子,我可能会为圆形区域实现类似的东西:
Dim sht as Worksheet
For Each sht In ThisWorkbook
Call sht.Names.Add(Name:="AreaCircle",RefersTo:="=PI()*'" & _
sht.Name & "'!Radius^2")
Next sht
Run Code Online (Sandbox Code Playgroud)
这导致以下一组命名范围/公式(作用于每个工作表):
=PI()*Sheet1!Radius^2 <--- scoped to Sheet1
=PI()*Sheet2!Radius^2 <--- scoped to Sheet2
etc. etc.
Run Code Online (Sandbox Code Playgroud)
当然这很好用,但它具有难以进行未来变化的主要缺点.因此,例如,如果公式发生变化(圆形区域当然不会改变!例如,AASHTO LRFD公路设计代码中的公式,几乎每个版本都会改变!),我必须编辑每个实例每个名称公式.即使我写了一个VBA程序来为我做这件事,这也很乏味.
我前几天在Excel 2013中发现了以下事故,并且无法在网上任何地方找到任何相关信息.这使我开始使用它犹豫不决.
假设我运行以下单行代码:
Call ThisWorkbook.Names.Add(Name:="AreaCircle",RefersTo:="=PI()*!Radius^2")
Run Code Online (Sandbox Code Playgroud)
这导致以下SINGLE命名范围/公式(作用于工作簿):
=PI()*!Radius^2<---公式的范围是工作簿; 请注意!Radius,不是Radius.
请注意,这与以下内容不同(没有感叹号):
=PI()*Radius^2<---请注意,这里Radius的范围是工作簿.
现在,AreaCircle将产生与上面第一种方法完全相同的行为:它将根据本地工作表定义的Radius值生成结果.因此,如果有两个命名范围Radius(一个用于Sheet1和一个用于Sheet2),AreaCircle将根据Radius其使用的工作表中的值进行计算.而且每次添加新工作表时,我都不再需要添加新版本(以及其他所有!)公式的额外好处(这是巨大的!).
这是难以描述的行为; …
现在,从Python 3.7(以及CPython 3.6)开始,保证Python字典的插入顺序是什么,对字典进行排序的最佳/最快方法是什么 - 按值和按键排序?
最明显的方法是:
by_key = {k: dct[k] for k in sorted(dct.keys())}
by_value = {k: dct[k] for k in sorted(dct.keys(), key=dct.__getitem__)}
Run Code Online (Sandbox Code Playgroud)
有没有其他更快的方法来做到这一点?
请注意,这个问题并不重复,因为之前有关如何对字典进行排序的问题已经过时(答案基本上是,您不能;使用collections.OrderedDict替代).
python ×8
python-3.x ×3
excel ×2
performance ×2
vba ×2
dictionary ×1
excel-vba ×1
flask ×1
iterator ×1
metaclass ×1
mypy ×1
named-ranges ×1
namedtuple ×1
python-3.7 ×1
range ×1
type-hinting ×1
virtualenv ×1