print的end参数会导致time.sleep的不同行为

时间:2017-03-29 12:38:17

标签: python python-3.x for-loop time printing

我试着编写这个脚本,只是在同一行上以一秒钟的延迟打印数字,但它不起作用。

这是有效的:

package com.example.abdul.myapplication;
import java.util.List;
import android.app.ActivityManager;
import android.app.ActivityManager.RunningAppProcessInfo;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.TextView;

 public class MainActivity extends AppCompatActivity {

 @Override
 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    TextView tv = (TextView) findViewById(R.id.textView);

    ActivityManager activityManager = (ActivityManager) this
            .getSystemService(ACTIVITY_SERVICE);

    List<RunningAppProcessInfo> procInfos = activityManager
            .getRunningAppProcesses();
    for (int idx = 0; idx < procInfos.size(); idx++) {

        tv.setText(tv.getText() + "" + (idx + 1) + "."
                + procInfos.get(idx).processName + "\n");

    }

    }
    }

但事实并非如此,程序只是冻结了:

from time import sleep

for n in range(1, 11):
    print(n)
    sleep(1)

任何人都可以解释为什么会这样吗?

1 个答案:

答案 0 :(得分:2)

程序不会冻结,您只需要通过传递flush=True

来刷新流
print(n, end="", flush=True)

sys.stdoutprint默认使用的流是行缓冲的(在交互模式下),如the documentation中所述:

  
      
  • 交互时,标准流是行缓冲的
  •   

这意味着当遇到用于end\n)的默认字符串时,将调用flush。使用其他字符串(即'')不会触发flush,因此您必须使用flush=True强制它。