了解python

举报
子都爱学习 发表于 2021/04/01 09:53:03 2021/04/01
【摘要】 1.python语言特点1)Python 程序简洁、易读:高级数据类型允许在单一语句中表述复杂操作;使用缩进,而不是括号实现代码块分组;无需预声明变量或参数。2)Python 支持把程序分割为模块,以便在其他 Python 程序中复用。3)Python 是一种解释型语言,不需要编译和链接,可以节省大量开发时间。它的解释器实现了交互式操作,轻而易举地就能试用各种语言功能,编写临时程序,或在自底...

1.python语言特点

1)Python 程序简洁、易读:

  • 高级数据类型允许在单一语句中表述复杂操作;

  • 使用缩进,而不是括号实现代码块分组;

  • 无需预声明变量或参数。

2)Python 支持把程序分割为模块,以便在其他 Python 程序中复用。

3)Python 是一种解释型语言,不需要编译和链接,可以节省大量开发时间。它的解释器实现了交互式操作,轻而易举地就能试用各种语言功能,编写临时程序,或在自底向上的程序开发中测试功能。




2.python解释器

python xx.py     
python -c command [arg] ...
python -m module [arg] ...
#回车后解释器读取命令行参数,把脚本名与其他参数转化为字符串列表存到sys模块的argv的变量里,
#解释器不直接处理 -c command 或 -m module 之后的选项,而是直接留在 sys.argv 中由命令或模块来处理。

【执行原理】

执行 python XX.py 后,将会启动 Python 的解释器,python解释器的编译器会将.py源文件编译(解释)成字节码生成PyCodeObject字节码对象存放在内存中。python解释器的虚拟机将执行内存中的字节码对象

转化为机器语言,虚拟机与操作系统交互,使机器语言在机器硬件上运行。运行结束后python解释器则将PyCodeObject写回到pyc文件中。当python程序第二次运行时,首先程序会在硬盘中寻找pyc文件,如果找到,则直接载入,否则就重复上面的过程。

所以我们应该这样来定位PyCodeObject和pyc文件,我们说pyc文件其实是PyCodeObject的一种持久化保存方式。

pyc文件,文件中包含python的magic number(来说明编译时使用的python版本号)、源文件的mtime(使pyc和py文件保持同步)、编译出的code对象。


主流python解释器:

  • cpython:C语言开发
  • IPython:基于CPython之上的一个交互式解释器
  • PyPy:它的目标是执行速度。PyPy采用JIT技术,对Python代码进行动态编译(注意不是解释),所以可以显着提高Python代码的执行速度。
  • Jython:运行在Java平台上的Python解释器,可以直接把Python代码编译成Java字节码执行。

【小结】

一个python的程序会有若干代码块组成,例如一个Python文件是一个代码块,一个类,一个函数,甚至一个语句都是一个代码块,一个代码块会对应一个运行的上下文环境以及一系列的字节码指令。

而Python的字节码是一种类似汇编指令的中间语言,但是一个字节码指令并不是对应一个机器指 令(二进制指令),而是对应一段C代码,而不同的指令的性能不同,所以不能单独通过指令数量来判断代码的性能,而是要通过查看调用比较频繁的指令的代码来 确认一段程序的性能。 

a,b=b,a
#通过上述就很容易理解python一行代码就能交换两个值:包含了一个代码块,其中对应的是一段字节码指令序列
#实现的主要原因就是其中的 ROT_TWO指令

dis的作用 
  dis模块主要是用来分析字节码的一个内置模块,经常会用到的方法是dis.dis([bytesource]),参数为一个代码块,可以得到这个代码块对应的字节码指令序列。

dis.dis(a,b=b.a)输出结果:

这里写图片描述

在python3.4的源码中查阅ceval.c文件可以看到ROT_TWO:

TARGET(ROT_TWO) {           
    PyObject *top = TOP();          
    PyObject *second = SECOND();       
    SET_TOP(second);          
    SET_SECOND(top);         
    FAST_DISPATCH();       
}        
TARGET(ROT_THREE) {            
    PyObject *top = TOP();            
    PyObject *third = THIRD();            
    SET_SECOND(third);            
    FAST_DISPATCH();        
}

解释器的运行环境:

#!/usr/bin/env python3
# -*- coding: cp1252 -*-

习惯注明python环境与编码方式(下一章介绍编码与解释器的关系)



3.词法分析

python程序由解析器读取,输入解析器的是词法分析生成的形符流:

Python 将读取的程序文本转为 Unicode 代码点;编码声明用于指定源文件的编码,默认为 UTF-8,详见 PEP 3120。源文件不能解码时,触发 SyntaxError

编码声明

Python 脚本第一或第二行的注释匹配正则表达式 coding[=:]\s*([-\w.]+) 时,该注释会被当作编码声明;这个表达式的第一组指定了源码文件的编码。编码声明必须独占一行,在第二行时,则第一行必须也是注释。编码表达式的形式如下:

# -*- coding: <encoding-name> -*-

这也是 GNU Emacs 认可的形式,此外,还支持如下形式:

