Stack Overflow 上有很多关于这个一般主题的问答,但它们要么质量很差(通常是初学者的调试问题暗示的),要么以其他方式错过了目标(通常是不够通用)。至少有两种极其常见的方法会使幼稚的代码出错,初学者从关于循环的规范中获益更多,而不是从将问题作为拼写错误或关于打印所需内容的规范中获益。所以这是我尝试将所有相关信息放在同一个地方。
假设我有一些简单的代码,可以对一个值进行计算x并将其分配给y:
y = x + 1
# Or it could be in a function:
def calc_y(an_x):
return an_x + 1
Run Code Online (Sandbox Code Playgroud)
现在我想重复计算 的许多可能值x。我知道for如果我已经有要使用的值列表(或其他序列),我可以使用循环:
xs = [1, 3, 5]
for x in xs:
y = x + 1
Run Code Online (Sandbox Code Playgroud)
while或者,如果有其他逻辑来计算值序列,我可以使用循环x:
def next_collatz(value):
if value % 2 == 0:
return value // 2
else:
return 3 * value + 1
def collatz_from_19():
x = 19
while x != 1:
x …Run Code Online (Sandbox Code Playgroud) 所以我有一个字符串'1xxx1',我想用一个字符替换一个特定数字(也许全部可能没有)的x,让我们说'5'.我想要所有可能的组合(...可能是排列)的字符串,其中x被替换或保留为x.我希望这些结果存储在列表中.
所以期望的结果是
>>> myList = GenerateCombinations('1xxx1', '5')
>>> print myList
['1xxx1','15xx1','155x1','15551','1x5x1','1x551','1xx51']
Run Code Online (Sandbox Code Playgroud)
显然,我希望能够处理任意长度的字符串以及任何数量的x,以及能够替换任何数字.我已经尝试使用循环和递归来解决这个问题无济于事.任何帮助,将不胜感激.
我继承了一个遗留代码库,其中包含大量嵌套的for循环,如下所示:
def func(infile, some_other_data, outfile, status_variable):
with open(infile, 'r') as f:
with open(outfile, 'w') as outf:
for line in f:
# parse line
for element in some_other_data:
standard_function(line, element)
if status_variable == 'status_A':
function_A(line, element)
elif status_variable == 'status_B':
function_B(line, element)
# handle other possible status variables
outf.write(new_line)
Run Code Online (Sandbox Code Playgroud)
此代码与性能有关。为了加快速度(除了其他更改之外),我想消除所有被称为n * m次的if子句,测试表明,这确实可以提高10%。
为此,我只是为每个可能的状态变量复制并修改了主循环函数,并相应地调用了不同的函数。这有效地将if子句移出了循环。但是,它非常丑陋,并且使库变成了原来的4倍。
有没有一种(相当)简单的python方式来处理这种情况,在这种情况下,我想重用样板循环并只更改每次迭代所做的事情而无需每次都处理条件?
我一直在玩装饰器,它根据状态变量动态返回循环函数,并调用不同的子函数,但是从可读性的角度来看,最终结果看起来很恐怖。我绝不是python专家,所以我可能会忽略一些方便的高级功能,这些功能在这里可能会有所帮助。
任何建议都将受到高度赞赏。
我需要编写一个名为'concat' 的python 函数,它接受任意两个函数作为输入,并返回一个函数,该函数是两个输入函数的连接函数(即它接受f1 和f2,并返回f1?f2)。
我试过这个:
def concat(f1,f2):
return f1(f2)
Run Code Online (Sandbox Code Playgroud)
例如,如果 f1 和 f2 是:
def f1(x):
return x+2
def f2(x):
return x*2
Run Code Online (Sandbox Code Playgroud)
然后, concat(f1,f2) 应该返回: (x*2)+2
我希望能够像这样使用它:
a = concat(f1,f2)
a(5)
Run Code Online (Sandbox Code Playgroud)
但我收到一个错误:
类型错误:不支持 + 的操作数类型:'function' 和 'int'
我知道我可以这样定义函数:
def concat(f1,f2,x):
return f1(f2(x))
Run Code Online (Sandbox Code Playgroud)
但这不是我想要的;我希望能够创建 concat 函数的实例,然后可以用任何 x 调用它。
我有如下代码:
if text == 'today':
date1, date2 = dt.today_()
result, data = ga.get_sessions_today_data(user_id, date1, date2)
result, data, caption = get_final_caption(result, data, date1, date2, 'hour', 'sessions')
handle_result(chat_id, result, data, caption)
elif text == 'yesterday':
date1, date2 = dt.yesterday()
result, data = ga.get_sessions_today_data(user_id, date1, date2)
result, data, caption = get_final_caption(result, data, date1, end_date, 'hour', 'sessions')
handle_result(chat_id, result, data, caption)
...
Run Code Online (Sandbox Code Playgroud)
代码重复了很多次,只是dt.function()和ga.function()不同.我怎样才能优化代码?
3.8 中引入了新的“仅位置参数”语法。
来自文档中的仅位置参数:
有新语法 (
/) 指示某些函数参数必须按位置指定(即,不能用作关键字参数)。这与help()for 在 C 中实现的函数(由 Larry Hastings 的Argument Clinic工具产生)所示的符号相同。
来自http://northtexasroofing.net/article/10509084.shtml:
现在
pow(2, 10)和pow(2, 10, 17)是有效的调用,但是pow(x=2, y=10)和pow(2, 10, z=17)是无效的。
我的问题是,为什么要使用这种语法?
为什么它对代码的用户更好?
在我看来,这让用户更难指定他们的论点的实际含义,如果他们愿意的话。
为什么要让用户更难?
我显然错过了一些东西。
python ×6
combinations ×1
function ×1
iteration ×1
pep570 ×1
python-2.7 ×1
python-3.8 ×1
python-3.x ×1
string ×1