{"id":1208,"date":"2020-11-18T04:24:22","date_gmt":"2020-11-18T04:24:22","guid":{"rendered":"https:\/\/www.pythontutorial.net\/?page_id=1208"},"modified":"2025-03-27T15:05:32","modified_gmt":"2025-03-27T15:05:32","slug":"python-generator-expressions","status":"publish","type":"page","link":"https:\/\/www.pythontutorial.net\/advanced-python\/python-generator-expressions\/","title":{"rendered":"Python Generator Expressions"},"content":{"rendered":"\n<p><strong>Summary<\/strong>: in this tutorial, you&#8217;ll learn about the Python generator expression to create a generator object.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id='introduction-to-generator-expressions'>Introduction to generator expressions <a href=\"#introduction-to-generator-expressions\" class=\"anchor\" id=\"introduction-to-generator-expressions\" title=\"Anchor for Introduction to generator expressions\">#<\/a><\/h2>\n\n\n\n<p>A generator expression is an expression that returns a <a href=\"https:\/\/www.pythontutorial.net\/advanced-python\/python-generators\/\">generator<\/a> object.<\/p>\n\n\n\n<p>Basically, a generator function is a function that contains a <code>yield<\/code> statement and returns a generator object.<\/p>\n\n\n\n<p>For example, the following defines a generator function:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">def squares(length):\n    <span class=\"hljs-keyword\">for<\/span> n <span class=\"hljs-keyword\">in<\/span> range(length):\n        <span class=\"hljs-keyword\">yield<\/span> n ** <span class=\"hljs-number\">2<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>The <code>squares<\/code> generator function returns a generator object that produces square numbers of integers from <code>0<\/code> to <code>length - 1<\/code>. <\/p>\n\n\n\n<p>Because a generator object is an <a href=\"https:\/\/www.pythontutorial.net\/advanced-python\/python-iterators\/\">iterator<\/a>, you can use a <a href=\"https:\/\/www.pythontutorial.net\/advanced-python\/python-iterators\/\">for loop<\/a> to iterate over its elements:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">def squares(length):\n    <span class=\"hljs-keyword\">for<\/span> n in range(length):\n        <span class=\"hljs-keyword\">yield<\/span> n ** <span class=\"hljs-number\">2<\/span>\n\n<span class=\"hljs-keyword\">for<\/span> square in squares(<span class=\"hljs-number\">5<\/span>):\n    <span class=\"hljs-keyword\">print<\/span>(square)<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p><a href=\"https:\/\/www.pythontutorial.net\/playground\/?q=ZGVmIHNxdWFyZXMobGVuZ3RoKToKICAgIGZvciBuIGluIHJhbmdlKGxlbmd0aCk6CiAgICAgICAgeWllbGQgbiAqKiAyCgpmb3Igc3F1YXJlIGluIHNxdWFyZXMoNSk6CiAgICBwcmludChzcXVhcmUp\" target=\"_blank\" rel=\"noreferrer noopener\">Try it<\/a><\/p>\n\n\n\n<p>Output:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">0\n1\n4\n9\n16<\/code><\/span><\/pre>\n\n\n<p>A generator expression provides you with a more simple way to return a generator object.<\/p>\n\n\n\n<p>The following example defines a generator expression that returns square numbers of integers from 0 to 4:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">squares = (n** 2 for n in range(5))<\/code><\/span><\/pre>\n\n\n<p>Since the <code>squares<\/code> is a generator object, you can iterate over its elements like this:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-keyword\">for<\/span> square in squares:\n    <span class=\"hljs-keyword\">print<\/span>(square)<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>As you can see, instead of using a <a href=\"https:\/\/www.pythontutorial.net\/python-basics\/python-functions\/\">function<\/a> to define a generator function, you can use a generator expression.<\/p>\n\n\n\n<p>A generator expression is like a <a href=\"https:\/\/www.pythontutorial.net\/python-basics\/python-list-comprehensions\/\">list comprehension<\/a> in terms of syntax. For example, a generator expression also supports complex syntaxes including:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>if statements<\/li>\n\n\n\n<li>Multiple nested loops<\/li>\n\n\n\n<li>Nested comprehensions<\/li>\n<\/ul>\n\n\n\n<p>However, a generator expression uses the parentheses <code>()<\/code> instead of square brackets <code>[]<\/code>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id='generator-expressions-vs-list-comprehensions'>Generator expressions vs list comprehensions <a href=\"#generator-expressions-vs-list-comprehensions\" class=\"anchor\" id=\"generator-expressions-vs-list-comprehensions\" title=\"Anchor for Generator expressions vs list comprehensions\">#<\/a><\/h2>\n\n\n\n<p>The following shows how to use the list comprehension to generate square numbers from 0 to 4:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">square_list = &#91;n** 2 for n in range(5)]<\/code><\/span><\/pre>\n\n\n<p>And this defines a square number generator:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">square_generator = (n** 2 for n in range(5))<\/code><\/span><\/pre>\n\n\n<h3 class=\"wp-block-heading\" id='syntax'>Syntax <a href=\"#syntax\" class=\"anchor\" id=\"syntax\" title=\"Anchor for Syntax\">#<\/a><\/h3>\n\n\n\n<p>In terms of syntax, a generator expression uses parentheses <code>()<\/code> while a list comprehension uses the square brackets <code>[]<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id='memory-utilization'>Memory utilization <a href=\"#memory-utilization\" class=\"anchor\" id=\"memory-utilization\" title=\"Anchor for Memory utilization\">#<\/a><\/h3>\n\n\n\n<p>A list comprehension returns a list while a generator expression returns a generator object.<\/p>\n\n\n\n<p>It means that a list comprehension returns a complete list of elements upfront. However, a generator expression returns a list of elements, one at a time, based on request.<\/p>\n\n\n\n<p>A <a href=\"https:\/\/www.pythontutorial.net\/python-basics\/python-list-comprehensions\/\">list comprehension<\/a> is eager while a generator expression is lazy.<\/p>\n\n\n\n<p>In other words, a list comprehension creates all elements right away and loads all of them into the memory.<\/p>\n\n\n\n<p>Conversely, a generator expression creates a single element based on request. It loads only one single element to the memory.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id='iterable-vs-iterator'>Iterable vs iterator <a href=\"#iterable-vs-iterator\" class=\"anchor\" id=\"iterable-vs-iterator\" title=\"Anchor for Iterable vs iterator\">#<\/a><\/h3>\n\n\n\n<p>A list comprehension returns an <a href=\"https:\/\/www.pythontutorial.net\/python-basics\/python-iterables\/\">iterable<\/a>. It means that you can iterate over the result of a list comprehension again and again.<\/p>\n\n\n\n<p>However, a generator expression returns an <a href=\"https:\/\/www.pythontutorial.net\/advanced-python\/python-iterators\/\">iterator<\/a>, specifically a lazy iterator. It becomes exhausting when you complete iterating over it. <\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id='summary'>Summary <a href=\"#summary\" class=\"anchor\" id=\"summary\" title=\"Anchor for Summary\">#<\/a><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Use a Python generator expression to return a generator.<\/li>\n<\/ul>\n<div class=\"helpful-block-content\" data-title=\"\">\n\t<header>\n\t\t<div class=\"wth-question\">Was this tutorial helpful ?<\/div>\n\t\t<div class=\"wth-thumbs\">\n\t\t\t<button\n\t\t\t\tdata-post=\"1208\"\n\t\t\t\tdata-post-url=\"https:\/\/www.pythontutorial.net\/advanced-python\/python-generator-expressions\/\"\n\t\t\t\tdata-post-title=\"Python Generator Expressions\"\n\t\t\t\tdata-response=\"1\"\n\t\t\t\tclass=\"wth-btn-rounded wth-yes-btn\"\n\t\t\t>\n\t\t\t\t<svg\n\t\t\t\t\txmlns=\"http:\/\/www.w3.org\/2000\/svg\"\n\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\tfill=\"none\"\n\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\tclass=\"feather feather-thumbs-up block w-full h-full\"\n\t\t\t\t>\n\t\t\t\t\t<path\n\t\t\t\t\t\td=\"M14 9V5a3 3 0 0 0-3-3l-4 9v11h11.28a2 2 0 0 0 2-1.7l1.38-9a2 2 0 0 0-2-2.3zM7 22H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h3\"\n\t\t\t\t\t><\/path>\n\t\t\t\t<\/svg>\n\t\t\t\t<span class=\"sr-only\"> Yes <\/span>\n\t\t\t<\/button>\n\n\t\t\t<button\n\t\t\t\tdata-response=\"0\"\n\t\t\t\tdata-post=\"1208\"\n\t\t\t\tdata-post-url=\"https:\/\/www.pythontutorial.net\/advanced-python\/python-generator-expressions\/\"\n\t\t\t\tdata-post-title=\"Python Generator Expressions\"\n\t\t\t\tclass=\"wth-btn-rounded wth-no-btn\"\n\t\t\t>\n\t\t\t\t<svg\n\t\t\t\t\txmlns=\"http:\/\/www.w3.org\/2000\/svg\"\n\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\tfill=\"none\"\n\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t>\n\t\t\t\t\t<path\n\t\t\t\t\t\td=\"M10 15v4a3 3 0 0 0 3 3l4-9V2H5.72a2 2 0 0 0-2 1.7l-1.38 9a2 2 0 0 0 2 2.3zm7-13h2.67A2.31 2.31 0 0 1 22 4v7a2.31 2.31 0 0 1-2.33 2H17\"\n\t\t\t\t\t><\/path>\n\t\t\t\t<\/svg>\n\t\t\t\t<span class=\"sr-only\"> No <\/span>\n\t\t\t<\/button>\n\t\t<\/div>\n\t<\/header>\n\n\t<div class=\"wth-form hidden\">\n\t\t<div class=\"wth-form-wrapper\">\n\t\t\t<div class=\"wth-title\"><\/div>\n\t\t\t<textarea class=\"wth-message\"><\/textarea>\n\t\t\t<input type=\"button\" name=\"wth-submit\" class=\"wth-btn wth-btn-submit\" id=\"wth-submit\" \/>\n\t\t\t<input type=\"button\" class=\"wth-btn wth-btn-cancel\" value=\"Cancel\" \/>\n\t\t<\/div>\n\t<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>In this tutorial, you&#8217;ll learn about the Python generator expression to create a generator object.<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":757,"menu_order":22,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-1208","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.pythontutorial.net\/wp-json\/wp\/v2\/pages\/1208","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.pythontutorial.net\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.pythontutorial.net\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.pythontutorial.net\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.pythontutorial.net\/wp-json\/wp\/v2\/comments?post=1208"}],"version-history":[{"count":2,"href":"https:\/\/www.pythontutorial.net\/wp-json\/wp\/v2\/pages\/1208\/revisions"}],"predecessor-version":[{"id":7134,"href":"https:\/\/www.pythontutorial.net\/wp-json\/wp\/v2\/pages\/1208\/revisions\/7134"}],"up":[{"embeddable":true,"href":"https:\/\/www.pythontutorial.net\/wp-json\/wp\/v2\/pages\/757"}],"wp:attachment":[{"href":"https:\/\/www.pythontutorial.net\/wp-json\/wp\/v2\/media?parent=1208"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}