Python从入门到放弃——深入研究Print函数

深入浅出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函数的绝大多数内容了!如果文章中存在问题欢迎大家指出。谢谢!

  • 8
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Loading_create

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值