小编Ben*_*ank的帖子

在块中迭代列表的最"pythonic"方法是什么?

我有一个Python脚本,它将整数列表作为输入,我需要一次使用四个整数.不幸的是,我无法控制输入,或者我将它作为四元素元组列表传入.目前,我正在以这种方式迭代它:

for i in xrange(0, len(ints), 4):
    # dummy op for example code
    foo += ints[i] * ints[i + 1] + ints[i + 2] * ints[i + 3]
Run Code Online (Sandbox Code Playgroud)

它看起来很像"C-think",这让我怀疑有更多的pythonic方式来处理这种情况.迭代后会丢弃该列表,因此无需保留.也许这样的事情会更好吗?

while ints:
    foo += ints[0] * ints[1] + ints[2] * ints[3]
    ints[0:4] = []
Run Code Online (Sandbox Code Playgroud)

但是,仍然没有"感觉"正确.: - /

相关问题:如何在Python中将列表拆分为大小均匀的块?

python optimization loops list chunks

449
推荐指数
15
解决办法
12万
查看次数

我为什么要关心轻量级和带注释的标签?

我去年从Subversion转到Git作为我的日常VCS,我仍在努力把握"Git-think"的细节.

最近困扰我的那个是"轻量级"与注释与签名标签.对于所有实际用途来说,注释标签优于轻量级标签似乎是普遍接受的,但我发现为什么情况的解释似乎总是归结为"因为最佳实践""因为它们是不同的".不幸的是,这些都是非常不满意的论据而不知道为什么它是最佳实践或这些差异如何与我的Git用法相关.

当我第一次切换到Git时,轻薄的标签似乎是自切片面包以来最好的东西; 我可以指出一个提交并说"那是1.0".我很难掌握标签如何比这更好,但我当然不能相信世界的Git专家更喜欢任意注释标签!那么喧哗什么呢?

(奖励积分:为什么我需要签署一个标签?)

编辑

我已经成功地确信注释标签是一件好事 - 知道谁标记,何时重要!作为后续行动,有关良好标签注释的任何建议吗?两者都git tag -am "tagging 1.0" 1.0试图总结提交日志,因为上一个标记感觉就像丢失策略一样.

git git-tag

332
推荐指数
6
解决办法
5万
查看次数

你可以给一个Django应用程序一个详细的名称,以便在整个管理员中使用吗?

就像你可以给出Django管理员中出现的字段和模型详细名称一样,你能给一个应用程序一个自定义名称吗?

python django

137
推荐指数
8
解决办法
7万
查看次数

字符串格式命名参数?

我知道这是一个非常简单的问题,但我不知道如何谷歌.

我能怎么做

print '<a href="%s">%s</a>' % (my_url)
Run Code Online (Sandbox Code Playgroud)

这样my_url两次使用?我假设我必须"命名" %s然后在params中使用dict,但我不确定正确的语法?


仅供参考,我知道我可以my_url在参数中使用两次,但这不是重点:)

python string syntax

128
推荐指数
5
解决办法
7万
查看次数

从Bash中的$ PATH变量中删除路径的最优雅方法是什么?

或者更一般地说,如何从Bash环境变量中以冒号分隔的列表中删除项?

我想我多年前已经看到了一种简单的方法,使用更高级的Bash变量扩展形式,但如果是这样的话,我已经忘记了它.对谷歌的快速搜索出乎意料地少了几个相关结果,没有一个我称之为"简单"或"优雅".例如,分别使用sed和awk的两种方法:

PATH=$(echo $PATH | sed -e 's;:\?/home/user/bin;;' -e 's;/home/user/bin:\?;;')
PATH=!(awk -F: '{for(i=1;i<=NF;i++){if(!($i in a)){a[$i];printf s$i;s=":"}}}'<<<$PATH)
Run Code Online (Sandbox Code Playgroud)

什么都不直接存在?有什么类似于Bash中的split()函数吗?

更新:
看起来我需要为我的故意模糊的问题道歉; 我对解决特定用例的兴趣不如激发良好的讨论.幸运的是,我明白了!

这里有一些非常聪明的技巧.最后,我在工具箱中添加了以下三个功能.魔法发生在path_remove中,这主要基于Martin York巧妙使用awk的RS变量.

path_append ()  { path_remove $1; export PATH="$PATH:$1"; }
path_prepend () { path_remove $1; export PATH="$1:$PATH"; }
path_remove ()  { export PATH=`echo -n $PATH | awk -v RS=: -v ORS=: '$0 != "'$1'"' | sed 's/:$//'`; }
Run Code Online (Sandbox Code Playgroud)

唯一真正的缺点是使用sed去除尾部结肠.考虑到马丁的其他解决方案是多么简单,但我非常愿意接受它!


相关问题: 如何在shell脚本中操作$ PATH元素?

bash shell path variable-expansion list-processing

106
推荐指数
10
解决办法
6万
查看次数

为什么我不能在Windows上使用TortoiseMerge作为我的git合并工具?

我正试图执行我的第一次Git合并(令人兴奋!),但无法在Windows 7上识别Git Gui(0.13GITGUI,来自Git 1.7.4.msysgit.0)以识别TortoiseMerge(1.6.11.20210 x64).基于对类似问题的回答,我进行了以下配置更改:

$ git config --global merge.tool tortoisemerge
$ git config --global mergetool.tortoisemerge.cmd 'TortoiseMerge.exe -base:"$BASE" -mine:"$LOCAL" -theirs:"$REMOTE" -merged:"$MERGED"'
$ git config --global --list
...snip...
merge.tool=tortoisemerge
mergetool.tortoisemerge.cmd=TortoiseMerge.exe -base:"$BASE" -mine:"$LOCAL" -theirs:"$REMOTE" -merged:"$MERGED"
$
Run Code Online (Sandbox Code Playgroud)

