昨日内容
文本模式下的r模式 | 二进制下的rb模式 | |
---|---|---|
括号里的数字read() | 代表读取多少个字符 | 代表读取多少个字节。英文是1个字节,中文是3个字节 |
f.tell() | f.seek(offset,whence) | |
---|---|---|
简介 | 表示文件从头到尾的字节数 | 代表代码来控制光标的移动 |
offset:控制光标的移动量,以字节为单位。 whence:移动模式(正负表示方向相反,为正则从左往右) | ||
0 文件位置的开头移动多少字节 、1 光标所在的位置移动多少字节 、2 文件末尾移动多少字节 (注意1和2只有在二进制下使用,0无所谓。) |
机器硬盘 | |
---|---|
简介 | 1.数据修改就是覆盖原来的数据写进新的数据---覆盖写 |
2.数据的删除就是数据由占有态转变成自由态。 | |
覆盖写 | 先读取文件的内容到内存进行修改,后保存到一个变量或者一个容器中,再用w模式打开文件写入,就是用w模式先清除原本内容再写入新内容。 |
优点:只占了硬盘一块空间 | |
缺点:数据量较大的时候会造成内存溢出 | |
重命名 | 写读取文件的内容到内存是哪个修改,后保存到另一个文件中,将原件删除新文件重命名为原文件。 |
优点:不会造成内存溢出 | |
缺点:可能会占硬盘也可能是内存还没刷到硬盘上占内存。 |
循环 | 函数 | |
---|---|---|
不同点 | 在相同位置位置反复执行相同代码 | 在不同位置反复执行相同代码 |
缺陷 | 1.只能统计某个固定的数据类型里面的数据值个数 | |
2.没有产生新的数据值---返回 |
今日内容
函数可以看成工具:提前定义好,之后可以反复使用。
没有函数类似于每次都是每换个地方就要重新创造工具。
有函数类似于每次在不同的地方都可以使用已创造好的工具反复使用。
#定义函数 def my_func(): pass #调用函数 my_func()
def 函数名(参数1,参数2) '''函数注释''' return 返回值
简介 | |
---|---|
def | 定义函数的关键字 |
函数名 | 与变量名的命名一致,尽量做到见面知意 |
括号 | 在定义函数是时候函数名 |
参数 | 定义函数括号可以写参数(个数不固定),也可以不写参数用于接收外界传递给函数体代码内部的数据。 |
函数注释 | 类似于说明书,用于介绍函数的主题功能和具体用法。 |
函数体代码 | 整个函数最核心的区域(逻辑代码) |
return | 控制函数的返回值(就是函数体代码运行结束有没有反馈,结果) |
函数必须先定义再使用
定义函数使用def
关键字 + 函数名
,调用函数使用 函数名 + ( )
。(括号内可以添加一个或多个或者不添加参数。)
函数在定义阶段只检测函数体代码语法
,不执行函数代码。只有在调用阶段才会真正的执行函数体代码。
函数名到底是什么?
内存地址
,里面存放了函数体代码
。函数名 + ( )
def func(): print('from func')#from func print(func) #<function func at 0x000002C5B0608700> print(func()) #None
内置函数
解释器已经定义好的函数,用户可以直接调用
注意:
内置函数可以直接调用 eg: len()
内置方法(函数),必须要前面加 数据类型 + . + 内置方法
d的方式才可以调用。eg:str.strip() 相当于数据类型独有的一些内置方法。
自定义函数
空函数
函数体代码用pass代替,暂时没有任何功能。
主要用于前期的项目搭建,提示主要功能。
def run(): pass
无参函数
函数定义阶段括号内没有填写参数
def func(): print('from func') #无参函数调用直接 函数名+括号 即可,可以添加数据值也可以不用 func()
有参函数
函数定义阶段括号内填写参数
def func(a, b): print('from func') #调用有参函数需要 函数名+括号并且括号内填数据值 func(1,2)
什么是返回值?
就是调用函数之后产生的结果,可有可无。
获取函数的返回值的方式是固定的
变量名 = 函数()
上述方式有则获取,没有则默认接收None
。
函数体代码没有return关键字:默认返回None
。
def func(): print('from func') #from func res = func() print(res) # None
函数体代码有return关键字:后面没有没有内容,则返回值也是None
。
def func(): print('from func') #from func return res = func() print(res) # None
函数体代码有return关键字:后面有内容,则返回该内容。
(如果是数据值则返回该数据值;如果是变量则找到该变量对应的数据值再返回该数据值。)
注意:变量名只是起过渡作用,最终还是找到具体数据值。
def func(): print('from func') #from func return 666 res = func() print(res) #666 def func(): print('from func') #from func name = 'xz' return name res = func() print(res) # xz
函数体代码有reyturn关键字并且后面写了多个数据值(名字)用逗号隔开
:默认情况下会自动组织元组
返回。
#逗号隔开,成元组 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':'jason'},123 res = func() print(res) # [1, 2, 3, 4]
注意:如果return 后面的数据值或者变量用逗号隔开,则返回值的数据类型是元组
。如果想要返回其他的数据类型可以加其他数据类型的符号 eg:[ ]
函数体代码遇到return关键字会立刻结束函数体代码的运行。
def func(): print('我在上面') return 123 print('我在下面') func() #我在上面
形式参数
函数在定义阶段括号内填写的参数---形参
实际参数
函数在调用阶段括号内填写的参数---实参
形参与形参关系
在函数调用阶段形参会临时与实参进行绑定,函数运行结束立刻解除。
<动态绑定,动态解除>
位置参数
在函数定义阶段括号内从左往右一次填写的变量名称之为位置形参。
位置实参
在函数调用阶段括号内从左往右依次填写的数据值称之为位置实参。
关键字实参
在函数调用阶段括号内内容是什么就是什么形式传值称之为关键字实参。
指名道姓的给形参传值(打破了位置的限制)。
位置实参必须在关键字实参前面。
小贴士:无论是形参还是实参,都遵循短的(构造简单)的在前面,长的(构造复杂)在后面。
同一形参在同一次调用只能传一次值。
def func(a, b): print(a, b) func(1, 2) #1 2 func(b=1,a=2) # 2 1 func(b=1,2) #会报错,因为位置参数必须在形参 func(2,b=1) #2 1 func(666,a=1) #会报错,因为位置参数已经将值传给a了,结果后面关键字参数也要传值给a,函数在同一形参上调用一次只能传一次值。
默认值形参
在函数定义阶段括号内容是什么就是什么形式填写的形参称之为默认值形参
def register(name, age, gender='male'): print(f""" -------------info----------- name:{name} age:{age} gender:{gender} ---------------------------- """) register('jason', 18) register('oscar', 28) register('jerry', 38) register('lili', 18, 'female')
1.在函数定义阶段截给形参绑定值,后续调用就可以不传值。 2.调用阶段不传值就使用默认的,传了就用传了的
可变长形参
可以打破形参和实参的个数,随意传值。
def func(*x): print(x)
* 在形参的作用: 接收多余的位置参数并组成元组的形式赋值给*后面的变量名。
def func(**y): print(y) func() # {} func(name='xz') # {'name': 'xz'} func(name='xz',age=18) # {'name': 'xz', 'age': 18} func(name='xz',age=18,hobby='read') # {'name': 'xz', 'age': 18, 'hobby': 'read'}
** 在形参的作用: 接收多余的关键字参数并组织成字典的形式赋值给**后面的变量
同时能接收位置参数和关键字参数的任意个数。
def func(*x, **y): print(x) print(y) func() # () {} func(1, 2) # (1,2) {} func(1, name='xz') #(1,) {'name': 'xz'} func(name='xz') # () {'name': 'xz'}
注意:能不能调用函数还会受到函数体代码的影响。