Python if-then块内屈服的奇性行为
我有一个函数,根据标志返回生成器或列表 然而,即使我将标志设置为Python if-then块内屈服的奇性行为,python,if-statement,generator,control-flow,yield-keyword,Python,If Statement,Generator,Control Flow,Yield Keyword,我有一个函数,根据标志返回生成器或列表 然而,即使我将标志设置为list,函数仍然返回一个生成器;也不打印标志 我希望首先计算yield命令之前的print语句。同样,如果将标志设置为list,我不希望生成器块进行计算 import os def get_iterator_all_files_name(dir_path, flag): if flag == 'generator': print(flag) for (dirpath, dirnames,
list
,函数仍然返回一个生成器;也不打印标志
我希望首先计算yield命令之前的print语句。同样,如果将标志设置为list
,我不希望生成器
块进行计算
import os
def get_iterator_all_files_name(dir_path, flag):
if flag == 'generator':
print(flag)
for (dirpath, dirnames, filenames) in os.walk(dir_path):
for f in filenames:
yield os.path.join(dirpath, f)
elif flag == 'list':
print(flag)
paths = list()
for (dirpath, dirnames, filenames) in os.walk(dir_path):
for f in filenames:
paths.append(os.path.join(dirpath, f))
return paths
使用函数
file_path = 'path/to/files'
flag = 'list'
foo = get_iterator_all_files_name(file_path, flag)
type(foo)
这就产生了结果
生成器
这不是我所期望的;我在等待列表。如果函数中有单词
yield
,则它是一个生成器。没有例外。在尝试迭代之前,不会对代码求值
只需对结果调用list
:
def get_iterator_all_files_name(dir_path):
for (dirpath, dirnames, filenames) in os.walk(dir_path):
for f in filenames:
yield os.path.join(dirpath, f)
file_path = 'path/to/files'
foo = list(get_iterator_all_files_name(file_path))
如果确实想保留标志
功能,可以修改函数以返回生成器。您还可以将路径
设置为列表理解,这可以简化功能:
def get_iterator_all_files_name(dir_path, flag):
if flag == 'generator':
return (os.path.join(dirpath, f) for (dirpath, dirnames, filenames) in os.walk(dir_path) for f in filenames)
elif flag == 'list':
return [os.path.join(dirpath, f) for (dirpath, dirnames, filenames) in os.walk(dir_path) for f in filenames]
如果函数中有单词
yield
,则它是一个生成器。没有例外。在尝试迭代之前,不会对代码求值
只需对结果调用list
:
def get_iterator_all_files_name(dir_path):
for (dirpath, dirnames, filenames) in os.walk(dir_path):
for f in filenames:
yield os.path.join(dirpath, f)
file_path = 'path/to/files'
foo = list(get_iterator_all_files_name(file_path))
如果确实想保留标志
功能,可以修改函数以返回生成器。您还可以将路径
设置为列表理解,这可以简化功能:
def get_iterator_all_files_name(dir_path, flag):
if flag == 'generator':
return (os.path.join(dirpath, f) for (dirpath, dirnames, filenames) in os.walk(dir_path) for f in filenames)
elif flag == 'list':
return [os.path.join(dirpath, f) for (dirpath, dirnames, filenames) in os.walk(dir_path) for f in filenames]
任何具有
yield
语句的函数都将成为生成器函数,因此,其return
语句具有不同的含义(与正常函数的return
语句相比)。
如果确实需要get\u iterator\u all\u files\u name
函数有时返回生成器,有时返回列表,一种方法是:
my\u gen\u func
),在if
子句中执行您现在正在执行的操作。因此,这个新功能将是一个生成器
函数(因为它将有一个yield
语句)get\u iterator\u all\u files\u name
函数中,修改if
子句,只需调用my\u gen\u func
,并返回
返回值。(现在,您的get\u iterator\u all\u files\u name
函数不再是生成器函数,而是普通函数,因为它没有yield
语句)elif
子句可以保持不变任何具有
yield
语句的函数都将成为生成器函数,因此,其return
语句具有不同的含义(与正常函数的return
语句相比)。
如果确实需要get\u iterator\u all\u files\u name
函数有时返回生成器,有时返回列表,一种方法是:
my\u gen\u func
),在if
子句中执行您现在正在执行的操作。因此,这个新功能将是一个生成器
函数(因为它将有一个yield
语句)get\u iterator\u all\u files\u name
函数中,修改if
子句,只需调用my\u gen\u func
,并返回
返回值。(现在,您的get\u iterator\u all\u files\u name
函数不再是生成器函数,而是普通函数,因为它没有yield
语句)elif
子句可以保持不变但如果我们发送flag='generator',这也会返回list@ravishankarchavare关键是,如果需要生成器,不要调用
list
。如果您需要列表,请调用list
。现在可以理解场景,但如果我们发送flag='generator',这也会返回list@ravishankarchavare关键是,如果需要生成器,不要调用list
。如果您需要列表,请致电list
。好的,现在了解场景如果问题有可接受的答案,则问题“已解决”。没有理由在问题中加上“已解决”一词。如果一个问题有一个公认的答案,那么它就是“已解决”。没有理由在问题中加上“已解决”一词。