当我print时,Python做了什么

趣味python之print做会动的皮卡丘 试试用print来画出皮卡丘并且让他动起来也作为小白学习python的一个入门小项目吧 先看看结果图: 首先,我们要有一个皮卡丘~ print(' へ     /|') print('  /\7    ∠_/') print('  / │   / /') print(' │ Z _,< /   /`ヽ') print(' │     ヽ   /  〉') print('  Y     ` ... 阅读详情

前言

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理。

PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取

python免费学习资料以及群交流解答点击即可加入


 

写了这么久的程序,不知道大家有没有思考过,Python到底在干嘛呢?

或者换句话说,当我们执行Python代码的时候,是怎么实现的呢?

众所周知,Python是一门解释型的语言

——所谓“解释型”,当然是区别于以C语言为代表的编译型语言。编译型语言需要将整个程序文件全部转换为可以直接由机器执行的二进制文件;而解释型语言则是由相应的解释器一行一行“解释”并执行代码描述的行为。

正是因此,对于新接触的人来说,Python这样的解释性语言很多时候需要执行到相应的语句,才会发现一些显然的错误。

话说回来,Python的解释器是怎么样来“解释”Python代码的呢?

实际上,类似于Java的执行机制,Python也拥有自己的虚拟机。而这个虚拟机实际上执行的也是一种“字节码”。

在Python程序的执行中依然存在一个“编译”的过程:将Python代码编译为字节码。

并且,Python也提供了一个名为dis模块,用于查看、分析Python的字节码。

1. dis模块

举例来说,dis模块中有一个同名函数dis,可以用于将当前命名空间中的对象反汇编为字节码。


import dis

def add(add_1, add_2):
    sum_value = add_1 + add_2

dis.dis(add)

执行结果为:


  4           0 LOAD_FAST                0 (add_1)
              2 LOAD_FAST                1 (add_2)
              4 BINARY_ADD
              6 STORE_FAST               2 (sum_value)
              8 LOAD_CONST               0 (None)
             10 RETURN_VALUE

其中,开头的数字“4”表示字节码的内容对应于脚本中第4行的内容。

随后的一列数字则表示对应指令所在的地址。纵向观察可以发现一个规律:下一条指令的地址总比上一条指令的地址大2。这是巧合吗?

显然不是的。官方文档《dis --- Python 字节码反汇编器》中记录的更改显示,从Python 3.6版本开始,”每条指令使用2个字节“。所以每条指令的地址会在上一条指令地址的基础上加2。

再往后,是一列表示指令含义的单词组合,实际上就是人类可读的对应指令名称。顾名思义,LOAD_FAST就是加载某个内容/对象到某处,”FAST“很可能意味着这是一个便捷快速的命令实现。

最右边,则是对应于当前命令的操作数,即操作对象。数字同样是一个类似于地址的表示,括号中的字符串则表示相应对象在Python代码中的具体名称。

这样我们就可以大概地阅读生成的字节码了:

首先Python将函数add的第一个参数add_1加载到某处,紧跟着将第二个参数add_2加载到第一个参数之后。然后调用了一个名为BINARY_ADD的指令,即对之前加载的两个参数做加法。再然后则是将加法所得的和sum_value存储在了另一个位置。最后,加载了一个常量None并返回。

其实读完上面这个执行过程,我们很容易想到一种常用的数据结构——栈。

像下面这样:

 

 

当然这并不是本文的重点——真要探讨Python的实现机制,还得另外写几篇长文才能说得一二。

使用dis.dis函数除了可以查看当前脚本中各个对象对应的字节码,还可以直接传入一段代码对应的字符串进行反汇编:


# test_dis.py
import dis


s = """
def add(add_1, add_2):
    sum_value = add_1 + add_2

print("Hello World!")

import sys
"""

dis.dis(s)

汇编结果:

  2           0 LOAD_CONST               0 (<code object add at 0x0000019FF66DFDB0, file "<dis>", line 2>)
              2 LOAD_CONST               1 ('add')
              4 MAKE_FUNCTION            0
              6 STORE_NAME               0 (add)

  5           8 LOAD_NAME                1 (print)
             10 LOAD_CONST               2 ('Hello World!')
             12 CALL_FUNCTION            1
             14 POP_TOP

  7          16 LOAD_CONST               3 (0)
             18 LOAD_CONST               4 (None)
             20 IMPORT_NAME              2 (sys)
             22 STORE_NAME               2 (sys)
             24 LOAD_CONST               4 (None)
             26 RETURN_VALUE

2. compile函数

除了在程序中直接给出要反汇编的程序形成的字符串,我们还可以通过使用内置函数compile来形成相应脚本的编译对象,再使用dis.dis查看其字节码内容。


# test_compile.py
import dis

with open("test_dis.py", "r", encoding="utf-8") as f:
    s = f.read()

compile_obj = compile(s, "test_dis.py","exec")

dis.dis(compile_obj)

字节码输出结果:

 1           0 LOAD_CONST               0 (0)
              2 LOAD_CONST               1 (None)
              4 IMPORT_NAME              0 (dis)
              6 STORE_NAME               0 (dis)

 11           8 LOAD_CONST               2 ('\ndef add(add_1, add_2):\n    sum_value = add_1 + add_2\n\nprint("Hello World!")\n\nimport sys\n')
             10 STORE_NAME               1 (s)

 13          12 LOAD_NAME                0 (dis)
             14 LOAD_METHOD              0 (dis)
             16 LOAD_NAME                1 (s)
             18 CALL_METHOD              1
             20 POP_TOP
             22 LOAD_CONST               1 (None)
             24 RETURN_VALUE

总结

dis模块为我们提供了一个观察Python内部机制的手段,恰当地使用dis模块,并结合其他方法,可以快速有效弄懂一些Python令人迷惑的地方。

希望大家善于利用这样一些有用的工具。

高通平台Camera sensor bring up! Qualcomm Camera sensor bring up!0. 准确1. Kernel 底层驱动配置1.1 dtsi1.2 pinctrl2. Chi-Cdk XML 配置2.1 sensormodule2.2 sensor3. CHECK 本文主要针对高通平台SM7250进行描述,当然高通平台可能基本都差不多【第一个项目】 —only for sensor probe sucess. 0.... 阅读详情

相关推荐

EPICS电机支持(asynMotor)

EPICS电机支持(asynMotor)

yuyuyuliang00的博客 916

python里面print空是干嘛用的-python中print用法

print用法参考文档:https://blog.youkuaiyun.com/sinat_28576553/article/details/81154912目录一、print()函数概述二、变量的输出三、数据的格式化输出3.1 %字符3.2 最小字段宽度和精度3.3 转换标志3.4 格式字符归纳四、换行与防止换行一、print()函数概述print() 方法用于打印输出,是python中最常见的一个函数。该...

weixin_37988176的博客 1711

安卓逆向实战:用Batch Apktool 3.8.0快速汉化APK的完整流程

本文详细解析了如何使用Batch Apktool 3.8.0进行安卓APK汉化的完整流程,包括环境配置、反编译、资源解析、深度汉化、重构建与签名优化等关键步骤。通过这款集成化逆向工具,开发者可以高效完成APK汉化,提升工作效率。

s1t2u3的博客 1102

print在python有啥用_当我print时,Python做了什么

前言本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理。写了这么久的程序,不知道大家有没有思考过,Python到底在干嘛呢?或者换句话说,当我们执行Python代码的时候,是怎么实现的呢?众所周知,Python是一门解释型的语言——所谓“解释型”,当然是区别于以C语言为代表的编译型语言。编译型语言需要将整个程序文件全部转换为可以直接由机器执行的二进制...

weixin_39986466的博客 88

CMU动作捕捉数据集实战:从AMC文件到Python可视化的完整流程

本文提供了CMU动作捕捉数据集的完整实战指南,详细解析了AMC文件格式,并对比了MATLAB转换、Python原生解析及转换为BVH格式三种数据解析策略。重点介绍了如何构建Python数据处理与可视化管道,包括将数据转换为Pandas DataFrame、绘制时间序列与相关性热力图,以及实现3D骨架动画,帮助开发者高效利用这一经典动作捕获数据集进行运动分析与模型训练。

android的专栏 716

计算数列位置N的值

本文介绍了一个数列生成问题,要求根据输入的两个整数M和N生成特定规则的数列,并输出第N个位置上的数值。数列生成规则为:前M个元素为1到M;后续元素根据前M个元素是否重复来决定计算方式(求和或求差)。文章提供了C++、Java和Python三种语言的实现方案,均包含输入处理、数列初始化、循环计算和结果输出等步骤。各语言实现中均使用集合去重特性判断重复元素,并通过内置函数或自定义方法求取最大值和最小值。该问题主要考察基础编程能力,包括数组/列表操作、最值计算和重复元素判断等基本编程技巧。

面试高手的博客 661

在做Python3 约瑟夫生者死者小游戏时遇到的print(,end=“”)和循环删除列表遇到的问题

系统:Ubuntu 第一个就是在命令行输入命令:python test.py,在执行print(列表元素, end="\t")时报错,说end后面=""这些符号是非法的,然后以为是中英文输入法切换的问题,结果还是报错,看了代码格式和单词也没问题啊,怎么还报错,后来想到网上和教程上说Python2和Python3有很大的区别,然后Ubuntu又是自带了Python2和Python3,就猜测估计命令行输入错了,就尝试了把python test.py改为python3 test.py,结果运行成功,然后个人理解

weixin_43168278的博客 327

【ROS2实体机械臂驱动】rokae xCoreSDK Python测试使用

本文记录了使用xCoreSDK-Python驱动Rokae实体机械臂的测试流程。

机器人梦想家 Bing Lee 1502

python3 里面的print可以作为变量名,但是没有意义

学python3的时候发现了一个好玩的事情,print是可以作为变量名去使用的 具体分析如下: 1.print 是一个函数名 在 Python3.x 是一个函数,但在 Python2.x 版本不是一个函数,只是一个关键字,我们现在用的是python3,应该是可以作为变量名使用的 2.变量和打印不可兼得 但是这样相当于把原来print指向的函数名,替换成一个变量,那样的话你使用的print 就不是函数,而是你设定的变量值,这样的话print本身的打印功能就会失效,也就是说你把print作为变量名,你就不能直接

mantoli的博客 2981

智驾车载以太网(18)-switch之报文转发和vlan处理流程

本文详细解析了交换机中报文处理和转发流程:1)通过目标MAC查找转发端口,源MAC创建ARL条目;2)VLAN标签处理包括tagged/untagged帧判断、默认VID标记等5种处理方式;3)完整转发流程包含CRC校验、IQ封装、VLAN和ARL表查询、端口向量计算及优先级队列发送。文中还涉及TCAM修改VLAN、802.1q多种模式处理等细节,省略了流量控制等次要流程。该过程实现了基于MAC和VLAN的高效二层交换。