# vim:fileencoding=<encoding-name>

这是 Bram Moolenaar 的 VIM 认可的形式。

没有编码声明时,默认编码为 UTF-8。此外,如果文件的首字节为 UTF-8 字节顺序标志(b'\xef\xbb\xbf'),文件编码也声明为 UTF-8(这是 Microsoft 的 notepad 等软件支持的形式)。

声明的编码名称必须是 Python 能识别的。语义字符串、注释和标识符等词法分析都使用此编码。

行结构

Python程序可以拆分为多个逻辑行,NEWLINE 形符表示结束逻辑行。根据显式或隐式 行拼接 规则,一个或多个 物理行 可组成逻辑行。物理行是一序列字符,由行尾序列终止,输入结束也可以用作最终物理行的隐式终止符。嵌入 Python 时,传入 Python API 的源码字符串应使用 C 标准惯例换行符(\n,代表 ASCII 字符 LF, 行终止符)。

显式拼接行

两个及两个以上的物理行可用反斜杠(\)拼接为一个逻辑行,规则如下:以不在字符串或注释内的反斜杠结尾时,物理行将与下一行拼接成一个逻辑行,并删除反斜杠及其后的换行符。例如:

if 1900 < year < 2100 and 1 <= month <= 12 \
   and 1 <= day <= 31 and 0 <= hour < 24 \
   and 0 <= minute < 60 and 0 <= second < 60:   # Looks like a valid date
        return 1

以反斜杠结尾的行,不能加注释;反斜杠也不能拼接注释。除字符串字面值外,反斜杠不能拼接形符(如,除字符串字面值外,不能用反斜杠把形符切分至两个物理行)。反斜杠只能在代码的字符串字面值里,在其他任何位置都是非法的。

 隐式拼接行

圆括号、方括号、花括号内的表达式可以分成多个物理行,不必使用反斜杠。例如:

month_names = ['Januari', 'Februari', 'Maart',      # These are the
               'April',   'Mei',      'Juni',       # Dutch names
               'Juli',    'Augustus', 'September',  # for the months
               'Oktober', 'November', 'December']   # of the year

隐式行拼接可含注释;后续行的缩进并不重要;还支持空的后续行。隐式拼接行之间没有 NEWLINE 形符。三引号字符串支持隐式拼接行(见下文),但不支持注释。

空白行

只包含空格符、制表符、换页符、注释的逻辑行会被忽略(即不生成 NEWLINE 形符)。交互模式输入语句时,空白行的处理方式可能因读取 - 求值 - 打印循环(REPL)的具体实现方式而不同。标准交互模式解释器中,完全空白的逻辑行(即连空格或注释都没有)将结束多行复合语句。

 缩进

逻辑行开头的空白符(空格符和制表符)用于计算该行的缩进层级,决定语句组块。

制表符(从左至右)被替换为一至八个空格,缩进空格的总数是八的倍数(与 Unix 的规则保持一致)。首个非空字符前的空格数决定了该行的缩进层次。缩进不能用反斜杠进行多行拼接;首个反斜杠之前的空白符决定了缩进的层次。

源文件混用制表符和空格符缩进时,因空格数量与制表符相关,由此产生的不一致将导致不能正常识别缩进层次,从而触发 TabError

连续行的缩进层级以堆栈形式生成 INDENT 和 DEDENT 形符,说明如下。

读取文件第一行前,先向栈推入一个零值,该零值不会被移除。推入栈的层级值从底至顶持续增加。每个逻辑行开头的行缩进层级将与栈顶行比较。如果相等,则不做处理。如果新行层级较高,则会被推入栈顶,并生成一个 INDENT 形符。如果新行层级较低,则 应当 是栈中的层级数值之一;栈中高于该层级的所有数值都将被移除,每移除一级数值生成一个 DEDENT 形符。文件末尾,栈中剩余的每个大于零的数值生成一个 DEDENT 形符。

关键字

False      await      else       import     pass
None       break      except     in         raise
True       class      finally    is         return
and        continue   for        lambda     try
as         def        from       nonlocal   while
assert     del        global     not        with
async      elif       if         or         yield

内置函数

abs()	        divmod()	        input()	        open()	        staticmethod()
all()	                enumerate()	int()	ord()	str()
any()	        eval()	        isinstance()	pow()	        sum()
basestring()	execfile()	        issubclass()	print()	        super()
bin()	file()	        iter()	        property()	tuple()
bool()	        filter()	        len()	range()	type()
bytearray()      float()	        list()	                raw_input()      unichr()
callable()	       format()	        locals()	        reduce()	        unicode()
chr()	               frozenset()	long()	        reload()	        vars()
classmethod()getattr()	        map()	        repr()	        xrange()
cmp()	       globals()	        max()	        reverse()	        zip()
compile()	       hasattr()	        memoryview()	round()	       __import__()
complex()       hash()	        min()	        set()	
delattr()	       help()	        next()	        setattr()	
dict()	       hex()	                object()	        slice()	
dir()	               id()	                oct()	sorted()	exec 内置表达式
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。