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
    。好的,现在了解场景如果问题有可接受的答案,则问题“已解决”。没有理由在问题中加上“已解决”一词。如果一个问题有一个公认的答案,那么它就是“已解决”。没有理由在问题中加上“已解决”一词。