首页 > 编程语言 >python基础:文件操作、函数、名称空间、函数名称的多种用法、闭包函数、装饰器、递归函数、算法之二分法、三元表达式、各种生成式、匿名函数、常见内置函数、可迭代对象和迭代器对象以及for循环的本质、异

python基础:文件操作、函数、名称空间、函数名称的多种用法、闭包函数、装饰器、递归函数、算法之二分法、三元表达式、各种生成式、匿名函数、常见内置函数、可迭代对象和迭代器对象以及for循环的本质、异

时间:2023-02-04 18:33:40浏览次数:43  
标签:文件 函数 迭代 二分法 参数 名称 我们

目录

一、文件操作

1、概念介绍

所谓文件操作模式就是用代码对文件进行操作,跟我们使用鼠标打开文件进行操作是类似的,就是文件操作不需要保存

2、两种操作方式

①直接用open方法打开

f = open(文件路径,文件读写模式,encoding = 'utf8')

f.close()

直接使用open方法需要在使用结束后使用close方法关闭文件,并且一次只能打开一个文件。

②使用with方法打开

with open(文件路径,文件读写模式,encoding = 'utf8') as f1:

f.read()

使用with方法打开文件的时候可以一次打开多个不同的文件,并且在使用结束后不需要使用close方法

3、文件读写模式

文件的读写模式有三种:只读模式(r)、只写模式(w)、只追加模式(a)

每个读写模式的功能都跟字面意思一样

只读模式,只能读取文件内容,不能修改

只写模式,打开文件的时候会直接清空其中的内容,然后再写入内容,不能读取文件内容

只追加模式,只能在文件末尾写入内容,不能读取文件内容

4、文件的操作模式

文件操作模式我们学了两种:

一种是文本模式(t),只能对文本文件进行操作,默认情况下我们使用的都是t模式,这时候读写模式的字符可以省略t

第二种是二进制模式(b),二进制模式可以对所有类型的文件进行操作,但是当我们打开的时候读取到的内容是二进制内容,这时候部分文件,如文本可以转换之后再读取到内容,视频类型的其他文件需要用专用的应用打开才能读取内容。除此之外,在我们使用二进制模式的时候后面的encoding参数可以不写,但是中间的读写模式需要写全:rb、wb、ab

5、文件的诸多方法

当我们使用代码打开文件之后对他们进行操作的时候需要用到很多方法,下面举例一些常用方法的功能:

1、read()

读取文件内容

2、readline()

读取一行文件内容

3、readlines()

读取所有的文件内容,但是会根据行,分成很多项放到一个列表中

4、write()

写入内容

5、writelines()

一次性写入多个内容,内容放到列表中加到括号内

6、readable()

判断这个文件能不能读取

7、writeable()

判断这个文件能不能写入内容

8、flush()

强制保存一次,跟ctrl+s的作用一样

9、tell()

可以返回文件中光标当前所在的位置举例开头有多少字节数(一个字母一个字节,中文三个字节)

6、文件内的光标移动

当我们在对上文中的文件操作方法进行实验的时候,我们会发现read只能使用一次,再次使用就读取不到内容了,这是因为read方法一次性读取了所有的内容,这个时候文件光标移动到了最末尾,之后我们再使用read方法就读取不到内容了,这时候就需要引入一个方法:

seek(offset,whence)

对于seek函数的参数,我们使用的时候并不会直接用单词来表达,第一个位置的参数是需要移动光标的位移量,第二个位置是操作模式,下面我们介绍一下三种模式:

0

从文件的开头进行操作

1

从文件的当前位置进行操作

2

从文件的末尾进行操作

其中0模式是文本操作模式可以使用的,第一个位置的位移量参数表示移动的字符数。

二进制模式可以使用所有的模式,在二进制模式下所有的位移量都表示移动的字节数。

7、文件内容修改

①计算机硬盘修改数据的原理

这里引入硬盘修改数据的原理来方便理解文件修改内容的方式。

这里的硬盘指的是机械硬盘,在光盘上刻录数据,当我们对文件进行修改的时候有以下两种情况:

情况一:文件保存在原来的的位置

这种情况下文件修改后会生成一个临时文件,原来位置的文件会被删除,之后会把临时文件放到这个位置,然后把他命名成原文件的名称。

情况二:文件保存到了其他位置

这种情况下,我们修改了文件之后,原文件会被删除,内存中修改后的文件内容会保存到其他地方并命名成原来的名字。

