Python基础必掌握的print()应用详解

学Python数据科学,玩游戏、学日语、搞编程一条龙。

整套学习自学教程中应用的数据都是《三國志》、《真·三國無雙》系列游戏中的内容。

print() 功能在日常的编程中经常会使用到,但是很少有人会重视。但是它存在的意义在于可以提示日常经常看见的问题,比如常见 print() 错误,处理换行符、字符编码,将文本写入文件,模拟单元测试,在终端中构建高级用户界面。
在这里插入图片描述

print 打印

简单 print() 示例。

print()

print('\n')

print('')

字符串文字 print() 直接传递。

print('データが読み込まれています...')

将该消息使用变量进行 print() 直接传递。

message = 'データが読み込まれています...'
print(message)

数字拼接字符串依旧需要强制转换。

'私は' + str(37) + '歳です。'
'私は 37 歳です。'

不同的内置类型的文字。

print(37)                            # <class 'int'>
37
print(3.14)                          # <class 'float'>
3.14
print(1 + 2j)                        # <class 'complex'>
(1+2j)
print(True)                          # <class 'bool'>
True
print([1, 2, 3])                     # <class 'list'>
[1, 2, 3]
print((1, 2, 3))                     # <class 'tuple'>
(1, 2, 3)
print({
    
    'red', 'green', 'blue'})      # <class 'set'>
{
    
    'red', 'green', 'blue'}
print({
    
    '名前': '諸葛亮', '年齢': 54}) # <class 'dict'>
{
    
    '名前': '諸葛亮', '年齢': 54}
print('hello')                       # <class 'str'>
hello
print(None)
None

sep,分隔符操作。

print('真', '三國無雙', sep=None)
真三國無雙
print('真', '三國無雙', sep='·')
真·三國無雙
print('真', '三國無雙', sep=',') # 逗号分隔值(CSV) 格式,三國無雙
print('真', '三國無雙')
真 三國無雙
print('真', '三國無雙', sep='')
真三國無雙
print('真', '三國無雙', sep='\n')
真
三國無雙

# os路径
print('home', 'user', 'documents', sep='/')
home/user/documents
print('/home', 'user', 'documents', sep='/')
/home/user/documents
print('', 'home', 'user', 'documents', sep='/')
/home/user/documents

# 任意长度的字符串用于连接元素
print('曹操', '孫権', '劉備', sep=' -> ')
曹操 -> 孫権 -> 劉備

end,禁用换行符。

print('真·三國無雙...', end='')
print('ok')
真·三國無雙...ok

# 输出到同一行
print('真·三國無雙', end='. ')
print('真·三國無雙', end='. ')
print('真·三國無雙.')
真·三國無雙. 真·三國無雙. 真·三國無雙.

sep 、end,混用打印。

print('王異', '夏侯惇', '夏侯淵', sep=', ', end=', ')
print('郭嘉', '楽進', '許褚', sep=', ', end=', ')
print('徐晃', '曹休', '曹仁', sep=', ')
王異, 夏侯惇, 夏侯淵, 郭嘉, 楽進, 許褚, 徐晃, 曹休, 曹仁

额外填充的换行符。

print('君主:曹操', end='\n * ')
print('五子良将:張遼、樂進、于禁、張郃、徐晃', end='\n * ')
print('五谋臣:荀彧、贾诩、荀攸、程昱、郭嘉', end='\n')

君主:曹操
 * 五子良将:張遼、樂進、于禁、張郃、徐晃
 * 五谋臣:荀彧、贾诩、荀攸、程昱、郭嘉

通过 print() 直接操作文档进行写入操作。

with open('file.txt', mode='w') as f:
    print('真·三國無雙', file=f)

print 缓存操作

缓存方式分3种。

  • 无缓冲 没有缓冲发生,所有的写入都立即生效。
  • 行缓冲 在触发任何 I/O 调用之前会等待,直到在缓冲区中的某处出现换行符。
  • 块缓冲 只允许缓冲区填充到特定大小而不管其内容如何。

line-buffered 行缓冲block-buffered 块缓冲 输出标准取决于哪个事件先出现。

import time

num_seconds = 3
for countdown in reversed(range(num_seconds + 1)):
    if countdown > 0:
        print(countdown, end='...', flush=True)
        time.sleep(1)
    else:
        print('Go!')

