深入浅出Print函数
第一个代码“Hello World”
在正常配置了PyCharm或者Thonny等编辑器之后,我们开始写第一个代码。正常的情况下学习一门编程语言,一般第一个代码都是输出Hello World。那么如何打印Hello World呢?
print("Hello World")
然后我们运行程序就可以看到交互窗中弹出了一行字:
Hello World
当然也可能有几种其他的情况,也就是代码写错了。下面我们来一一举例说明原因。
1.下面的报错,很有可能就是你的双引号不完整,你只有前双引,没有后双引导致的。
Traceback (most recent call last):
File "<string>", line 1
print("Hello world)
^
SyntaxError: EOL while scanning string literal
2.下面的报错很有可能是print的拼写出现了错误导致的。
Traceback (most recent call last):
File "<string>", line 1, in <module>
NameError: name 'prit' is not defined
3.下面的报错很有可能是因为括号或者双引号使用了中文输入法(全角符)导致的。
Traceback (most recent call last):
File "<string>", line 1
print("Hello world")
^
SyntaxError: invalid character in identifier
输出函数print()
现在我们学习一下输出函数print()。首先在学习一个函数前,我们要养成一个好的习惯,既然学了这个知识点,那我们就要把它绝大多数的知识点都了解一下,争取可以全都掌握。
def print(self, *args, sep=' ', end='\n', file=None, flush=False)
首先我们先忽略掉开头的def,这个我们暂时可以理解为定义print这个函数的功能的一个标志。然后print后面括号中的self,我们也优先忽略掉。
*args
:这是一个接受参数的标志,他可以接收无数个参数。而我们也就自然而然可以联想到刚刚的"Hello World"
就是一个参数。各个值之间分割方式,默认空格,可以自定义,例如
print("Hello", 1, 2, "World")
运行结果如下:
Hello 1 2 World
sep
:这是一个表示相邻两个传入的参数之间,在输出的时候用什么隔开。我们不难看到,print在设计的时候默认了sep是一个空格,所以我们不妨去尝试一下后面的代码。
print("hello", "world", "!")
print("hello", "world", "!", sep="")
运行效果如下所示。
hello world !
helloworld!
运行之后我们看到的效果中,第一行的文本是hello world !,而第二行的文本是helloworld!。那么这样是不是就方便理解了。
end
:这个参数是表示在print将所有参数都输出完毕之后,要自行输出的文本。在print设计的时候,默认end的参数是\n。\n
又叫做转义字符串。它代表着换行的意思。那么我们如何去验证呢?可以尝试去编写一下下面的代码。
print("hello")
print("world")
print("hello", end="")
print("world")
运行效果如下:
hello
world
helloworld
那么在运行上面的代码的时候,我们可以看到第一组hello world是两行输出的,但是第二组则是在一行输出。这个就是我们的end参数的效果。
file
:这个参数的意思是设置输出设备,以及要把print中的值打印到什么地方,默认输出到终端Terminal,同时也可以设置file= 文件储存对象,把内容存到该文件中,但是要先记得在代码中open文件哦!刚开始的宝子们可以先不学习这个参数。
MyFile = open(r'1.txt', 'w') # 打开文件
print('Hello World', file=MyFile) # 输出到文件中
MyFile.close() # 关闭文件
运行前我们要确保已经存在了1.txt
文件。然后在运行代码之后我们可以在文件中看到Hello World已经存储到txt中了。如下图所示。
flush
:这个参数的意义主要是刷新终端,参数的默认值是False,也就是不刷新,当参数数值设定为True时,就可以开始刷新了。新手目前可以暂时不去care这个细节。
正常情况下print到MyFile中的内容会优先存储到内存中,当文件对象关闭时才把内容打印到1.txt
中,当flush=True
时它会立即把内容刷新存到1.txt
中。
Print中的拼接
在print函数中其实还有很多其他的玩法,例如我们可以用逗号隔开我们的文字,其实也可以尝试使用加号。代码如下:
print("hello" + "world" + "三木地")
代码运行后可以看到效果如下:
helloworld三木地
不难看出使用+进行连接的时候,每一段字之间时不会自动产生空格的,所以我们需要手动写出空格。这样才可以实现之前的效果。
但是一定要注意,千万不要直接用加号连接一个数字,因为在Python中数字就是另外一种类型,Python不支持直接用数字和字符进行连接,会产生报错。报错大概效果如下所示。
Traceback (most recent call last):
File "/Users/loadingcreate/Desktop/LearnPython/L1.py", line 22, in <module>
print("hello" + "world" + 1)
~~~~~~~~~~~~~~~~~~^~~
TypeError: can only concatenate str (not "int") to str
Print中的数学计算
在print函数中其实还可以实现数学计算。我们可以直接看代码。
print(1+1)
print(1-10)
print(1*10)
print(3/2)
运行结果如下所示
2
-9
10
1.5
深入研究
在Python中,print 函数是用于输出文本或变量值到控制台的标准库函数。虽然它本身并不是Python语言的核心构造(比如if, for, while等控制结构),但它是Python标准库中的一个重要部分,且对于日常编程和调试非常有用。
当我们深入print函数的内部机制时,会发现其背后并没有像某些编程语言中那样的复杂构造原理,因为Python的设计哲学之一就是简单明了。但是,我们可以从几个方面来理解print函数是如何工作的:
- 输出流(Output Stream):
在Python中,print函数默认将数据发送到标准输出流(通常是终端或控制台)。这个流是一个文件对象,可以被重定向到文件或其他设备。
你可以通过修改sys.stdout来更改print的输出目的地。 - 字符串格式化:
print函数可以接受多个参数,并将它们以空格分隔的方式连接起来。这些参数可以是字符串、数字或其他可转换为字符串的对象。
Python 3.x中引入了f-string(格式化字符串字面量),使得字符串格式化更加简洁和强大。 - 换行符:
默认情况下,print函数在输出后会添加一个换行符(\n),使得下一次输出从新的一行开始。
你可以通过end参数来自定义结束符,比如print(“Hello”, end=“”)将不会在新的一行开始输出。 - 分隔符:
当你使用多个参数调用print函数时,它们之间默认用空格分隔。
你可以通过sep参数来自定义分隔符。 - 文件对象:
虽然print函数通常用于控制台输出,但它也可以接受一个文件对象作为file参数,将数据写入该文件而不是控制台。 - flush参数:
在某些情况下,你可能希望立即将输出发送到其目标(例如,在编写一个需要实时更新的GUI应用程序时)。flush参数控制输出是否立即被刷新到目标。 - 内部实现:
虽然Python的C实现细节对于普通用户来说是透明的,但print函数的内部实现大致上涉及到将参数转换为字符串(如果需要),然后写入到指定的输出流(默认为sys.stdout)。 - 可定制性:
由于print函数是基于Python语言的,因此它是可定制的。你可以通过覆盖内置的print函数(虽然通常不推荐这样做)或编写自己的包装函数来改变其行为。 - 错误处理:
虽然print函数本身不直接处理错误(比如I/O错误),但它依赖于底层的文件对象(如sys.stdout)来处理这些错误。如果输出流在写入时遇到问题,可能会引发异常。 - 国际化(i18n)和本地化(l10n):
print函数与Python的国际化和本地化功能相兼容,允许你根据用户的语言和文化习惯来格式化输出。
虽然这些点涵盖了print函数的许多方面,但真正的“深层”知识可能涉及到Python解释器的内部实现和C语言的底层细节,这些对于大多数Python程序员来说是不必要的。理解上述概念应该足以让你在日常编程中有效地使用print函数。
异常情况
在Python中,print 函数通常不会直接引发异常,因为它主要用于输出信息到标准输出(通常是屏幕)。然而,在特定的情况下,如果print函数中使用的数据或格式化字符串有误,可能会间接导致异常,比如类型错误(TypeError)或值错误(ValueError)。
尽管print本身不常需要异常处理,但了解如何处理其可能引发的异常仍然是一个很好的练习。下面我们看看如何在尝试打印一个可能引发异常的对象时处理异常:
def safe_print(obj):
try:
# 尝试打印对象
print(obj)
except TypeError as e:
# 如果打印过程中发生了TypeError,捕获它并处理
print(f"在尝试打印时发生TypeError: {e}")
except ValueError as e:
# 如果打印过程中发生了ValueError,捕获它并处理
# 注意:标准的print函数很少会因为ValueError而失败,但自定义对象可能在__str__或__repr__中抛出
print(f"在尝试打印时发生ValueError: {e}")
except Exception as e:
# 捕获所有其他类型的异常
print(f"在尝试打印时发生未知异常: {e}")
# 测试
safe_print("Hello, world!") # 正常打印
safe_print(123) # 正常打印
# 尝试打印一个可能会引发TypeError的对象(例如,一个无法转换为字符串的对象)
class BadObject:
def __str__(self):
# 故意引发TypeError
raise TypeError("BadObject can't be converted to string")
safe_print(BadObject()) # 捕获并处理TypeError
# 尝试打印一个可能会引发ValueError的对象(较少见,但可能通过自定义__str__或__repr__方法发生)
class AnotherBadObject:
def __str__(self):
# 故意引发ValueError
raise ValueError("AnotherBadObject encountered a value error")
safe_print(AnotherBadObject()) # 捕获并处理ValueError
在这个例子中,我们定义了一个safe_print函数,它尝试打印传入的对象。我们使用了try…except块来捕获并处理可能发生的TypeError、ValueError和所有其他类型的异常。虽然print函数本身在标准使用中很少引发异常,但这种方法展示了如何在调用可能引发异常的函数时处理异常。
结尾语
以上便是Python知识中Print函数的绝大多数内容了!如果文章中存在问题欢迎大家指出。谢谢!