python3 基础学习

问题

1.

斐波拉切数列不用迭代器和用迭代器和生成器的区别

2.

基础语法

1.标识符

  • 第一个字符必须是字母表中字母或下划线 _ 。
  • 在 Python 3 中,可以用中文作为变量名,非 ASCII 标识符也是允许的了。

2.关键字

3.注释

单行注释以 # 开头

多行注释可以用多个 # 号,还有 ''' 和 """:

4.行与缩进

python最具特色的就是使用缩进来表示代码块,不需要使用大括号 {} 

5.多行语句

可以使用反斜杠 \ 来实现多行语句

在 [], {}, 或 () 中的多行语句,不需要使用反斜杠 \

6.数字(Number)

python中数字有四种类型:整数、布尔型、浮点数和复数。

  • int (整数), 如 1, 只有一种整数类型 int,表示为长整型,没有 python2 中的 Long。
  • bool (布尔), 如 True。
  • float (浮点数), 如 1.23、3E-2
  • complex (复数), 如 1 + 2j、 1.1 + 2.2j

7.字符串(String)

  • Python 中单引号 ' 和双引号 " 使用完全相同。
  • 使用三引号(''' 或 """)可以指定一个多行字符串

  • 转义符 \。
  • 反斜杠可以用来转义,使用 r 可以让反斜杠不发生转义。 如 r"this is a line with \n" 则 \n 会显示,并不是换行。
  • 按字面意义级联字符串,如 "this " "is " "string" 会被自动转换为 this is string
  • 字符串可以用 + 运算符连接在一起,用 * 运算符重复。
  • Python 中的字符串有两种索引方式,从左往右以 0 开始,从右往左以 -1 开始。
  • Python 中的字符串不能改变
  • Python 没有单独的字符类型,一个字符就是长度为 1 的字符串。
  • 字符串切片 str[start:end],其中 start(包含)是切片开始的索引,end(不包含)是切片结束的索引。
  • 字符串的切片可以加上步长参数 step,语法格式如下:str[start:end:step]

8.多个语句构成代码组

缩进相同的一组语句构成一个代码块,我们称之代码组。

像if、while、def和class这样的复合语句,首行以关键字开始,以冒号( : )结束,该行之后的一行或多行代码构成代码组。

我们将首行及后面的代码组称为一个子句(clause)。

在Python中,冒号(:)用于表示代码块的开始。在条件语句、循环、函数定义等地方,冒号后面通常会缩进一段代码,这些缩进的代码被视为代码块的一部分,属于同一层级。冒号的作用是告诉解释器接下来的代码是一个代码块,需要按照缩进来执行。

9.print 输出

print 默认输出是换行的,如果要实现不换行需要在变量末尾加上 end="":

10.import 与 from...import

在 python 用 import 或者 from...import 来导入相应的模块。

将整个模块(somemodule)导入,格式为: import somemodule

从某个模块中导入某个函数,格式为: from somemodule import somefunction

从某个模块中导入多个函数,格式为: from somemodule import firstfunc, secondfunc, thirdfunc

将某个模块中的全部函数导入,格式为: from somemodule import *

11.命令行参数

Python可以使用-h参数查看各参数帮助信息:

这是使用 python 命令时可以使用的一些选项和参数,以及它们对应的环境变量。下面是对其中一些选项的解释:

  • -c cmd:将 cmd 参数作为字符串传递给 Python 解释器执行。这可以让您在命令行中直接执行一行 Python 代码。
  • -d:启用解析器的调试输出。可以使用 PYTHONDEBUG 环境变量来设置调试级别。
  • -E:忽略环境变量,比如 PYTHONPATH。这意味着 Python 将不会在环境变量中查找模块。
  • -h:打印帮助信息并退出。这会显示类似于您提供的输出,说明了 python 命令的用法和可用选项。

在 Python 的 sys 模块中,argvpath 是两个常用的成员:

  1. argv:是一个包含命令行参数的列表。当 Python 脚本被执行时,argv 包含了传递给脚本的命令行参数,其中 argv[0] 是脚本的名称,后续元素是传递给脚本的参数。例如,如果您在命令行中执行 python script.py arg1 arg2,那么 argv 将包含 ['script.py', 'arg1', 'arg2']

  2. path:是一个包含模块搜索路径的列表。当您导入模块时,Python 会在这些路径中查找要导入的模块。path 列表的第一个元素通常是空字符串,表示当前目录。其他元素是其他可能包含模块的目录。您可以使用 sys.path.append() 方法将其他目录添加到 path 中,以便 Python 在这些目录中查找模块。

基本数据类型

Python允许你同时为多个变量赋值。例如:

a = b = c = 1

也可以为多个对象指定多个变量。例如:

a, b, c = 1, 2, "runoob"

常见的数据类型有:

  • Number(数字)
  • String(字符串)
  • bool(布尔类型)
  • List(列表)
  • Tuple(元组)
  • Set(集合)
  • Dictionary(字典)

六个标准数据类型中:

  • 不可变数据(3 个):Number(数字)、String(字符串)、Tuple(元组);
  • 可变数据(3 个):List(列表)、Dictionary(字典)、Set(集合)。

Number(数字)

Python3 支持 int、float、bool、complex(复数)

内置的 type() 函数可以用来查询变量所指的对象类型。

还可以用 isinstance 来判断:

isinstance 和 type 的区别在于:

  • type()不会认为子类是一种父类类型。
  • isinstance()会认为子类是一种父类类型。

  • 数值的除法包含两个运算符:返回一个浮点数// 返回一个整数
  • 在混合计算时,Python会把整型转换成为浮点数

String(字符串)

Python中的字符串用单引号 ' 或双引号 " 括起来,同时使用反斜杠 \ 转义特殊字符。

字符串的截取的语法格式如下:

变量[头下标:尾下标]

索引值以 0 为开始值,-1 为从末尾的开始位置。

加号 + 是字符串的连接符星号 * 表示复制当前字符串,与之结合的数字为复制的次数

与 C 字符串不同的是,Python 字符串不能被改变。向一个索引位置赋值,比如 word[0] = 'm' 会导致错误。

List(列表)

列表是写在方括号 [] 之间、用逗号分隔开的元素列表。列表同样可以被索引和截取

Python字符串不一样的是,列表中的元素是可以改变的

数据项进行修改或更新,你也可以使用 append() 方法来添加列表项

可以使用 del 语句来删除列表的的元素

Python包含以下方法:

1list.append(obj)
在列表末尾添加新的对象
2list.count(obj)
统计某个元素在列表中出现的次数
3list.extend(seq)
在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表)
4list.index(obj)
从列表中找出某个值第一个匹配项的索引位置
5list.insert(index, obj)
将对象插入列表
6list.pop([index=-1])
移除列表中的一个元素(默认最后一个元素),并且返回该元素的值
7list.remove(obj)
移除列表中某个值的第一个匹配项
8list.reverse()
反向列表中元素
9list.sort( key=None, reverse=False)
对原列表进行排序
10list.clear()
清空列表
11list.copy()
复制列表

Tuple(元组)

元组(tuple)与列表类似,不同之处在于元组的元素不能修改。元组写在小括号 () 里,元素之间用逗号隔开。

元组中的元素类型也可以不相同:

虽然tuple的元素不可改变,但它可以包含可变的对象,比如list列表

构造包含 0 个或 1 个元素的元组比较特殊,所以有一些额外的语法规则:

tup1 = ()    # 空元组
tup2 = (20,) # 一个元素,需要在元素后添加逗号

Set(集合)

Python 中的集合(Set)是一种无序、可变的数据类型,用于存储唯一的元素。

集合中的元素不会重复,并且可以进行交集、并集、差集等常见的集合操作。

在 Python 中,集合使用大括号 {} 表示,元素之间用逗号 , 分隔。

另外,也可以使用 set() 函数创建集合。

注意:创建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典。

创建格式:

1、添加元素

语法格式如下:

s.add( x )

将元素 x 添加到集合 s 中,如果元素已存在,则不进行任何操作。

还有一个方法,也可以添加元素,且参数可以是列表,元组,字典等,语法格式如下:

s.update( x )

集合内置方法完整列表

方法描述
add()为集合添加元素
clear()移除集合中的所有元素
copy()拷贝一个集合
difference()返回多个集合的差集
difference_update()移除集合中的元素,该元素在指定的集合也存在。
discard()删除集合中指定的元素
intersection()返回集合的交集
intersection_update()返回集合的交集。
isdisjoint()判断两个集合是否包含相同的元素,如果没有返回 True,否则返回 False。
issubset()判断指定集合是否为该方法参数集合的子集。
issuperset()判断该方法的参数集合是否为指定集合的子集
pop()随机移除元素
remove()移除指定元素
symmetric_difference()返回两个集合中不重复的元素集合。
symmetric_difference_update()移除当前集合中在另外一个指定集合相同的元素,并将另外一个指定集合中不同的元素插入到当前集合中。
union()返回两个集合的并集
update()给集合添加元素
len()计算集合元素个数

Dictionary(字典)

字典(dictionary)是Python中另一个非常有用的内置数据类型。

列表是有序的对象集合,字典是无序的对象集合。两者之间的区别在于:字典当中的元素是通过键来存取的,而不是通过偏移存取。

字典是一种映射类型,字典用 { } 标识,它是一个无序的 键(key) : 值(value) 的集合。

键(key)必须使用不可变类型。

在同一个字典中,键(key)必须是唯一的。

在这个表达式中,x**2 表示 x 的平方。在Python中,** 运算符用于计算幂。因此,x**2 就是 x 的平方值。

循环语句

1.while语句

形式:

while 判断条件(condition):
    执行语句(statements)……

例子:、

CTRL+C 来退出当前的无限循环

while 循环使用 else 语句

如果 while 后面的条件语句为 false 时,则执行 else 的语句块。

语法格式如下:

while <expr>:
    <statement(s)>
else:
    <additional_statement(s)>

2.for 语句

for循环的一般格式如下:

例子

for...else

在 Python 中,for...else 语句用于在循环结束后执行一段代码。

语法格式如下:

当循环执行完毕(即遍历完 iterable 中的所有元素)后,会执行 else 子句中的代码,如果在循环过程中遇到了 break 语句,则会中断循环,此时不会执行 else 子句。

range() 函数

如果你需要遍历数字序列,可以使用内置 range() 函数。它会生成数列,例如:

break 语句可以跳出 for 和 while 的循环体。如果你从 for 或 while 循环中终止,任何对应的循环 else 块将不执行。

continue 语句被用来告诉 Python 跳过当前循环块中的剩余语句,然后继续进行下一轮循环。

显式类型转换

在显式类型转换中,用户将对象的数据类型转换为所需的数据类型。 我们使用 int()、float()、str() 等预定义函数来执行显式类型转换。

**幂 - 返回x的y次幂a**b 为10的21次方

Python位运算符

运算符描述实例
&按位与运算符:参与运算的两个值,如果两个相应位都为1,则该位的结果为1,否则为0(a & b) 输出结果 12 ,二进制解释: 0000 1100
|按位或运算符:只要对应的二个二进位有一个为1时,结果位就为1。(a | b) 输出结果 61 ,二进制解释: 0011 1101
^按位异或运算符:当两对应的二进位相异时,结果为1(a ^ b) 输出结果 49 ,二进制解释: 0011 0001
~按位取反运算符:对数据的每个二进制位取反,即把1变为0,把0变为1。~x 类似于 -x-1(~a ) 输出结果 -61 ,二进制解释: 1100 0011, 在一个有符号二进制数的补码形式。
<<左移动运算符:运算数的各二进位全部左移若干位,由"<<"右边的数指定移动的位数,高位丢弃,低位补0。a << 2 输出结果 240 ,二进制解释: 1111 0000
>>右移动运算符:把">>"左边的运算数的各二进位全部右移若干位,">>"右边的数指定移动的位数a >> 2 输出结果 15 ,二进制解释: 0000 1111

Python逻辑运算符

运算符逻辑表达式描述实例
andx and y布尔"与" - 如果 x 为 False,x and y 返回 x 的值,否则返回 y 的计算值。(a and b) 返回 20。
orx or y布尔"或" - 如果 x 是 True,它返回 x 的值,否则它返回 y 的计算值。(a or b) 返回 10。
notnot x布尔"非" - 如果 x 为 True,返回 False 。如果 x 为 False,它返回 True。not(a and b) 返回 False

数学函数

函数返回值 ( 描述 )
abs(x)返回数字的绝对值,如abs(-10) 返回 10
ceil(x)返回数字的上入整数,如math.ceil(4.1) 返回 5

cmp(x, y)

如果 x < y 返回 -1, 如果 x == y 返回 0, 如果 x > y 返回 1。 Python 3 已废弃,使用 (x>y)-(x<y) 替换
exp(x)返回e的x次幂(ex),如math.exp(1) 返回2.718281828459045
fabs(x)以浮点数形式返回数字的绝对值,如math.fabs(-10) 返回10.0
floor(x)返回数字的下舍整数,如math.floor(4.9)返回 4
log(x)如math.log(math.e)返回1.0,math.log(100,10)返回2.0
log10(x)返回以10为基数的x的对数,如math.log10(100)返回 2.0
max(x1, x2,...)返回给定参数的最大值,参数可以为序列。
min(x1, x2,...)返回给定参数的最小值,参数可以为序列。
modf(x)返回x的整数部分与小数部分,两部分的数值符号与x相同,整数部分以浮点型表示。
pow(x, y)x**y 运算后的值。
round(x [,n])

返回浮点数 x 的四舍五入值,如给出 n 值,则代表舍入到小数点后的位数。

其实准确的说是保留值将保留到离上一位更近的一端。

sqrt(x)返回数字x的平方根。

随机数函数

函数描述
choice(seq)从序列的元素中随机挑选一个元素,比如random.choice(range(10)),从0到9中随机挑选一个整数。
randrange ([start,] stop [,step])从指定范围内,按指定基数递增的集合中获取一个随机数,基数默认值为 1
random()随机生成下一个实数,它在[0,1)范围内。
seed([x])改变随机数生成器的种子seed。如果你不了解其原理,你不必特别去设定seed,Python会帮你选择seed。
shuffle(lst)将序列的所有元素随机排序
uniform(x, y)随机生成下一个实数,它在[x,y]范围内。

三角函数

函数描述
acos(x)返回x的反余弦弧度值。
asin(x)返回x的反正弦弧度值。
atan(x)返回x的反正切弧度值。
atan2(y, x)返回给定的 X 及 Y 坐标值的反正切值。
cos(x)返回x的弧度的余弦值。
hypot(x, y)返回欧几里德范数 sqrt(x*x + y*y)。
sin(x)返回的x弧度的正弦值。
tan(x)返回x弧度的正切值。
degrees(x)将弧度转换为角度,如degrees(math.pi/2) , 返回90.0
radians(x)将角度转换为弧度

Python 字符串格式化

实例(Python 3.0+)

#!/usr/bin/python3 print ("我叫 %s 今年 %d 岁!" % ('小明', 10))

格式化操作符辅助指令:

符号功能
*定义宽度或者小数点精度
-用做左对齐
+在正数前面显示加号( + )
<sp>在正数前面显示空格
#在八进制数前面显示零('0'),在十六进制前面显示'0x'或者'0X'(取决于用的是'x'还是'X')
0显示的数字前面填充'0'而不是默认的空格
%'%%'输出一个单一的'%'
(var)映射变量(字典参数)
m.n.m 是显示的最小总宽度,n 是小数点后的位数(如果可用的话)

f-string

f-string 格式化字符串以 f 开头,后面跟着字符串,字符串中的表达式用大括号 {} 包起来,它会将变量或表达式计算后的值替换进去,实例如下:

Python 的字符串内建函数

条件语句

Python 中用 elif 代替了 else if,所以if语句的关键字为:if – elif – else

注意:

  • 1、每个条件后面要使用冒号 :,表示接下来是满足条件后要执行的语句块。
  • 2、使用缩进来划分语句块,相同缩进数的语句在一起组成一个语句块。
  • 3、在 Python 中没有 switch...case 语句,但在 Python3.10 版本添加了 match...case,功能也类似,详见下文。

match...case

Python 3.10 增加了 match...case 的条件判断,不需要再使用一连串的 if-else 来判断了。

match 后的对象会依次与 case 后的内容进行匹配,如果匹配成功,则执行匹配到的表达式,否则直接跳过,_ 可以匹配一切。

语法格式如下:

match subject:
    case <pattern_1>:
        <action_1>
    case <pattern_2>:
        <action_2>
    case <pattern_3>:
        <action_3>
    case _:
        <action_wildcard>

case _: 类似于 C 和 Java 中的 default:,当其他 case 都无法匹配时,匹配这条,保证永远会匹配成功。

a, b = b, a+b

在Python中,a, b = b, a+b 是一个使用了元组解包(tuple unpacking)的赋值语句。这条语句同时更新了变量 ab 的值,其中 a 被赋予了原来 b 的值,而 b 被赋予了原来 a 的值加上原来 b 的值

Python 推导式

列表推导式

元组推导式(生成器表达式)

元组推导式和列表推导式的用法也完全相同,只是元组推导式是用 () 圆括号将各部分括起来,而列表推导式用的是中括号 [],另外元组推导式返回的结果是一个生成器对象

迭代器

迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。

迭代器有两个基本的方法:iter() 和 next()

字符串,列表或元组对象都可用于创建迭代器:

在Python中,tryexcept是异常处理的关键字,用于捕获和处理程序执行过程中可能发生的错误。异常处理是一种编程结构,它允许你编写代码来处理程序运行时出现的问题,而不是让程序直接崩溃。下面是tryexcept StopIteration的详细解释:

  1. try: try块是异常处理的开始。在这个块中的代码被称为“受保护”的代码,因为如果在这段代码中发生异常,程序的执行将不会直接跳转到异常发生的位置,而是会跳转到对应的except块。这样做的好处是可以避免程序因为未预料到的错误而意外终止,同时允许你有机会以更优雅的方式处理错误。

    try块中,你可以放置可能会引发异常的代码。例如,访问文件、进行网络请求、执行复杂的计算等操作都可能会因为各种原因引发异常。

  2. except StopIteration: except块用于捕获并处理特定类型的异常。在这个例子中,StopIteration是Python中的一个内置异常,它在迭代器没有更多的元素可以提供时被抛出。当你使用next()函数从一个迭代器中获取元素,而迭代器已经没有更多元素时,就会引发StopIteration异常。

    except StopIteration:块告诉Python,如果在try块中执行的代码引发了StopIteration异常,那么程序应该跳转到这个except块来处理这个异常,而不是让程序崩溃。

    except块中,你可以编写用于处理异常的代码。例如,你可以打印一条错误消息、记录日志、释放资源、或者执行一些清理工作。在处理完异常之后,程序可以继续执行或者优雅地退出。

下面是一个简单的例子,演示了如何使用tryexcept StopIteration来处理迭代器耗尽的情况:

# 假设我们有一个迭代器
my_iter = iter([1, 2, 3])

# 使用try块来尝试从迭代器中获取元素
try:
    while True:
        print(next(my_iter))
except StopIteration:
    # 当迭代器耗尽时,捕获StopIteration异常
    print("迭代器中没有更多的元素了。")

在这个例子中,try块中的无限循环会持续尝试从my_iter迭代器中获取下一个元素并打印出来。当迭代器中没有更多元素时,next(my_iter)会引发StopIteration异常,这个异常被except StopIteration块捕获,程序将打印出“迭代器中没有更多的元素了。”,然后继续执行或者退出。这样,程序就不会因为迭代器耗尽而崩溃。

生成器

在 Python 中,使用了 yield 的函数被称为生成器(generator)。

yield 是一个关键字,用于定义生成器函数,生成器函数是一种特殊的函数,可以在迭代过程中逐步产生值,而不是一次性返回所有结果。

跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。

当在生成器函数中使用 yield 语句时,函数的执行将会暂停,并将 yield 后面的表达式作为当前迭代的值返回。

然后,每次调用生成器的 next() 方法或使用 for 循环进行迭代时,函数会从上次暂停的地方继续执行,直到再次遇到 yield 语句。这样,生成器函数可以逐步产生值,而不需要一次性计算并返回所有结果。

调用一个生成器函数,返回的是一个迭代器对象。

生成器函数的优势是它们可以按需生成值,避免一次性生成大量数据并占用大量内存。此外,生成器还可以与其他迭代工具(如for循环)无缝配合使用,提供简洁和高效的迭代方式。

下面是一个简单的生成器例子:

def count_up_to(max):
    count = 1
    while count <= max:
        yield count
        count += 1

# 使用生成器
counter = count_up_to(5)

# 迭代生成器
for number in counter:
    print(number)

在这个例子中,`count_up_to` 函数是一个生成器。当我们创建 `counter` 变量并调用 `count_up_to(5)` 时,我们得到了一个生成器对象。通过在循环中迭代这个生成器,我们可以打印从 1 到 5 的数字。

生成器的一个关键优势是它们在每次迭代时只需要计算并返回下一个值,而不是一次性计算所有值并将它们存储在内存中。这使得生成器非常适合处理大量数据或无限序列。

另一个生成器的例子是生成斐波那契数列:

def fibonacci(n):
    a, b = 0, 1
    count = 0
    while count < n:
        yield a
        a, b = b, a + b
        count += 1

# 使用生成器
fib_sequence = fibonacci(10)

# 迭代生成器
for num in fib_sequence:
    print(num)

在这个例子中,`fibonacci` 函数生成器会产生前 10 个斐波那契数。每次迭代时,它都会计算下一个斐波那契数并将其 `yield` 出去,同时更新 `a` 和 `b` 的值以计算下一个数。

生成器还可以使用 `send` 方法来发送值到生成器中。例如:

def echo():
    while True:
        value = yield
        if value is None:
            break
        print(f"you said {value}")

# 使用生成器
echo_gen = echo()

# 开始迭代生成器
next(echo_gen)  # 初始化生成器

# 发送值到生成器并接收返回值
echo_gen.send("hello")  # 输出: you said hello
echo_gen.send("world")  # 输出: you said world

# 发送 None 来退出生成器
echo_gen.send(None)

在这个例子中,`echo` 函数是一个生成器,它可以接收外部发送的值,并在每次迭代时打印出来。当发送 `None` 时,生成器会通过 `if value is None: break` 语句退出循环,从而结束生成器的执行。

方法使用

open().read()

在Python中,open().read()连用是一种常见的文件读取模式。这里,open是内置的文件打开函数,而read是文件对象的方法。这种模式用于打开一个文件,读取其内容,并通常在一个操作中完成关闭文件的过程。

以下是open().read()连用的基本用法:

# 打开文件,并读取其内容
content = open('filename.txt', 'r').read()

# 打印文件内容
print(content)

在这个例子中,open('filename.txt', 'r')会打开当前目录下名为filename.txt的文件,并且以只读模式('r')打开。这个操作返回一个文件对象,然后通过调用这个文件对象的.read()方法,我们可以读取文件的全部内容。读取的内容被存储在变量content中。

然而,这种简单直接的模式并不推荐用于大文件读取,因为它可能会一次性将整个文件内容加载到内存中,对于大文件来说可能会导致内存不足。对于大文件,推荐使用迭代器或者分块读取的方法,例如:

# 使用with语句和迭代器逐行读取大文件
with open('largefile.txt', 'r') as file:
    for line in file:
        print(line, end='')  # 打印每一行内容,end=''防止重复打印换行符

或者,如果你确实需要读取整个文件内容到内存,可以使用with语句来确保文件正确关闭:

# 使用with语句打开文件,并读取其内容
with open('filename.txt', 'r') as file:
    content = file.read()

# 打印文件内容
print(content)

使用with语句的好处是,即使在读取文件内容时发生异常,文件也会被自动关闭,这样可以避免文件泄露和其他资源管理问题。此外,with语句还支持上下文管理器,可以用来处理更复杂的资源管理任务。

with open() as f

with open() as f 是Python中用于打开文件并自动管理文件资源的上下文管理器语法。这种语法提供了一种简洁、安全的方式来处理文件,因为它确保了文件在使用后会被正确关闭,即使在处理文件的过程中发生了异常也是如此。

下面是with open() as f的基本用法:

with open('filename.txt', 'r') as f:
    # 在这里进行文件操作,例如读取或写入
    data = f.read()
    # 文件会在退出这个代码块后自动关闭

在这个例子中,open('filename.txt', 'r')是调用open函数并传递两个参数:第一个参数是文件名,第二个参数是模式。'r'模式表示以只读方式打开文件。as f部分将打开的文件对象赋值给变量f

使用with语句的好处包括:

  1. 自动关闭文件:当with代码块执行完毕时,文件会自动关闭,无需手动调用f.close()。这有助于避免文件泄露和其他与未关闭文件相关的资源问题。

  2. 异常处理:如果在with代码块中发生异常,文件仍然会被自动关闭。这意味着即使在发生错误的情况下,资源也会被适当地释放。

  3. 代码简洁with语句使得代码更加简洁和易读,因为它减少了需要编写的代码量,并且将资源管理逻辑封装在了with代码块中。

  4. 支持多个上下文管理器with语句可以同时包含多个上下文管理器,每个管理器使用逗号分隔。这使得可以同时管理多个资源。

例如,如果你需要同时打开两个文件进行操作,可以这样写:

with open('file1.txt', 'r') as f1, open('file2.txt', 'w') as f2:
    # 同时处理两个文件
    data_from_f1 = f1.read()
    f2.write(data_from_f1)

  • 38
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值