当我们在使用python代码进行文件操作的时候,进行的也是这样的操作流程。

二、函数

1、概念

当一个功能的代码,需要被重复使用的时候,我们就会把他封装成函数,然后当我们需要使用这个功能的时候,调用函数就可以达成功能,需要再次编写类似的代码。相当于工具,没有封装成函数的时候就是相当于每次工作先造工具。

2、语法结构

def 函数名(参数):

函数内部功能代码

return 返回值

3、函数的定义与调用

我们使用def来定义函数,定义好了之后用函数名加()的形式就可以调用函数,函数运行完成后会返回一个返回值,我们可以用变量名来接收,如果不写返回值就会返回None。函数在定义与调用的过程中有一些注意事项:

1、我们使用函数的时候需要先定义后使用,否则报错。

2、在定义阶段,不会检测函数内部代码的语法错误,只要结构完整就能运行代码,调用函数的时候才会检测语法错误。

4、函数的分类

根据函数的特征我们把函数分成三类:空函数、无参函数、有参函数。

空函数就是内部没有代码,使用了pass或三个点补全语法结构的函数。内部没有功能代码。

无参函数就是函数内部有了功能代码,但是括号内没有参数

有参函数就是内部有了功能代码,并且右边的括号内有参数

5、函数的返回值

这个上面浅谈过一些,如果我们不写return就没有返回值,会返回None,如果写了return,函数内部代码运行到return就会停止运行,然后返回输入的返回值,如果没有就返回None。

6、函数的参数

参数分成形参和实参

形参就是定义阶段右边括号内的变量名

实参就是调用阶段右边括号内的变量名

我们可以把形参和实参理解成变量绑定数据值,形参就是变量名,实参就是我们输入的数据值。

这里我们根据参数的形式不同把参数分成以下几类(所有类型的参数都分为形参和实参):位置参数、关键词参数、可变长参数

位置参数

就是根据括号内的顺序,依次绑定参数

关键词参数

就是用变量绑定数据值的格式来传参,改变关键字形参的绑定值

可变长参数

因为有些时候我们需要接收很多的数据值当参数传参,这样的话用上面两种参数就很麻烦,因此有了可变长参数,可变长参数使用的是和**两个符号来达成功能的。后面跟上变量名就可以把接收的参数以元组的形式传到变量名中。因为使用频繁,所以python语法建议我们使用args和**kwargs来表示两种类型的可变长参数。

可变长形参

当我们使用args和**kwargs的时候两者有不同的意义,args接收多余的位置参数(如果前面没有别的位置参数就会把所有的位置实参都当成多余的),**kwargs用于接收多余的关键字参数(如果前面没有关键字参数就会把所有的关键字实参当成多余的)

可变长实参

当我们传参的时候也是用*和**来实现功能的,但是跟形参有所不同,在形参中是接收数据值,在实参中是把接受数据值的元组,内部数据值取出一个个进行传参。

7、参数的排序规则

当我们使用参数你时候需要遵循短的简单的在前面,长的复杂的在后面,因为这个原则会出现接收位置参数的可变长形参需要排在关键字参数的前面,这就导致了关键字参数在获取实参的时候会出现因顺序问题导致的传参失败,所以在这个情况下关键字形参需要用关键字实参来传参,这个过程又叫做命名关键字参数

三、名称空间

1、概念

名称空间就是存放变量名和函数名等名称的空间,总共有三种名称空间,第一种是内置名称空间,第二种是全局名称空间,第三种是局部名称空间。

2、名称空间的作用返回和存活周期

内置名称空间

是python解释器产生的,所以当python解释器运行的时候内置名称空间就产生了,当python解释器停止运行的时候内置名称空间关闭,因为内置名称空间是解释器产生的,所以它是作用到全局的代码的。

全局名称空间

是由py文件产生的,运行python代码的时候就会产生全局名称空间,代码运行结束的时候全局名称空间关闭,全局名称空间目前来说只能作用到自己所在的py文件中的代码

局部名称空间

是由函数产生的,当我们调用函数的时候局部名称空间产生,当函数运行结束的时候局部名称空间关闭,如果是内嵌函数的话,外层函数不会立刻关闭,会在内存函数也运行完之后才关闭局部名称空间

3、名称的查找顺序

这里我们记住一个规律就可以了,内部可以向外部查找,外部不能向内部查找。

在局部名称空间中找变量名或函数名,找不到会向外层查找,如果是嵌套函数就会先去外层的内置名称空间找,然后去全局名称空间找,再去内置名称空间找,找不到就报错

