我尝试使用%r
作为变量的替代品,并使用此代码中的等式(我可能措辞错误)。
s = int(input("How many sweets do you want to share?:"))
p = int(input("How many people will they be divided between?:"))
print("Each person will have %r sweets." % s/p)
print("There will be %r sweets left over" % s%p)
这是我的错误:
File "pye7.py", line 3, in <module>
print("Each person will have %r sweets.") % s/p
TypeError: unsupported operand type(s) for /: 'str' and 'int'
答案 0 :(得分:2)
这是一种字符串格式化语法。基本用法是使用%s占位符将值插入到字符串中。您正在尝试将表达式插入到字符串中,因此您需要将等式括在括号中:
#include <string>
#include <stdexcept>
#include <memory>
#include <iostream>
#include <uvw.hpp>
int
main(void)
{
auto loop = uvw::Loop::getDefault ();
if (loop == nullptr)
{
throw std::runtime_error ("loop init failed");
}
auto tcp = loop->resource<uvw::TcpHandle>();
if (tcp == nullptr)
{
throw std::runtime_error ("tcp init failed");
}
tcp->once<uvw::ConnectEvent> ([] (const uvw::ConnectEvent &, uvw::TcpHandle &tcp) mutable
{
tcp.read ();
});
tcp->once<uvw::ErrorEvent> ([] (const uvw::ErrorEvent &, uvw::TcpHandle &) mutable
{
std::cerr << "Connection error\n";
});
std::string buf;
tcp->on<uvw::DataEvent> ([&] (const uvw::DataEvent &event, uvw::TcpHandle &tcp) mutable
{
std::string data {event.data.get (), event.length};
buf += data;
std::string::size_type pos;
while ((pos = buf.find ('\n')) != std::string::npos)
{
std::string line = buf.substr (0, pos);
buf.erase (0, pos + 1);
if (!line.compare (0, 2, "OK"))
{
const std::string idle = "idle\n";
std::unique_ptr<char[]> ptr {new char[idle.size ()]};
idle.copy (ptr.get (), idle.size ());
tcp.write (std::move (ptr), idle.size ());
}
else
{
std::cout << line << "\n";
}
}
});
tcp->connect ("127.0.0.1", 7701);
loop->run<uvw::Loop::Mode::DEFAULT> ();
}
答案 1 :(得分:0)
Python的运算符优先级规则规定在%
之前评估/
(这两个运算符实际上具有相同的内在优先级,因此最左边的一个首先被计算)。在这种情况下,这似乎是不可取的,其中第一个参数是一个字符串,并且运算符被用于格式化变量值,但是当双方的参数都是数字时,规则可能被认为是最不令人惊讶的。然后规则不会因操作数类型的改变而改变 - 这将是混乱。
在考虑你的第二个例子时,问题是最清楚的。空白不会改变事物,所以
fmt % s%p
和
fmt%s % p
是一样的。应首先评估哪个%
? Python的答案是:第一个就行了。
要解决这个问题,可以选择括号:
fmt % (arg)
或者,使用更现代的fmt.format( ... )
方法而不是%
。