Python的"print“函数在”Hello World"之外的延伸
off999 2024-09-14 07:11 39 浏览 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/
译者:游骑兵
相关推荐
- 阿里云国际站ECS:阿里云ECS如何提高网站的访问速度?
-
TG:@yunlaoda360引言:速度即体验,速度即业务在当今数字化的世界中,网站的访问速度已成为决定用户体验、用户留存乃至业务转化率的关键因素。页面加载每延迟一秒,都可能导致用户流失和收入损失。对...
- 高流量大并发Linux TCP性能调优_linux 高并发网络编程
-
其实主要是手里面的跑openvpn服务器。因为并没有明文禁p2p(哎……想想那么多流量好像不跑点p2p也跑不完),所以造成有的时候如果有比较多人跑BT的话,会造成VPN速度急剧下降。本文所面对的情况为...
- 性能测试100集(12)性能指标资源使用率
-
在性能测试中,资源使用率是评估系统硬件效率的关键指标,主要包括以下四类:#性能测试##性能压测策略##软件测试#1.CPU使用率定义:CPU处理任务的时间占比,计算公式为1-空闲时间/总...
- Linux 服务器常见的性能调优_linux高性能服务端编程
-
一、Linux服务器性能调优第一步——先搞懂“看什么”很多人刚接触Linux性能调优时,总想着直接改配置,其实第一步该是“看清楚问题”。就像医生看病要先听诊,调优前得先知道服务器“哪里...
- Nginx性能优化实战:手把手教你提升10倍性能!
-
关注△mikechen△,十余年BAT架构经验倾囊相授!Nginx是大型架构而核心,下面我重点详解Nginx性能@mikechen文章来源:mikechen.cc1.worker_processe...
- 高并发场景下,Spring Cloud Gateway如何抗住百万QPS?
-
关注△mikechen△,十余年BAT架构经验倾囊相授!大家好,我是mikechen。高并发场景下网关作为流量的入口非常重要,下面我重点详解SpringCloudGateway如何抗住百万性能@m...
- Kubernetes 高并发处理实战(可落地案例 + 源码)
-
目标场景:对外提供HTTPAPI的微服务在短时间内收到大量请求(例如每秒数千至数万RPS),要求系统可弹性扩容、限流降级、缓存减压、稳定运行并能自动恢复。总体思路(多层防护):边缘层:云LB...
- 高并发场景下,Nginx如何扛住千万级请求?
-
Nginx是大型架构的必备中间件,下面我重点详解Nginx如何实现高并发@mikechen文章来源:mikechen.cc事件驱动模型Nginx采用事件驱动模型,这是Nginx高并发性能的基石。传统...
- Spring Boot+Vue全栈开发实战,中文版高清PDF资源
-
SpringBoot+Vue全栈开发实战,中文高清PDF资源,需要的可以私我:)SpringBoot致力于简化开发配置并为企业级开发提供一系列非业务性功能,而Vue则采用数据驱动视图的方式将程序...
- Docker-基础操作_docker基础实战教程二
-
一、镜像1、从仓库获取镜像搜索镜像:dockersearchimage_name搜索结果过滤:是否官方:dockersearch--filter="is-offical=true...
- 你有空吗?跟我一起搭个服务器好不好?
-
来人人都是产品经理【起点学院】,BAT实战派产品总监手把手系统带你学产品、学运营。昨天闲的没事的时候,随手翻了翻写过的文章,发现一个很严重的问题。就是大多数时间我都在滔滔不绝的讲理论,却很少有涉及动手...
- 部署你自己的 SaaS_saas如何部署
-
部署你自己的VPNOpenVPN——功能齐全的开源VPN解决方案。(DigitalOcean教程)dockovpn.io—无状态OpenVPNdockerized服务器,不需要持久存储。...
- Docker Compose_dockercompose安装
-
DockerCompose概述DockerCompose是一个用来定义和管理多容器应用的工具,通过一个docker-compose.yml文件,用YAML格式描述服务、网络、卷等内容,...
- 京东T7架构师推出的电子版SpringBoot,从构建小系统到架构大系统
-
前言:Java的各种开发框架发展了很多年,影响了一代又一代的程序员,现在无论是程序员,还是架构师,使用这些开发框架都面临着两方面的挑战。一方面是要快速开发出系统,这就要求使用的开发框架尽量简单,无论...
- Kubernetes (k8s) 入门学习指南_k8s kubeproxy
-
Kubernetes(k8s)入门学习指南一、什么是Kubernetes?为什么需要它?Kubernetes(k8s)是一个开源的容器编排系统,用于自动化部署、扩展和管理容器化应用程序。它...
欢迎 你 发表评论:
- 一周热门
-
-
抖音上好看的小姐姐,Python给你都下载了
-
全网最简单易懂!495页Python漫画教程,高清PDF版免费下载
-
Python 3.14 的 UUIDv6/v7/v8 上新,别再用 uuid4 () 啦!
-
python入门到脱坑 输入与输出—str()函数
-
宝塔面板如何添加免费waf防火墙?(宝塔面板开启https)
-
Python三目运算基础与进阶_python三目运算符判断三个变量
-
(新版)Python 分布式爬虫与 JS 逆向进阶实战吾爱分享
-
慕ke 前端工程师2024「完整」
-
失业程序员复习python笔记——条件与循环
-
飞牛NAS部署TVGate Docker项目,实现内网一键转发、代理、jx
-
- 最近发表
- 标签列表
-
- 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写入txt (66)
- python读取文件夹下所有文件 (59)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)