print 风格

python 的打印可以提供多种的风格支持,比如添加颜色,添加装饰,使用动画,甚至播放声音。
在这里插入图片描述

这里需要一个库就是 pprint

from pprint import pprint as pp

嵌套数据结构输出,漂亮的打印是关于使一段数据或代码看起来更吸引人眼,以便更容易理解。这是通过缩进某些行、插入换行符、重新排序元素等来完成的。

data = {
    
    'powers': [x**10 for x in range(10)]}
pp(data)
{
    
    'powers': [0,
            1,
            1024,
            59049,
            1048576,
            9765625,
            60466176,
            282475249,
            1073741824,
            3486784401]}

# 无限嵌套结构 ...
cities = {
    
    '魏': {
    
    '官職': {
    
    '君主': ['曹操']}}}
pp(cities, depth=3)
{
    
    '魏': {
    
    '官職': {
    
    '君主': [...]}}}

json 格式化输出。

import json
data = {
    
    'Name': '真·三國無雙', 'Version': '8'}
data_json = json.dumps(data)
data_json_pp = json.dumps(data_json, indent=4, sort_keys=True)
print(data_json)
{
    
    "Name": "\u771f\u00b7\u4e09\u570b\u7121\u96d9", "Version": "8"}
print(data_json_pp)
"{\"Name\": \"\\u771f\\u00b7\\u4e09\\u570b\\u7121\\u96d9\", \"Version\": \"8\"}"

ANSI 转义序列添加颜色,ANSI 转义序列就像终端的标记语言。在 HTML 中,您使用标签(例如 <b><i>)来更改元素在文档中的外观。

def esc(code):
    return f'\033[{
      
      code}m'
print(esc('31;1;4') + 'really' + esc(0) + ' important')

在这里插入图片描述

使用动画,终端中为文本设置动画,必须能够自由移动光标。可以使用 ANSI 转义码或 curses 库(仅Linux支持)。

显示轮子表示程序正在执行。

from itertools import cycle
from time import sleep

for frame in cycle(r'-\|/-\|/'):
    print('\r', frame, sep='', end='', flush=True)
    sleep(0.2)

在这里插入图片描述

百分比动画进度条。

from time import sleep

def progress(percent=0, width=30):
    left = width * percent // 100
    right = width - left
    print('\r[', '#' * left, ' ' * right, ']',
          f' {
      
      percent:.0f}%',
          sep='', end='', flush=True)

for i in range(101):
    progress(i)
    sleep(0.1)

在这里插入图片描述
播放声音,使用 \a 实现,至于这个声音是什么需要OS而定。一般都是OS的某一个提示音。

输出window的警告音。

print('\a')

print('\a:pynote.net')
:pynote.net

print 单元格测试

软件测试在动态类型语言中尤其重要,例如 Python 没有编译器来警告明显的错误,因此经常会使用 print 输出来检查。
在这里插入图片描述

例如数据分析中使用 sklearn 进行模型应用计算时候发生错误的错误第一个反应就是要打印一下看看数据是不是模型需要的样子。

def average(numbers):
    print('debug1:', numbers)
    if len(numbers) > 0:
        print('debug2:', sum(numbers))
        return sum(numbers) / len(numbers)

0.1 == average(3*[0.1])

在这里插入图片描述
日志记录,可以将日志视为文本文件。每行都传达有关系统中事件的详细信息。法律规定不会包含个人识别信息。

一般日志保存为这样。

[2021-06-14 11:18:34,517][DEBUG][root][MainThread] Customer(id=123) logged out

python 使用 logging 模块进行日志操作更加简单。未来会有专门一篇文章进行介绍。

import logging
logging.basicConfig(level=logging.DEBUG)

调试,一般会使用 pycharm 进行断点测试。这里介绍的 pdb 方法比较繁琐,知道了解就好。

python -m pdb my_script.py

import pdb
pdb.set_trace()
--Return--
> <stdin>(1)<module>()->None
(Pdb)

Python 3.7+ 使用 breakpoint() 实现同样的功能。

def average(numbers):
    if len(numbers) > 0:
        breakpoint()  
        return sum(numbers) / len(numbers)

猜你喜欢

转载自blog.csdn.net/qq_20288327/article/details/124510186