Python中常见的反模式是+在循环中连接一系列字符串.这很糟糕,因为Python解释器必须为每次迭代创建一个新的字符串对象,并最终获得二次时间.(在某些情况下,CPython的最新版本显然可以优化它,但是其他实现不能,因此不鼓励程序员依赖它.)''.join是正确的方法.
不过,我听人说(这里包括对堆栈溢出),你应该永远不会使用+字符串连接,而是始终使用''.join或格式字符串.我不明白为什么如果你只是连接两个字符串就是这种情况.如果我的理解是正确的,它不应该花费二次时间,我认为a + b比任何一个''.join((a, b))或更清晰,更可读'%s%s' % (a, b).
+用于连接两个字符串是一种好习惯吗?还是有一个我不知道的问题?
我正在使用带有Rails 1.2.3的Ruby 1.8.6,并且需要确定两个数组是否具有相同的元素,无论它们是否处于相同的顺序.保证其中一个数组不包含重复项(另一个可能,在这种情况下答案是否定的).
我的第一个想法是
require 'set'
a.to_set == b.to_set
Run Code Online (Sandbox Code Playgroud)
但我想知道是否有更有效或惯用的方式.
我正在寻找一种更好的方法
if hash.key? :a &&
hash.key? :b &&
hash.key? :c &&
hash.key? :d
Run Code Online (Sandbox Code Playgroud)
最喜欢的东西
hash.includes_keys? [ :a, :b, :c, :d ]
Run Code Online (Sandbox Code Playgroud)
我想出来了
hash.keys & [:a, :b, :c, :d] == [:a, :b, :c, :d]
Run Code Online (Sandbox Code Playgroud)
但我不喜欢两次添加数组
我试图从命令行的stdin一次读取任意长度的一行.我不确定我是否能够包含GNU readline并且更喜欢使用库函数.
我读过的文档表明它getline应该有效,但在我的实验中它并没有阻止.我的示例程序:
#include <stdio.h>
int main()
{
char *line = NULL;
if (getline(&line, NULL, stdin) == -1) {
printf("No line\n");
} else {
printf("%s\n", line);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
生成No line,这使它不适合接受用户输入.
我该怎么做呢?我知道这应该是微不足道的,但我无法弄明白.
我的程序中有多个goroutine,每个都在fmt.Println没有任何显式同步的情况下进行调用.这是安全的(即,每条线路是否单独出现而没有数据损坏),或者我是否需要创建另一个带有同步的goroutine来专门处理打印?
对于三个n位有符号整数a,b和c(例如32位)a * (b + c) == (a * b) + (a * c),考虑到整数溢出,总是这样吗?
我认为这是与语言无关的,但如果不是,我对Java的答案特别感兴趣.
在C程序中除以零会导致错误消息的异常终止Floating point exception (core dumped).这对于浮点除法并不足为奇,但为什么在整数除以零时会这样说呢?整数除法实际上是否使用引擎盖下的FPU?
(顺便说一下,这都是在x86下的Linux上.)
我想在Racket中创建一个可以接受关键字参数的语法形式,这是某些函数的方式.
把它简化为一个简单的例子,我试着写:
(define-syntax sum-of-products
(syntax-rules (#:extra)
[(sum-of-products ([a b] ...))
(+ (* a b) ...)]
[(sum-of-products ([a b] ...) #:extra extra)
(+ extra (* a b) ...)]))
Run Code Online (Sandbox Code Playgroud)
这样以下就可以了:
(sum-of-products ([2 2] [3 3])) ? 13
(sum-of-products ([2 2] [3 3]) #:extra 5) ? 18
Run Code Online (Sandbox Code Playgroud)
不幸的是,Racket称这种"语法错误",显然这种尝试不正确.
可以这样做吗?
我想让Django开发服务器在开始运行之前做一些事情.为此,我创建了一个新应用程序,将其添加到顶部INSTALLED_APPS,然后management/commands/runserver.py使用以下代码在应用程序中创建一个文件:
from django.contrib.staticfiles.management.commands.runserver import Command as RunserverCommand
class Command(RunserverCommand):
def run(self, *args, **options):
self.stdout.write('About to start running on ' + self.addr)
super(Command, self).run(*args, **options)
Run Code Online (Sandbox Code Playgroud)
(当然,我想要做的事情比向stdout写一行更复杂,但这是演示问题的最简单的例子.我覆盖的原因run,而不是handle或其他方法,是因为我需要self.addr已经在此代码运行时设置.)
当我运行时./manage.py runserver,"关于开始在127.0.0.1上运行"一行不会出现一次,而是在服务器开始运行之前出现两次.为什么会发生这种情况以及可以采取哪些措施呢?
我希望我的主机系统中的某些环境变量在我的Vagrant VM中可见,使用该config.ssh.forward_env设置.我正在使用Vagrant 1.8.1.这是我的Vagrantfile:
Vagrant.configure(2) do |config|
config.vm.box = 'ubuntu/trusty64'
config.ssh.forward_env = ['FOO']
end
Run Code Online (Sandbox Code Playgroud)
创建它之后,我运行了以下命令:
vagrant up
export FOO=bar
vagrant ssh -c 'echo $FOO'
Run Code Online (Sandbox Code Playgroud)
我期望最后一行输出bar,但它输出一个空行(后跟Connection to 127.0.0.1 closed.).我究竟做错了什么?