编程基础

字节码和机器码

机器码

机器码(machine code),学名机器语言指令,有时也被称为原生码(Native Code),是电脑的CPU可直接解读的数据。

通常意义上来理解的话,机器码就是计算机可以直接执行,并且执行速度最快的代码。

字节码

字节码(Bytecode)是一种包含执行程序、由一序列 op 代码/数据对 组成的二进制文件。字节码是一种中间码,它比机器码更抽象,需要直译器转译后才能成为机器码的中间代码。

通常情况下它是已经经过编译,但与特定机器码无关。字节码通常不像源码一样可以让人阅读,而是编码后的数值常量、引用、指令等构成的序列。

编译型语言

程序在执行之前需要一个专门的编译过程,把程序编译成 为机器语言的文件,运行时不需要重新翻译,直接使用编译的结果就行了。程序执行效率高,依赖编译器,跨平台性差些。如C、C++、Delphi等

解释型语言

相对于编译型语言存在的,源代码不是直接翻译成机器语言,而是先翻译成中间代码,再由解释器对中间代码进行解释运行,每执 行一次都要翻译一次。因此效率比较低。(在运行程序的时候才翻译,专门有一个解释器去进行翻译,每个语句都是执行的时候才翻译。效率比较低,依赖解释器,跨 平台性好.),比如Python/JavaScript / Perl /Shell等都是解释型语言。

堆和栈

栈
由系统分配,速度较快,不会产生内存碎片
堆
是由alloc分配的内存,速度比较慢,容易产生内存碎片,不过用起来方便

python解释器原理

Python先把代码(.py文件)编译成字节码,交给字节码虚拟机,然后虚拟机一条一条执行字节码指令,从而完成程序的执行

字符编码

字符是一个信息单位,在计算机里面,一个中文汉字是一个字符,一个英文字母是一个字符,一个阿拉伯数字是一个字符,一个标点符号也是一个字符。
字符集是字符组成的集合,通常以二维表的形式存在,二维表的内容和大小是由使用者的语言而定,是英语,是汉语,还是阿拉伯语。
字符编码是把字符集中的字符编码为特定的二进制数,以便在计算机中存储。编码方式一般就是对二维表的横纵坐标进行变换的算法。一般都比较简单,直接把横纵坐标拼一起就完事了。后来随着字符集的不断扩大,为了节省存储空间,才出现了各种各样的算法。
字符集和字符编码一般都是成对出现的,如ASCII、IOS-8859-1、GB2312、GBK,都是即表示了字符集又表示了对应的字符编码,以后统称为编码。Unicode比较特殊,后面细说。

python 2.7

#!/usr/bin/env python
# -*- conding: utf-8 -*-

temp = '李杰' # utf-8
# 解码,需要指定原来是什么编码
temp_unicode = temp_decode('utf-8')

temp_gbk = temp_unicode.encode('gbk')

print(temp_gbk)

python3.5

#py3,自动转换utf-8  unicode  gbk
# py3,移除了Python的Unicode类型
#!/usr/bin/env python
# -*- conding: utf-8 -*-

temp = '李杰' 
temp_gbk = temp.encode('gbk')    #一条命令搞定
print(temp_gbk)

  

进制转换

整数之间的进制转换:
10进制转16进制: hex(16)  ==>  0x10
16进制转10进制: int('0x10', 16)  ==>  16
类似的还有oct(), bin()
-------------------
字符串转整数:
10进制字符串: int('10')  ==>  10
16进制字符串: int('10', 16)  ==>  16
16进制字符串: int('0x10', 16)  ==>  16
-------------------
字节串转整数:
转义为short型整数: struct.unpack('<hh', bytes(b'x01x00x00x00'))  ==>  (1, 0)
转义为long型整数: struct.unpack('<L', bytes(b'x01x00x00x00'))  ==>  (1,)
-------------------
整数转字节串:
转为两个字节: struct.pack('<HH', 1,2)  ==>  b'x01x00x02x00'
转为四个字节: struct.pack('<LL', 1,2)  ==>  b'x01x00x00x00x02x00x00x00'
-------------------
字符串转字节串:
字符串编码为字节码: '12abc'.encode('ascii')  ==>  b'12abc'
数字或字符数组: bytes([1,2, ord('1'),ord('2')])  ==>  b'x01x0212'
16进制字符串: bytes().fromhex('010210')  ==>  b'x01x02x10'
16进制字符串: bytes(map(ord, 'x01x02x31x32'))  ==>  b'x01x0212'
16进制数组: bytes([0x01,0x02,0x31,0x32])  ==>  b'x01x0212'
-------------------
字节串转字符串:
字节码解码为字符串: bytes(b'x31x32x61x62').decode('ascii')  ==>  12ab
字节串转16进制表示,夹带ascii: str(bytes(b'x01x0212'))[2:-1]  ==>  x01x0212
字节串转16进制表示,固定两个字符表示: str(binascii.b2a_hex(b'x01x0212'))[2:-1]  ==>  01023132
字节串转16进制数组: [hex(x) for x in bytes(b'x01x0212')]  ==>  ['0x1', '0x2', '0x31', '0x32']
选择了奋斗,以后可以随时还有选择安逸的权力。 但选择了安逸,可能以后就不那么轻易还能有选择奋斗的权力。
原文地址:https://www.cnblogs.com/wtli/p/7679479.html