mitugaoyang1993的博客 44

ROS与Qt5人机交互界面开发:添加rviz显示界面

最后,点击"完成"以创建新的Qt5应用程序项目。通过结合ROS和Qt5,您可以创建强大的人机交互界面,以实现丰富的机器人控制和数据可视化。在本教程中,我们将在主窗口中创建一个简单的按钮,用于启动rviz显示界面。在Qt Creator的槽函数编辑器中,为按钮添加一个槽函数,该函数将在单击按钮时调用。在上面的代码中,我们使用QProcess类启动了一个新的进程,并执行"rviz"命令来启动rviz显示界面。当您单击Qt5应用程序中的按钮时,将会启动一个新的rviz窗口,显示机器人数据的可视化界面。

CodeJolt的博客 2067

pycharm中编写python3,在print语句中使用end=““为什么会报红但不报错?

1. 为什么报红:在 pycharm 中的 print 语句里使用 end="xxx" 时,可能会出现红字报错,这是因为 pycharm 默认使用 PEP8 代码风格指南,然后该指南建议在 print 语句中不要使用 end="xxx" ,所以报红。2. 为什么不报错:因为 end="xxx" 在 python3 中是合法,所以能运行,并不会报错。

m0_57184270的博客 1156

VHDL六层电梯控制器及仿真

