0.Python解释器
解释器 | 说明 |
---|---|
CPython | 官方,C语言开发,最广泛的Python解释器 |
IPython | 一个交互式、功能增强的CPython |
PyPy | Python语言写的Python解释器,JIT技术,动态编译Python代码 |
Jython | Python的源代码编译成Java的字节码,跑在JVM上 |
IronPython | 与Jython类似,运行在.Net平台上的解释器,Python代码被编译成.Net的字节码 |
stackless | Python的增强版本解释器,不使用CPython的C的栈,采用微线程概念编程,并发 编程 |
语言类型
Python是动态语言、强类型语言。 静态语言
- 事先声明变量类型,之后变量的值可以改变,但值的类型不能再改变
- 编译时检查
动态语言
- 不用事先声明类型,随时可以赋值为其他类型
- 编程时不知道是什么类型,很难推断
强类型语言
- 不同类型之间操作,必须先强制类型转换为同一类型。print(‘a’+1)
弱类型语言
- 不同类型间可以操作,自动隐式转换,JavaScript中console.log(1+’a’)
但是要注意的是,强与弱只是一个相对概念,即使是强类型语言也支持隐式类型转换。
1.Python 变量 & 注释
内存中,变量默认一次只能指向一个值,当一个值没有任何变量指向的时候,内存会自动把改数据从内存释放掉,以节省内存空间。
:::success 变量 : 可以改变的量就是变量,实际上指代的是内存的一块空间 :::
1.1 变量的概念
变量:赋值后,可以改变值的标识符
rujia305 = "张三"
rujia305 = "李四"
rujia305 = "小明"
print(rujia305)
1.2 变量的3种声明形式
# 1
a = 100
b = 101
print(a)
print(b)
# 2
a,b = 200,201
# print(值1,值2,值3, ..... ) 一行打印所有变量
print(a , b)
# 3
a = b = 300
print(a, b)
1.3 变量的命名
标识符
- 一个名字,用来指代一个值
- 只能是字母、下划线和数字
- 只能以字母或下划线开头
- 不能是python的关键字,例如def、class就不能作为标识符
- Python是大小写敏感的
标识符约定: 不允许使用中文,也不建议使用拼音 不要使用歧义单词,例如class_ 在python中不要随便使用下划线开头的标识符
标识符本质: 每一个标识符对应一个具有数据结构的值,但是这个值不方便直接访问,程序员就可以通过其对应的标识符来访问数据,标识符就是一个指代。一句话,标识符是给程序员编程使用的。
"""
变量的命名
字母数字下划线,首字符不能为数字
严格区分大小写,且不能使用关键字
变量命名有意义,且不能使用中文哦
"""
# abc123 = 1
# 123abdc error
________1_ = 1
# ___@@_ = 2 error
# a__________ = 90
# 1____ = 10 error
# 严格区分大小写
abc = 10
ABC = 11
print(abc) # 10
print(ABC) # 11
# 关键字 : 系统预设的相关属性和函数或者特殊意义的变量;
# 引入 模块(文件)
import keyword
# 模块.属性 (文件.变量)
print(keyword.kwlist)
"""
[
'False', 'None', 'True', 'and', 'as', 'assert',
'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except',
'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda',
'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while',
'with', 'yield'
]
"""
# 系统预设的相关关键字不能被替换覆盖,不要使用改名字作为变量名;
"""
print = 100
print(1)
"""
# 起名字要见名知意
mycar = "特斯拉"
youcar = "五菱宏光"
asldkfjaskldjfklasdjfklasjdklfjasdkl = "宝马" # 不推荐
# 中文命名变量不会报错的,但是严禁使用
中文 = "小明"
print(中文)
n = "小明"
print(n)
"""
(1) 字符编码:
中文命名的变量容易乱码;
utf-8(万国码): 一个中文占用3个字节,字母数字其他符号占用1个字节
gbk (国标码) : 一个中文占用2个字节,字母数字其他符号占用1个字节
(2) 占用空间:
中文命名变量比英文命名变量占用更大的空间.
"""
1.4 变量的交换
a = 18
b = 19
# 通用写法
tmp = a
a = b
b = tmp
print(a,b)
# python特有
a = 18
b = 19
a,b = b,a
print(a,b)
1.5 常量
- 一旦赋值就不能改变值的标识符
- python中无法定义常量
```python
(5) 常量 : 永远不变的量(约定俗成:把每个字母都变成大写)
BIRTHDAY = “1010” ID_CARD = 210205200010106688
<a name="HyqMK"></a>
## 1.6 注释
:::warning
**注释: 就是对代码的解释 方便大家阅读python代码**
:::
```python
1)注释的分类
(2)注释的注意点
(3)注释的排错性
(1)注释的分类 : 1.单行注释 2.多行注释
# 1.单行注释 以#号开头 ,右边的所有东西都被当做说明文字 ,程序不进行编译运行。
print(‘hello world’)
# 2.多行注释 三个单引号 或 三个双引号
'''
这是第一行
这是第二行
'''
(2)注释的注意点
如果外面使用三个单引号,里面使用三个双引号,反之亦然。
(3)注释的排错性
先注释一部分代码,然后执行另外一部分,看看是否报错,逐层缩小报错范围,找到最终错误点。
# 注释: 就是对代码的解释,方便程序员阅读代码 , 被注释的代码不执行.
# 1.注释的分类: 单行注释 , 多行注释
# 单行注释
# python2.x print "hello,world"
# python3.x print("hello,world")
# notepad: ctrl + q pycharm: ctrl + /
# 快捷键 : ctrl + z 撤销 ctrl + y 反撤销
# print("hello,world")
# 多行注释 ''' """
'''
print("今天是python32期,python上课第一天")
print("总体学员人数,40人左右")
print("同学们上课积极踊跃,非常认真")
print("在半年之后,都要找一份满意的工作")
print("希望同学们养成吃苦耐劳的习惯,好好的学习python")
print("在未来,可以靠python大放光彩")
'''
"""
print("今天是python32期,python上课第一天")
print("总体学员人数,40人左右")
print("同学们上课积极踊跃,非常认真")
print("在半年之后,都要找一份满意的工作")
print("希望同学们养成吃苦耐劳的习惯,好好的学习python")
print("在未来,可以靠python大放光彩")
"""
# 2.多行注释的注意点
'''
如果里面嵌套的是三个单引号,外层使用三个双引号
如果里面嵌套的是三个双引号,外层使用三个单引号
单双引号要岔开
'''
'''
print("今天是python32期,python上课第一天")
print("总体学员人数,40人左右")
print("同学们上课积极踊跃,非常认真")
print("在半年之后,都要找一份满意的工作")
"""
print("希望同学们养成吃苦耐劳的习惯,好好的学习python")
"""
print("在未来,可以靠python大放光彩")
'''
"""
print("今天是python32期,python上课第一天")
print("总体学员人数,40人左右")
print("同学们上课积极踊跃,非常认真")
print("在半年之后,都要找一份满意的工作")
'''
print("希望同学们养成吃苦耐劳的习惯,好好的学习python")
'''
print("在未来,可以靠python大放光彩")
"""
# 3.注释具有一定的排错性
"""
先用注释包裹一份部分代码,查看是否报错
如果ok,缩小注释范围,再去一行一行进行排查,
直到找到错误为止,以此类推...
"""
"""
print("今天是python32期,python上课第一天")
print("总体学员人数,40人左右")
print("同学们上课积极踊跃,非常认真")
"""
print("在半年之后,都要找一份满意的工作")
print("希望同学们养成吃苦耐劳的习惯,好好的学习python")
print("在未来,可以靠python大放光彩")
# 其他语言的注释形式(了解)
"""
# shell注释
/* */ 多行注释
// 单行注释
<!-- --> html/xml 注释
"""
2.Python 6大数据类型
# ### 数据类型分类:
(1)Number 数字类型 (int float bool complex)
(2)str 字符串类型
(3)list 列表类型
(4)tuple 元组类型
(5)set 集合类型
(6)dict 字典类型
# ### Number数字类型分类:
int : 整数类型 ( 正整数 0 负整数 )
float: 浮点数类型 ( 1普通小数 2科学计数法表示的小数 例:a = 3e-5 #3e-05 )
bool: 布尔值类型 ( 真True 和 假False )
complex: 复数类型 ( 声明复数的2种方法 ) (复数用作于科学计算中,表示高精度的数据,科学家会使用)
# ### 容器类型分类:五个
str "nihao"
list [1,2,3]
tuple (6,7,8)
set {'a',1,2}
dict {'a':1,'b':2}
2.0 数据的由来及介绍
:::success
数据类型的由来
0,1 控制电脑
:::
为什么会有多种数据类型 为了可以适应更多的使用场景,将数据划分为多种类型,每种类型都有着各自的特点和使用场景,帮助计算机高效的处理与展示数据
2.1 Number数字类型 (int float bool complex)
int 整型 (正整型 0 负整型)
数字
- 整数int
- Python3开始不再区分long、int,long被重命名为int,所以只有int类型了
- 进制表示:
- 十进制10
- 十六进制0x10
- 八进制0o10
- 二进制0b10
- bool类型,有2个值True、False
- 浮点数float
- 1.2、3.1415、-0.12,1.46e9等价于科学计数法1.46*10
- 本质上使用了C语言的double类型
- 复数complex
- 1+2j或1+2J
intvar = 100
print(intvar)
# type 获取值得类型
res = type(intvar)
print(res)
# id 获取值得地址
res = id(intvar)
print(res)
# 二进制整型
intvar = 0b110
print(intvar)
print( type(intvar) )
print( id(intvar) )
# 八进制整型
intvar = 0o127
print(intvar)
print(type(intvar))
print(id(intvar))
# 十六进制
intvar = 0xff
intvar = 0XFF
print(intvar)
print(type(intvar))
print(id(intvar))
"""
二进制 1 + 1 = `10
八进制 7 + 1 = 10
十六进制 f + 1 = 10
"""
float 浮点型(小数)
# 表达方式1
floatvar = 3.6
print(floatvar , type(floatvar))
# 表达方式2 科学计数法
floatvar = 5.7e5 # 小数点右移5
floatvar = 5.7e-2 # 小数点左移2
print(floatvar , type(floatvar))
bool 布尔型 (True 真的, False 假的)
False等价 False等价布尔值,相当于bool(value)
- 空容器
- 空集合set
- 空字典dict
- 空列表list
- 空元组tuple
- 空字符串
- None
- 0
boolvar = True
boolvar = False
print(boolvar , type(boolvar))
complex 复数类型
"""
3 + 4j
实数+虚数
实数: 3
虚数: 4j
j : 如果有一个数他的平方等于-1,那么这个数就是j , 科学家认为有,表达一个高精度的类型
"""
# 表达方式1
complexvar = 3 + 4j
complexvar = -3j
print(complexvar , type(complexvar))
# 表达方法2
"""
complex(实数,虚数) => 复数
"""
res = complex(3,4)
print(res , type(res))
2.2 字符串类型 str
字符串
- 使用 ‘ “ 单双引号包裹的信息就是字符串
- ‘’’和””” 单双三引号,可以跨行、可以在其中自由的使用单双引号
- 字符串中可以包含任意字符:如字母,数字,符号,且没有先后顺序
- r前缀:在字符串前面加上r或者R前缀,表示该字符串不做特殊的处理
- f前缀:3.6版本开始,新增f前缀,格式化字符串
字符串拼接
str(1) + ',' + 'b' # 都转换成字符串拼接到一起
"{}-{}".format(1, 'a') # {}就是填的空,有2个,就使用2个值填充
# 在3.6后,可以使用插值
a = 100;
b = 'abc'
f'{a}-{b}' # 一定要使用f前缀,在大括号中使用变量名
# ### 字符串类型 str
"""
用引号引起来的就是字符串,单引号,双引号,三引号
# 转义字符 \ + 字符
(1) 可以将无意义的字符变得有意义
(2) 可以将有意义的字符变得无意义
\n : 换行
\r\n : 换行
\t : 缩进(水平制表符)
\r : 将\r后面的字符串拉到了当前行的行首
"""
# 1.单引号的字符串
strvar = '生活不止眼前的苟且'
print(strvar , type(strvar) )
# 2.双引号的字符串
strvar = "还有诗和远方的田野"
print(strvar , type(strvar))
# 可以将无意义的字符变得有意义
strvar = "还有诗和\n远方的田野"
strvar = "还有诗和\r\n远方的田野"
strvar = "还有诗和\t远方的田野"
strvar = "还有诗和\r远方的田野"
strvar = "还有诗和\n远方的\r田野"
# 可以将有意义的字符变得无意义
strvar = "还有诗和\"远\"方的田野"
print(strvar)
strvar = "还有诗和\"远\"方的田野"
# 3.三引号的字符串 (可以支持跨行效果)
strvar = '''
生活就像"醉"酒
表面上说'不'要
身体却很诚实
'''
print(strvar)
# 4.元字符串 r"字符串" 原型化输出字符串
strvar = "D:\nython32_python\tay02"
strvar = r"D:\nython32_python\tay02"
print(strvar)
# 5.字符串的格式化
"""
%d 整型占位符
%f 浮点型占位符
%s 字符串占位符
语法形式:
"字符串" % (值1,值2)
"""
# %d 整型占位符
strvar = "王同佩昨天买了%d风油精,洗澡" % (2)
print(strvar)
# %2d 占两位 (不够两位拿空格来补位) 原字符串具右
strvar = "王同佩昨天买了%2d风油精,洗澡" % (2)
print(strvar)
# %-2d 占两位 (不够两位拿空格来补位) 原字符串具左
strvar = "王同佩昨天买了%-2d风油精,洗澡" % (2)
print(strvar)
# %f 浮点型占位符
strvar = "赵世超一个月开%f工资" % (9.9)
print(strvar)
# %.2f 保留小数点后面两位小数 (存在四舍五入的情况,默认保留六位小数)
strvar = "赵世超一个月开%.2f工资" % (9.178)
print(strvar)
# %s 字符串占位符
strvar = "%s最喜欢在电影院尿尿" % ("赵万里")
print(strvar)
# 综合案例
strvar = "%s在水里%s被发现了,罚款%.2f元,并且做了%d俯卧撑." % ("孟凡伟","拉屎",500.129,50000)
print(strvar)
# 如果搞不清楚用什么占位符,可以无脑使用%s
strvar = "%s在水里%s被发现了,罚款%s元,并且做了%s俯卧撑." % ("孟凡伟","拉屎",500.129,50000)
print(strvar)
2.3 列表类型 list
# ### 列表类型 list
"""特征: 可获取,可修改,有序"""
# 1.定义一个空列表
listvar = []
print( listvar , type(listvar))
# 定义普通列表
listvar = [98,6.9,True,12-90j,"赵万里"]
# 2.获取列表中的元素
# 正向索引 0 1 2 3 4
listvar = [98,6.9,True,12-90j,"赵万里"]
# 逆向索引 -5 -4 -3 -2 -1
res = listvar[2]
res = listvar[-2]
print(res)
# 通用写法
# len 获取容器类型数据中元素个数
length = len(listvar)
res = listvar[length-1]
print(res)
# 简写
res = listvar[len(listvar)-1]
print(res)
# python逆向索引的特点,瞬间得到列表中最后一个元素
print(listvar[-1])
# 3.修改列表中的元素
listvar = [98,6.9,True,12-90j,"赵万里"]
listvar[3] = "大象"
print(listvar)
2.4 元组类型 tuple
# ### 元组类型 tuple
"""特征: 可获取,不可修改,有序"""
# 定义一个元组
tuplevar = ("梦好心","王伟","安晓东","孙坚")
print(tuplevar , type(tuplevar))
# 获取元组中的元素
# 正向索引 0 1 2 3
tuplevar = ("梦好心","王伟","安晓东","孙坚")
# 逆向索引 -4 -3 -2 -1
print(tuplevar[2])
print(tuplevar[-1])
# 修改元组中的元素 : 元组中的值不能修改
# tuplevar[0] = "萌不好心" error
# 注意点
"""逗号才是区分是否是元组的标识符"""
tuplevar = (8.9,)
tuplevar = 8.1,
print(tuplevar)
print(type(tuplevar))
# 定义空元组
tuplevar = ()
print(type(tuplevar))
# ### 字符串类型
"""特征: 可获取,不可修改,有序"""
# 正向索引 0 1 2 3 4 5 6 7 8
strvar = "看你,我就心跳加速"
# 逆向索引 -9-8-7-6-5-4-3-2-1
# 获取字符串中的元素
print(strvar[3])
print(strvar[-6])
# 不能修改字符串中的元素
# strvar[3] = "你" error
print("<===============>")
strvar = "" # 单纯定义一个字符串类型
print(strvar)
print(type(strvar))
strvar = " " # 字符串中含有3个空格字符
print(strvar[0])
print(type(strvar))
2.5 字典&集合 (dict set)
# ### 1.set 集合类型 (交差并补)
"""特点: 无序,自动去重"""
# 1.集合无序
setvar = {"巨石强森","史泰龙","施瓦辛格","王文"}
print(setvar , type(setvar))
# 获取集合中的元素 不可以
# setvar[0] error
# 修改集合中的元素 不可以
# setvar[2] = 111 error
# 2.集合自动去重
setvar = {"巨石强森","史泰龙","施瓦辛格","王文","史泰龙","史泰龙","史泰龙"}
print(setvar , type(setvar))
# 3.定义一个空集合
setvar = set()
print(setvar , type(setvar))
# ### 2.dict 字典类型
"""
键值对存储的数据,表面上有序,本质上无序
dictvar = {键1:值1, 键2:值2 , ... }
3.6版本之前,完全无序,
3.6版本之后,存储的时候,保留了字典定义的字面顺序,在获取内存中数据时
重新按照字面顺序做了排序,所以看起来有序,实际上存储时还是无序.
"""
# 1.定义一个字典
dictvar = {"top":"the shy","middle":"肉鸡","bottom":"jacklove" ,"jungle":"臭鞋","support":"吃饱饱_嘴里种水稻"}
print(dictvar, type(dictvar))
# 2.获取字典中的值
res = dictvar["middle"]
res = dictvar["jungle"]
print(res)
# 3.修改字典中的值
dictvar["top"] = "the xboy"
print(dictvar)
# 4.定义空字典
dictvar = {}
print(dictvar, type(dictvar))
# ### 3.set 和 dict 的注意点
"""
字典的键 和 集合的值 有数据类型上的要求:
(允许的类型范围)不可变的类型: Number(int float complex bool) str tuple
(不允许的类型)可变的类型 : list set dict
哈希算法的提出目的是让数据尽量均匀的在内存当中分配,以减少哈希碰撞,提升存储分配的效率;
哈希算法一定是无序的散列,所以集合 和 字典都是无序
字典的 键有要求,值没要求
字典的值可以任意换掉,但是键不可以.
"""
# 允许的类型范围
dictvar = {1:"abc",4.89:111,False:333,3+90j:666,"王文":"你好帅啊,我好喜欢哦,没毛病",(1,2,3,4,5,6):9999}
print(dictvar)
print(dictvar[(1,2,3,4,5,6)])
# dictvar = {[1,2,3]:123} error
# 允许的类型范围
setvar = {1,"a",4.56,9+3j,False,(1,2,3)}
# setvar = {1,"a",4.56,9+3j,False,(1,2,3),{"a","b"}} error
print(setvar)
# 总结:
"""
无论是变量缓存机制还是小数据池的驻留机制,
都是为了节省内存空间,提升代码效率
"""
2.6 自动类型转换
当2个不同类型的数据进行运算的时候,默认向更高精度转换
数据类型精度从低到高: bool int float complex
2.7 强制类型转换
# -->Number部分
int : 整型 浮点型 布尔类型 纯数字字符串
float: 整型 浮点型 布尔类型 纯数字字符串
complex: 整型 浮点型 布尔类型 纯数字字符串 (复数)
bool: ( 容器类型数据 / Number类型数据 都可以 )
# -->容器类型部分
str: ( 容器类型数据 / Number类型数据 都可以 )
list: 字符串 列表 元组 集合 字典
tuple: 字符串 列表 元组 集合 字典
set: 字符串 列表 元组 集合 字典 (注意:相同的值,只会保留一份)
dict: 使用 二级列表,二级元组,二级集合(里面的容器数据只能是元组)
2.8 字典和集合的注意点
# ###哈希算法
#定义:
把不可变的任意长度值计算成固定长度的唯一值,这个值可正可负,可大可小,但长度固定
该算法叫哈希算法(散列算法),这个固定长度值叫哈希值(散列值)
#特点:
1.计算出来的值长度固定且该值唯一
2.该字符串是密文,且加密过程不可逆
#用哈希计算得到一个字符串的用意?
例如:比对两个文件的内容是否一致?
例如:比对输入的密码和数据库存储的密码是否一致
#字典的键和集合中的值都是唯一值,不可重复:
为了保证数据的唯一性,
用哈希算法加密字典的键得到一个字符串。
用哈希算法加密集合的值得到一个字符串。
如果重复,他们都是后面的替换前面的。自动去重
#版本:
3.6版本之前都是 字典和集合都是无序的
3.6版本之后,把字典的字面顺序记录下来,当从内存拿数据的时候,
根据字面顺序重新排序,所以看起来像有序,但本质上无序
可哈希数据:
可哈希的数据 (不可变的数据):Number(int float bool complex) str tuple
不可哈希的数据 (可变的数据): list set dict
2.9 空类型
:::success
(1)算数运算符:
+、-、、/、//向下取整整除、%取模、*幂
注:在Python2中/和//都是整除。
(2)比较运算符:
==、!=、>、>=、<、<=
链式比较: 4 > 3 > 2
比较运算符,返回一个bool值
思考:1 == ‘1’ 吗? 1 > ‘1’ 吗?
注:<>:判断是否不等于;在python3里边已经废弃,仅在python2里边可用。
(3)赋值运算符:
a = min(3, 5)
+=、 -= 、=、/=、%=、//=、*= 等
x = y = z = 10
赋值语句先计算等式右边,然后再赋值给变量
(4)成员运算符: (针对于容器型数据)
in和not in,用来判断是否是容器的元素,返回布尔值
(5)身份运算符:
is 和 is not (检测两个数据在内存当中是否是同一个值)
(6)逻辑运算符:
与and、或or、非not
逻辑运算符也是短路运算符
and 如果前面的表达式等价为False,后面就没有必要计算了,这个逻辑表达式最终一定等价为False
1 and '2' and 0<br /> 0 and 'abc' and 1
or 如果前面的表达式等价为True,后面没有必要计算了,这个逻辑表达式最终一定等价为True
1 or False or None
- 特别注意,返回值。返回值不一定是bool型
- 把最频繁使用的,做最少计算就可以知道结果的条件放到前面,如果它能短路,将大大减少计算量
(7)位运算符:
&位与、|位或、^异或、<<左移、>>右移、~按位取反,包括符号位
:::
| python运算符 | 注意点 |
| —- | —- |
| 算数运算符 | % 取余 , //地板除 , ** 幂运算 |
| 比较运算符 | == 比较两个值是否相等 != 比较两个值是否不同 |
| 赋值运算符 | a += 1 => a = a+1 |
| 成员运算符 | in 或 not in 判断某个值是否包含在(或不在)一个容器类型数据当中 |
| 身份运算符 | is 和 is not 用来判断内存地址是否相同 |
| 逻辑运算符 | 优先级 () > not > and > or |
| 位运算符 | 优先级 (<<或 >> ) > & > ^ > | 5 << 1 结果:10 , 5 >> 1 结果:2 |
3.2 运算符优先级
- 单目运算符 > 双目运算符
- 算数运算符 > 位运算符 > 比较运算符 > 逻辑运算符
- -3 + 2 > 5 and ‘a’ > ‘b’
搞不清楚就使用括号。长表达式,多用括号,易懂、易读。
3.3 表达式
- 由数字、符号、括号、变量等的组合。有算数表达式、逻辑表达式、赋值表达式、lambda表达式等等。
- Python中,赋值即定义。Python是动态语言,只有赋值才会创建一个变量,并决定了变量的类型和值。
- 如果一个变量已经定义,赋值相当于重新定义。
3.4 内建函数
| 内建函数 | 函数签名 | 说明 | | —- | —- | —- | | print | print(value, …, sep=’ ‘,
end=’\n’) | 将多个数据输出到控制台,默认使用空格分隔、
\n换行 | | input | input([prompt]) | 在控制台和用户交互,接收用户输入,并返回字
符串 | | int | int(value) | 将给定的值,转换成整数。int本质是类 | | str | str(value) | 将给定的值,转换成字符串。str本质是类 | | type | type(value) | 返回对象的类型。本质是元类 | | isinstance | isinstance(obj,
class_or_tuple) | 比较对象的类型,类型可以是obj的基类 | | len | len(str) | 返回字符串的长度 |
print(1,2,3,sep='\n', end='***')
type(1) # 返回的是类型,不是字符串
type('abc') # 返回的是类型,不是字符串
type(int) # 返回type,意思是这个int类型由type构造出来
type(str) # 返回type,也是类型
type(type) # 也是type
print(isinstance(1, int))
print(isinstance(False, int)) # True
3.5 转义序列
- \ \t \r \n \’ \”
- 上面每一个转义字符只代表一个字符,例如\t 显示时占了4个字符位置,但是它是一个字符
前缀r,把里面的所有字符当普通字符对待,则转义字符就不转义了。
3.6 缩进
未使用C等语言的花括号,而是采用缩进的方式表示层次关系
-
3.7 续行
在行尾使用 \,注意\之后除了紧跟着换行之外不能有其他字符
- 如果使用各种括号,认为括号内是一个整体,其内部跨行不用 \
4.数据的在内存中的缓存机制
4.1 在同一文件(模块)里,变量存储的缓存机制 (仅对python3.6版本负责)
# -->Number 部分
1.对于整型而言,-5~正无穷范围内的相同值 id一致
2.对于浮点数而言,非负数范围内的相同值 id一致
3.布尔值而言,值相同情况下,id一致
4.复数在 实数+虚数 这样的结构中永不相同(只有虚数的情况例外)
# -->容器类型部分
5.字符串 和 空元组 相同的情况下,地址相同
6.列表,元组,字典,集合无论什么情况 id标识都不同 [空元组例外]
4.2 不同文件(模块)里,部分数据驻留小数据池中 (仅对python3.6版本负责 了解)
小数据池只针对:int,str,bool,空元祖(),None关键字 这些数据类型有效
#(1)对于int而言
python在内存中创建了-5 ~ 256 范围的整数,提前驻留在了内存的一块区域.
如果是不同文件(模块)的两个变量,声明同一个值,在-5~256这个范围里,
那么id一致.让两个变量的值都同时指向一个值的地址,节省空间。
#(2)对于str来说:
1.字符串的长度为0或者1,默认驻留小数据池
2.字符串的长度>1,且只含有大小写字母,数字,下划线时,默认驻留小数据池
3.用*号得到的字符串,分两种情况。
1)乘数等于1时: 无论什么字符串 * 1 , 都默认驻留小数据池
2)乘数大于1时: 乘数大于1,仅包含数字,字母,下划线时会被缓存,但字符串长度不能大于20
#(3)指定驻留
# 从 sys模块 引入 intern 函数 让a,b两个变量指向同一个值
from sys import intern
a = intern('大帅锅&*^^1234'*10)
b = intern('大帅锅&*^^1234'*10)
print(a is b)
#可以指定任意字符串加入到小数据池中,无论声明多少个变量,只要此值相同,都指向同一个地址空间
4.3 缓存机制的意义
无论是变量缓存机制还是小数据池的驻留机制,都是为了节省内存空间,提升代码效率