Python中的input和print方法

input

很多情况下运行的 Python 程序并没有和用户交互,程序运行后就等待结果的输出。而有些程序是需要用户输入才能继续向下执行。Python 中使用 input() 函数可以很便捷地获取用户的输入:

1
2
name = input("What's your name ? ")
print("Your name is", name)

输出结果

1
2
What's your name ? Tom
Your name is Tom

需要注意的是, input() 返回的数据类型都是字符串

print

使用帮助

print() 函数是 Python 的内置方法,用于将指定的值打印到屏幕输出,或文件流。它的参数如下:

1
2
3
4
5
6
7
8
9
10
11
12
>>> help(print)
Help on built-in function print in module builtins:

print(...)
print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)

Prints the values to a stream, or to sys.stdout by default.
Optional keyword arguments:
file: a file-like object (stream); defaults to the current sys.stdout.
sep: string inserted between values, default a space.
end: string appended after the last value, default a newline.
flush: whether to forcibly flush the stream.

参数说明

*values : 表示要打印的值,任何多个无名参数, 各个值之间用 , 隔开,打印出来的各个值之间默认是以空格隔开

1
2
3
4
>>> name = 'Tom'
>>> age = '18'
>>> print(name, age)
Tom 18

sep=' ': 表示当输入多个打印的值时,各个值之间分割方式, 默认是空格,也可以自定义,例如

1
2
3
4
>>> name = 'Tom'
>>> age = '18'
>>> print(name, age, sep = '---' )
Tom---18

end='\n': 控制 print() 中传入值输出完后的结束符号,默认是换行,也可以自定义,例如:

1
2
3
4
5
6
7
>>> name = 'Tom'
>>> age = '18'
>>> print(name);print(age)
Tom
18
>>> print(name, end=' is ');print(age, end=' years old ')
Tom is 18 years old

file=sys.stdout:在 Linux 中一切皆文件,包括屏幕终端输出,file 用来设置输出到哪里,默认是输出到屏幕(标准输出),在 Python 中就是 sys.stdout 。我们可以设置 file='/tmp/test.txt',把内容存到该文件中

1
2
3
f = open(r'/tmp/test.txt', 'w')
print('Tom is 18 years old', file=f)
f.close()

flush=False:刷新内存中的缓冲区数据,是否立刻将缓冲区的数据写入 file= 所指定的输出位置,默认为 False 。默认情况下 print() 将内容输出到 sys.stdout ,即标准输出(屏幕)文件,比较下面两种的参数实现进度条的效果

默认情况,flush=False,当所有 sleep 完成之后才会写到屏幕输出文件

1
2
3
4
5
import time

for i in range(30):
print('*', end='')
time.sleep(0.1)

人为干预,flush=True,每次输出都会写到屏幕输出文件

1
2
3
4
5
import time

for i in range(30):
print('*', end='', flush=True)
time.sleep(0.1)

另一种实现效果

1
2
3
4
5
6
7
8
9
import time

for i in range(0, 101, 2):
time.sleep(0.3)
char_num = i // 2 # 打印多少个'*'
per_str = '\r%s%% : %s' % (i, '*' * char_num)
print(per_str, end='', flush=True)
print('')
# \r 可以把光标移动到行首但不换行,覆盖之前行的内容

请注意,如果使用了 Pycharm 在远程调试 Linux 的代码时,会给解释器添加 -u 选项,这样将会导致看不出来实际效果:

1
ssh://root@192.168.127.129:22/opt/python3-venv/bin/python3 -u /Python3/everyday/test.py

这时候应该在 Linux 终端执行代码查看效果。

格式化输出

Python 中的 print 继承了 C 中的 printf,例如

1
2
>>> print('%s x %s = %s' % (5, 6, 5 * 6))
5 x 6 = 30
  • %:占位符,标记了转换说明符的开始
  • 转换标志
    • - 表示左对齐
    • + 表示在转换值之前要加上正负号
    • (空白字符)表示正数之前保留空格
    • 0 表示转换值若位数不够则用0填充
  • 最小字段宽度:转换后的字符串至少应该具有该值指定的宽度。如果是 *,则宽度值会从元组中读出

  • . 后跟精度值:

    • 如果转换的是实数,精度值就表示出现在小数点后的位数。
    • 如果转换的是字符串,那么该数字就表示最大字段宽度。
    • 如果是 *,那么精度将从元组中读出

