Python的"print“函数在”Hello World"之外的延伸
off999 2024-09-14 07:11 28 浏览 0 评论
想必任何一个人学习python的第一件事就是学习怎么去输出字符串“hello world”,就像你期望的那样,这段代码是非常简洁的: 确实,python的“print”函数用起来非常简单直接以至于我们很少对它进行一些思考。我们猜测人们知道如何使用它——而且多数情况下,对于人们想要去做的事,这也是正确的。
但隐藏在“print”功能表面之下还有许多功能,以及一些历史(甚至有点痛苦)。了解如何使用“打印”可以减少你编写的代码,而且通常也会让它对于你来说更加容易使用。
原理
基本原理很简单:“print”是一个函数,这意味着如果要调用它,需要使用括号:
您可以将任何类型的数据传递给“print”。字符串是最常见的,但也可以是int、float、list、tuples、dict、set或任何其他对象。例如:
或者:
当然,这跟你要传递的参数是无关的,不论是对象字面量或是引用一个变量
你也可以将表达式放在括号内;表达式的值将传递给“print”:
在“print”显示其输出之后,它添加了一个新行。例如
您可以传递任意多的参数来“打印”,将参数用逗号分隔,每一个参数都会按照顺序打印出来,参数中间会有一个空格:
下面我们将看到如何更改这两个默认行为。
输入和输出
如果“print”是一个函数,那么他一定会有返回值,我们看:
换句话说:不管你打印的是什么,“print”都不会有返回值。毕竟你不是为了得到返回值而打印的,而是为了它的另一个作用。
那么“print”的实参呢?已经看到我们可以传递任意数量的实参,它们都会被打印出来。但是有一些可选的形参我们也是可以传递的。
改变输出项之间的字符串显示和改变放在输出末尾的代码,这两点是联系非常紧密的,他们可以让我们自定义我们在前面看到的行为。
例如,参数“sep”,默认为“”(空格字符),被放在打印项之间。我们可以将其设置为任何字符串,包括多字符字符串:
请注意,“sep”放在“print”的参数之间,而不是参数的每个元素之间。因此,在第三个示例中,“**”位于列表之间,而不是列表的整数元素之间。
如果你想让打印的参数一次相连,可以把“sep”设为空字符串:
类似的,参数“end”的默认值是“\n”(换行),但是可以包含任意字符串。他决定了在“print”结束之后打印什么。
例如,如果你想在你打印之后额外空几行出来,就改一下“end”的值就会产生新行:
但是,反过来讲如果你不想在输出之后加新行,吧“end”的值设成空字符串就可以了:
注意,在python交互命令行中,使用空字符串打印内容意味着下一个“>>>”提示出现在所打印内容之后。毕竟,您并没有要求在您所写的内容之后有一个新行,而python遵从了您的请求。
当然,你可以传递根本不涉及换行的“end”值。例如,假设您希望将多个字段输出到屏幕,每个字段打印在一行中:
默认情况下,“print”将其数据发送到标准输出,在python中称为“sys.stdout”。当“sys”模块与python一起自动加载时,它的名称不可用,除非你明确了“import sys”。
“print”函数允许您使用“file”参数指定要写入的另一个类似文件的对象(即,遵循适当协议的对象)。对象必须是可写的,除此之外,您可以使用任何对象。例如:
在这种情况下,输出被写入一个文件。但我们也可以写入一个Stringio对象,例如,它的行为类似于一个文件,但不是一个文件。
注意,如果我在上面的示例中没有关闭“f”,输出就不会到达文件中。这是因为默认情况下,python会缓冲所有输出;每当写入文件时,只有当缓冲区填满(并刷新)时,显式调用“flush”方法时,或关闭文件时(从而隐式刷新)才实际写入数据。将“with”结构与文件对象一起使用就会关闭它,从而刷新缓冲区。
但是,还有另一种刷新输出缓冲区的方法:我们可以将一个True值传递给“print”中的“flush”参数。在这种情况下,输出会立即刷新到磁盘,然后写入。这听起来不错,但请记住,缓冲的目的是减少磁盘和计算机I/O系统上的负载。所以需要的时候才能刷新,但不要一直这样做——除非你是按小时付钱的,而且更慢些对你有好处。
下面是一个有或无冲洗的打印示例:
您可能注意到这里有一个小的不一致:“print”写入文件,默认情况下为“sys.stdout”。如果我们不刷新或关闭文件,输出将被缓冲。那么,当我们打印到屏幕上时,为什么不需要冲洗(或者关闭,这不是一个好主意)?
答案是“sys.stdout”是由python专门处理的。正如python文档所说,它是“行缓冲的”,这意味着每次发送换行符(“\n”)时,都会刷新输出。只要你把东西打印到“sys.stdout”就会以新行结尾——为什么不这样做呢?——你不会注意到缓存。
还记得Python2吗?
在我写这篇文章的时候,是2019年1月,距离不再支持或维护python 2之前还有不到12个月的时间。这并没有改变我的许多客户仍在使用python 2的事实(因为重写大型代码库既不可行也不值得)。如果您仍在使用python 2,那么应该尝试转移到python 3。
事实上,让用户从python 2到3的因素之一就是“打印”的不同。
首先,python2中的“print”是一个语句,而不是表达式。这意味着2中的括号是可选的,而3中的括号是强制的——当人们从2移动到3时,首先要学习的内容之一。
这也意味着在python2中“print”不能传递给其他函数。在Python3中是可以的。
python 2的“print”语句没有可以处理的参数(或默认值)。你想打印到文件而不是“sys.stdout”?将其分配给“sys.stdout”以使用“print”——或者只使用文件的“write”方法写入文件。你想让“打印”在打印后降行?在行尾加一个逗号。(是的,这是真的;这很难看,但是管用。)
如果您正在使用python 2,并且想体验一下python 3的打印功能,那该怎么办?您可以将此行添加到代码中:
from __future__ import print_function
一旦您这样做了,python 3的“print”函数就会就位。现在我知道python 3已经不是将来时了;实际上,您可以说python 2已经过时了。但对于许多想转型或学习如何转型的人来说,这是一个很好的方法。但是要当心:如果您有不带括号的“打印”调用,或者是避免行换行的逗号,那么您需要做的不仅仅是这个导入。您需要检查您的代码,并确保它以这种方式工作。所以这看起来是一个明智的方法,是一个大的过渡阶段你需要做的第一步,从2到3。
英文原文:https://blog.lerner.co.il/beyond-the-hello-world-of-pythons-print-function/
译者:游骑兵
相关推荐
- Python函数参数和返回值类型:让你的代码更清晰、更健壮
-
在Python开发中,你是否遇到过这些抓狂时刻?同事写的函数参数类型全靠猜调试两小时发现传了字符串给数值计算函数重构代码时不知道函数返回的是列表还是字典今天教你两招,彻底解决类型混乱问题!让你的...
- 有公司内部竟然禁用了python开发,软件开发何去何从?
-
今天有网友在某社交平台发文:有公司内部竟然禁止了python开发!帖子没几行,评论却炸锅了。有的说“太正常,Python本就不适合做大项目”,还有的反驳“飞书全员用Python”。暂且不说这家公司...
- 写 Python 七年才发现的七件事:真正提高生产力的脚本思路
-
如果你已经用Python写了不少脚本,却总觉得代码只是“能跑”,这篇文章或许会刷新你对这门语言的认知。以下七个思路全部来自一线实战,没有花哨的概念,只有可落地的工具与习惯。它们曾帮我省下大量无意义...
- 用Python写一个A*搜索算法含注释说明
-
大家好!我是幻化意识流。今天我们用Python写一个A*搜索算法的代码,我做了注释说明,欢迎大家一起学习:importheapq#定义搜索节点类,包括当前状态、从初始状态到该状态的代价g、从该状态...
- 使用python制作一个贪吃蛇游戏,并为每一句添加注释方便学习
-
今天来设计一个贪吃蛇的经典小游戏。先介绍下核心代码功能(源代码请往最后面拉):游戏功能:-四个难度等级:简单(8FPS)、中等(12FPS)、困难(18FPS)、专家(25FPS)-美...
- Python 之父 Guido van Rossum 宣布退休
-
Python之父GuidovanRossum在推特公布了自己从Dropbox公司离职的消息,并表示已经退休。他还提到自己在Dropbox担任工程师期间学到了很多东西——Python的类型注解(T...
- 4 个早该掌握的 Python 类型注解技巧
-
在Python的开发过程中,类型注解常常被忽视。但当面对一段缺乏类型提示、逻辑复杂的代码时,理解和维护成本会迅速上升,极易陷入“阅读地狱”。本文整理了4个关于Python类型注解的重要技巧...
- 让你的Python代码更易读:7个提升函数可读性的实用技巧
-
如果你正在阅读这篇文章,很可能你已经用Python编程有一段时间了。今天,让我们聊聊可以提升你编程水平的一件事:编写易读的函数。请想一想:我们花在阅读代码上的时间大约是写代码的10倍。所以,每当你创建...
- Python异常模块和包
-
异常当检测到一个错误时,Python解释器就无法继续执行了,反而出现了一些错误的提示,这就是所谓的“异常”,也就是我们常说的BUG例如:以`r`方式打开一个不存在的文件。f=open('...
- 别再被 return 坑了!一文吃透 Python return 语句常见错误与调试方法
-
Pythonreturn语句常见错误与调试方法(结构化详解)一.语法错误:遗漏return或返回值类型错误错误场景pythondefadd(a,b):print(a+b)...
- Python数据校验不再难:Pydantic库的工程化实践指南
-
在FastAPI框架横扫Python后端开发领域的今天,其默认集成的Pydantic库正成为处理数据验证的黄金标准。这个看似简单的库究竟隐藏着哪些让开发者爱不释手的能力?本文将通过真实项目案例,带您解...
- python防诈骗的脚本带注释信息
-
以下是一个简单但功能完整的防诈骗脚本,包含URL检测、文本分析和风险评估功能。代码结构清晰,带有详细注释,适合作为个人或家庭防诈骗工具使用。这个脚本具有以下功能:文本诈骗风险分析:检测常见诈骗关键...
- Python判断语句
-
布尔类型和比较运算符布尔类型的定义:布尔类型只有两个值:True和False可以通过定义变量存储布尔类型数据:变量名称=布尔类型值(True/False)布尔类型不仅可以自行定义,同时也可通过...
- 使用python编写俄罗斯方块小游戏并为每一句添加注释,方便学习
-
先看下学习指导#俄罗斯方块游戏开发-Python学习指导##项目概述这个俄罗斯方块游戏是一个完整的Python项目,涵盖了以下重要的编程概念:-面向对象编程(OOP)-游戏开发基础-数据...
- Python十大技巧:不掌握这些,你可能一直在做无用功!
-
在编程的世界里,掌握一门语言只是起点,如何写出优雅、高效的代码才是真功夫。Python作为最受欢迎的编程语言之一,拥有简洁明了的语法,但要想真正精通这门语言,还需要掌握一些实用的高级技巧。一、列表推导...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python封装 (57)
- python读取文件夹下所有文件 (59)
- java调用python脚本 (56)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)