我最近买了一台MacBook并通过Anaconda安装了Python.这是版本信息:
Python 2.7.6 |Anaconda 1.8.0 (x86_64)| (default, Nov 11 2013, 10:49:09)
[GCC 4.0.1 (Apple Inc. build 5493)] on darwin
Run Code Online (Sandbox Code Playgroud)
我希望能够做到以下所有方面:
这是我尝试过的:
这是我可以做的:
一旦我有了这个工作,我就有兴趣做以下事情:
A.控制哪些脚本在运行时创建一个控制台窗口而哪些脚本没有
B.控制在脚本完成或等待用户时生成的控制台窗口是否消失(我)关闭它
然而,我怀疑一旦我弄清楚如何首先调用我的脚本,可能很容易弄清楚如何做这些(或者是否可能).
这里有一些代码使用matplotlib散布了许多不同系列的图,然后添加了行y = x:
import numpy as np, matplotlib.pyplot as plt, matplotlib.cm as cm, pylab
nseries = 10
colors = cm.rainbow(np.linspace(0, 1, nseries))
all_x = []
all_y = []
for i in range(nseries):
x = np.random.random(12)+i/10.0
y = np.random.random(12)+i/5.0
plt.scatter(x, y, color=colors[i])
all_x.extend(x)
all_y.extend(y)
# Could I somehow do the next part (add identity_line) if I haven't been keeping track of all the x and y values I've seen?
identity_line = np.linspace(max(min(all_x), min(all_y)),
min(max(all_x), max(all_y)))
plt.plot(identity_line, identity_line, color="black", linestyle="dashed", linewidth=3.0)
plt.show() …Run Code Online (Sandbox Code Playgroud) Fibonacci堆在实践中用于任何地方吗?我环顾四周,找到了相关问题的答案(见下文),但实际上并没有回答这个问题.
考虑以下玩具示例:
>>> def square(x): return x*x
...
>>> [square(x) for x in range(12) if square(x) > 50]
[64, 81, 100, 121]
Run Code Online (Sandbox Code Playgroud)
我必须在列表理解中两次调用square(x).重复是丑陋的,容易出错(修改代码时只能更改两个调用中的一个),并且效率低下.
我当然可以这样做:
>>> squares = [square(x) for x in range(12)]
>>> [s for s in squares if s > 50]
[64, 81, 100, 121]
Run Code Online (Sandbox Code Playgroud)
或这个:
[s for s in [square(x) for x in range(12)] if s > 50]
Run Code Online (Sandbox Code Playgroud)
这些都是宜居的,但感觉似乎有一种方法可以在一个语句中完成所有操作,而不需要嵌套两个列表推导,我知道下次我在阅读时我将不得不盯着它看一段时间代码只是为了弄清楚发生了什么.有办法吗?
我认为一个可以问我的公平问题是我想象的这样的语法可能是什么样的.这里有两个想法,但在Python中都不是惯用的(它们也不起作用).它们的灵感来自Lisp中的照应宏.
[square(x) for x in range(12) if it > 50]
[it=square(x) for x in range(12) if …Run Code Online (Sandbox Code Playgroud) 我知道如果我想用Python复制文件而不是覆盖目标,我可以使用这样的代码:
if os.path.exists(dest):
raise Exception("Destination file exists!")
else:
shutil.copy2(src, dest)
Run Code Online (Sandbox Code Playgroud)
但是,在我打电话os.path.exists和打电话的时间之间,世界状况可能会发生变化copy2.是否有更优选的方式进行复制而不进行覆盖,大概是如果目标已经存在,复制操作会引发异常?
本文从各种stackoverflow问题中多次链接,描述了带参数的装饰器在语法上与不带参数的装饰器的区别.
__init__()是执行装饰的唯一方法,__call__()每次调用装饰时都会调用它sayHello()."__call__(),只能接受一个参数(函数对象),并且必须返回替换原始的装饰函数对象.请注意,__call__()现在只调用一次,在装修期间,之后您返回的装饰功能将__call__()用于实际通话."文章中给出的解释并没有告诉我为什么语言是这样建立的:
虽然这种行为是有道理的 - 构造函数现在用于捕获装饰器参数,但该对象
__call__()不能再用作装饰函数调用,因此您必须使用它__call__()来执行装饰 - 它仍然是令人惊讶的第一次你看到了
此设置有两个相关功能让我感到不舒服:
__init__和__call__在这两个,但他们意味着不同的事情?__call__在具有参数的装饰器的情况下使用除了调用装饰函数之外的其他目的(顾名思义,至少来自无参数情况)?由于__call__只有后立即调用__init__,为什么不直接传递给装饰作为参数传递给函数__init__和处理,将在发生一切__call__的__init__呢?我相信使用Python的内置日志记录模块logger使主模块中的根记录器成为标准做法.假设这是正确的,在我看来,对于任何可能或可能不作为main运行的模块,我需要明确检查.原因是,如果我遵循标准的调用方法,logging.getLogger(__name__)我会得到一个名为logger __main__而不是根记录器:
import logging
print logging.getLogger().name # root
print logging.getLogger(__name__).name # __main__
Run Code Online (Sandbox Code Playgroud)
总是要检查最佳做法吗?
if __name__ == "__main__":
logger = logging.getLogger()
else:
logger = logging.getLogger(__name__)
Run Code Online (Sandbox Code Playgroud)
这并不是那么糟糕,因为我总是会有其他代码只运行if __name__ == "__main__"(通常包括调用logging.basicConfig),但是只需要一行而不是更多就很好.
Python 3.4提供了这个简洁的工具来暂时重定向stdout:
# From https://docs.python.org/3.4/library/contextlib.html#contextlib.redirect_stdout
with redirect_stdout(sys.stderr):
help(pow)
Run Code Online (Sandbox Code Playgroud)
代码并不是非常复杂,但我不想一遍又一遍地写它,特别是因为有些想法已经进入它以使它重新进入:
class redirect_stdout:
def __init__(self, new_target):
self._new_target = new_target
# We use a list of old targets to make this CM re-entrant
self._old_targets = []
def __enter__(self):
self._old_targets.append(sys.stdout)
sys.stdout = self._new_target
return self._new_target
def __exit__(self, exctype, excinst, exctb):
sys.stdout = self._old_targets.pop()
Run Code Online (Sandbox Code Playgroud)
我想知道是否有一般方法使用该with语句来临时更改变量的值.从另外两个用例sys是sys.stderr和sys.excepthook.
在一个完美的世界中,这样的东西会起作用:
foo = 10
with 20 as foo:
print(foo) # 20
print (foo) # 10
Run Code Online (Sandbox Code Playgroud)
我怀疑我们能做到这一点,但也许这样的事情是可能的:
foo = 10
with temporary_set('foo', …Run Code Online (Sandbox Code Playgroud) 有没有办法在Python中编写一个会出错的类,除非它与with语句一起使用?
# Okay:
with Foo() as f1:
f1.func1()
f1.func2()
# Not okay:
f2 = Foo()
f2.func1()
Run Code Online (Sandbox Code Playgroud)
我可以手动完成:__enter__设置一个标志并让其他方法检查该标志.但有更好的方法吗?
以下是不那么自然的代码:
class Foo(object):
def __init__(self):
self._entered = False
def __enter__(self):
self._entered = True
return self
def _verify_entered(self):
if not self._entered:
raise Exception("Didn't get call to __enter__")
def __exit__(self, typ, val, traceback):
self._verify_entered()
print("In __exit__")
def func1(self):
self._verify_entered()
# do stuff ...
def func2(self):
self._verify_entered()
# do other stuff
Run Code Online (Sandbox Code Playgroud) 如果我在Python中引发异常,这就是我得到的:
raise Exception("Hello world")
Traceback (most recent call last):
File "<ipython-input-24-dd3f3f45afbe>", line 1, in <module>
raise Exception("Hello world")
Exception: Hello world
Run Code Online (Sandbox Code Playgroud)
注意最后一行说的Exception: Hello world.给定Exception(foo = Exception("Hello world")),我该如何生成这样的文本?以下工作均不属于:
str(foo)
Out[27]: 'Hello world'
repr(foo)
Out[28]: "Exception('Hello world',)"
"{}".format(foo)
Out[29]: 'Hello world'
"{}: {}".format(type(foo), foo)
Out[30]: "<type 'exceptions.Exception'>: Hello world"
Run Code Online (Sandbox Code Playgroud)