字符串格式化转换类型

转换类型 含义
d,i 带符号的十进制整数
o 不带符号的八进制
u 不带符号的十进制
x 不带符号的十六进制(小写)
X 不带符号的十六进制(大写)
e 科学计数法表示的浮点数(小写)
E 科学计数法表示的浮点数(大写)
f,F 十进制浮点数
g 如果指数大于-4或者小于精度值则和e相同,其他情况和f相同
G 如果指数大于-4或者小于精度值则和E相同,其他情况和F相同
C 单字符(接受整数或者单字符字符串)
r 字符串(使用repr转换任意python对象)
s 字符串(使用str转换任意python对象)

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
# 最小宽度为2,默认右对齐
>>> print('%2sx%2s=%2s' % (5, 6, 5 * 6))
5x 6=30
# 最小宽度为2,左对齐
>>> print('%-2sx%-2s=%-2s' % (5, 6, 5 * 6))
5 x6 =30

# 最小宽度为8,
>>> print('%8d' % 9)
9
# 最小宽度为8,位数不够用0填充
>>> print('%08d' % 9)
00000009

颜色输出

示例

1
2
3
print('\033[0;31m Hello \033[0;39m')
# print('\033[字背景颜色;文字颜色m 字符串\033[0m')
print('\033[1;36;41m Something here \033[0m')

说明

  • \ 代表转义
  • 033 代表键盘的Control键
  • 1 字体行为(高亮,闪烁,下划线等);
  • 36 字体颜色
  • 41 字体背景色

注:

  • 字背景颜色和文字颜色之间是英文的分号 ;

  • 文字颜色后面有个m

  • 字符串前后可以没有空格,如果有的话,输出也是同样有空格

文字和背景颜色搭配

字体颜色范围值 30~37

1
2
3
4
5
6
7
8
"\033[30m 黑色字 \033[0m"
"\033[31m 红色字 \033[0m"
"\033[32m 绿色字 \033[0m"
"\033[33m 黄色字 \033[0m"
"\033[34m 蓝色字 \033[0m"
"\033[35m 紫色字 \033[0m"
"\033[36m 天蓝字 \033[0m"
"\033[37m 白色字 \033[0m"

字体背景颜色范围值 40~47

1
2
3
4
5
6
7
8
"\033[40;37m 黑底白字 \033[0m" 
"\033[41;37m 红底白字 \033[0m"
"\033[42;37m 绿底白字 \033[0m"
"\033[43;37m 黄底白字 \033[0m"
"\033[44;37m 蓝底白字 \033[0m"
"\033[45;37m 紫底白字 \033[0m"
"\033[46;37m 天蓝底白字 \033[0m"
"\033[47;30m 白底黑字 \033[0m"

控制选项说明

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
\033[0m # 关闭所有属性 
\033[1m # 设置高亮度
\033[4m # 下划线
\033[5m # 闪烁
\033[7m # 反显
\033[8m # 消隐
\033[30m — \33[37m # 设置前景色
\033[40m — \33[47m # 设置背景色
\033[60A # 光标上移60行
\033[60B # 光标下移60行
\033[60C # 光标右移60行
\033[60G # 光标右移60行
\033[60D # 光标左移60行
\033[y;xH # 设置光标位置
\033[2J # 清屏
\033[K # 清除从光标到行尾的内容
\033[s # 保存光标位置
\033[u # 恢复光标位置
\033[?25l # 隐藏光标
\033[?25h # 显示光标

额外说明

  • 前景颜色各数字是对应背景颜色减去10

  • 结束非常规字符序列的 m 要紧跟前面的数字,不能有空格

练习

输入的内容如下

1
2
3
4
name = input("Input your name : ")
age = input("Input your age : ")
job = input("input your job : ")
salary = input("input your salary : ")

输出格式:

1
2
3
4
5
6
---------- Info of Jerry ----------
Name : Jerry
Age : 18
Job : IT
Salary : 1000
------------ End -------------------

示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
name = input("Input your name : ")
age = input("Input your age : ")
job = input("input your job : ")
salary = input("input your salary : ")

if salary.isdigit():
salary = int(salary)
else:
exit('Must input digit')

msg = '''
---------- Info of %s ----------
Name : %s
Age : %s
Job : %s
Salary : %s
------------ End ---------------
''' % (name, name, age, job, salary)

print(msg)
有钱任性,请我吃包辣条
0%