文件操作
打开方式 #推荐用第二种
1.f = open(文件路径,读写模式,encoding='utf8')
f.close
2.with open(文件路径,读写模式,encoding='utf8') as f
\n撬棍加一些字母会产生一些特殊含义,导致路径混乱,查找不到,在路径前面加上r,就是原字符的意思
with支持一次性打开多个文件,用逗号隔开
读写模式
'r'只能看不能写,找不到文件会报错
with open(r'a.txt','r', encoding='utf8') as f:
print(f.read())
'w'只能写不能看
没有文件自动创建
每次打开会先删除原有内容在写新的
一次性写多个write要自己加换行符
with open(r'a.txt','w', encoding='utf8') as f:
f.write()
'a'尾部追加
文件末尾添加数据
with open(r'a.txt','w', encoding='utf8') as f:
pass
编写代码的时候不知道写什么可以用pass补全
文件操作模式
t 文本模式 rt wt at 默认模式,只写r w a也可以
只能操作文本文件
读写以字符串为单位
要指定 encoding 参数
b 二进制模式 bytes rb wb ab
需要写全 rb wb ab
可以操作任意类型文件
读写以 bytes为单位
不需要编码,本身已经是二进制
文件的诸多方法
read()
一次性读取文件全部内容,并且光标停留在尾部
for循环
一行行读取文件内容
readline()
一次只读一行内容
readlines()
一次性读取文件内容,会按照行数组织成列表的一个个数据值
readable()
判断文件是否具备读数据的能力
write()
写入数据
writeable()
判断文件是否具备写的能力
writelines()
接收一个列表,一次性将列表中所有的数据值写入
flush()
将内存中的文件一次性刷到硬盘 等于Ctrl + s
文件内光标的移动
print(f.seek(0,0))
f.seek(offset,whence)
offset是位移量
文本模式以字符为单位向后移动,负数是向前移动
二进制模式以字节为单位
whence是模式
0是基于开头,文件和二进制都可以用
1是基于当前位置,只有二进制可以用
2是基于末尾,只有二进制可以用
f.seek
print(f.tell())
f.tell 返回光标距离开头文件产生的字节
计算机修改原理
硬盘写数据可以看成是在硬盘上刻字 一旦需要修改中间内容 则需要重新刻字
因为刻过的字不可能从中间再分开
硬盘删除数据的原理
不是直接删除而是改变状态 等待后续数据的覆盖才会被真正删除
文件内容修改
1 覆盖写
2 换地写
函数格式
def 函数名(参数):
'''函数注释'''
函数体代码
return 返回值
1.def
定义函数的关键字
2.函数名
命名等同于变量名
3.参数
可有可无 主要是在使用函数的时候规定要不要外界传数据进来
4.函数注释
类似于工具说明书
5.函数体代码
是整个函数的核心 主要取决于程序员的编写
6.return
使用函数之后可以返回给使用者的数据 可有可无
函数的定义与调用
1.函数在定义阶段只检测语法 不执行代码
def func():
pass
2.函数在调用阶段才会执行函数体代码
func()
3.函数必须先定义后调用
4.函数名加括号是调用
函数的分类
1.空函数
函数体代码为空 使用的pass
def register():
pass
2.无参函数
定义函数的时候括号内没有参数
def index():
print('from index function')
index()
3.有参函数
定义函数的时候括号内写参数 调用函数的时候括号传参数
def func(a):
print(a)
func(123)
函数的返回值
1.调用函数之后返回给调用者的结果
2.变量名 赋值符号 函数的调用
res = func() # 先执行func函数 然后将返回值赋值给变量res
3.函数返回值的多种情况
3.1.函数体代码中没有return关键字 默认返回None
3.2.函数体代码有return 如果后面没有写任何东西还是返回None
3.3.函数体代码有return 后面写什么就返回什么
3.4.函数体代码有return并且后面有多个数据值 则自动组织成元组返回
3.5.函数体代码遇到return会立刻结束
def index():
print('from index')
return 666
res = index()
print(res) #返回值666
函数的参数
形式参数
在函数定义阶段括号内填写的参数 简称'形参'
实际参数
在函数调用阶段括号内填写的参数 简称'实参'
形参与实参的关系
形参类似于变量名 在函数定义阶段可以随便写 最好见名知意
def register(name,pwd):
pass
实参类似于数据值 在函数调用阶段与形参临时绑定 函数运行结束立刻断开
register('jason',123)
形参name与jason绑定 形参pwd与123绑定
函数的传参
位置参数(按照位置一一对应,少了,多了会报错)
位置形参
函数定义阶段括号内从左往右依次填写的变量名
def func1(a, b, c):pass
位置实参
函数调用阶段括号内从左往右依次填写的数据值
func1(1, 2, 3)
关键字参数(指名道姓的传)
关键字形参
别名叫默认参数:提前就已经给了,用户可以不传,也可以传
在函数定义阶段,直接给形参赋值
调用的时候传了就是你输的,不传就是之前写的
关键字实参
关键字传参一定要跟在位置传参的后面,不然会报错
同一个形参在调用的时候不能多次赋值,不然会报错
实参没有固定的定义 可以传数据值 也可以传绑定了数据值的变量名
可变长参数
可变长形参
def func1(*a): def func3(**k):
print(a) print(k)
*号在形参中
用于接收多余的位置参数 组织成元组赋值给*号后面的变量名
**号在形参中
用于接收多余的关键字参数 组织成字典的形式赋值给**号后面的变量名
可变长实参
*在实参中
类似于for循环 将所有循环遍历出来的数据按照位置参数一次性传给函数
**在实参中
将字典打散成关键字参数的形式传递给函数
(就是把字典里的键变成变量名,值还是值,再让变量名=值)
由于*和**在函数的传参中使用频率很高 后面跟的变量名推荐使用
*args
**kwargs
名称空间
1.内置名称空间
解释器运行自动产生 里面包含了很多名字
2.全局名称空间
py文件运行产生 里面存放文件级别的名字
3.局部名称空间
函数体代码运行\类体代码运行 产生的空间
名称空间存活周期及作用范围
存活周期
内置名称空间
python解释器启动则创建 关闭则销毁
全局名称空间
py文件执行则创建 运行结束则销毁
局部名称空间
函数体代码运行创建 函数体代码结束则销毁(类暂且不考虑)
作用域
内置名称空间
解释器级别的全局有效
全局名称空间
py文件级别的全局有效
局部名称空间
函数体代码内有效
名字的查找顺序
1.当我们在局部名称空间中的时候
局部名称空间 >>> 全局名称空间 >>> 内置名称空间
2.当我们在全局名称空间中的时候
全局名称空间 >>> 内置名称空间
函数的用法
global
局部名称空间直接修改全局名称空间中的数据
nonlocal
内层局部名称空间修改外层局部名称空间中的数据
函数名的多种用法
1.可以当做变量名赋值
2.可以当做函数的参数
3.可以当做函数的返回值
4.可以当做容器类型(可以存放多个数据的数据类型)的数据
闭包函数
1定义在函数内部的函数
2用到了外部函数名称空间中的名字
装饰器模板
def outer(func):
def inner(*args, **kwargs):
# 执行被装饰对象之前可以做的额外操作
res = func(*args, **kwargs)
# 执行被装饰对象之后可以做的额外操作
return res
return inner
语法糖
语法糖会自动将下面紧挨着的函数名当做第一个参数自动传给
@函数名(就可以调用)
有参装饰器模板
def outer_plus(mode):
def outer(func_name):
def inner(*args, **kwargs):
res = func_name(*args, **kwargs)
return res
return inner
return outer
递归函数
1.直接或者间接调用自己
2.每次调用都必须比上一次简单 并且需要有一个明确的结束条件
三元表达式
res = '老师' if name == 'jason' else '学生'
数据值1 if 条件 else 数据值2
条件成立则使用数据值1 条件不成立则使用数据值2
生成式
列表生成式
先看for循环 每次for循环之后再看for关键字前面的操作
new_list = [name + "_NB" for name in name_list]
字典生成式
s1 = 'hello world'
for i,j in enumerate(s1,start=100):
print(i,j)
集合生成式
res = {i for i in 'hello'}
print(res)
匿名函数
没有名字的函数 需要使用关键字lambda
lambda 形参:返回值
使用场景
lambda a,b:a+b
匿名函数一般不单独使用 需要配合其他函数一起用
内置函数
1.map() 映射
2.max()\min() 最大\最小
3.reduce 传多个值 返回一个值
4.zip 把多个列表中的数据值,能对应到位置的,以元组的方式返还出来
5.filter 过滤
6.sorted 默认升序
7.abs() 绝对值
8.all() 所有数据值对应的布尔值为True结果才是True 否则返回False
9.any() 所有数据值对应的布尔值有一个为True结果就是True 否则返回False
10.bin() oct() hex() int() 转进制数
11.bytes() 转换成bytes类型
12.callable() 判断名字是否可以加括号调用
13.chr() ord() 基于ASCII码表做数字与字母的转换
14.dir() 返回括号内对象能够调用的名字
15.divmod() 元组 第一个数据为整除数 第二个是余数
16.enumerate() 枚举,每个数据值从0开始标号
17.eval() exec() 能够识别字符串中的python并执行
18.hash() 哈希加密
19.id() input() isinstance() 某一个数据类型属于什么类型
20.open() 打开一个文件
21.pow() 幂指数(次方)
22.range() 生成一个含有多个数字的列表,用的时候在生产出来
23.round() 五舍六入
24.sum() 求和
可迭代对象
1.可迭代对象
对象内置有__iter__方法的都称为可迭代对象
2.可迭代对象的范围
不是可迭代对象
int float bool 函数对象
是可迭代对象
str list dict tuple set 文件对象
3.可迭代的含义
可迭代在python中可以理解为是否支持for循环
迭代器对象
1.迭代器对象
是由可迭代对象调用__iter__方法产生的
迭代器对象判断的本质是看是否内置有__iter__和__next__
2.迭代器对象的作用
提供了一种不依赖于索引取值的方式
正因为有迭代器的存在 我们的字典 集合才能够被for循环
for循环的本质
for 变量名 in 可迭代对象:
循环体代码
"""
1.先将in后面的数据调用__iter__转变成迭代器对象
2.依次让迭代器对象调用__next__取值
3.一旦__next__取不到值报错 for循环会自动捕获并处理
"""
标签:总结,__,return,函数,迭代,文件,第二周,def
From: https://www.cnblogs.com/8564129qwe/p/16797534.html