首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >自动化那些无聊的东西:为什么这些Python函数不做同样的事情呢?

自动化那些无聊的东西:为什么这些Python函数不做同样的事情呢?
EN

Stack Overflow用户
提问于 2020-02-03 04:05:20
回答 3查看 79关注 0票数 2

我正在学习Automate那些无聊的东西,我注意到他教开放模块是这样的:

代码语言:javascript
运行
复制
baconFile = open('bacon.txt', 'w')
baconFile.write('Bacon is not a vegetable.')
baconFile.close()

为什么我们需要baconFile变量呢?我理解易于阅读/调试,但是,当我尝试以下代码时,文本不会输入到.txt文件中:

代码语言:javascript
运行
复制
open('bacon.txt', 'w').write('Bacon is not a vegetable.')
open('bacon.txt', 'w').close()

为什么?这两者之间的区别是什么?

编辑:人们说我在底部的代码中再次打开它。这不是我在顶层代码中所做的吗?我以为变量只是我不想再输入的代码的替代品。

EN

回答 3

Stack Overflow用户

发布于 2020-02-03 04:10:50

在您的版本中,您创建了两个文件处理程序(类似于原始示例中的baconFile ),每次调用open时都会创建一个处理程序,它们处理相同的文件。baconFile 不是一个文件,它是一个处理文件的对象。

你用来写一些文本的第一个。你永远不会关闭它,当你的程序结束时,它将被销毁。

当您在w模式下打开第二个文件时,它将重置文本内容,然后您将其关闭。

票数 2
EN

Stack Overflow用户

发布于 2020-02-03 04:15:04

代码语言:javascript
运行
复制
step 1. open the file to write.
step 2. write something in the file.
step 3. close the file.

您正在尝试打开一个打开的文件。

票数 2
EN

Stack Overflow用户

发布于 2020-02-03 04:32:13

,我认为变量只是我不想再输入的代码的替代品。

这是一个外行术语对的描述。

只有当你在处理纯函数,即没有副作用的函数时,它才有效。例如,

代码语言:javascript
运行
复制
def double(x):
    return 2 * x

a = double(5)
b = a + a

等同于

代码语言:javascript
运行
复制
b = double(5) + double(5)

但在Python中,函数通常不是纯函数。Assignment的工作方式是对右侧求值一次,然后将其绑定到左侧的名称。使用名称仅引用计算表达式的值,但不会重复其可能产生的副作用。

所以如果相反,

代码语言:javascript
运行
复制
def double(x):
    print('doubling', x)
    return 2 * x

然后

代码语言:javascript
运行
复制
a = double(5)
b = a + a

不再等同于

代码语言:javascript
运行
复制
b = double(5) + double(5)

在这两种情况下,b仍然是20,但是第一种情况打印doubling 5一次,第二种情况打印两次。

open('bacon.txt', 'w')有打开文件并截断它的副作用,它的计算结果是一个值,即文件句柄。

在您的示例中,

代码语言:javascript
运行
复制
open('bacon.txt', 'w').write('Bacon is not a vegetable.')
open('bacon.txt', 'w').close()

等同于:

代码语言:javascript
运行
复制
f = open('bacon.txt', 'w')
f.write('Bacon is not a vegetable.')

g = open('bacon.txt', 'w')
g.close()

这意味着文件被打开并被截断一次,然后向其中写入一些内容。然后,它被打开并再次被截断,丢失了您之前编写的内容。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60030086

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档