列表的内置方法
* 在列表调用内置方法之后不会产生新的值 而是修改的自身
* len()可以统计列表中数据值的个数
* 在尾部增加append() 括号内什么类型都是可以的 当成一个数据值进行追加
* 在任意位置插入数据值insert()括号内无论什么数据类型都是当成一个数据值插入
* 如果是扩展列表直接使用三种方法 .append() print(+) extend(这种是值得推荐的防方法 括号内必须支持for循环的数据类型 for循环+append)
* del 通过索引即可达成删除
* remove()括号内需要填上准确的数据值然后进行删除
* pop()默认取出列表末尾的数据值然后进行删除
* index()用于查看数据值对应的索引值
* count()用于统计莫格数据值出现的次数
* 升序 sort() 在括号内加上revers=ture就是降序
* .revers() 前后颠倒
可变与不可变的类型
* list可变类型就是值改变(内置方法)内存地址可以不改遍
l1 = [11, 22, 33]
print(id(l1)) # 1931283911552
l1.append(44) # [11, 22, 33, 44]
print(id(l1)) # 1931283911552
* 不可遍的类型有str int float 他们是值改遍(内置方法) 内存地址肯定变
s1 = '$hello$'
print(id(s1))
s1 = s1.strip('$')
print(id(s1))
ccc = 666
print(id(ccc))
ccc = 990
print(id(ccc))
元组内置方法
支持for循环的数据类型都可以转元组
当元组内只有一个数据值的时候 逗号不能省略
如果省略了 那么括号里面是什么数据类型就是什么数据类型
以后遇到可以存储多个数据值的数据类型 如果里面只有一个数据 逗号也趁机加上
字典的内置方法
字典都是直接定义使用的 很少涉及到转换 在字典里k是对v的描述性的一般字符 k只要是不可变的类型都是可以的
- 在字典内k:v是无序的
- info[键]=值 键值存在是修改 不存在是新增
- 统计字典中键值对的个数也是使用len
- 修改数据 只要键值在就是直接进行修改
- 新增数据使用salary 键值不存在就是新增一个数据
- 删除数据
1:del 直接删除
2:pop 也是可以直接进行删除
3:popitem 随即删除
- keys 获取的是k值 结果当成列表使用 valuse()获取的是字典所有的v值 结果当成列表使用即可 item获取kv键值组成元组
- 修改字典数据使用update()健存在则是修改 不存在则是新增一个新的数据
- fromkeys 统一指向一个值 给的值在默认的情况下所有的键都用一个
- setdefault 健存在则获取相应的值不存在则设置新值并回到新的值
集合内置方法
set()支持for循环的使用关键字才可以使用并且数据必须是不可变的类型(整型 浮点型 字符串 元组 布尔值)
垃圾回收机制
- 在python中他自己会自动申请和释放内存空间
- 引用计数就是当一个数据值在被引用的次数不为0次的时候则表示这个数据值还有用 不会被当成垃圾删除 如果这个数据值被引用的次数为0则要被当成垃圾进行回收
- 标记清楚专门用来解决循环引用的问题上 将内存中的所有数据值都检查一遍是否存在循环然后进行标识 最后进行删除
- 分段时间进行检查所有数据的使用率 因资源消耗过大为了减轻垃圾回收机制的资源消耗 越往后检测频率越低
发展史
- 从一开始计算机是由美国人发明 使用的是英文字符
- ASCII码:内部记录了英文字符和数字的对应的关系
A-Z 69-90
a-z 97-122
使用1bytes来存储字符
在这个阶段计算机只能识别英文 无法识别其他文字
- EBK码:由于需要让计算机识别中文 就开发了一套中文字符 内部记录了中文字符 英文字符与数字的对应的关系
2bytes起步存储中文
1bytes存储英文
- unicode:是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码 以满足跨语言、跨平台进行文本转换、处理的要求。
- utf:针对unicode进行的优化 utf8
英文采用1bytes 其他的都是统一采用3bytes
内存使用Unicode 硬盘使用utf8
字符编码的实际应用
- 在使用编码解码只用字符串可以 其他的需要进行转换才可以使用编码解码
- 开始使用什么编码保存的就用什么编码打开
- 编码就是将信息转换成计算机能够读懂的代码 encode
- 解码就是将计算机的代码转换成我们能读懂的信息decode
在解释器里面python2默认的编码是ASCII码 在python3中默认的编码是utf8
如果需要写文件进行编码的话需要加上coding:utf8 在所有的字符串前面加上小字母u
文件操作的简介
- 使用写代码进行自动操作的文件读写
- 代码操作文件使用open(文件路径,读写模式,字符编码)
方式1:使用一个变量=open()打开这个文件 再加上f.close()进行关闭
方式2:使用with open() as 变量名: 在这里就是子代码运行结束以后自动使用close()进行关闭
- 针对文件路径在使用的时候可能存在特殊含义 在字符串前面加上r就可取消特殊含义了
文件的读写模式
with支持一次性打开多个文件 pass补全语法但是不执行任何操作 通常情况下英语单词末尾加上able便是具备了该单词的描述能力
* r 只读模式 也是默认的模式 使用该模式打开的文件只能做读的操作 不能写
文件路径不存在: r模式直接报错
with open(r‘从.txt'.'r',encoding='utf8')as f:
pass
文件路径存在: r模式会打开文件等待读取文件内容
with open(r'a.txt', 'r', encoding='utf8') as f:
print(f.read())
f.write('123')
* w 只写模式 使用该模式打开的文件只能够些内容 不能做读操作
文件路径不存在: w模式会自动创建该文件
with open(r'c.txt', 'w', encoding='utf8') as f:
pass
文件路径存在: w模式会先清空该文件内容 之后等待填写新内容
with open(r'a.txt', 'w', encoding='utf8') as f:
pass
* a只追加模式 使用该模式打开的文件默认在末尾追加新的内容 不能做其他的操作
文件路径不存在: a模式会自动创建该文件
# with open(r'd.txt', 'a', encoding='utf8') as f:
# pass
# 文件路径存在: a模式不会先清空该文件内容 只在在文件末尾等待填写新内容
with open(r'b.txt', 'a', encoding='utf8') as f:
f.write('听党指挥能打胜仗\n')
文件的操作模式
* t 文本模式也是文件操作的默认模式
r rt
w wt
a at
只能操作文本文件
必须指定encoding参数
读写都是以字符串为单位
b 二进制模式
rb wb ab 三者必须自己指定不能省略
能够操作所有类型的文件
不需要指定encoding参数
读写都是以bytes为单位
文件操作的诸多方法
read()一次性读取文件内容并且光标会停留在末尾 继续读下去就是空白的
for line in f:
print(line)
文件对象支持for循环一次只读一行
文件内光标的移动
read()
在文本模式下括号内表示读取几个字符
在二进制模式下表示读取几个字节
tell() 表示获取光标一定的字节数
offset 控制光标移动的位移量
whence 模式
0 文件开头移动多少字节
1 光标当前所在位置移动多少字节
2 文件末尾移动多少字节
1和2只能在二进制模式下使用
文件内数据修改
1.覆盖写:先读取文件内容到内存 在内存中完成修改 之后w模式打开该文件写入
方式1:覆盖写
with open(r'demo.txt','r',encoding='utf8') as f:
data = f.read()
new_data = data.replace('DSB','NB')
with open(r'demo.txt','w',encoding='utf8') as f1:
f1.write(new_data)
2.重命名:先读取文件内容到内存 在内存中完成修改 之后保存到另外一个文件中再将原文件删除 将新的文件重命名为原文件
import os
with open('demo.txt', 'r', encoding='utf8') as read_f, \
open('.demo.txt.swap', 'w', encoding='utf8') as wrife_f:
for line in read_f:
wrife_f.write(line.replace('NB', 'SB'))
os.remove('demo.txt') # 删除文件
os.rename('.demo.txt.swap', 'demo.txt') # 重命名文件
函数的简介
函数:减少重复代码的编写,在不同位置反复执行相同代码。
函数的本质
- 刚开始的时候我们可以把函数当成一个工具 提前准备好 等到需要使用时候就可以拿出来使用了。(必须是提前定义好,而后才可以进行使用)
- 我们在往后会说成调用函数 或者函数的调用
函数的语法与结构
-
def函数名(参数1,参数2):
函数注释:用来给函数进行解释
函数代数体:缩进行构成了函数体
return:这是函数的返回值
-
def 是定义函数的关键字
-
函数名与变量名一致 要做到让我们见名就知道意思
-
括号在定义函数的时候后面必须加上括号
-
参数是在函数括号内写的,个数不固定,也可以不写用于接收外界传递给函数的整体代码内部的数据
-
函数注释就类似于说明书 用于介绍函数的功能和用法
-
函数体代码:整个函数的中心的 重要的部分
-
return 控制函数的返回值
函数的定义与调用
- 函数是必须先进行定义好的而后在进行的使用的
- 定义函数需要使用def关键字调用函数需要使用函数名+(在这个括号内可能需要添加相应的参数)
- 函数在被定义的阶段值检测函数体代码语法 不执行函数体的代码 只有在调用的阶段才会真正的去执行函数体代码
- 函数名就是绑定的一块内存地址 里面存了很多的的代码 如果需要使用需要进行调用 函数名+()
函数名+()执行优先等级是最高的 (除了定义阶段)
函数的分类
- 解释器提前帮我们定义好的函数用户可以直接调用 len()
内置函数是可以直接调用的 但是数据类型的函数内置方法必须使用数据类型点的方式才可以进行调用 这也就是数据类型独有的一些内置方法
自定义函数
* 空函数体代码使用pass代替 暂时没有任何功能 主要用于前期的项目搭建 提醒主要功能
def run():
pass
* 无参函数体是在定义阶段括号内没有填写的参数
def func():
print('from func')
无参函数直接函数名+()进行调用
*有参函数是在函数定义阶段括号内填写的参数
def func(a,b):
parnt(‘from func’)
调用有参函数需要函数名+()并且给上数据值
函数的返回值
返回值就是调用函数后产生的结果 可有可无 获取函数值返回的方式是固定的 变量名=函数() 有返回值就获取 没有给到none
* 函数体代码没有return关键字默认返回None
def func():
print('from func')
res = func()
print(res) =None
* 函数体代码有return关键字后面写也是返回None
def func():
print('from func')
return
res = func()
print(res) = None
* 函数体代码有return关键字,后面写什么就返回什么 如果是数据值就烦直接返回 如果是变量就需要找到相对应的数据值返回
def func():
print('from func')
return 666
res = func()
print(res)
def func():
print('from func')
name = 'yqb'
return name
res = func()
print(res) = yqb
* 函数体代码有return关键字并且后面写了很多歌数据值用逗号隔开在这种情况下默认用元组的方式进行返回
def func():
return 1, 2, 3, 4
res = func()
print(res) # (1, 2, 3, 4)
def func():
return [1, 2, 3, 4]
res = func()
print(res) # [1, 2, 3, 4]
def func():
return [1, 2, 3, 4],{'name':'yqb'},123
res = func()
print(res) = [1, 2, 3, 4]
* 当函数体代码遇到return关键字就会立刻结束函数体代码的运行
def func():
print('我在上面')
return 123
print('我在下面')
func()
函数的参数
- 函数的参数分为两大类 1形式参数在函数定义的阶段内填写的参数==形参 2实际参数实在调用阶段括号内填写的参数==实参
形参就相当于变量名 实参就相当于数据值 在函数调用阶段形参会临时与实参进行绑定 函数运算立刻结束
位置参数
- 位置形参在函数中定义阶段括号内从左到右依次填写的变量名称之为位置形参
- 位置实参实在函数调用阶段括号内从左到右依次填写的数据值称之为位置实参
实参可以是数据值也可以是绑定了数据值的变量名.给位置形参传值时必须个数一致 多一个少一个都不可以的
关键字参数=关键字实参
- 在函数调用阶段括号内以什么等于深恶的形式传值称之为关键字实参
指名道姓的给形参传值 位置实参必须在关键字前面(不管是形参还是实参都必须遵循简短的在前面 复杂的在后面) 同一个形参再一次调用中只能传一次值
def func(a, b):
print(a, b)
func(1, 2)
func(b=1,a=2)
func(b=1,2)
func(2,b=1)
func(666,a=1)
默认值参数=默认值形参
在函数定义阶段括号内以什么等什么的形式填写的形参称之为默认值形参
在函数定义阶段就将形参绑定值 在后续使用就可以不传。顶用阶段不传值就使用默认的传了值就用传了的值。也得遵循简单的在左边 复杂的在右边
可变长形参
* 可以打破形参与实参的个数限制 随意传值
def func(* x):
print(x)
在形参的作用中接受多余的位置参数并组成元组的形式赋值给* 后面的变量名
def func(* * y):
print(y)
func() = {}
func(name='yqb') = {'name': 'yqb'}
func(name='yqb',age=18) = {'name': 'yqb', 'age': 18}
func(name='yqb',age=28,hobby='run') = {'name': 'yqb', 'age': 28, 'hobby': 'run'}