不幸的是,当我启动Git Gui并尝试"运行合并工具"时,我收到错误Unsupported merge tool 'tortoisemerge'.

谁能告诉我我做错了什么?这是我的相关部分~/.gitconfig:

[merge]
        tool = tortoisemerge
[mergetool "tortoisemerge"]
        cmd = TortoiseMerge.exe -base:\"$BASE\" -mine:\"$LOCAL\" -theirs:\"$REMOTE\" -merged:\"$MERGED\"
Run Code Online (Sandbox Code Playgroud)

更新

git mergetool从命令行运行时,TortoiseMerge可以正常使用上面的配置.似乎只有Git Gui有问题.: - /

windows git user-interface mergetool tortoisemerge

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

当*不*使用准备好的陈述?

我正在重新设计一个使用最小数据库的PHP驱动的网站.原始版本使用"伪准备语句"(PHP函数进行引用和参数替换)来防止注入攻击并将数据库逻辑与页面逻辑分开.

用一个使用PDO和真实预处理语句的对象替换这些ad-hoc函数似乎很自然,但在阅读它们之后,我不太确定.PDO似乎仍然是一个好主意,但准备好的声明的主要卖点之一是能够重用它们......我永远不会.这是我的设置:

  • 这些陈述都非常简单.大多数是在形式SELECT foo,bar FROM baz WHERE quux = ? ORDER BY bar LIMIT 1.该批次中最复杂的陈述只是三个这样的选择与UNION ALLs 连接在一起.
  • 每个页面命中至多执行一个语句并仅执行一次.
  • 我处于托管环境中,因此通过亲自进行任何"压力测试"来抨击他们的服务器.

鉴于使用准备好的语句至少会使我正在进行的数据库往返次数增加一倍,我最好避免使用它们吗?我是否可以使用PDO::MYSQL_ATTR_DIRECT_QUERY以避免多个数据库跳闸的开销,同时保留参数化和注入防御的好处?或者,与执行我不应该担心的非准备查询相比,准备好的语句API使用的二进制调用是否运行良好?

编辑:

伙计们,感谢所有好的建议.这是我希望我可以将多个答案标记为"已接受"的地方 - 许多不同的观点.不过,最终,我必须给rick他应得的......如果没有他的答案,我会幸福地离开并完成错误的事情,即使遵循了所有人的建议.:-)

仿真准备好的陈述吧!

php mysql pdo prepared-statement

34
推荐指数
5
解决办法
1万
查看次数

一种类方法,当作为实例方法调用时表现不同?

我想知道是否有可能使一个方法在被称为类方法时比在被调用为实例方法时表现不同.

例如,作为一个技能提升项目,我正在编写一个Matrix类(是的,我知道那里已经有非常好的矩阵类).我已经为它创建了一个类方法,它identity返回一个指定大小的单位矩阵.

现在,当调用一个实例Matrix,似乎不需要指定大小; 它应该返回一个与Matrix调用它相同大小的单位矩阵.

换句话说,我想定义一个方法,可以确定它是否是通过实例调用的,如果是,则访问该实例的属性.不幸的是,即使在深入阅读文档和一些Google搜索之后,我也没有找到任何暗示这是可行的.有谁知道不同?

编辑:

哇!显然,我还不太习惯一流的功能.这就是我最终得到的结果 - 感谢Unknown提供密钥!

class Foo(object):
    def __init__(self, bar):
        self.baz = bar
        self.bar = MethodType(lambda self: self.__class__.bar(self.baz), self, self.__class__)

    @classmethod
    def bar(cls, baz):
        return 5 * baz

Foo.bar(3) # returns 15

foo = Foo(7)
foo.bar() # returns 35
Run Code Online (Sandbox Code Playgroud)

编辑2:

只是一个简单的说明 - 这种技术(以及下面介绍的大多数)不适用于定义的类__slots__,因为您无法重新分配该方法.

python methods class

26
推荐指数
3
解决办法
3316
查看次数

双击时暂停批处理文件,但从控制台窗口运行时不能暂停?

有没有办法批处理文件(在这种情况下,在Windows XP上运行)来确定它是从命令行启动(即在控制台窗口内)还是通过shell启动(例如通过双击)?

我有一个脚本,我希望在通过shell运行时在某些点暂停,但不是在命令行运行时.我在SO上看到过类似的问题,但由于两个原因我无法使用相同的解决方案:首先,它是否暂停需要依赖于多个因素,其中只有一个是双击.其次,我将把这个脚本分发给我团队中的其他人,我无法真实地要求他们所有人进行注册表更改,这将影响所有脚本.

这可能吗?

windows batch-file

24
推荐指数
2
解决办法
5715
查看次数

哪个更准确,x**.5还是math.sqrt(x)?

我最近发现x**.5并且math.sqrt(x)并不总是在Python中产生相同的结果:

Python 2.6.1 (r261:67517, Dec 4 2008, 16:51:00) [MSC v.1500 32 bit (Intel)]
on win32
>>> 8885558**.5 - math.sqrt(8885558)
-4.5474735088646412e-13
Run Code Online (Sandbox Code Playgroud)

检查低于10**7的所有整数,这两种方法对几乎正好0.1%的样本产生不同的结果,对于较大的数字,误差的大小增加(缓慢).

所以问题是,哪种方法更准确?

python floating-point

22
推荐指数
3
解决办法
6028
查看次数