Yielding ahead of time - Printable Version +- Python Forum (https://python-forum.io) +-- Forum: Python Coding (https://python-forum.io/forum-7.html) +--- Forum: General Coding Help (https://python-forum.io/forum-8.html) +--- Thread: Yielding ahead of time (/thread-33834.html) |
Yielding ahead of time - Daring_T - May-31-2021 I was making a function that could output the results one by one with yield or return all results in a list. I have everything in the right indention, but it always. Does anyone know the reason why? I am using Python 3.9 if that helps. def get_ep_info(iter=False): ep_list_info = list() ep_nums = [1,2,3,4,5] for ep_num in ep_nums: if iter is True: print("true") yield ep_num elif iter is False: print("false") ep_list_info.append(ep_num) if iter is False: print("false") return ep_list_info a = get_ep_info() print(a)
RE: Yielding ahead of time - deanhystad - May-31-2021 Containing yield makes a function a generator. And since the yield forces the function to be a generator you need to use next or for to get the values and you cannot use return in the function. You could write your function like this: def get_ep_info(iter=False): ep_list_info = list() ep_nums = [1,2,3,4,5] for ep_num in ep_nums: if iter is True: print("true") yield ep_num elif iter is False: print("false") ep_list_info.append(ep_num) if iter is False: print("false") yield ep_list_info #<- Change from return to yeild a = next(get_ep_info()) print(a)But it makes far more sense to leave it a generator and use list() to create a list of the returned values. def get_ep_info(): for ep_num in [1,2,3,4,5]: yield ep_num a = list(get_ep_info()) print(a)This is less likely to result in uncontrolled laughter or swearing when people try to use your code RE: Yielding ahead of time - BashBedlam - May-31-2021 See if this is what you wanted: def get_ep_info(iterator=False): ep_list_info = list() ep_nums = [1,2,3,4,5] for ep_num in ep_nums: ep_list_info.append (ep_num) if iterator is False: return ep_list_info else : return iter(ep_list_info) a = get_ep_info(True) print(next (a), next (a)) RE: Yielding ahead of time - deanhystad - May-31-2021 While this works for the original example: def get_ep_info(iterator=False): ep_list_info = list() ep_nums = [1,2,3,4,5] for ep_num in ep_nums: ep_list_info.append (ep_num) if iterator is False: return ep_list_info else : return iter(ep_list_info) a = get_ep_info(True) print(next (a), next (a))It does not create code that acts like a generator. Regardless of the iterator flag all the results are created immediately and the advantages of using a generator are lost. It is better to act like a generator and use something like list() to create a collection from the generator results. That allows getting the benefits of a generator or getting a collection depending on you need. RE: Yielding ahead of time - Daring_T - Jun-01-2021 Thanks to everyone how replyed. This is the code I think I am going to use. I just have never across this before where yielding overrides the return statement. The ep_nums[] is a placeholder for the function that I was working on when I ran into this issue. def get_ep_info_iter(): # This is placeholder data ep_nums = [1,2,3,4,5] for ep_num in ep_nums: yield ep_num get_ep_info = lambda : list(get_ep_info_iter()) a = get_ep_info_list() print(a) RE: Yielding ahead of time - Daring_T - Jun-01-2021 Quote:Containing yield makes a function a generator. And since the yield forces the function to be a generator you need to use next or for to get the values and you cannot use return in the function. You could write your function like this: Thanks for the reply, I never knew that list() could take in generators. That's great to know instead of doing a comprehension list . |