Python设计理念的一个想法是"应该有一个......明显的方法来实现它".(PEP 20),但这并非总是如此.我特别指的是(简单)if语句与布尔评估.考虑以下:
if words:
self.words = words
else:
self.words = {}
Run Code Online (Sandbox Code Playgroud)
与
self.words = words or {}
Run Code Online (Sandbox Code Playgroud)
在这样一个简单的情况下,从风格上说,这是更可取的吗?对于更复杂的情况,可以选择if语句以获得可读性,对吧?
可能重复:
Python中的"最小惊讶":可变默认参数
def f(a, L=[]):
L.append(a)
return L
print(f(1, [1, 2]))
print(f(1))
print(f(2))
print(f(3))
Run Code Online (Sandbox Code Playgroud)
我想知道为什么其他f(1),f(2),f(3)没有附加到第一个f(1,[1,2]).我想结果应该是:
[1, 2, 1]
[1, 2, 1, 1]
[1, 2, 1, 1, 2]
[1, 2, 1, 1, 2, 3]
Run Code Online (Sandbox Code Playgroud)
但结果不是这个.我不知道为什么.
我有一个简单的Python脚本,它使用Ctl-C的信号处理程序.如果程序正常完成,则结束时间将传递到"print_results"函数中.我希望print_results函数有一个可选参数,如果没有传递,只需获取当前"现在"时间.但是当我从信号处理程序调用它时,它没有得到正确的时间.
这是我简化但可重复的程序:
import sys
import signal
import urllib2
import urllib
import datetime
import time
import getopt,sys
def signal_handler(signal, frame):
print_results()
sys.exit(0)
def print_results(ended=datetime.datetime.now()):
print "\nEnded at ",ended
print "Total time: ",(ended - startTime)
print "Finished ",numIterations," iterations, received ",totalRecords," records"
numIterations = 0
maxIterations = 8
delaySecs = 3
totalRecords = 0
# set up signal handler
signal.signal(signal.SIGINT, signal_handler)
startTime = datetime.datetime.now()
print "Starting at ",time.asctime(time.localtime())
while (numIterations < maxIterations):
iterStartTime = datetime.datetime.now()
numIterations += 1
print "Iteration: ",numIterations
# …Run Code Online (Sandbox Code Playgroud) [编辑00]:我已经多次编辑该帖子,现在甚至是标题,请阅读以下内容.
我只是了解了格式字符串的方法,其使用词典使用,如所提供的那些vars(),locals()和globals(),例如:
name = 'Ismael'
print 'My name is {name}.'.format(**vars())
Run Code Online (Sandbox Code Playgroud)
但是我想这样做:
name = 'Ismael'
print 'My name is {name}.' # Similar to ruby
Run Code Online (Sandbox Code Playgroud)
所以我想出了这个:
def mprint(string='', dictionary=globals()):
print string.format(**dictionary)
Run Code Online (Sandbox Code Playgroud)
您可以在此处与代码进行交互:http://labs.codecademy.com/BA0B/3#: workspace
最后,我想做的是将该函数放在另一个名为的文件中my_print.py,这样我就能做到:
from my_print import mprint
name= 'Ismael'
mprint('Hello! My name is {name}.')
Run Code Online (Sandbox Code Playgroud)
但就像现在一样,范围存在问题,我如何从导入的mprint函数中将主模块命名空间作为字典.(不是那个my_print.py)
我希望我自己理解,如果没有,尝试从另一个模块导入该功能.(回溯在链接中)
它正在访问globals()dict my_print.py,但当然变量名在该范围内没有定义,有关如何实现这一点的任何想法?
如果它在同一模块中定义,该函数可以工作,但请注意我必须如何使用,globals()因为如果不是,我只会得到一个mprint()范围内的值的字典.
我已经尝试使用非局部和点符号来访问主模块变量,但我仍然无法弄明白.
[编辑01]:我想我找到了一个解决方案:
在my_print.py中:
def mprint(string='',dictionary=None):
if dictionary is None:
import sys …Run Code Online (Sandbox Code Playgroud) 我有以下的代码和变量,我想找到什么样的变量a,a1,a2,b,b1,和b2参考代码已经执行之后.
def do_something(a, b):
a.insert(0, "z")
b = ["z"] + b
a = ["a", "b", "c"]
a1 = a
a2 = a[:]
b = ["a", "b", "c"]
b1 = b
b2 = b[:]
do_something(a, b)
Run Code Online (Sandbox Code Playgroud)
我尝试的解决方案如下:
a = ["z", "a", "b", "c"]
a1 = ["a", "b", "c"]
a2 = ["a", "b", "c"]
b = ["z" "a", "b", "c"]
b1 = ["a", "b", "c"]
b2 = ["a", "b", "c"] …Run Code Online (Sandbox Code Playgroud) num1 = self.var1在 function 中赋值时fiz,Python 说未解析的引用。这是为什么?
class Foo:
def __init__(self):
self.var1 = "xyz"
def fiz(self, num1=self.var1):
return
Run Code Online (Sandbox Code Playgroud) 这是问题912526的后续内容 - 如何在Python中向函数传递大量变量?.
在我正在编写的程序中需要传递很多变量,从我之前的问题中我理解我应该将这些变量放入类中,然后传递类.
其中一些变量来自重复集 - 对于薄膜计算,我需要跟踪多个层的光学特性(折射率,吸收,厚度等).
存储这样的变量的最佳方法是创建一个派生自Python列表的类来存储每组保存单个层变量的类集合吗?然后将处理从列表中派生的图层集的函数和处理该类中特定图层的函数放在一起?有没有更好的方法来完成单一课程?
在下面的例子中使用两类方法,我能够进行设置,以便我可以使用像这样的语句来访问变量
n1 = layers[5].n
Run Code Online (Sandbox Code Playgroud)
这是最好的方法,对吗?
#Test passing values to and from functions
class Layers(list):
def add(self,n,k,comment):
self.append( OneLayer(n,k,comment) )
def input_string(self):
input_string = []
for layer in self:
vars = layer.input_string()
for var in vars:
input_string.append( var )
return input_string
def set_layers(self,results):
for layer,i in enumerate(self):
j = i*layer.num_var
layer.set_layer( *results[j:j+2] )
class OneLayer(object):
def __init__(self,n,k,comment):
self.n = n
self.k = k
self.comment = comment
def input_string(self):
return [['f','Index of Refraction',self.n], …Run Code Online (Sandbox Code Playgroud) 我今天遇到了一个有趣的python bug,其中实例化一个类似乎反复出现状态.在以后的实例化调用中,已经定义了变量.
我将问题归结为以下类/ shell交互.我意识到这不是初始化类变量的最佳方法,但它肯定不应该像这样.这是一个真正的错误还是这个"功能"?:d
tester.py:
class Tester():
def __init__(self):
self.mydict = self.test()
def test(self,out={}):
key = "key"
for i in ['a','b','c','d']:
if key in out:
out[key] += ','+i
else:
out[key] = i
return out
Python提示:
Python 2.6.6 (r266:84292, Oct 6 2010, 00:44:09)
[GCC 4.2.1 (Apple Inc. build 5664)] on darwin
>>> import tester
>>> t = tester.Tester()
>>> print t.mydict
{'key': 'a,b,c,d'}
>>> t2 = tester.Tester()
>>> print t2.mydict
{'key': 'a,b,c,d,a,b,c,d'}
在Python 2.7.1中,我试图提供一个消息列表作为第一个参数,并将颜色列表作为第二个参数.我希望第二个参数默认为白色列表,如果没有提供的话.这是我试图这样做的方式:
def multicolor_message(msgs, colors=[libtcod.white for x in len(msgs)]):
#function body
Run Code Online (Sandbox Code Playgroud)
libtcod.white是我正在使用的库的一部分,并且不会导致任何问题.编译器说msgs没有定义变量.显然该msgs变量在此范围内不存在,但我需要创建一个适当长度的列表并将其分配给colors.最干净的方法是什么?
我有这个简单的课程:
class revs:
def __init__(self, rev, us, accs = []):
self.rev = rev
self.us = us
self.accs = accs
Run Code Online (Sandbox Code Playgroud)
我有这段代码将值赋予列表并且在循环内部
rev, usu = cada_l.split("|")
acct = each_l[:2].strip()
list_acct.append(acct)
Run Code Online (Sandbox Code Playgroud)
最后,我创建了一个dict,来管理这样的转速列表:
drevs = {}
cada = revs(rev, us, list_acct)
drevs[cada.rev] = cada
Run Code Online (Sandbox Code Playgroud)
并且它与rev和我们一起正常工作,但是list_acct正在更新所有实例:
drevs['1'].rev
'1'
drevs['2'].rev
'2'
drevs['1'].us
'user1'
drevs['2'].us
'user2'
drevs['1'].accs
'["Doc1","Doc2"]'
drevs['2'].accs
'["Doc1","Doc2"]'
Run Code Online (Sandbox Code Playgroud)
如果我改变list_acct.clear(),所有实例中的值都是清楚的,我仍然是Python的新手,这让我很困惑.
谢谢
python ×10
class ×2
arguments ×1
coding-style ×1
datetime ×1
function ×1
if-statement ×1
list ×1
parameters ×1
python-3.x ×1