小编Ric*_*ica的帖子

为什么Python 3中的"1000000000000000在范围内(1000000000000001)"如此之快?

据我所知,该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源代码和解释.

python performance range python-3.x python-internals

1890
推荐指数
11
解决办法
18万
查看次数

Python for循环和迭代器行为

我想了解更多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循环的引擎下真正发生了什么?

python iterator

42
推荐指数
3
解决办法
3万
查看次数

将字符串转换或取消格式化为Python中的变量(如format(),但反之)

我有形式的字符串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()反向)会很棒!我的具体案例的答案也会非常有用.

python string-formatting

28
推荐指数
4
解决办法
1万
查看次数

没有使用virtualenv命名为flask的模块

我正在按照这些步骤学习烧瓶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安装它不起作用.

python virtualenv flask

23
推荐指数
2
解决办法
7万
查看次数

为什么namedtuple模块不使用元类来创建nt类对象?

几周前我花了一些时间调查这个collections.namedtuple模块.该模块使用工厂函数将动态数据(新namedtuple类的名称和类属性名称)填充到一个非常大的字符串中.然后exec使用字符串(表示代码)作为参数执行,并返回新类.

有没有人知道为什么这样做,当有一种特定的工具可供现有的这种东西,即元类?我自己没有尝试过这样做,但似乎namedtuple模块中发生的一切都可以使用namedtuple元类轻松完成,如下所示:

class namedtuple(type):
Run Code Online (Sandbox Code Playgroud)

等等

python metaclass namedtuple python-internals

20
推荐指数
1
解决办法
1274
查看次数

不使用ActiveSheet或Select,将多个工作表同时导出为PDF

它已经钻入我的头,以避免错误,并提供良好的用户体验,最好避免使用.Select,.Activate,ActiveSheet,ActiveCell,等.

记住这一点,有没有办法在不使用上述其中一个的情况.ExportAsFixedFormat下Sheets在工作簿的子集上使用该方法?到目前为止,我能够做到这一点的唯一方法是:

  1. 用一个For Each; 但是,这导致单独的PDF文件,这是不好的.
  2. 使用类似于宏录制器生成的代码,使用.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:对象不支持此属性或方法

excel vba

16
推荐指数
2
解决办法
1万
查看次数

如何区分对象等文件与对象等文件路径

摘要:

有多种函数可以传递两种对象非常有用:表示路径的对象(通常是字符串),以及表示某种流的对象(通常是派生的东西)来自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 python-3.x

16
推荐指数
1
解决办法
2221
查看次数

使用Python输入模块指定Sequence或List的长度

我正在给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模块指定长度.

python type-hinting python-3.x mypy

15
推荐指数
4
解决办法
4423
查看次数

Excel VBA:工作簿范围,工作表相关的命名公式/命名范围(结果更改取决于活动工作表)

编辑:标题已更改为清晰.

快速摘要:我想知道工作簿范围,工作表依赖命名公式(我将在下面描述)的行为是否是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其使用的工作表中的值进行计算.而且每次添加新工作表时,我都不再需要添加新版本(以及其他所有!)公式的额外好处(这是巨大的!).

这是难以描述的行为; …

excel vba excel-vba named-ranges

13
推荐指数
1
解决办法
4514
查看次数

排序python 3.7+字典的最快方法

现在,从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 performance dictionary python-3.7

12
推荐指数
1
解决办法
3174
查看次数