如何使用%r作为等式替换?

时间:2017-01-06 16:47:49

标签: python

我尝试使用%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'

2 个答案:

答案 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( ... )方法而不是%