一、代码块
if True:
print(333)
print(666) for i in "":
print(i)
虽然上面的缩进的内容都叫代码块,但是他不是python中严格定义的代码块。
python中真正意义的代码块是什么?
块是一个python程序的文本,他是作为一个单元执行的。
代码块:一个模块,一个函数,一个类,一个文件等都是一个代码块。
而对于一个文件中的两个函数,也分别是两个不同的代码块:
def func():
print(333) class A:
name = 'xiaojing'
交互模式下,每一行是一个代码块。
什么叫交互方式?就是咱们在cmd中进入Python解释器里面,每一行代码都是一个代码块
>>> i1 = 520 可以理解为这一行在一个文件中。
>>> i2 = 520 可以理解为这一行在另一个文件中。
二、id is ==
在Python中,id是什么?id是内存地址,== 是比较的两边的数值是否相等,而 is 是比较的两边的内存地址是否相等。
如果内存地址相等,那么这两边其实是指向同一个内存地址。
name = 'shuaige' # 赋值
print('shuaige' == 'shuaige') # True, 数值相同 name2 = 'abc123'
name3 = 'abc123'
print(id(name2), id(name3)) # 2370269674608 2370269674608
print(name2 is name3) # True
在内存中id都是唯一的,如果两个变量指向的值的id相同,就证明他们在内存中是同一个。
is 判断的是两个变量的id值是否相同。
如果is是True, == 一定是True。== 是True,is不一定是True
三、小数据池(缓存机制,驻留机制)
1、介绍
小数据池的应用的数据类型: 一定范围内的整数,一定规则的字符串,bool值
小数据池是python对内存做的一个优化:
python将 -5 ~256 的整数,以及一定规则的字符串,bool值,进行了缓存,就是提前在内存中创建了池(容器),
在这些容器里固定的放了这些数据。
为什么这么做???
- 节省内存。
- 提高性能与效率。
2、一定范围内的整数
对于整数来说,小数据池的范围是 -5~256 ,如果多个变量都是指向同一个(在这个范围内的)数字,他们在内存中指向的都是一个内存地址。
3、一定规则的字符串
1,字符串的长度为0或者1,默认都采用了驻留机制(小数据池)
2,字符串的长度>1,且只含有大小写字母,数字,下划线时,才会默认驻留。
3,用乘法得到的字符串,分两种情况。
3.1 乘数为1时:仅含大小写字母,数字,下划线,默认驻留。
3.1.2含其他字符,长度<=1,默认驻留。
3.1.3含其他字符,长度>1,默认驻留
3.2 乘数>=2时:仅含大小写字母,数字,下划线,总长度<=20,默认驻留。
4,指定驻留。
from sys import intern
a = intern('hello!@'*20)
b = intern('hello!@'*20)
print(a is b)
#指定驻留是你可以指定任意的字符串加入到小数据池中,让其只在内存中创建一个对象,多个变量都是指向这一个字符串。
四、代码块与小数据池的关系
同样一段代码,为什么在交互方式中(cmd命令的终端)执行,和通过pycharm执行结果不同呢?
# pycharm 通过运行文件的方式执行下列代码:
i1 = 520
i2 = 520
print(i1 is i2) # 结果为True
通过交互方式中执行下面代码:
>>> i1 = 520
>>> i2 = 520
>>> print(i1 is i2) #结果为False
那为什么结果会不同呢?
对于pycharm:
在同一个代码块中的变量(数字,字符串),初始化对象的命令时,首先会从小数据池中找,如果没有找到,它会将变量与值的对应关系放到一个字典中,
同一个代码块中的其他变量遇到初始化对象的命令,他会先从字典中寻找,如果存在相同的值,他会复用,指向的都是同一个内存地址。
所以,在pycharm中的两行变量赋值中(实际上在同一个代码块中的赋值):
(注意:如果这个变量不是数字或者字符串,那么值相同,地址也是不同的)
s1 = 1000
s2 = 1000
print(s1 is s2) # True l1 = [1,2]
l2 = [1,2]
print(id(l1), id(l2)) # 1745841050760 1745840183304
print(l1 == l2) # True
print(l1 is l2) # False
对于cmd命令行:
而在cmd命令的终端中(交互模式),每一行都是一个代码块,因此在cmd命令的终端中,s1和s2是在不同的代码块,因此s1 is s2 是False
在不同的代码块:初始化对象的命令时,首先从小数据池中寻找,如果在小数据池,那么地址相同,如果不在小数据池中,则创建新的地址。
不同代码块中:
def func():
i1 = 1000
print(id(i1)) # def func1():
i2 = 1000
print(id(i2)) #
func()
func1()
# 一个函数是一个代码块,因此这里的i1的地址跟i2的地址不是同一个地址
总结:
同一代码块中:
如果变量在小数据池,那么地址相同,
如果不在小数据池,那么如果变量是数字或者字符串,也会复用地址,地址也相同,
如果变量不是数字或者字符串,那么地址不同。
不同一代码块中:
如果变量在小数据池,那么地址相同,
如果不在小数据池,那么地址不同。
五、编码二
"""
位:计算机时间里面的二进制
字节:8位二进制 等于 1个字节 # 这是不变的
字符:就是我们平常可以看到的文字、字母之类的,比如: ABC,我爱python等。
"""
ASCII: 只包含字母,数字,特殊字符。
8位二进制(bit)等于1个字节(Bytes),1个字节代表一个字符
A: 0000 0010
B: 0000 0011 unicode: 万国码,包含世界上所有的文字。
创建之初:16位二进制(bit)[即2个字节(Bytes)]代表1个字符
A :0001 0010 0000 0010
中:0011 0010 0000 0110
缺点:还不能完全覆盖世界上的所有文字 升级:32位二进制(bit)[即4个字节(Bytes)]代表1个字符
A :0000 0010 0100 0010 0000 0010 1000 0010
中:0001 0010 0010 0010 0000 0010 0010 0010
缺点:虽然能够覆盖全世界的文字,但是浪费资源。 对unicode升级 --> utf-8:最少用8位表示一个字符。
A :0000 0010 # 字母,数字,特殊字符按照ASCII规则,8位(1个字节)代表1个字符
欧:0000 0010 0100 0010 # 对于欧洲文字,使用16位(2个字节)代表1个字符
中:0000 0010 0001 0010 0000 0010 # 对于中文,使用24位(3个字节)代表1个字符 我国特有的编码 --> GBK(国标):字母,数字,特殊字符,中文。
A :0000 0010 # 字母,数字,特殊字符按照ASCII规则,8位(1个字节)代表1个字符
中:0000 0010 0001 0010 # 对于大部分中文,使用16位(2个字节)代表1个字符
# 国标只包含绝大部分我们日常使用的中文,对于一些比较偏的中文是没有的 1, 编码之间不能互相识别。
2, 网络传输,或者硬盘存储的010101,必须是以非uniocde编码方式的01010101. 3,大环境python3x:
str:内存(内部)编码方式为Unicode,因此python3中的字符串不能直接用于网络传输和硬盘存储,为了解决这个问题,就出现了bytes
bytes:python的基础数据类型之一,他和str相当于双胞胎,str拥有的所有方法,bytes类型都适用。 区别:
英文字母:
str:
表现形式:s1 = 'xiaohei'
内部编码方式:unicode bytes:
表现形式:b1 = b'xiaohei'
内部编码方式:非unicode 中文:
str:
表现形式:s1 = '小黑'
内部编码方式:unicode bytes:
表现形式:b1 = b'\xe5\xb0\x8f\xe9\xbb\x91'
内部编码方式:非unicode 如何使用:
你想将一部分内容(字符串)写入文件,或者通过网络socket传输,这样这部分内容(字符串)必须转化成bytes才可以进行。
在平时的代码中,可以直接使用字符串。 具体使用方法:encode编码 decode解码(bytes拥有str的所有方法) encode()不写参数,默认编码成utf-8 str ---> bytes encode 编码
非中文可以使用encode(),也可直接在字符串前加一个 b 表示bytes
s1 = 'xiaohei' b1 = b'xiaohei' # 等于 b1 = s1.encode()
b2 = b1.upper() print(s1, type(s1)) # xiaohei <class 'str'> print(b1, type(b1)) # b'xiaohei' <class 'bytes'>
print(b2, type(b2)) # b'XIAOHEI' <class 'bytes'> 中文只能使用encode()
s1 = '小黑'
b1 = s1.encode('utf-8')
b2 = s1.encode('gbk')
print(b1) # b'\xe5\xb0\x8f\xe9\xbb\x91'
print(b2) # b'\xd0\xa1\xba\xda' bytes ---> str decode 解码
b1 = b'\xd0\xa1\xba\xda' # gbk的bytes
s2 = b1.decode('gbk') # 对应用gbk的解码
print(s2) # 小黑
六、字节单位之间的换算
位(bit,缩写为b)是存储器的最小单位,可以表示一位二进制数。1字节(Byte,缩写为B)由8个位组成,即1Byte=8bit,是存储器的基本单位,通常被作为一个存储单元。通常情况下,把B称为字节、b称为字位、KB称为千字节、MB称为兆字节、GB称为吉字节。
1字位(bit)=1个二进制数
1字节(Byte)=8字位=8个二进制数
1B=8b
1KB=1024B
1MB=1024KB
1GB=1024MB
python基础之小数据池、代码块、编码和字节之间换算的更多相关文章
-
python基础之小数据池、代码块、编码
一.代码块.if True: print(333) print(666) while 1: a = 1 b = 2 print(a+b) for i in '12324354': print(i) 虽 ...
-
python基础之小数据池
一,id,is,== 在Python中,id是什么?id是内存地址,比如你利用id()内置函数去查询一个数据的内存地址: name = '太白' print(id(name)) # 158583128 ...
-
python基础之小数据池,is和==区别 编码问题
主要内容 小数据池,is和==区别 编码问题 小数据池 一种缓存机制,也称为驻留机制,是为了能更快提高一些字符串和整数的处理速度is 和 == 的区别 == 主要指对变量值是否相等的判断,只要数值相同 ...
-
Python基础篇 -- 小数据池和再谈编码
小数据池 1. id() 通过id()可以查看到一个变量表示的值在内存中的地址 s = "Agoni" print(id(s)) # 2410961093272 2. is 和 = ...
-
python之路--小数据池,再谈编码,is和 == 的区别
一 . 小数据池 # 小数据池针对的是: int, str, bool 在py文件中几乎所有的字符串都会缓存. # id() 查看变量的内存地址 s = 'attila' print(id(s)) 二 ...
-
百万年薪python之路 -- 小数据池和代码块
1.小数据池和代码块 # 小数据池 -- 缓存机制(驻留机制) # == 判断两边内容是否相等 # a = 10 # b = 10 # print(a == b) # is 是 # a = 10 # ...
-
百万年薪python之路 -- 小数据池和代码块练习
1.请用代码验证 "alex" 是否在字典的值中? info = {'name':'王刚蛋','hobby':'铁锤','age':'18',...100个键值对} info = ...
-
python 浅谈小数据池和编码
⼀. ⼩数据池 在说⼩数据池之前. 我们先看⼀个概念. 什么是代码块: 根据提示我们从官⽅⽂档找到了这样的说法: A Python program is constructed from code b ...
-
Python细节(二)小数据池
3.8小数据池 python是由代码块构成的 代码块,一个模块.一个函数,一个类,一个文件,eval(),exec()执行的时候也是一个代码块 1.内存地址 id() 通过id() 我们可以查看到一个 ...
随机推荐
-
给li标签添加自定义属性
给li标签添加属性<ul> <li></li> <li></li> <li></li> <li>< ...
-
解决64位win7系统IIS7[ODBC 驱动程序管理器]未发现数据源名称并且未指定默认驱动程序
从网上下载了一个asp系统,数据库是Access类型的,运行环境为 64位Windows 7系统,IIS7,运行系统后,报如下错误: Microsoft OLE DB Provider for ODB ...
-
Chrome 控制台console的用法(学了之后对于调试js可是大大有用的哦)
大家都有用过各种类型的浏览器,每种浏览器都有自己的特色,本人拙见,在我用过的浏览器当中,我是最喜欢Chrome的,因为它对于调试脚本及前端设计调试都有它比其它浏览器有过之而无不及的地方.可能大家对co ...
-
数据结构-单向链表 C和C++的实现
数据结构,一堆数据的存放方式. 今天我们学习数据结构中的 链表: 链表的结构: 链表是一种特殊的数组,它的每个元素称为节点,每个节点包括两个部分: 数据域:存放数据,此部分与数组相同 指针域:存放了下 ...
-
Servlet校验密码之Mariadb篇
Servlet校验密码之Mariadb篇 先放图-- 数据库: 效果图: 整体来说与上一篇差距不大,这次主要是采用数据库来进行校验,我使用的是Mariadb,安装与配置不用我说 主要有一点,导入连接器 ...
-
c++ 单元测试框架 gmock 深度剖析
c++ 单元测试框架 gmock 深度剖析 随着微服务和CI的流行,在目前的软件工程领域中单元测试可以说是必不可少的一个环节,在TDD中,单元测试更是被提高到了一个新的高度.但是很多公司由于很多不同的 ...
-
剑指offer十四之链表中倒数第k个结点
一.题目 输入一个链表,输出该链表中倒数第k个结点. 二.思路 两个指针,先让第一个指针和第二个指针都指向头结点,然后再让第一个指正走(k-1)步,到达第k个节点.然后两个指针同时往后移动,当第一个结 ...
-
Java中类的线程安全问题
java中各种集合(字符串类)的线程安全性!!! 一.概念: 线程安全:就是当多线程访问时,采用了加锁的机制:即当一个线程访问该类的某个数据时,会对这个数据进行保护,其他线程不能对其访问,直到该线程读 ...
-
openfire + spark 展示组织机构(客户端)
在spark 加一个插件用于展示组织机构, 参考了好多人的代码 插件主类增加一个 TAB用于展示机构树 package com.salesoa.orgtree; import java.net.URL ...
-
UOJ46. 【清华集训2014】玄学
传送门 Sol 考虑对于操作时间建立线段树,二进制分组 那么现在主要的问题就是怎么合并信息 你发现一个性质,就是每个修改只会在整个区间内增加两个端点 那么我们二进制分组可以得到每个区间内最多只有区间长 ...