六层电梯电梯 设计要求:设计一个六层电梯控制系统要求有超载、关门中断、提前关门清除报警信电梯外人的上升请求信号,电梯外人的下降请求信号, 电梯外人上升请求信号显示电梯外人下降请求信号显示到达楼层信号 设计思路:输入有clk时钟信号(频率为2Hz) full,deng,quick,clr超载、关门中断、提前关门清除报警c_u1,c_u2,c_u3,c_u4,c_u5电梯外人的上升请求c_d2,c_d3,c_d4,c_d5,c_d6 电梯外人的下降请求 d1,d2,d3,d4,d5,d6电梯内人的...

QQ_778132974的博客 1712

Python当中print用法汇总

print函数用法讲解(全)

MCine4186的博客 8669

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

python中print的用法_Python中print函数简单使用总结

Python中print函数简单使用总结print函数是Python的入门,每一个学习python的人都绕不开这个函数,下面介绍一下这个函数的用法。打开电脑,选择python软件,下面选择python 3.7为例进行介绍,点击python 3.7,就进入了python的命令行界面。python函数的格式是print(),然后再括号内输入想要在屏幕上面显示的内容,如果是数字等内容,可以直接输入pri...

weixin_39640024的博客 2325

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Python中print的用法

1.Python中print()函数的概述 print()方法用于打印输出,是python中最常见的一个函数。(python2中不是函数) 该函数的语法如下: print(*objects, sep=' ', end='\n', file=sys.stdout) 参数的具体含义如下: objects --表示输出的对象。输出多个对象时,需要用 , (逗号)分隔。 sep -- 用来间隔多个对象。 end -- 用来设定以什么结尾。默认值是换行符 \n,我们可以换成其他字符。 file -- .

