通过Python 的内置 print 函数就能轻松实现终端上的输出
print("Hello World")
Hello World
?print()
def print(self, *args, sep=' ', end='\n', file=None):
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.
pass
*args 非关键字可变长参数,可以接受任意个参数,参数之间用逗号“,”分隔
sep='' 默认参数,打印参数与参数之间默认有空格
end=‘\n’ 默认参数,打印后字符串结尾默认会换行。
那么接下来,让我们来看看怎么使用吧:
这里我往print里面传入了很多数字,每一个数字都是一个参数,每一个参数都要用逗号 “,” 隔开了。
print(0,1,2,3,4,5)
0 1 2 3 4 5
字符串也是一样的,字符串用引号包含(“ ”/‘ ’)
print('liangxiansen','lixiaojie','zhaoguifei','liuaiqing')
liangxiansen lixiaojie zhaoguifei liuaiqing
如果我在print里面写 1+1 呢?
print(1+1)
2
接下来,如果我传入一个列表呢?
list_1 = [1,23,'liang','xian','sen']
print(list_1)
[1, 23, 'liang', 'xian', 'sen']
列表当做一个参数传递进去,一次打印出来,所以显示list得形式。
我不想要list的形式,就想要里面的每一个元素的内容呢?
for n in list_1:
print(n,end=" ")
1 23 liang xian sen
因为print默认会在结尾加 “\n” 换行符,我们想显示在一行,可以将默认参数 end 赋值为 “ ” 空格。
还有一个很简单的形式, 使用 “*” 星号也一样可以遍历列表中的每个元素。
print(*list_1)
1 23 liang xian sen
# 单词之间下划线
user_name = 'liangxiansen'
user_age = 18
print(user_name, user_age)
liangxiansen 18
# 驼峰命名规则
UserName = 'liangxiansen'
UserAge = 18
print(UserName, UserAge)
liangxiansen 18
像上面输出都在一行,没有什么阅读性,我们可以使用格式化输出:
Python的字符串格式化有两种方式: 百分号方式、format方式
百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存。
%[(name)][flags][width].[precision]typecode
(name) 可选,用于选择指定的key
flags 可选,可供选择的值有:
width 可选,占有宽度
.precision 可选,小数点后保留的位数
typecode 必选
name = "liangxiansen"
age = 18
job ="programmer"
msg = """
Infomation of user %r:
-------------------
Name: %s
Age : %d
Job : %s
---------End-------
"""
print(msg % (name, name, age, job))
Infomation of user 'liangxiansen': ------------------- Name: liangxiansen Age : 18 Job : programmer ---------End-------
接下来具体介绍 typecode 都有哪些用法:
"My name is %s." % name
'My name is liangxiansen.'
通过上面的几个例子可以看到 “%” 百分号那个位置都被字符串 % 后面的变量所替代了
事实上,使用百分号的格式就是这样:
你需要被格式化的字符串 % 需要用来格式化的元素,如果是多个,用括号包住。
"My name is %s, I'm %d years old." % (name, age)
"My name is liangxiansen, I'm 18 years old."
%s —— 获取传入对象的str方法的返回值,并将其格式化到指定位置
%d —— 将整数、浮点数转换成 十 进制表示,并将其格式化到指定位置
"percent: %.2f%%" % 99.87557
'percent: 99.88%'
.precision —— 可选,小数点后保留的位数
%f —— 将整数、浮点数转换成浮点数表示,并将其格式化到指定位置(默认保留小数点后6位
"percent: %e%%" % 99.87557
"percent: %E%%" % 99.87557
'percent: 9.987557e+01%'
'percent: 9.987557E+01%'
%e —— 将整数、浮点数转换成科学计数法,并将其格式化到指定位置
%E —— 将整数、浮点数转换成科学计数法,并将其格式化到指定位置
"oct nummber: %o" % 81
"hex number: %x" % 81
'oct nummber: 121'
'hex number: 51'
%o —— 将整数转换成 八 进制表示,并将其格式化到指定位置
%x —— 将整数转换成十六进制表示,并将其格式化到指定位置
接下来看看非必须标记符,怎么辅助必须标记符 typecode 实现不同的工作:
msg1 = """
Infomation of user %(name)s:
-------------------
Name: %(name)s
Age : %(age)d
Job : %(job)s
---------End-------
"""
print(msg1 % {"name": name, "age": age, "job": job})
Infomation of user liangxiansen: ------------------- Name: liangxiansen Age : 18 Job : programmer ---------End-------
当在很大一长串字符串里面需要格式格式化的地方特别多的时候,你写很多%s ,%d ... 等,然后再最后需要格式化的时候,需要在 %( ) 里面写一大堆内容,而且要排序对应好往里面添加的时候是不是感觉特别不友好,很容易出问题,对应不上整个内容就出更期望的不一样了,如果数据类型和字符串中的标识位不一样将会程序出错。
For example:
"This is number : %d" % name
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-18-718e1695c103> in <module>() ----> 1 "This is number : %d" % name TypeError: %d format: a number is required, not str
看报错信息,%d 标识符需要一个 number 来格式化,但是却得到了一个str? 所以它看不懂了,一懵逼就报错。
So, 上面使用百分号格式化添加 (name) 标记, 在未格式化之前也能很清晰的知道哪个位置是什么;
在格式化的时候 % 后面接受一个 dict, key 是(name)标记位的名称, value 就是需要用来格式化的内容。
flags And width :
"This is string : %(name)-20s" % {"name": name}
"This is string : %(name)+20s" % {"name": name}
"This is number : %(num) 20.2f" % {"num": 75.678}
"This is number : %(num)+20.2f" % {"num": 75.678}
"This is number : %(num)20.2f" % {"num": -75.678}
"This is number : %(num)020.2f" % {"num": 75.678}
'This is string : liangxiansen '
'This is string : liangxiansen'
'This is number : 75.68'
'This is number : +75.68'
'This is number : -75.68'
'This is number : 00000000000000075.68'
看上面例子:
width 用来设置宽度,
flags 在不同的情况增加表现形式,
[[fill]align][sign][#][0][width][,][.precision][type]
fill 【可选】空白处填充的字符
align 【可选】对齐方式(需配合width使用)
sign 【可选】有无符号数字
# 【可选】对于二进制、八进制、十六进制,如果加上#,会显示 0b/0o/0x,否则不显示
, 【可选】为数字添加分隔符,如:1,000,000
width 【可选】格式化位所占宽度
.precision 【可选】小数位保留精度
type 【可选】格式化类型
传入” 字符串类型 “的参数
传入“ 整数类型 ”的参数
最简单的使用:
"I'm {}, {} years old, I like {}.".format("Kevin", 18, 'watching movies')
"I'm Kevin, 18 years old, I like watching movies."
这么写是不太规范的,虽然现在运行没有问题,但是可能在低版本的python上可能会报错,所以我这里写出来。
使用format格式化的时候,在需要格式化的字符串里面写上一对花括号 { } , 然后使用 .format() 方法。 将需要用来格式化的对象以参数的形式传给format方法
但是标准的方法是下面的,在每个 { } 里面加上序号。
"I'm {0}, {1} years old, I like {2}.".format("Kevin", 18, 'watching movies')
"I'm Kevin, 18 years old, I like watching movies."
当然还有更优雅的方式,给每个需要格式化的地方加个名字,然后每个名字就是format方法的 key ,格式化的时候使用指定的key传 value
"I'm {name}, {age} years old, I like {hobbies}.".format(name="Kevin", age=18, hobbies="watching movies")
"I'm Kevin, 18 years old, I like watching movies."
还有高级用法,既然format接受key,value 的形式,那我们可以传一个 dict ,或者序列化一个json,都是可以的。
"I'm {name}, {age} years old, I like {hobbies}.".format(**{"name": "Kevin", "age": 18, "hobbies": "watching movies"})
"I'm Kevin, 18 years old, I like watching movies."
你会看到 ****{dict}** 是不是联想到上面 ***[list]** 的用法。是的!
事实上,****{dict}** 也会遍历dict中的内容以 (key=value,...) 的形式返回
list 的使用:
"i am {0}, age {1}, really {2}".format(*[1, 2, 3])
'i am 1, age 2, really 3'
"i am {0[0]}, age {1[1]}, really {0[2]}".format([1, 2, 3], [11, 22, 33])
'i am 1, age 22, really 3'
整数类型格式化:
"numbers: {num:b},{num:c},{num:d},{num:o},{num:x},{num:X}".format(num=15)
'numbers: 1111,\x0f,15,17,f,F'
"numbers: {num:#b},{num:c},{num:#d},{num:#o},{num:#x},{num:#X}".format(num=15)
'numbers: 0b1111,\x0f,15,0o17,0xf,0XF'
b,将10进制整数自动转换成2进制表示然后格式化
c,将10进制整数自动转换为其对应的unicode字符
d,十进制整数
o,将10进制整数自动转换成8进制表示然后格式化;
x,将10进制整数自动转换成16进制表示然后格式化(小写x)
X,将10进制整数自动转换成16进制表示然后格式化(大写X)
#,对于二进制、八进制、十六进制,如果加上#,会显示 0b/0o/0x,否则不显示
"number: {0:,d}".format(1000000000)
'number: 1,000,000,000'
, 为数字添加分隔符
浮点数格式化:
print("float:\ne:{float:e}\nE:{float:E}\nf:{float:.2f}\nF:{float:.2F}\ng:{float:g}\nG:{float:G}".format(float=97.69345))
float: e:9.769345e+01 E:9.769345E+01 f:97.69 F:97.69 g:97.6934 G:97.6934
"{0:.3%}".format(0.971234)
'97.123%'
"{name:*^30}".format(name='liangxiansen')
"{name:*<30}".format(name='liangxiansen')
"{name:*>30}".format(name='liangxiansen')
"{num:=030}".format(num=10)
'*********liangxiansen*********'
'liangxiansen******************'
'******************liangxiansen'
'000000000000000000000000000010'
这里使用了 fill, align, width;
上面实例中:
30,表示设置30宽度,
<,^,>,分别为左对齐,居中对齐,右对齐,
*****,填充空白区域
更多 format 使用方法详见官网
在Linux终端中,使用转义序列来进行彩色文字的显示,转义序列以ESC开头,即ASCII码下的\033,其格式为:
\033[显示方式;前景色;背景色m
显示方式、前景色、背景色至少一个存在即可。
for example:
\033[1;31;40m 1-高亮显示 31-前景色红色 40-背景色黑色
\033[0m 结尾采用终端默认设置,即取消颜色设置
print("\033[1;31;0m Hello World! \033[0m")
print("\033[1;31;1m Hello World! \033[0m")
print("\033[1;31;2m Hello World! \033[0m")
print("\033[1;31;4m Hello World! \033[0m")
print("\033[1;31;5m Hello World! \033[0m")
print("\033[1;31;7m Hello World! \033[0m")
Hello World! Hello World! Hello World! Hello World! Hello World! Hello World!
"\033[0;31;0m", 无颜色
"\033[0;31;1m", 显示 \033[0;31 的颜色 当前为红色
"\033[0;31;2m", 显示 \033[0;31 的稍浅的颜色 当前为浅红色
"\033[0;31;4m", 显示 \033[0;31 的稍浅的颜色加下划线 当前为浅红色下划线
"\033[0;31;5m", 显示 \033[0;31 的稍浅的颜色并闪烁 当前为浅红色闪烁
"\033[0;31;7m", 显示 \033[0;31 的全填充颜色 当前为红色填充
前景色 | 颜色 | 背景色 | 颜色 |
---|---|---|---|
30 | 黑色 | 40 | 黑色 |
31 | 红色 | 41 | 红色 |
32 | 绿色 | 42 | 绿色 |
33 | 黄色 | 43 | 黄色 |
34 | 蓝色 | 44 | 蓝色 |
35 | 紫色 | 45 | 紫色 |
36 | 青色 | 46 | 青色 |
37 | 白色 | 47 | 白色 |
print("\033[1;30;1m Hello World! \033[0m", "\033[1;30;47m Hello World! \033[0m")
print("\033[1;31;1m Hello World! \033[0m", "\033[1;30;41m Hello World! \033[0m")
print("\033[1;32;1m Hello World! \033[0m", "\033[1;30;42m Hello World! \033[0m")
print("\033[1;33;1m Hello World! \033[0m", "\033[1;30;43m Hello World! \033[0m")
print("\033[1;34;1m Hello World! \033[0m", "\033[1;30;44m Hello World! \033[0m")
print("\033[1;35;1m Hello World! \033[0m", "\033[1;30;45m Hello World! \033[0m")
print("\033[1;36;1m Hello World! \033[0m", "\033[1;30;46m Hello World! \033[0m")
print("\033[1;37;1m Hello World! \033[0m", "\033[1;30;40m Hello World! \033[0m")
Hello World! Hello World! Hello World! Hello World! Hello World! Hello World! Hello World! Hello World! Hello World! Hello World! Hello World! Hello World! Hello World! Hello World! Hello World! Hello World!
通过Python 内置函数 input 实现用户的输入操作。
your_name = input("What's your name:")
print("Hello , %s" % your_name)
What's your name:Kevin Hello , Kevin
print(type(input(">>>")))
>>>123 <class 'str'>
print(type(input(">>>")))
>>>abc <class 'str'>
用户输入的不管你是数字还是字符串或者什么,都是字符串的形式保存。
根据用户输入自动生成表格:
user_name = input("input your name:")
user_age = input("input your age:")
user_jobe = input("input your jobe:")
message = """
Infomation of user {name}:
-------------------
Name: {name}
Age : {age}
Job : {job}
---------End-------
"""
print(message.format(name=user_name, age=user_age, job=user_jobe))
input your name:Kevin input your age:18 input your jobe:programmer Infomation of user Kevin: ------------------- Name: Kevin Age : 18 Job : programmer ---------End-------
用户如果输入密码这样隐私得东西,不应该在屏幕上显示输入得内容,可以使用python内建 getpass模块的 getpass 函数来实现
from getpass import getpass
UserName = input("Please input your name:")
Password = getpass("Please input your password:")
print("your name is :%s\npassword is :%s" % (UserName, Password))
Please input your name:liangxiansen Please input your password:········ your name is :liangxiansen password is :123456