在全局名称空间找变量名或函数名的时候会现在全局名称空间找,找不到去内置名称空间找,之后找不到就报错

内置名称空间在找名称的时候只能在内置名称空间内找,找不到就会报错

4、global和nonlocal方法

当我们在使用函数的时候会出现一些情况,比如我们在函数内想要修改外层的全局名称空间的变量名绑定的值,或是内嵌函数想要修改外层包着的函数生成的局部名称空间中的变量名,这个时候就需要用到这两种方法:

global方法是用于修改全局名称空间中的变量名绑定的值,nonlocal是修改内嵌函数外层函数局部名称空间中的变量绑定的值

四、函数名称的多种用法

函数名称其实跟变量名差不多的意思,所以她也有很多用法

1、当成变量名右边的赋值对象

2、当成函数的返回值

3、当成函数的参数

4、函数还可以当成存储数据容器中的参数

比如放到字典中,根据键取值,这个值可以是函数名

五、闭包函数

闭包函数就是在嵌套函数的基础上,内存函数调用了外层的局部名称空间中的变量名

六、装饰器

1、概念简介

当我们工作中对老的代码新增功能的时候通常遵循不修改原代码的原则,因此有了装饰器,装饰器可以使我们在不修改原代码不改变调用方式的条件下新增其他功能

2、推导流程

这里就简单说一下吧,后面内容太多了,我们使用time模块计数

然后想统计一个函数的运行时间,这时候我们想到如果对不同的函数都进行计时的话,我们可以封装成函数,这样方便,之后我们想到检测不同函数需要调用不同函数,那么我们把函数名变成参数,之后我们又考虑到被检测的函数也是有参数的,所以我们想到给他加参数,但是因为不同函数参数个数类型不同,所以我们使用可变长参数来接收和传参,之后又考虑到传参不能跟在函数名后面,这样调用的时候接收不到,所以想到了第二种传参的方式,闭包函数,用闭包函数的外层接受函数名,内存用可变长形参接受,调用函数的时候用可变长实参传参,然后外层函数的返回值写成内层函数的函数名,接下来我们考虑到调用方式还没改变,因此我们想到用被包装的函数的名称当成变量来接收装饰器的结果,到此位置装饰器就基本完成了

3、模版

def outter(func):
    def inner(*args,**kwargs):
        res = func(*args,**kwargs)
        return res
    return inner

4、语法糖

我们在上面修改调用方式的那个步骤,因为用被包装函数的名称当变量名了,这确实有点绕,所以有了语法糖这个东西来代替这步骤,我们只需要在定义函数的代码上面写上@+装饰器函数名,就可以达到上面改变调用方式的目的,这里需要贴着函数。

5、多层语法糖

多层语法糖其实跟语法糖一样的流程拿下面的函数当参数传到上面的语法糖对应的装饰器中,再把得到的结果往上一次传参,然后就能得到运行的顺序

6、有参装饰器

考虑到我们在对被装饰函数执行其他功能的时候可能也会用到参数,所以我们又开始想怎么加参数了,直接传参肯定不行,因为外层参数是函数名称,内存是被装饰函数需要的参数,所以我们又想到用上闭包函数来传参。然后在语法糖部分需要先运行后面的函数名加括号部分,得到的结果再运行语法糖功能才是正确的运行流程

7、有参装饰器模板

def outter(a,b):
    def middle(func):
        def inner(*args,**kwargs):
            c = a+b
            res = func(*args,**kwargs)
            return res
        return inner
    return middle
@outter(1,2)
def func1():pass

8、装饰器修复技术

当我们用help方法查看函数内容的时候我们发现被装饰函数返回的是装饰器的内容,这里我们使用如下代码达成看到原函数的内容的目的:

from functools import wraps
def outter(func):
    @wraps
    def inner(*args,**kwargs):
        res = func(*args,**kwargs)
        return res
    return inner

七、递归函数

递归函数就是循环引用函数的一种,他有一些限制条件:

1、需要有明确的结束条件

2、需要在不断循环引用的过程中变得越来越简单

这里我们可以浅谈一下 循环引用函数,在python中最多引用1000次,我们在实际应用的时候可能996左右就停止了,但是我们可以使用setrecursionlimit(2000)来改变最大引用次数

八、算法之二分法

