使用\行连接符
对象
python中一切皆对象,每个对象由:标识、类型、value组成
对象的本质就是:一个内存块,拥有特定的值,支持特定类型的相关操作。
1.标识用于唯一标识对象,通常对应于对象在计算机内存中的地址。使用内置函数id(obj)
可返回对象obj的标识。
2.类型用于标识对象存储的数据的类型。类型可以限制对象的取值范围以及可执行的操作。可以使用type(obj)获得对象的所属类型。
3.值表示对象所存储的数据的信息。使用print(obj)可以直接打印出值
引用
在python中,变量也称为:对象的引用。因为,变量存储的就是对象的地址。
变量通过地址引用了对象。
变量位于:栈内存
对象位于:堆内存
python是动态类型语言
变量不需要显示声明类型。根据变量引用的对象,Python解释器自动确定数据类型。
Python是强类型语言
每个对象都有数据类型。只支持该类型支持的操作。
标识符:
用于变量、函数、类模块等的名称。
规则:1、区分大小写
2、第一个字符必须是字幕、下划线。其后的字符是:字母、数字、下划线
3、不能使用关键字、
4、以双下划线开头和结尾的名称通常有特殊含义
可以通过del删除变量
垃圾回收机制
一文读懂Python垃圾回收机制【收藏版】-腾讯云开发者社区-腾讯云 (tencent.com)
链式赋值
链式赋值用于同一个对象赋值给多个变量。
系列解包赋值
系列数据赋值给对应相同个数的变量
Python不支持常量,全部大写规则位常量
python中最基本的内置数据类型:
1、整型
2、浮点型
3、布尔型
4、字符串型
**是幂运算
/浮点数除法,//整数除法
使用divmod()可以同时得到商和余数
python2,int有存储限制,python3中可以存储任意大小的整数,可以做超大数的计算,不会造成“整数溢出”
Googol是10的100次方是Google最初的名字古戈尔 - 维基百科,自由的百科全书 (wikipedia.org)
round(value)可以返回四舍五入的值
但不会改变原有值,而是产生新的值
浮点数
整数和浮点数混合计算时,表达式结果自动转型成浮点数。
时间的表示
计算机中时间的表示从1970年1月1日0点开始,以毫秒进行计算,把1970年这个时刻称为unix时间点
布尔值
python2中没有布尔值,直接用数字0表示false,用数字1表示true
python3中把true和false定义成了关键字,但他们的本质还是1和0,甚至可以和数字相加
同一运算符
用于比较两个对象的存储单元,实际比较的是对象的地址。
is 是判断两个标识符是不是引用同一个对象
is not 是判断两个标识符是不是引用不同对象
is和 = =区别
is用于判断两个变量引用对象是否为同一个,即比较对象的地址。
==用于判断引用变量引用对象的值是否相等,默认调用对象的_eq_()方法
整数缓存问题
python仅仅对比较小的整数对象进行缓存(范围为【-5,256】)缓存起来,而并非是所有整数对象。需要注意的是,这仅仅是在命令行中执行,而在Pycharm或者保存为文件执行,结果是不一样的,这是因为解释器做了一部分优化范围是[-5,任意正整数].
总结:
1、is比较两个对象的id值是否相等,是否指向同一个内存地址;
2、==比较的是两个对象的内容是否相等,值是否相等;
3、小整数对象[-5,256]在全局解释器范围内被放入缓存供重复使用;
4、is运算符比==效率高,在变量和None进行比较时,应该使用is
字符串的本质是:字符序列、
python中的字符串是不可变的,我们无法对原字符串做任何修改。但是,可以讲字符串的一部分赋值到新创建的字符串,达到“看起来修改”的效果。
python不支持单字符类型,单字符也是做为一个字符串使用的
字符串的编码
python3直接支持Unicode,可以表示世界上任何书面语言的字符,python3的字符默认就是16为Unicode编码,ASCII码是Unicode编码的子集。
使用内置函数 ord()可以吧字符转换成对相应的Unicode码
使用内置函数chr()可以把十进制数字转换为对应的字符。
引号创建字符串
我们可以通过单引号或双引号创建字符串
使用两种引号的好处是可以创建本身就包含引号的字符串,而不用使用转移字符。
使用连续三个单引号或双引号,可以帮助我们创建多行字符串。
转义字符
我们可以使用“\+特殊字符”,实现某些难以用字符表示的效果,比如换行超详细总结:python的转义字符及用法_python转义字符的作用和用法-CSDN博客
字符串拼接
1、可以使用+将多个字符串拼接起来、
如果+两边都是字符串则拼接
如果+两边都是数字则加法
如果+两边类型不同,则抛出异常
2、可以将多个字面字符串直接放到一起实现拼接。
不换行打印
我们前面调用print时,会自动打印一个换行符。有时,我们不想换行,不想自动添加换行符。我们可以自己通过参数“end=”任意字符串、实现末尾添加任何内容:
str()实现数字转型字符串
str()可以帮我们将其他数据类型转换为字符串
当我们调用print函数时,解释器自动调用了str()将非字符串的对象转成了字符串。
使用[]提取字符
字符串的本质就是字符序列,我们可以通过在字符串后面加【】,在[]里面制定偏移量,可以提取该位置的单个字符。
正向搜索:
最左侧第一个字符,偏移量是0,第二个偏移量是1,以此类推。
最右侧第一个字符,偏移量是-1,倒数第二个偏移量是-2,以此类推。
replace()实现字符串替换
字符串不可改变。但是我们确实有时候需要替换某些字符,这时只能通过创建新的字符串来实现。
整个过程中,实际上我们是创建了新的字符串对象。并指向了变量a,而不是修改了以前的字符串。
字符串切片slice操作
切片slice操作可以让我们快速地提取字符串。
标准格式为:[起始偏移量start:终止偏移量end:步长step]
【:】提取整个字符
split()分割和join()合并
split()可以基于指定分隔符将字符创分割成多个字符串(存储到列表中)。如果不指定分隔符,则默认使用空白字符(换行符、空格、制表符)
join()作用和split()作用刚好相反,用于将一系列子字符串连接起来。
拼接字符串要点:
使用字符串拼接符+,会生成新的字符串对象,因此不推荐使用+来拼接字符串。推荐使用join函数,因为join函数在拼接字符串之前会计算所有字符串的长度,然后逐一拷贝,仅新建一次对象。
字符串驻留机制和字符串比较
字符串驻留:仅保存一份相同且不可变字符串的方法,不同的值被存放在字符串驻留池中。Python支持字符串驻留机制,对于符合标识符规则的字符串(仅包含下划线、字母和数字)会启用字符串驻留机制。
去除首尾信息
可以通过strip()去除字符串首尾指定信息
Python strip()方法 | 菜鸟教程 (runoob.com)
大小写转换
编程中关于字符串大小写
a.capitalize() 产生新的字符串,首字母大写
a.title() 每个单词都首字母大写
a.upper() 所以字符转换成大写
a.lower() 所有字符转换成小写
a.swapcase() 所有字母大小写转换
格式排版
center()、ljust()、rjust()
字符串的格式化
format()基本用法
python 2.6开始,新增了一种格式化字符串的函数str.format(),它增强了字符串格式化的功能。
基本语法是通过{}和:来代替以前的%。
format 函数可以接受不限个参数,位置可以不按顺序。
我们可以通过示例进行格式化的学习。
可以通过{索引}/{参数名},直接映射参数值,实现对字符串的格式化,非常方便
填充与对齐
序列
序列是一种数据存储方式,用来存储一系列的数据。在内存中,序列就是一块用来存放多个值的连续的内存空间。比如一个整数序列【10,20,30,40】
序列中存储的是整数对象的地址,而不是整数对象的值
在内存中,序列就是一块用来存放多个值的连续的内存空间。
Python的列表大小可变,根据需要随时增加或缩小。
字符串和列表都是序列类型,一个字符串是一个字符序列,一个列表是任何元素的序列。
列表元素的增加和删除
当列表增加和删除元素时,列表会自动进行内存管理,大大减少了程序员的负担。但这个特点涉及列表元素的大量移动,效率较低。除非必要,我们一般只在列表的尾部添加元素或删除元素,这会大大提高列表的操作效率。
append()方法
+运算符操作
并不是真正的尾部添加元素,而是创建新的列表对象,将原列表的元素和新列表的元素依次复制到新的列表对象中。这样,会涉及大量的复制操作,对于操作大量元素不建议使用。
extend()方法
将目标列表的所有元素添加到本列表的尾部,属于原地操作,不创建新的列表对象。
乘法拓展
使用乘法拓展列表,生成一个新列表,新列表元素是原列表元素的多次重复。
列表元素的删除
del删除
删除列表指定位置的元素
pop方法
pop()删除并返回指定位置元素,如果未指定位置则默认操作列表最后一个元素。
remove()方法
删除首次出现的指定元素,若不存在该元素抛出异常。
列表元素访问和计数
通过索引直接访问元素
我们可以通过索引直接访问元素。索引的区间在[0,列表长度-1]这个范围。超过这个范围则会抛出异常。
index()获得指定元素在列表中首次出现的索引
index()可以获取指定元素首次出现的索引位置。语法是:index(value,[start,[end]])).其中,start和end指定了搜索的范围。
count()获得指定元素在列表中出现的次数
a=[10,20,30,40,50,20,30,20,30]
a.count(20)
3
len()返回列表长度
即列表中包含元素的个数
成员资格判断
判断列表中是否存在指定的元素,我们可以使用count()方法,返回0则表示不存在,返回大与0则表示存在。但是,一般我们会使用更加简洁的in关键字来判断,直接返回True或False
列表的遍历
for obj in listObj:
print(obj)
列表排序
修改原列表,不建新列表的排序
建新列表的排序
我们也可以通过内置函数sorted()进行排序,这个方法返回新列表,不对原列表做修改
Python sorted() 函数 | 菜鸟教程 (runoob.com)
Python之排序函数sorted()详解_python中sorted-CSDN博客
reversed()返回迭代器
内置函数reversed()也支持进行逆序排列,与列表对象reverse()方法不同的是,内置函数reversed()
不对原列表做任何修改,只是返回一个逆序排列的迭代器对象。
sum max min
多维列表
二维列表
第四章
控制语句
我们在前面学习的过程中,都是很短的示例代码,没有进行复杂的操作。现在,我们将开始学习流程控制语句。
前面学习的变量、数据类型(整数、浮点数、布尔)、序列(字符串、列表、元祖、字典、集合)可以看做是数据的组织方式。数据可以看做是砖块
流程控制语句是代码的组织方式,可以看做是混凝土
一个完整的程序,离不开砖块,也离不开混凝土,他们的组合,才能让我们建立从小到一个方法大到操作系统,这样各种各样的软件
选择结构
三元条件运算符
Python中的三元运算符:简洁高效的条件表达式_python三元运算符-CSDN博客
for x in (10,20,30)
print(x)
range对象
range对象是 一个迭代器对象,用来产生指定范围的数字序列。格式为
range(start,end,【step】)
生成的数值序列从start开始到end结束(不包含end)若没有填写start,则默认从0开始。
step是可选的步长,默认为1.
打印九九乘法表
for m in range(1,10):
for n in range(1,m+1):
print("{0}*{1}={2}".format(m,n,(m*n)),end="\t")
print()#换行
#使用列表和字典存储表格的数据
r1= dict(name="zhangsan",age=18,salary=30000,city="北京”)
r2= dict(name="lisi",age=19,salary=20000,city="上海")
r3= dict(name="wangwu",age=20,salary=10000,city="深圳”)
tb=[r1,r2,r3]
for x in tb:
if x.get("salary")>15000:
print(x)
循环代码优化
虽然计算机越来越快,空间也越来越大,我们仍然要在性能问题上斤斤计较。编写循环时,遵守下面三个原则可以大大提高运行效率,避免不必要的低效计算:
1.尽量减少循环内部不必要的计算
2.嵌套循环中,尽量减少内层循环的计算,尽可能向外提。
3.局部变量查询较快,尽量使用局部变量
其他优化手段
1.连接多个字符串,使用join()而不适用+
2.列表进行元素插入和删除,尽量在列表尾部操作
使用zip()并行迭代
我们可以通过zip()函数对多个序列进行并行迭代,zip()函数在最短序列“用完”时就会停止。
推导式创建序列
推导式是从一个或者多个迭代器快速创建序列的一种方法,它可以将循环和条件判断结合,从而避免冗长的代码,推导式是典型的Python风格,会使用它代表你已经超过python初学者的水平
列表推导式
集合推导式
字典推导式21. Python的字典推导(Dictionary Comprehension)_python 字典推导-CSDN博客
生成器推导式(生成元组)
一个生成器只能运行一次,第一次迭代可以得到数据,第二次迭代发现数据已经没有了
函数用法和底层分析
函数是可重用的程序代码块,函数的作用,不仅可以实现代码的复用,更能实现代码的一致性。一致性指的是,只要修改函数的代码,则所有调用该函数的地方都能得到体现。
在编写函数时,函数体中的代码写法和我们前面讲述的基本一致,只是对代码实现了封装,并增加了函数调用、传递函数、返回计算结果等内容、
为了让大家更容易理解,掌握的更深刻。我们也要深入内存底层进行分析。绝大多数语言内存底层都是高度相似的,这样大家掌握了这些内容也便于以后学习其他语言。
函数的基本概念
1.一个程序由一个个任务组成;函数就是代表一个任务或者一个功能、
2.函数是代码复用的通用机制
Python函数的分类
1.内置函数
2.标准库函数
3.第三方库函数
4.用户自定义函数
Python中,定义函数的语法如下:
def 函数名 (【参数列表】):
“文档字符串”
函数体/若干语句
要点:
1、我们使用def来定义函数,然后就是一个空格和函数名称;
Python执行def时,会创建一个函数对象,并绑定到函数名变量上。
2.参数列表
圆括号内是形式参数列表,有多个参数则使用逗号隔开
形式参数不需要声明类型,也不需要指定函数返回值类型。
无参数,也必须保留空的圆括号
实参列表必须与形参列表一一对应
文档字符串_函数注释
程序的可读性最重要,一般建议在函数体开始的部分附上函数定义说明,这就是“文档字符串”,也有人称为函数的注释。我们通过三个单引号或者三个双引号,中间可以加入多行文字进行说明。
返回值
return返回值要点:
1.如果函数体中包含return语句,则结束函数执行并返回值;
2.如果函数体中不包含return语句,则返回None值。
3.要返回多个返回值,使用列表、元组、字典、集合将多个值“存起来”即可
变量的作用域
变量起作用的范围称为变量的作用域,不同作用域内同名变量之间不影响
变量分为:全局变量、局部变量
全局变量:
1.在函数和类定义之外声明的变量。作用域为定义的模块,从定义位置开始直到模块结束。
2。全局变量降低了函数的可读性和通用性。应尽量避免全局变量的使用。
3.全局变量一般做常量使用
4。函数内要改变全局变量的值。使用global声明一下
局部变量:
1.在函数体中(包含形式参数)声明的变量。
2.局部变量的引用比全局变量快
3.如果局部变量和全局变量同名,则在函数内隐藏全局变量,只使用同名的局部变量。
参数的传递
函数的参数传递本质上就是:从实参到形参的赋值操作。Python中“一切皆对象”,所有的赋值操作都是“引用的赋值”。所以,Python中参数的传递都是“引用传递”,不是“值传递”。具体操作时分为两类:
1、对“可变对象”进行“写操作”,直接作用于原对象本身。
2、对“不可变对象”进行“写操作”,会产生一个新的“对象空间”,并用新的值填充这块空间。(起到其他语言的“值传递”效果,但不是“值传递”)
可变对象有:
字典、列表、集合、自定义的对象
不可变对象有:
数字、字符串、元组、function等