看到这里的讨论后:Python - 生成我很好奇的时差.我最初也认为生成器比列表更快,但是当谈到sorted()我不知道.将生成器表达式发送到sorted()而不是列表有什么好处?在排序之前,生成器表达式是否最终被放入sorted()中的列表?
编辑:让我感到悲伤的是只能接受一个答案,因为我觉得很多回复都有助于澄清这个问题.再次感谢大家.
我的印象是文件对象在引用计数达到0时立即关闭,因此该行:
foo = open('foo').read()
Run Code Online (Sandbox Code Playgroud)
会得到文件的内容并立即关闭文件.但是,在Python文件对象上使用迭代器时,在读取了Is close()的答案之后,我得到的印象是这不会发生,并且始终需要调用.close()文件对象.
上面的那行是否符合我的想法,即使它确实如此,它是Pythonic要做的吗?
我希望python中的饼图上有小尺寸的标签,以提高可视性,这里是代码
import matplotlib.pyplot as plt
frac=[1.40 , 10.86 , 19.31 , 4.02 , 1.43 , 2.66 , 4.70 , 0.70 , 0.13 , 1.48, 32.96 , 1.11 , 13.30 , 5.86]
labels=['HO0900344', 'HO0900331', 'HO0900332', 'HO0900354',
'HO0900358', 'HO0900374', 'HO0900372', 'HO0900373',
'HO0900371', 'HO0900370', 'HO0900369', 'HO0900356',
'HO0900353', 'HO0900343']
fig = plt.figure(1, figsize=(6,6))
ax = fig.add_subplot(111)
ax.axis('equal')
colors=('b', 'g', 'r', 'c', 'm', 'y', 'burlywood', 'w')
ax.pie(frac,colors=colors ,labels=labels, autopct='%1.1f%%')
plt.show()
Run Code Online (Sandbox Code Playgroud)
谢谢和欢呼
在python 2.5中,我在一个名为modtest.py的模块中有以下代码:
def print_method_module(method):
def printer(self):
print self.__module__
return method(self)
return printer
class ModTest():
@print_method_module
def testmethod(self):
pass
if __name__ == "__main__":
ModTest().testmethod()
Run Code Online (Sandbox Code Playgroud)
但是,当我运行它时,它打印出来:
__main__
Run Code Online (Sandbox Code Playgroud)
如果我创建一个名为modtest2.py的第二个文件并运行它:
import modtest
if __name__ == "__main__":
modtest.ModTest().testmethod()
Run Code Online (Sandbox Code Playgroud)
打印出:
modtest
Run Code Online (Sandbox Code Playgroud)
如何将装饰器更改为始终打印出来modtest,即定义类的模块的名称?
我有一个以下格式的文本文件:
DELIMITER1
extract me
extract me
extract me
DELIMITER2
Run Code Online (Sandbox Code Playgroud)
我想extract me在.txt文件中提取DELIMITER1和DELIMITER2之间的每个块
这是我目前的不良代码:
import re
def GetTheSentences(file):
fileContents = open(file)
start_rx = re.compile('DELIMITER')
end_rx = re.compile('DELIMITER2')
line_iterator = iter(fileContents)
start = False
for line in line_iterator:
if re.findall(start_rx, line):
start = True
break
while start:
next_line = next(line_iterator)
if re.findall(end_rx, next_line):
break
print next_line
continue
line_iterator.next()
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
我有一个sumranges()函数,它对元组元组中找到的所有连续数字的范围求和.为了显示:
def sumranges(nums):
return sum([sum([1 for j in range(len(nums[i])) if
nums[i][j] == 0 or
nums[i][j - 1] + 1 != nums[i][j]]) for
i in range(len(nums))])
>>> nums = ((1, 2, 3, 4), (1, 5, 6), (19, 20, 24, 29, 400))
>>> print sumranges(nums)
7
Run Code Online (Sandbox Code Playgroud)
如您所见,它返回元组内连续数字的范围数,即:len((1,2,3,4),(1),(5,6),(19,20),( 24),(29),(400))= 7.元组总是有序的.
我的问题是我的sumranges()很糟糕.我讨厌看着它.我现在只是迭代元组和每个子元素,如果数字不是(1 +前一个数字),则分配1,并总计总和.我觉得我错过了一种更容易实现既定目标的方法.有没有人知道更多的pythonic方式来做到这一点?
编辑:我已经对迄今为止给出的所有答案进行了基准测试.感谢大家的回答.
基准测试代码如下,使用100K的样本大小:
from time import time
from random import randrange
nums = [sorted(list(set(randrange(1, 10) for i in range(10)))) for
j in range(100000)]
for func in sumranges, alex, matt, redglyph, ephemient, ferdinand: …Run Code Online (Sandbox Code Playgroud) 我正在寻找一种方法将任意Emacs命令的输出(在我的情况下是sql-send-region)发送到另一个窗口.我宁愿在目前的窗口中保持焦点,这将有效地给我一个窗口来编辑查询和一个窗口来查看输出.
我最近创建了一个@sequenceable装饰器,它可以应用于任何带有一个参数的函数,并使其自动适用于任何序列.这是代码(Python 2.5):
def sequenceable(func):
def newfunc(arg):
if hasattr(arg, '__iter__'):
if isinstance(arg, dict):
return dict((k, func(v)) for k, v in arg.iteritems())
else:
return map(func, arg)
else:
return func(arg)
return newfunc
Run Code Online (Sandbox Code Playgroud)
正在使用:
@sequenceable
def unixtime(dt):
return int(dt.strftime('%s'))
>>> unixtime(datetime.now())
1291318284
>>> unixtime([datetime.now(), datetime(2010, 12, 3)])
[1291318291, 1291352400]
>>> unixtime({'start': datetime.now(), 'end': datetime(2010, 12, 3)})
{'start': 1291318301, 'end': 1291352400}
Run Code Online (Sandbox Code Playgroud)
我的问题是: