我正在玩python,我意识到除非直接使用,否则我们不需要使用'+'运算符来连接字符串。
例如:
string1 = 'Hello' 'World' #1 works fine
string2 = 'Hello' + 'World' #2 also works fine
string3 = 'Hello'
string4 = 'World'
string5 = string3 string4 #3 causes syntax error
string6 = string3 + string4 #4 works fine
现在我有两个问题:
答案 0 :(得分:49)
来自docs:
允许使用多个相邻的字符串文字(由空格分隔),可能使用不同的引用约定,并且它们的含义与它们的连接相同。因此,“你好”'世界'相当于“helloworld”。
声明3不起作用,因为:
必须使用'+'运算符在运行时连接字符串表达式。
请注意,docs中子标题的标题也是“字符串文字串联”。这仅适用于字符串文字,而不适用于其他对象。
可能没什么区别。如果有,它可能非常小,没有人应该担心。
另外,要明白这可能存在危险:
>>> def foo(bar, baz=None):
... return bar
...
>>> foo("bob"
... "bill")
'bobbill'
这是错误永远不会无声传递的完美示例。如果我希望"bill"
成为参数baz
怎么办?我有一个逗号,但没有错误。相反,连接已经发生。
答案 1 :(得分:2)
回答你的第二个问题:完全没有区别(至少我使用的实施方式)。反汇编这两个语句,它们呈现为LOAD_CONST STORE_FAST
。它们是等价的。
答案 2 :(得分:2)
您可以使用%s
,因为这比使用+号更有效。
>>> string2 = "%s %s" %('Hello', 'World')
>>> string2
'Hello World'
(OR)
另一种方法是.format
>>> string2 = "{0} {1}".format("Hello", "World")
>>> string2
'Hello World'
>>>
答案 3 :(得分:1)
这是隐式字符串文字串联。它只发生在字符串文字中,而不是变量或评估为字符串的其他表达式。曾经存在(微小的)性能差异,但是现在,窥视孔优化器应该使形式基本相同。
答案 4 :(得分:1)
语句3不起作用,因为当你连接两个字符串表达式来创建一个新的字符串时,你需要一个'+'运算符。
而在sting 1,2和4的情况下,由空格分隔的相邻文字使用不同的引用约定。因此允许它们使它们与它们的串联打印相同。
此外,运行这两项操作不会有任何重大或明显的时差。
#!/bin/bash
source=/home/username/documents
dest=/myBackup
if [ "$1" == "--install" ] ; then
echo "installing..."
cp $0 /etc/cron.daily/myBackupScript
mkdir $dest
echo "installed"
exit 0
fi
for i in {0..9999}; do
if [ ! -e ${dest}/$i ]; then
echo "Copying to " ${dest}/$i
if [ -d ${dest}/$((i-1)) ]; then
rsync --checksum --recursive ${source} ${dest}/$i --link-dest=${dest}/$((i-1))
else
rsync --checksum --recursive ${source} ${dest}/$i
fi
DATE=`date +%Y-%m-%d__%H:%M:%S`
touch ${dest}/$i/$DATE
exit 0
fi
done
echo "unable to do backup"
exit 4
O / P 最慢的运行时间比最快的运行时间长17.08倍。这可能意味着正在缓存中间结果。 每回路57.8μs±92.5μs(平均值±标准偏差,7次运行,每次1次循环)
%%timeit -n 1
s1='ab'
s2='ba'
print(s1+s2)
O / P 最慢的运行时间比最快的运行时长4.86倍。这可能意味着正在缓存中间结果。 每回路25.7μs±21μs(平均值±标准偏差,7次运行,每次1次循环)
答案 5 :(得分:0)
为什么语句3不起作用而语句1起作用?
因为在第一条语句中,我们为变量分配了一些常量。变量赋值非常简单,因此我们可以继续将多个常量放入单个变量,赋值仍将继续进行。术语"hello"
和"world"
是两个相同类型的常量。因此,该声明有效。
如果执行以下操作,我们将获得SyntaxError
string1 = "Hello" 1
原因是我们在单个变量分配中提供了多个常量。这使python感到困惑,并将它作为错误抛出。
语句3全部关于基于两个变量分配变量。这将产生SyntaxError
,因为python在将2个变量赋给变量之前不知道它能做什么。
语句1和2之间是否存在诸如计算速度等技术上的差异?
是的。唯一的技术差异是可读性,而不是其他任何方面。可读性在Python中最为重要。对于未经训练的眼睛,"hello" "world"
可能看起来像编译器会将空格添加到字符串中。事实并非如此。
但是
"hello" + "world"
是明确且正常的。几乎总是,显式优于隐式。