zhc的博客 2万+

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

python中print后面要加括号吗

主要是先有一个人问了我这方面的问题 在下面这篇博文的评论里面 https://blog.youkuaiyun.com/sinat_16643223/article/details/113793463#comments_15178480 我去搜了下,发现大体是这样的答案 摘自:https://blog.youkuaiyun.com/weixin_33248912/article/details/113501002 python中print后面要加括号吗_python里print要括号吗 带你进黄铜 2021-0

自主无人机 PX4 ROS SLAM 路径规划 MVS等技术分享 8192

Python中print换行问题

print 如何实现换行? 1、 将语句分别输入在不同行中,也就是多输入几个print语句。 # coding:utf-8 print("今天天气很好") print("我们出去玩吧") print("你说好吗") 输出的结果:今天天气很好 我们出去玩吧 你说好吗 2、我们在学习C语言的时候,经常用\n换行,在python中同样适用。 # coding:utf-8 print("今天天气很好\n我们出去玩吧\n你说好吗") 输出的结果:今天天气很好 我们出去玩吧 你说好吗 如何使要打印

bingxi312的博客 3万+

python能print中文吗_python中使用print输出中文的方法

python中使用print输出中文的方法看Python简明教程,学习使用print打印字符串,试了下打印中文,不行。编辑环境:IDLE上网搜了下解决办法,各种说法,试了两种:print u"学习"print (unicode("学习", encoding="utf-8"))保存时均还是会提示shell输出:ѧϰѧϰ说明第二种还是有编码但还是不对。最后,加上最前面一行就好了,虽然现在还不明白第...

weixin_39581896的博客 3069

python print函数用法总结

print函数说明 print() 函数的详细语法格式如下: print (value,..., sep='', end='\n', file=sys.stdout, flush=False) 从上面的语法格式可以看出,value 参数可以接受任意多个变量或变量,依次用逗号拼起来的,因此 print() 函数完全可以输出多个值。例如如下代码: user_name = 'Charlie' user_age = 8 #同时输出多个变量和字符串 print("读者名:",user_name,"年...

tecoes的博客 7476

python win32print打印

pip install pywin32import win32print import win32api for fn in ['1.txt', '2.txt', '3.txt', '4.docx']: win32api.ShellExecute(0,\ 'print',\ fn,\ ...

qq_20259383的博客 1万+

python print什么意思_python中print有什么用

python中print有什么用发布时间:2020-11-11 12:34:11来源:亿速云阅读:77作者:小新这篇文章主要介绍python中print有什么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Python是一种解释型、面向对象、动态数据类型的高级程序设计语言。Python由Guido van Rossum于1989年底发明,第一个公开发行版发行于1991年。像...

weixin_35875219的博客 3415

python中print说法正确的是_Python中的print

Python 3.X的print在Python 3.X中,print是一个内置函数,完整的声明形式如下:print([object, ...][, sep=' '][, end='\n'][, file=sys.stdout][, flush=False])sepsep表示打印对象之间的分隔符,默认使用单个空格>>>print(1, 2, sep='$')1$2endend表示在...

weixin_34271305的博客 1472

python中print后面要加括号吗_python里print要括号吗

print函数加与不加括号,主要是在Python2和Python3中的差异,print函数在Python2中是不需要加括号的,在Python3中,需要加括号。主要体现在以下几个方面:1.python3中print是一个内置函数,有多个参数,而python2中print是一个语法结构;2.Python2打印时可以不加括号:print'helloworld',Python3则需要加括号pr...

weixin_33248912的博客 9038

Python之print语句

print语句可以向屏幕上输出指定的文字。比如输出'hello, world',用代码实现如下: >>> print 'hello, world' 注意: 1.当我们在Python交互式环境下编写代码时,>>>是Python解释器的提示符,不是代码的一部分。 2.当我们在文本编辑器中编写代码时,千万不要自己添加 >>>。 print语句也可以跟...

Jennyni1122的博客 1650

python的print函数用逗号分隔时输出不用空格_Python进阶之路 3.1 神奇的print函数

3.1 神奇的print函数相信大家对print函数一定不陌生,因为在前面的章节,几乎每个例子都使用了print函数,这个函数的功能就是在控制台输出文本。不过print在输出文本时可以进行一些设置,以及输出多参数字符串。如果为print函数传入多个参数值,那么print函数会将所有的参数值首尾相接输出。print("a","b","c","d","e")a b c d e可以看到,上面这行代码输...

weixin_39702639的博客 5761
上一篇: 你所不知道的Python的精髓
下一篇: Python中“等于“到底用 == 还是 is?
酸菜鱼编程
博客等级 码龄6年 155粉丝 63原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值