gpt4 book ai didi

Python 语句作为方法的参数

转载 作者:太空宇宙 更新时间:2023-11-03 13:38:08 24 4
gpt4 key购买 nike

下面我有两段代码,除了一行之外,其余的都是一样的。

for id in ids_list:
id_dir = os.path.join(dir, id)
os.chdir(id_dir)
for path in glob('*' + file_extention):
with open(path) as file:
# count number of lines in file
names[path] = sum(1 for line in file if line.strip())

for id in ids_list:
id_dir = os.path.join(dir, id)
os.chdir(id_dir)
for path in glob('*' + file_extention):
with open(filepath) as file:
# get file content
content = file.read()

我想知道是否有办法创建一个方法(可能会有ids_listfile_extention,当然还有statement(计算行数或获取内容)作为参数。我正在努力研究如何使用 statement 做到这一点。任何帮助,尤其是一些说明示例代码,因为我是 Python 新手,所以会很棒。

最佳答案

回调函数使用时间

您的情况是使用回调函数会有所帮助。

通常,回调是一个具有约定参数的函数,有时还返回值。这回调函数作为参数传递给另一个函数,该函数调用它传递同意它的参数并将处理留给回调函数。

为了使您的代码正常工作,我不得不对其进行一些修改。所有代码都放在一个文件中,例如有名字“et.py”

为了解释它,我会一段一段地展示。

导入

import os
from glob import glob

处理从文件中读取内容的回调

您的示例是将值读入 content 变量,每个循环都用新值重写它,所以最后你在那里只有最后一个值(value)。

我通过添加全局变量 GLOB_CONTENT 修改了代码,我将每个文件的内容一一显示。

GLOB_CONTENT = []


def read_file_content(path):
global GLOB_CONTENT
with open(path) as f:
# get file content
content = f.read()
# do some content processing here
GLOB_CONTENT.append(content)

全局变量的使用有时是可疑的,但它是保持全局状态的一种方式一些东西。

计数行的回调 - 带有“内存”

任何函数都可以用作回调(如果它遵循预期的签名)。一个案例是类实例的方法。它将派生自 dict 以便能够记住下面的一些值键名,它会添加一个方法count_file_lines,以文件名作为参数:

class FilesLineCounter(dict):
def count_file_lines(self, path):
with open(path) as file:
self[path] = sum(1 for line in file if line.strip())

它计算文件中的非空行并自己记住它。

处理文件的函数

循环可以概括为函数:

def process_ids(dir_path, ids_list, file_extension, callback):
for itm_id in ids_list:
id_dir = os.path.join(dir_path, itm_id)
for path in glob(id_dir + '/*' + file_extension):
callback(path)

如您所见,它获得了查找正确文件所需的所有参数,以及使用的 callback 函数处理找到的文件。

最后:把它们放在一起

这是代码的最后一部分:

if __name__ == "__main__":
dir_path = "subdir"
ids_list = ["1", "2"]
file_extension = ".txt"

cntr = FilesLineCounter()
# goint to use the callback magic
process_ids(dir_path, ids_list, file_extension, cntr.count_file_lines)
process_ids(dir_path, ids_list, file_extension, read_file_content)

# time to show our results
for path, numoflines in cntr.items():
print("File {} has {} lines".format(path, numoflines))

for i, content in enumerate(GLOB_CONTENT):
print("File # {} last 3 bytes are {}".format(i, content[-3:]))

cntr = FilesLineCounter() 创建了我们特殊类型的扩展字典。 cntr 为空添加方法 count_file_lines 的字典。由于该方法可用作函数,我们使用cntr.count_file_lines 作为回调值。

当它被process_ids处理时,我们将在cntr中找到每个处理过的文件和每个具有该文件中非空行数的值。

同样我们阅读内容。

运行 $ python et.py 我得到以下输出:

File subdir/1/one-plus.txt has 1 lines                                                                                                                                                                      
File subdir/2/empty.txt has 0 lines
File subdir/1/one.txt has 8 lines
File subdir/2/long.txt has 42 lines
File # 0 last 3 bytes are fa

File # 1 last 3 bytes are hi

File # 2 last 3 bytes are fa

File # 3 last 3 bytes are

关于Python 语句作为方法的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36456938/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com