算法就是解决问题的方法,这里介绍的二分法是最简单的算法,搞懂运行原理就很好实现代码,他的功能是对一组数据值进行查找,但是需要有序。查找的时候取中间值进行跟需要找的值进行比较,根据大于或小于的情况,我们可以排除一半的查找对象。通过这个流程我们把他封装成函数,然后在内部没有找到对应值的时候就循环引用这个函数,最后我们在函数的最上面设置一个条件,如果这个列表里面没数据值了,说明查找失败了,我们直接返回找不到。

九、三元表达式

三元表达式就是简化代码的一种方式,但是我们不能使用三元表达式嵌套,虽然这可以写出来,但是违背了简化代码的初衷。

格式如下:

res = '靓仔 'if is_beautiful else '丑啊'

十、各种生成式

生成式是用于帮助我们快速对一组数据值进行同一操作的代码

new_list = [name + "_NB" for name in name_list]

比如这里对name列表中的数据值全部加上一个NB

生成式总共有三种,列表生成式和字典生成式,集合生成式,字典生成式比较特殊,如果前面只给一个变量返回键值对,如果给两个,就会解压赋值,一个变量接受键,一个接收值

元组类型的不叫生成式,叫生成器,会返回一个对象,需要使用类型转换的方法转化后才能看到内部结果。

十一、匿名函数

匿名函数也不是没名字,只是在使用一些代码简短的函数的时候我们临时用匿名函数来完成功能,省去定义这个步骤

lambda 参数:进行的操作

通常都是在内置函数中使用

十二、常见内置函数

重要的

1、zip

压缩,然后输出压缩后的结果,如果多个压缩对象的数据个数不一样,只根据最少的个数输出。

2、filter

这个是筛选的作用

filter(筛选条件,筛选对象)

这里的条件可以使用匿名函数

3、reduce

可以看成是计算结果的函数,

reduce(计算方式,计算对象)

这里的计算方式也可以用匿名函数来表达,如果我们写的是a+b,得到结果就是计算对象中所有数据值相加的结果,如果写的是乘法也是相乘之后的结果。

4、sorted

升序排列,括号内加resver = Ture会变成降序排列

了解的

1、abs

取绝对值

2、all

就是and的作用

3、any

就是or的作用

4、bytes

是把数据值转换成二进制类型的值,可以跟encode一起记忆

5、bin、oct、hex、int

二进制、八进制、十六进制、十进制转换

6、callable

判断这个名称是不是加个括号就能调用

7、chr和ord

ascii码转换,chr是转换成对应的数值,ord是转换成字符

8、eval和exec

作用一样,就是把字符串内的python代码执行,但是eval只能执行简单的功能,不能搞复杂的。

9、hash

用哈希算法加密得到一串数字

10、map、max、min

映射,最大值最小值

11、dir

查看这个对象能用的方法

12、divmod

对数据值进行整除,并得到余数

13、enumerate

对可遍历对象进行编号,我们可以在括号内加参数确定起始编号

14、open

用于文件操作

15、range

生成一个工厂,产生数据值,python2和3中有所不同

16、round

进行五舍六入

17、sum

求和

18、pow

写两个参数x和y,然后就会返回x的y次方的值

19、id、input

id是返回对象的内存地址,input是接收外界输入的值

20、isinstance

类似type的作用,判断这个数据值是不是这个类型

十三、可迭代对象和迭代器对象以及for循环的本质

1、可迭代对象

对应的数据类型下如果可以通过点+的形式使用双下划线iter的数据就是可迭代对象

2、迭代器对象

可迭代对象使用双下户线iter后就会变成迭代器对象,判断是不是迭代器对象可以查看对象是否可以使用双下划线iter和双下划线next。

对迭代器对象使用双下划线iter没有变化,还是迭代器对象

双下滑先next方法就是取一个值,取不到就报错

3、for循环本质

学了上面的知识点我们可以了解到for循环的遍历过程就是把可迭代对象变成迭代器对象,然后一次次的使用双下户线next方法取值,如果取不到值会自动检测然后停止。

十四、异常捕获和处理

我们平时说的报错专业名称叫异常,行业内俗称bug,分成三部分组成,第一部分是报错代码的位置,有些时候会出现很多位置,我们通常来说看最下面那个就可以了。第二部分在最下面那行的左边,标志了你的异常是什么类型,第三部分在最下面的右边,标志了你的错误的具体原因。这部分的信息是最有用的,我们可以根据他的提示去查找错误

标签:文件,函数,迭代,二分法,参数,名称,我们
From: https://www.cnblogs.com/wxlxl/p/17092115.html

相关文章