<
8000
script type="application/json" data-target="react-app.embeddedData">{"payload":{"allShortcutsEnabled":false,"fileTree":{"basics":{"items":[{"name":"README.md","path":"basics/README.md","contentType":"file"},{"name":"answers.md","path":"basics/answers.md","contentType":"file"},{"name":"classes.md","path":"basics/classes.md","contentType":"file"},{"name":"defining-functions.md","path":"basics/defining-functions.md","contentType":"file"},{"name":"dicts.md","path":"basics/dicts.md","contentType":"file"},{"name":"docstrings.md","path":"basics/docstrings.md","contentType":"file"},{"name":"editor-setup.md","path":"basics/editor-setup.md","contentType":"file"},{"name":"exceptions.md","path":"basics/exceptions.md","contentType":"file"},{"name":"files.md","path":"basics/files.md","contentType":"file"},{"name":"getting-started.md","path":"basics/getting-started.md","contentType":"file"},{"name":"handy-stuff-strings.md","path":"basics/handy-stuff-strings.md","contentType":"file"},{"name":"if.md","path":"basics/if.md","contentType":"file"},{"name":"installing-python.md","path":"basics/installing-python.md","contentType":"file"},{"name":"larger-program.md","path":"basics/larger-program.md","contentType":"file"},{"name":"lists-and-tuples.md","path":"basics/lists-and-tuples.md","contentType":"file"},{"name":"loops.md","path":"basics/loops.md","contentType":"file"},{"name":"modules.md","path":"basics/modules.md","contentType":"file"},{"name":"the-way-of-the-program.md","path":"basics/the-way-of-the-program.md","contentType":"file"},{"name":"trey-hunner-zip-and-enumerate.md","path":"basics/trey-hunner-zip-and-enumerate.md","contentType":"file"},{"name":"using-functions.md","path":"basics/using-functions.md","contentType":"file"},{"name":"variables.md","path":"basics/variables.md","contentType":"file"},{"name":"what-is-programming.md","path":"basics/what-is-programming.md","contentType":"file"},{"name":"what-is-true.md","path":"basics/what-is-true.md","contentType":"file"}],"totalCount":23},"":{"items":[{"name":"advanced","path":"advanced","contentType":"directory"},{"name":"basics","path":"basics","contentType":"directory"},{"name":"images","path":"images","contentType":"directory"},{"name":".gitignore","path":".gitignore","contentType":"file"},{"name":"LICENSE","path":"LICENSE","contentType":"file"},{"name":"README.md","path":"README.md","contentType":"file"},{"name":"TODO.md","path":"TODO.md","contentType":"file"},{"name":"classes.md","path":"classes.md","contentType":"file"},{"name":"common.py","path":"common.py","contentType":"file"},{"name":"contact-me.md","path":"contact-me.md","contentType":"file"},{"name":"getting-help.md","path":"getting-help.md","contentType":"file"},{"name":"html-style.css","path":"html-style.css","contentType":"file"},{"name":"linkcheck.py","path":"linkcheck.py","contentType":"file"},{"name":"make-html.py","path":"make-html.py","contentType":"file"},{"name":"update-ends.py","path":"update-ends.py","contentType":"file"},{"name":"update-readmes.py","path":"update-readmes.py","contentType":"file"},{"name":"what-next.md","path":"what-next.md","contentType":"file"}],"totalCount":17}},"fileTreeProcessingTime":3.936994,"foldersToFetch":[],"incompleteFileTree":false,"repo":{"id":455294803,"defaultBranch":"master","name":"python-tutorial","ownerLogin":"sirena-rubia","currentUserCanPush":false,"isFork":true,"isEmpty":false,"createdAt":"2022-02-03T19:10:16.000Z","ownerAvatar":"https://avatars.githubusercontent.com/u/84289465?v=4","public":true,"private":false,"isOrgOwned":false},"codeLineWrapEnabled":false,"symbolsExpanded":false,"treeExpanded":true,"refInfo":{"name":"master","listCacheKey":"v0:1643915423.0362072","canEdit":false,"refType":"branch","currentOid":"0f840ff1b2be0355798ab8b4bd4bbe90558ddb87"},"path":"basics/defining-functions.md","currentUser":null,"blob":{"rawLines":null,"stylingDirectives":null,"colorizedLines":null,"csv":null,"csvError":null,"dependabotInfo":{"showConfigurationBanner":false,"configFilePath":null,"networkDependabotPath":"/sirena-rubia/python-tutorial/network/updates","dismissConfigurationNoticePath":"/settings/dismiss-notice/dependabot_configuration_notice","configurationNoticeDismissed":null},"displayName":"defining-functions.md","displayUrl":"https://github.com/sirena-rubia/python-tutorial/blob/master/basics/defining-functions.md?raw=true","headerInfo":{"blobSize":"14.2 KB","deleteTooltip":"You must be signed in to make or propose changes","editTooltip":"You must be signed in to make or propose changes","ghDesktopPath":"https://desktop.github.com","isGitLfs":false,"onBranch":true,"shortPath":"ebe9e12","siteNavLoginPath":"/login?return_to=https%3A%2F%2Fgithub.com%2Fsirena-rubia%2Fpython-tutorial%2Fblob%2Fmaster%2Fbasics%2Fdefining-functions.md","isCSV":false,"isRichtext":true,"toc":[{"level":1,"text":"Defining custom functions","anchor":"defining-custom-functions","htmlText":"Defining custom functions"},{"level":2,"text":"Why should I use custom functions?","anchor":"why-should-i-use-custom-functions","htmlText":"Why should I use custom functions?"},{"level":2,"text":"First functions","anchor":"first-functions","htmlText":"First functions"},{"level":2,"text":"Locals and globals","anchor":"locals-and-globals","htmlText":"Locals and globals"},{"level":2,"text":"Input","anchor":"input","htmlText":"Input"},{"level":2,"text":"Default values","anchor":"default-values","htmlText":"Default values"},{"level":2,"text":"Output","anchor":"output","htmlText":"Output"},{"level":2,"text":"Return or print?","anchor":"return-or-print","htmlText":"Return or print?"},{"level":2,"text":"Common problems","anchor":"common-problems","htmlText":"Common problems"},{"level":2,"text":"Examples","anchor":"examples","htmlText":"Examples"},{"level":2,"text":"Summary","anchor":"summary","htmlText":"Summary"},{"level":2,"text":"Exercises","anchor":"exercises","htmlText":"Exercises"}],"lineInfo":{"truncatedLoc":"584","truncatedSloc":"453"},"mode":"file"},"image":false,"isCodeownersFile":null,"isPlain":false,"isValidLegacyIssueTemplate":false,"issueTemplate":null,"discussionTemplate":null,"language":"Markdown","languageID":222,"large":false,"planSupportInfo":{"repoIsFork":null,"repoOwnedByCurrentUser":null,"requestFullPath":"/sirena-rubia/python-tutorial/blob/master/basics/defining-functions.md","showFreeOrgGatedFeatureMessage":null,"showPlanSupportBanner":null,"upgradeDataAttributes":null,"upgradePath":null},"publishBannersInfo":{"dismissActionNoticePath":"/settings/dismiss-notice/publish_action_from_dockerfile","releasePath":"/sirena-rubia/python-tutorial/releases/new?marketplace=true","showPublishActionBanner":false},"rawBlobUrl":"https://github.com/sirena-rubia/python-tutorial/raw/refs/heads/master/basics/defining-functions.md","renderImageOrRaw":false,"richText":"\u003carticle class=\"markdown-body entry-content container-lg\" itemprop=\"text\"\u003e\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch1 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eDefining custom functions\u003c/h1\u003e\u003ca id=\"user-content-defining-custom-functions\" class=\"anchor\" aria-label=\"Permalink: Defining custom functions\" href=\"#defining-custom-functions\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eIt's probably been a while since you read about using functions.\n\u003ca href=\"/sirena-rubia/python-tutorial/blob/master/basics/using-functions.md\"\u003eRead about it again\u003c/a\u003e if you need to.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eWhy should I use custom functions?\u003c/h2\u003e\u003ca id=\"user-content-why-should-i-use-custom-functions\" class=\"anchor\" aria-label=\"Permalink: Why should I use custom functions?\" href=\"#why-should-i-use-custom-functions\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eHave a look at this code:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-python notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"print(\u0026quot;************\u0026quot;)\nprint(\u0026quot;Hello World!\u0026quot;)\nprint(\u0026quot;************\u0026quot;)\n\nprint(\u0026quot;*************\u0026quot;)\nprint(\u0026quot;Enter a word:\u0026quot;)\nprint(\u0026quot;*************\u0026quot;)\n\nword = input()\n\nif word == 'python':\n print(\u0026quot;*******************\u0026quot;)\n print(\u0026quot;You entered Python!\u0026quot;)\n print(\u0026quot;*******************\u0026quot;)\nelse:\n print(\u0026quot;**************************\u0026quot;)\n print(\u0026quot;You didn't enter Python :(\u0026quot;)\n print(\u0026quot;**************************\u0026quot;)\"\u003e\u003cpre\u003e\u003cspan class=\"pl-en\"\u003eprint\u003c/span\u003e(\u003cspan class=\"pl-s\"\u003e\"************\"\u003c/span\u003e)\n\u003cspan class=\"pl-en\"\u003eprint\u003c/span\u003e(\u003cspan class=\"pl-s\"\u003e\"Hello World!\"\u003c/span\u003e)\n\u003cspan class=\"pl-en\"\u003eprint\u003c/span\u003e(\u003cspan class=\"pl-s\"\u003e\"************\"\u003c/span\u003e)\n\n\u003cspan class=\"pl-en\"\u003eprint\u003c/span\u003e(\u003cspan class=\"pl-s\"\u003e\"*************\"\u003c/span\u003e)\n\u003cspan class=\"pl-en\"\u003eprint\u003c/span\u003e(\u003cspan class=\"pl-s\"\u003e\"Enter a word:\"\u003c/span\u003e)\n\u003cspan class=\"pl-en\"\u003eprint\u003c/span\u003e(\u003cspan class=\"pl-s\"\u003e\"*************\"\u003c/span\u003e)\n\n\u003cspan class=\"pl-s1\"\u003eword\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-en\"\u003einput\u003c/span\u003e()\n\n\u003cspan class=\"pl-k\"\u003eif\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eword\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e==\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e'python'\u003c/span\u003e:\n \u003cspan class=\"pl-en\"\u003eprint\u003c/span\u003e(\u003cspan class=\"pl-s\"\u003e\"*******************\"\u003c/span\u003e)\n \u003cspan class=\"pl-en\"\u003eprint\u003c/span\u003e(\u003cspan class=\"pl-s\"\u003e\"You entered Python!\"\u003c/span\u003e)\n \u003cspan class=\"pl-en\"\u003eprint\u003c/span\u003e(\u003cspan class=\"pl-s\"\u003e\"*******************\"\u003c/span\u003e)\n\u003cspan class=\"pl-k\"\u003eelse\u003c/span\u003e:\n \u003cspan class=\"pl-en\"\u003eprint\u003c/span\u003e(\u003cspan class=\"pl-s\"\u003e\"**************************\"\u003c/span\u003e)\n \u003cspan class=\"pl-en\"\u003eprint\u003c/span\u003e(\u003cspan class=\"pl-s\"\u003e\"You didn't enter Python :(\"\u003c/span\u003e)\n \u003cspan class=\"pl-en\"\u003eprint\u003c/span\u003e(\u003cspan class=\"pl-s\"\u003e\"**************************\"\u003c/span\u003e)\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThen compare it to this code:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-python notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"print_box(\u0026quot;Hello World!\u0026quot;)\nprint_box(\u0026quot;Enter a word:\u0026quot;)\nword = input()\nif word == 'python':\n print_box(\u0026quot;You entered Python!\u0026quot;)\nelse:\n print_box(\u0026quot;You didn't enter Python :(\u0026quot;)\"\u003e\u003cpre\u003e\u003cspan class=\"pl-en\"\u003eprint_box\u003c/span\u003e(\u003cspan class=\"pl-s\"\u003e\"Hello World!\"\u003c/span\u003e)\n\u003cspan class=\"pl-en\"\u003eprint_box\u003c/span\u003e(\u003cspan class=\"pl-s\"\u003e\"Enter a word:\"\u003c/span\u003e)\n\u003cspan class=\"pl-s1\"\u003eword\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-en\"\u003einput\u003c/span\u003e()\n\u003cspan class=\"pl-k\"\u003eif\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eword\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e==\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e'python'\u003c/span\u003e:\n \u003cspan class=\"pl-en\"\u003eprint_box\u003c/span\u003e(\u003cspan class=\"pl-s\"\u003e\"You entered Python!\"\u003c/span\u003e)\n\u003cspan class=\"pl-k\"\u003eelse\u003c/span\u003e:\n \u003cspan class=\"pl-en\"\u003eprint_box\u003c/span\u003e(\u003cspan class=\"pl-s\"\u003e\"You didn't enter Python :(\"\u003c/span\u003e)\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eIn this tutorial we'll learn to define a \u003ccode\u003eprint_box\u003c/code\u003e function\nthat prints text in a box. We can write the code for printing the\nbox once, and then use it multiple times anywhere in the program.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003ca href=\"/sirena-rubia/python-tutorial/blob/master/basics/larger-program.md\"\u003eDividing a long program into simple functions\u003c/a\u003e also\nmakes the code easier to work with. If there's a problem with the code\nwe can test the functions one by one and find the problem easily.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eFirst functions\u003c/h2\u003e\u003ca id=\"user-content-first-functions\" class=\"anchor\" aria-label=\"Permalink: First functions\" href=\"#first-functions\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThe \u003ccode\u003epass\u003c/code\u003e keyword does nothing.\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-python notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"\u0026gt;\u0026gt;\u0026gt; pass\n\u0026gt;\u0026gt;\u0026gt;\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-k\"\u003epass\u003c/span\u003e\n\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eLet's use it to define a function that does nothing.\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-python notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"\u0026gt;\u0026gt;\u0026gt; def do_nothing():\n... pass\n...\n\u0026gt;\u0026gt;\u0026gt; do_nothing\n\u0026lt;function do_nothing at 0x7f56b74e9598\u0026gt;\n\u0026gt;\u0026gt;\u0026gt;\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-k\"\u003edef\u003c/span\u003e \u003cspan class=\"pl-en\"\u003edo_nothing\u003c/span\u003e():\n... \u003cspan class=\"pl-k\"\u003epass\u003c/span\u003e\n...\n\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003edo_nothing\u003c/span\u003e\n\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-s1\"\u003efunction\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003edo_nothing\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eat\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e0x7f56b74e9598\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\n\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eSeems to be working so far, we have a function. It's just a value that\nis assigned to a variable called \u003ccode\u003edo_nothing\u003c/code\u003e. You can ignore the\n\u003ccode\u003e0xblablabla\u003c/code\u003e stuff for now.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThe \u003ccode\u003epass\u003c/code\u003e is needed here because without it, Python doesn't know when\nthe function ends and it gives us a syntax error. We don't need the\n\u003ccode\u003epass\u003c/code\u003e when our functions contain something else.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eLet's see what happens if we call our function.\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-python notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"\u0026gt;\u0026gt;\u0026gt; do_nothing()\n\u0026gt;\u0026gt;\u0026gt;\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-en\"\u003edo_nothing\u003c/span\u003e()\n\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThere we go. It did nothing at all.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eMaybe we could just do something in the function instead?\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-python notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"\u0026gt;\u0026gt;\u0026gt; def print_hi():\n... print(\u0026quot;Hi!\u0026quot;)\n...\n\u0026gt;\u0026gt;\u0026gt; print_hi()\nHi!\n\u0026gt;\u0026gt;\u0026gt;\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-k\"\u003edef\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eprint_hi\u003c/span\u003e():\n... \u003cspan class=\"pl-en\"\u003eprint\u003c/span\u003e(\u003cspan class=\"pl-s\"\u003e\"Hi!\"\u003c/span\u003e)\n...\n\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eprint_hi\u003c/span\u003e()\n\u003cspan class=\"pl-v\"\u003eHi\u003c/span\u003e!\n\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eIt's working. How about printing a variable in the function?\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-python notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"\u0026gt;\u0026gt;\u0026gt; def print_message():\n... print(message)\n...\n\u0026gt;\u0026gt;\u0026gt; message = \u0026quot;Hello World!\u0026quot;\n\u0026gt;\u0026gt;\u0026gt; print_message()\nHello World!\n\u0026gt;\u0026gt;\u0026gt;\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-k\"\u003edef\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eprint_message\u003c/span\u003e():\n... \u003cspan class=\"pl-en\"\u003eprint\u003c/span\u003e(\u003cspan class=\"pl-s1\"\u003emessage\u003c/span\u003e)\n...\n\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003emessage\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\"Hello World!\"\u003c/span\u003e\n\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eprint_message\u003c/span\u003e()\n\u003cspan class=\"pl-v\"\u003eHello\u003c/span\u003e \u003cspan class=\"pl-v\"\u003eWorld\u003c/span\u003e!\n\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eAgain, it works. How about setting a variable in the function?\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-python notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"\u0026gt;\u0026gt;\u0026gt; def get_username():\n... username = input(\u0026quot;Username: \u0026quot;)\n...\n\u0026gt;\u0026gt;\u0026gt; get_username()\nUsername: me\n\u0026gt;\u0026gt;\u0026gt; username\nTraceback (most recent call last):\n File \u0026quot;\u0026lt;stdin\u0026gt;\u0026quot;, line 1, in \u0026lt;module\u0026gt;\nNameError: name 'username' is not defined\n\u0026gt;\u0026gt;\u0026gt;\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-k\"\u003edef\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eget_username\u003c/span\u003e():\n... \u003cspan class=\"pl-s1\"\u003eusername\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-en\"\u003einput\u003c/span\u003e(\u003cspan class=\"pl-s\"\u003e\"Username: \"\u003c/span\u003e)\n...\n\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eget_username\u003c/span\u003e()\n\u003cspan class=\"pl-v\"\u003eUsername\u003c/span\u003e: \u003cspan class=\"pl-smi\"\u003eme\u003c/span\u003e\n\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eusername\u003c/span\u003e\n\u003cspan class=\"pl-en\"\u003eTraceback\u003c/span\u003e (\u003cspan class=\"pl-s1\"\u003emost\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003erecent\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003ecall\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003elast\u003c/span\u003e):\n \u003cspan class=\"pl-v\"\u003eFile\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\"\u0026lt;stdin\u0026gt;\"\u003c/span\u003e, \u003cspan class=\"pl-s1\"\u003eline\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e1\u003c/span\u003e, \u003cspan class=\"pl-s1\"\u003ein\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-s1\"\u003emodule\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\n\u003cspan class=\"pl-v\"\u003eNameError\u003c/span\u003e: \u003cspan class=\"pl-s1\"\u003ename\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e'username'\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e\u003cspan class=\"pl-c1\"\u003eis\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003enot\u003c/span\u003e\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003edefined\u003c/span\u003e\n\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThat was weird! Why didn't that work?\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eLocals and globals\u003c/h2\u003e\u003ca id=\"user-content-locals-and-globals\" class=\"anchor\" aria-label=\"Permalink: Locals and globals\" href=\"#locals-and-globals\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eSo far we have used nothing but \u003cstrong\u003eglobal variables\u003c/strong\u003e. They are called\nglobals because the same variables are available anywhere in our\nprogram, even in functions.\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-python notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"\u0026gt;\u0026gt;\u0026gt; a = 1\n\u0026gt;\u0026gt;\u0026gt; b = \u0026quot;hi\u0026quot;\n\u0026gt;\u0026gt;\u0026gt; c = \u0026quot;hello\u0026quot;\n\u0026gt;\u0026gt;\u0026gt; def print_abc():\n... print(a, b, c)\n...\n\u0026gt;\u0026gt;\u0026gt; print_abc()\n1 hi hello\n\u0026gt;\u0026gt;\u0026gt;\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003ea\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e1\u003c/span\u003e\n\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eb\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\"hi\"\u003c/span\u003e\n\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003ec\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\"hello\"\u003c/span\u003e\n\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-k\"\u003edef\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eprint_abc\u003c/span\u003e():\n... \u003cspan class=\"pl-en\"\u003eprint\u003c/span\u003e(\u003cspan class=\"pl-s1\"\u003ea\u003c/span\u003e, \u003cspan class=\"pl-s1\"\u003eb\u003c/span\u003e, \u003cspan class=\"pl-s1\"\u003ec\u003c/span\u003e)\n...\n\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eprint_abc\u003c/span\u003e()\n\u003cspan class=\"pl-c1\"\u003e1\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003ehi\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003ehello\u003c/span\u003e\n\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eBut there are also \u003cstrong\u003elocal variables\u003c/strong\u003e. They exist only \u003cstrong\u003einside\u003c/strong\u003e\nfunctions, and they are deleted when the function exits.\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-python notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"\u0026gt;\u0026gt;\u0026gt; def thingy():\n... d = \u0026quot;hello again, i'm a local variable\u0026quot;\n... print('inside thingy:', d)\n...\n\u0026gt;\u0026gt;\u0026gt; thingy()\ninside thingy: hello again, i'm a local variable\n\u0026gt;\u0026gt;\u0026gt; d\nTraceback (most recent call last):\n File \u0026quot;\u0026lt;stdin\u0026gt;\u0026quot;, line 1, in \u0026lt;module\u0026gt;\nNameError: name 'd' is not defined\n\u0026gt;\u0026gt;\u0026gt;\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-k\"\u003edef\u003c/span\u003e \u003cspan class=\"pl-en\"\u003ethingy\u003c/span\u003e():\n... \u003cspan class=\"pl-s1\"\u003ed\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\"hello again, i'm a local variable\"\u003c/span\u003e\n... \u003cspan class=\"pl-en\"\u003eprint\u003c/span\u003e(\u003cspan class=\"pl-s\"\u003e'inside thingy:'\u003c/span\u003e, \u003cspan class=\"pl-s1\"\u003ed\u003c/span\u003e)\n...\n\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-en\"\u003ethingy\u003c/span\u003e()\n\u003cspan class=\"pl-s1\"\u003einside\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003ethingy\u003c/span\u003e: \u003cspan class=\"pl-smi\"\u003ehello\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eagain\u003c/span\u003e, \u003cspan class=\"pl-s1\"\u003ei\u003c/span\u003e'\u003cspan class=\"pl-s1\"\u003em\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003ea\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003elocal\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003evariable\u003c/span\u003e\n\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003ed\u003c/span\u003e\n\u003cspan class=\"pl-en\"\u003eTraceback\u003c/span\u003e (\u003cspan class=\"pl-s1\"\u003emost\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003erecent\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003ecall\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003elast\u003c/span\u003e):\n \u003cspan class=\"pl-v\"\u003eFile\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\"\u0026lt;stdin\u0026gt;\"\u003c/span\u003e, \u003cspan class=\"pl-s1\"\u003eline\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e1\u003c/span\u003e, \u003cspan class=\"pl-s1\"\u003ein\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-s1\"\u003emodule\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\n\u003cspan class=\"pl-v\"\u003eNameError\u003c/span\u003e: \u003cspan class=\"pl-s1\"\u003ename\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e'd'\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e\u003cspan class=\"pl-c1\"\u003eis\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003enot\u003c/span\u003e\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003edefined\u003c/span\u003e\n\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eLet's draw a diagram of these variables:\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/sirena-rubia/python-tutorial/blob/master/images/locals-and-globals.png\"\u003e\u003cimg src=\"/sirena-rubia/python-tutorial/raw/master/images/locals-and-globals.png\" alt=\"Locals and globals.\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eHowever, modifying a global variable in-place from a function is easy.\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-python notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"\u0026gt;\u0026gt;\u0026gt; stuff = ['global stuff']\n\u0026gt;\u0026gt;\u0026gt; def add_stuff():\n... stuff.append('local stuff')\n...\n\u0026gt;\u0026gt;\u0026gt; add_stuff()\n\u002
8000
6gt;\u0026gt;\u0026gt; stuff\n['global stuff', 'local stuff']\n\u0026gt;\u0026gt;\u0026gt;\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003estuff\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e [\u003cspan class=\"pl-s\"\u003e'global stuff'\u003c/span\u003e]\n\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-k\"\u003edef\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eadd_stuff\u003c/span\u003e():\n... \u003cspan class=\"pl-s1\"\u003estuff\u003c/span\u003e.\u003cspan class=\"pl-c1\"\u003eappend\u003c/span\u003e(\u003cspan class=\"pl-s\"\u003e'local stuff'\u003c/span\u003e)\n...\n\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eadd_stuff\u003c/span\u003e()\n\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003estuff\u003c/span\u003e\n[\u003cspan class=\"pl-s\"\u003e'global stuff'\u003c/span\u003e, \u003cspan class=\"pl-s\"\u003e'local stuff'\u003c/span\u003e]\n\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThis only works for changing in-place, we cannot assign a new value to\nthe variable.\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-python notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"\u0026gt;\u0026gt;\u0026gt; def set_stuff_to_something_new():\n... stuff = ['more local stuff']\n...\n\u0026gt;\u0026gt;\u0026gt; set_stuff_to_something_new()\n\u0026gt;\u0026gt;\u0026gt; stuff\n['global stuff', 'local stuff']\n\u0026gt;\u0026gt;\u0026gt;\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-k\"\u003edef\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eset_stuff_to_something_new\u003c/span\u003e():\n... \u003cspan class=\"pl-s1\"\u003estuff\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e [\u003cspan class=\"pl-s\"\u003e'more local stuff'\u003c/span\u003e]\n...\n\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eset_stuff_to_something_new\u003c/span\u003e()\n\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003estuff\u003c/span\u003e\n[\u003cspan class=\"pl-s\"\u003e'global stuff'\u003c/span\u003e, \u003cspan class=\"pl-s\"\u003e'local stuff'\u003c/span\u003e]\n\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eInput\u003c/h2\u003e\u003ca id=\"user-content-input\" class=\"anchor\" aria-label=\"Permalink: Input\" href=\"#input\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eNote:\u003c/strong\u003e This section has nothing to do with the \u003ccode\u003einput\u003c/code\u003e function that\nis used like \u003ccode\u003eword = input(\"enter something: \")\u003c/code\u003e.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eSo far our functions seem to be really isolated from the rest of our\ncode, and it sucks! But they really are not as isolated as you might\nthink they are.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eLet's think about what the print function does. It takes an argument\nand prints it. Maybe a custom function could also take an argument?\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-python notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"\u0026gt;\u0026gt;\u0026gt; def print_twice(message):\n... print(message)\n... print(message)\n...\n\u0026gt;\u0026gt;\u0026gt;\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-k\"\u003edef\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eprint_twice\u003c/span\u003e(\u003cspan class=\"pl-s1\"\u003emessage\u003c/span\u003e):\n... \u003cspan class=\"pl-en\"\u003eprint\u003c/span\u003e(\u003cspan class=\"pl-s1\"\u003emessage\u003c/span\u003e)\n... \u003cspan class=\"pl-en\"\u003eprint\u003c/span\u003e(\u003cspan class=\"pl-s1\"\u003emessage\u003c/span\u003e)\n...\n\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eHere \u003ccode\u003emessage\u003c/code\u003e is an argument. When we call the function we'll get a\nlocal variable called message that will point to whatever we passed\nto \u003ccode\u003eprint_twice\u003c/code\u003e.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThis function can be called in two ways:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003eUsing a \u003cstrong\u003epositional argument\u003c/strong\u003e.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThis is the recommended way for functions that take only one or two\narguments. I would do this in my code.\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-python notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"\u0026gt;\u0026gt;\u0026gt; print_twice(\u0026quot;hi\u0026quot;)\nhi\nhi\n\u0026gt;\u0026gt;\u0026gt;\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eprint_twice\u003c/span\u003e(\u003cspan class=\"pl-s\"\u003e\"hi\"\u003c/span\u003e)\n\u003cspan class=\"pl-s1\"\u003ehi\u003c/span\u003e\n\u003cspan class=\"pl-s1\"\u003ehi\u003c/span\u003e\n\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eWhen the function was running it had a local \u003ccode\u003emessage\u003c/code\u003e variable\nthat pointed to \u003ccode\u003e\"hi\"\u003c/code\u003e. The function printed it twice.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003ePositional arguments are great for simple things, but if our\nfunction takes many positional arguments it may be hard to tell\nwhich argument is which.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003eUsing a \u003cstrong\u003ekeyword argument\u003c/strong\u003e:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-python notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"\u0026gt;\u0026gt;\u0026gt; print_twice(message=\u0026quot;hi\u0026quot;)\nhi\nhi\n\u0026gt;\u0026gt;\u0026gt;\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eprint_twice\u003c/span\u003e(\u003cspan class=\"pl-s1\"\u003emessage\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"hi\"\u003c/span\u003e)\n\u003cspan class=\"pl-s1\"\u003ehi\u003c/span\u003e\n\u003cspan class=\"pl-s1\"\u003ehi\u003c/span\u003e\n\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThe name \"keyword argument\" is a little bit confusing because\nkeyword arguments don't actually have anything to do with keywords\n(\u003ccode\u003eif\u003c/code\u003e, \u003ccode\u003eelse\u003c/code\u003e etc). Keyword arguments are just a way to give names\nfor our arguments.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eKeyword arguments are great when our function needs to take many\narguments, because each argument has a name and it's easy to see\nwhich argument is which.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eAlso note that there are no spaces around the \u003ccode\u003e=\u003c/code\u003e sign. This is\njust a small style detail that Python programmers like to do\nbecause \u003ccode\u003emessage = \"hi\"\u003c/code\u003e and \u003ccode\u003esome_function(message=\"hi\")\u003c/code\u003e do two\ncompletely different things.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003eNow it's time to solve our box printing problem:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-python notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"def print_box(message):\n print('*' * len(message))\n print(message)\n print('*' * len(message))\"\u003e\u003cpre\u003e\u003cspan class=\"pl-k\"\u003edef\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eprint_box\u003c/span\u003e(\u003cspan class=\"pl-s1\"\u003emessage\u003c/span\u003e):\n \u003cspan class=\"pl-en\"\u003eprint\u003c/span\u003e(\u003cspan class=\"pl-s\"\u003e'*'\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e*\u003c/span\u003e \u003cspan class=\"pl-en\"\u003elen\u003c/span\u003e(\u003cspan class=\"pl-s1\"\u003emessage\u003c/span\u003e))\n \u003cspan class=\"pl-en\"\u003eprint\u003c/span\u003e(\u003cspan class=\"pl-s1\"\u003emessage\u003c/span\u003e)\n \u003cspan class=\"pl-en\"\u003eprint\u003c/span\u003e(\u003cspan class=\"pl-s\"\u003e'*'\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e*\u003c/span\u003e \u003cspan class=\"pl-en\"\u003elen\u003c/span\u003e(\u003cspan class=\"pl-s1\"\u003emessage\u003c/span\u003e))\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eDefault values\u003c/h2\u003e\u003ca id=\"user-content-default-values\" class=\"anchor\" aria-label=\"Permalink: Default values\" href=\"#default-values\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eWhat if we want to print different characters instead of always\nprinting stars?\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eWe could change our \u003ccode\u003eprint_box\u003c/code\u003e function to take two arguments:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-python notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"def print_box(message, character):\n print(character * len(message))\n print(message)\n print(character * len(message))\"\u003e\u003cpre\u003e\u003cspan class=\"pl-k\"\u003edef\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eprint_box\u003c/span\u003e(\u003cspan class=\"pl-s1\"\u003emessage\u003c/span\u003e, \u003cspan class=\"pl-s1\"\u003echaracter\u003c/span\u003e):\n \u003cspan class=\"pl-en\"\u003eprint\u003c/span\u003e(\u003cspan class=\"pl-s1\"\u003echaracter\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e*\u003c/span\u003e \u003cspan class=\"pl-en\"\u003elen\u003c/span\u003e(\u003cspan class=\"pl-s1\"\u003emessage\u003c/span\u003e))\n \u003cspan class=\"pl-en\"\u003eprint\u003c/span\u003e(\u003cspan class=\"pl-s1\"\u003emessage\u003c/span\u003e)\n \u003cspan class=\"pl-en\"\u003eprint\u003c/span\u003e(\u003cspan class=\"pl-s1\"\u003echaracter\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e*\u003c/span\u003e \u003cspan class=\"pl-en\"\u003elen\u003c/span\u003e(\u003cspan class=\"pl-s1\"\u003emessage\u003c/span\u003e))\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThen we could change our code to always call \u003ccode\u003eprint_box\u003c/code\u003e with a star as\nthe second argument:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-python notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"print_box(\u0026quot;Hello World\u0026quot;, \u0026quot;*\u0026quot;)\n...\"\u003e\u003cpre\u003e\u003cspan class=\"pl-en\"\u003eprint_box\u003c/span\u003e(\u003cspan class=\"pl-s\"\u003e\"Hello World\"\u003c/span\u003e, \u003cspan class=\"pl-s\"\u003e\"*\"\u003c/span\u003e)\n...\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eBut we don't need to change our existing code. We can make the second\nargument \u003cstrong\u003eoptional\u003c/strong\u003e by giving it a default value.\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-python notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"def print_box(message, character='*'):\n print(character * len(message))\n print(message)\n print(character * len(message))\"\u003e\u003cpre\u003e\u003cspan class=\"pl-k\"\u003edef\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eprint_box\u003c/span\u003e(\u003cspan class=\"pl-s1\"\u003emessage\u003c/span\u003e, \u003cspan class=\"pl-s1\"\u003echaracter\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e'*'\u003c/span\u003e):\n \u003cspan class=\"pl-en\"\u003eprint\u003c/span\u003e(\u003cspan class=\"pl-s1\"\u003echaracter\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e*\u003c/span\u003e \u003cspan class=\"pl-en\"\u003elen\u003c/span\u003e(\u003cspan class=\"pl-s1\"\u003emessage\u003c/span\u003e))\n \u003cspan class=\"pl-en\"\u003eprint\u003c/span\u003e(\u003cspan class=\"pl-s1\"\u003emessage\u003c/span\u003e)\n \u003cspan class=\"pl-en\"\u003eprint\u003c/span\u003e(\u003cspan class=\"pl-s1\"\u003echaracter\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e*\u003c/span\u003e \u003cspan class=\"pl-en\"\u003elen\u003c/span\u003e(\u003cspan class=\"pl-s1\"\u003emessage\u003c/span\u003e))\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eWe can print a row of stars using the function without specifying a\ndifferent character in two ways:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003eUsing a positional argument.\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-python notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"print_box(\u0026quot;Hello World!\u0026quot;)\"\u003e\u003cpre\u003e\u003cspan class=\"pl-en\"\u003eprint_box\u003c/span\u003e(\u003cspan class=\"pl-s\"\u003e\"Hello World!\"\u003c/span\u003e)\u003c/pre\u003e\u003c/div\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003eUsing a keyword argument.\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-python notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"print_box(message=\u0026quot;Hello World!\u0026quot;)\"\u003e\u003cpre\u003e\u003cspan class=\"pl-en\"\u003eprint_box\u003c/span\u003e(\u003cspan class=\"pl-s1\"\u003emessage\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"Hello World!\"\u003c/span\u003e)\u003c/pre\u003e\u003c/div\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003eOr we can give it a different character in a few different ways if we\nneed to:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003eUsing two positional arguments.\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-python notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"print_box(\u0026quot;Enter a word:\u0026quot;, \u0026quot;?\u0026quot;)\"\u003e\u003cpre\u003e\u003cspan class=\"pl-en\"\u003eprint_box\u003c/span\u003e(\u003cspan class=\"pl-s\"\u003e\"Enter a word:\"\u003c/span\u003e, \u003cspan class=\"pl-s\"\u003e\"?\"\u003c/span\u003e)\u003c/pre\u003e\u003c/div\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003eUsing two keyword arguments.\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-python notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"print_box(message=\u0026quot;Enter a word:\u0026quot;, character=\u0026quot;?\u0026quot;)\nprint_box(character=\u0026quot;?\u0026quot;, message=\u0026quot;Enter a word:\u0026quot;)\"\u003e\u003cpre\u003e\u003cspan class=\"pl-en\"\u003eprint_box\u003c/span\u003e(\u003cspan class=\"pl-s1\"\u003emessage\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"Enter a word:\"\u003c/span\u003e, \u003cspan class=\"pl-s1\"\u003echaracter\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"?\"\u003c/span\u003e)\n\u003cspan class=\"pl-en\"\u003eprint_box\u003c/span\u003e(\u003cspan class=\"pl-s1\"\u003echaracter\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"?\"\u003c/span\u003e, \u003cspan class=\"pl-s1\"\u003emessage\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"Enter a word:\"\u003c/span\u003e)\u003c/pre\u003e\u003c/div\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003eUsing one positional argument and one keyword argument.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eI would probably do this. If an argument has a default value, I\nlike to use a keyword argument to change it if needed.\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-python notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"print_box(\u0026quot;Enter a word:\u0026quot;, character=\u0026quot;?\u0026quot;)\"\u003e\u003cpre\u003e\u003cspan class=\"pl-en\"\u003eprint_box\u003c/span\u003e(\u003cspan class=\"pl-s\"\u003e\"Enter a word:\"\u003c/span\u003e, \u003cspan class=\"pl-s1\"\u003echaracter\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"?\"\u003c/span\u003e)\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eHowever, this doesn't work:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-python notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"print_box(character=\u0026quot;?\u0026quot;, \u0026quot;Enter a word:\u0026quot;)\"\u003e\u003cpre\u003e\u003cspan class=\"pl-en\"\u003eprint_box\u003c/span\u003e(\u003cspan class=\"pl-s1\"\u003echaracter\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"?\"\u003c/span\u003e, \u003cspan class=\"pl-s\"\u003e\"Enter a word:\"\u003c/span\u003e)\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThe problem is that we have a keyword argument before a positional\nargument. Python doesn't allow this. We don't need to worry about\nthis, because if we accidentally call a function like this we\nwill get an error message.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eOutput\u003c/h2\u003e\u003ca id=\"user-content-output\" class=\"anchor\" aria-label=\"Permalink: Output\" href=\"#output\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThe built-in input function \u003ca href=\"/sirena-rubia/python-tutorial/blob/master/basics/using-functions.md#return-values\"\u003ereturns a value\u003c/a\u003e.\nCan our function return a value too?\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-python notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"\u0026gt;\u0026gt;\u0026gt; def times_two(thing):\n... return thing * 2\n...\n\u0026gt;\u0026gt;\u0026gt; times_two(3)\n6\n\u0026gt;\u0026gt;\u0026gt; times_two(5)\n10\n\u0026gt;\u0026gt;\u0026gt;\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-k\"\u003edef\u003c/span\u003e \u003cspan class=\"pl-en\"\u003etimes_two\u003c/span\u003e(\u003cspan class=\"pl-s1\"\u003ething\u003c/span\u003e):\n... \u003cspan class=\"pl-k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003ething\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e*\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e2\u003c/span\u003e\n...\n\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-en\"\u003etimes_two\u003c/span\u003e(\u003cspan class=\"pl-c1\"\u003e3\u003c/span\u003e)\n\u003cspan class=\"pl-c1\"\u003e6\u003c/span\u003e\n\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-en\"\u003etimes_two\u003c/span\u003e(\u003cspan class=\"pl-c1\"\u003e5\u003c/span\u003e)\n\u003cspan class=\"pl-c1\"\u003e10\u003c/span\u003e\n\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eYes, it can. Now typing \u003ccode\u003etimes_two(3)\u003c/code\u003e to the prompt does the same\nthing as typing \u003ccode\u003e6\u003c/code\u003e to the prompt.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eWe can call the \u003ccode\u003etimes_two\u003c/code\u003e function and use the result however we\nwant, just like we can use built-in functions:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-python notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"\u0026gt;\u0026gt;\u0026gt; times_two(2) + times_two(3) # calculate 4 + 6\n10\n\u0026gt;\u0026gt;\u0026gt; print('2 * 5 is', times_two(5))\n2 * 5 is 10\n\u0026gt;\u0026gt;\u0026gt;\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-en\"\u003etimes_two\u003c/span\u003e(\u003cspan class=\"pl-c1\"\u003e2\u003c/span\u003e) \u003cspan class=\"pl-c1\"\u003e+\u003c/span\u003e \u003cspan class=\"pl-en\"\u003etimes_two\u003c/span\u003e(\u003cspan class=\"pl-c1\"\u003e3\u003c/span\u003e) \u003cspan class=\"pl-c\"\u003e# calculate 4 + 6\u003c/span\u003e\n\u003cspan class=\"pl-c1\"\u003e10\u003c/span\u003e\n\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eprint\u003c/span\u003e(\u003cspan class=\"pl-s\"\u003e'2 * 5 is'\u003c/span\u003e, \u003cspan class=\"pl-en\"\u003etimes_two\u003c/span\u003e(\u003cspan class=\"pl-c1\"\u003e5\u003c/span\u003e))\n\u003cspan class=\"pl-c1\"\u003e2\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e*\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e5\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003eis\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e10\u003c/span\u003e\n\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eNote that \u003cstrong\u003ereturning from a function ends it immediately\u003c/strong\u003e.\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-python notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"\u0026gt;\u0026gt;\u0026gt; def return_before_print():\n... return None\n... print(\u0026quot;This never gets printed.\u0026quot;)\n...\n\u0026gt;\u0026gt;\u0026gt; return_before_print()\n\u0026gt;\u0026gt;\u0026gt;\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-k\"\u003edef\u003c/span\u003e \u003cspan class=\"pl-en\"\u003ereturn_before_print\u003c/span\u003e():\n... \u003cspan class=\"pl-k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003eNone\u003c/span\u003e\n... \u003cspan class=\"pl-en\"\u003eprint\u003c/span\u003e(\u003cspan class=\"pl-s\"\u003e\"This never gets printed.\"\u003c/span\u003e)\n...\n\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-en\"\u003ereturn_before_print\u003c/span\u003e()\n\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eIf we don't have any return statements or we have a return statement\nthat doesn't specify what to return, our function will return None.\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-python notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"\u0026gt;\u0026gt;\u0026gt; def return_none_1():\n... pass\n...\n\u0026gt;\u0026gt;\u0026gt; def return_none_2():\n... return\n...\n\u0026gt;\u0026gt;\u0026gt; print(return_none_1())\nNone\n\u0026gt;\u0026gt;\u0026gt; print(return_none_2())\nNone\n\u0026gt;\u0026gt;\u0026gt;\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-k\"\u003edef\u003c/span\u003e \u003cspan class=\"pl-en\"\u003ereturn_none_1\u003c/span\u003e():\n... \u003cspan class=\"pl-k\"\u003epass\u003c/span\u003e\n...\n\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-k\"\u003edef\u003c/span\u003e \u003cspan class=\"pl-en\"\u003ereturn_none_2\u003c/span\u003e():\n... \u003cspan class=\"pl-s1\"\u003ereturn\u003c/span\u003e\n...\n\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eprint\u003c/span\u003e(\u003cspan class=\"pl-en\"\u003ereturn_none_1\u003c/span\u003e())\n\u003cspan class=\"pl-c1\"\u003eNone\u003c/span\u003e\n\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eprint\u003c/span\u003e(\u003cspan class=\"pl-en\"\u003ereturn_none_2\u003c/span\u003e())\n\u003cspan class=\"pl-c1\"\u003eNone\u003c/span\u003e\n\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eReturn or print?\u003c/h2\u003e\u003ca id=\"user-content-return-or-print\" class=\"anchor\" aria-label=\"Permalink: Return or print?\" href=\"#return-or-print\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThere are two ways to output information from functions. They can print\nsomething or they can return something. So, should we print or return?\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eMost of the time \u003cstrong\u003ereturning makes functions much easier to use\u003c/strong\u003e. Think\nabout the \u003ccode\u003einput()\u003c/code\u003e function. It asks the user to enter something, and\nthen the user enters something and that value is returned. If the input\nfunction would print the value instead of returning it, things like\n\u003ccode\u003ename = input(\"Name: \")\u003c/code\u003e wouldn't work and assigning the result to a\nvariable would be much more difficult. Printing things is fine when we\nknow that we'll only need to print the result and we'll never need to\nassign it to a variable.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eIf our function returns a value we can always print it, like this:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-python notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"\u0026gt;\u0026gt;\u0026gt; def return_hi():\n... return \u0026quot;hi\u0026quot;\n...\n\u0026gt;\u0026gt;\u0026gt; print(return_hi())\nhi\n\u0026gt;\u0026gt;\u0026gt;\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-k\"\u003edef\u003c/span\u003e \u003cspan class=\"pl-en\"\u003ereturn_hi\u003c/span\u003e():\n... \u003cspan class=\"pl-k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\"hi\"\u003c/span\u003e\n...\n\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eprint\u003c/span\u003e(\u003cspan class=\"pl-en\"\u003ereturn_hi\u003c/span\u003e())\n\u003cspan class=\"pl-s1\"\u003ehi\u003c/span\u003e\n\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eCommon problems\u003c/h2\u003e\u003ca id=\"user-content-common-problems\" class=\"anchor\" aria-label=\"Permalink: Common problems\" href=\"#common-problems\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1
827B
.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eFunctions are easy to understand, but you need to pay attention to how\nyou're calling them. Note that \u003ccode\u003esome_function\u003c/code\u003e and \u003ccode\u003esome_function()\u003c/code\u003e do\ntwo completely different things.\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-python notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"\u0026gt;\u0026gt;\u0026gt; def say_hi():\n... print(\u0026quot;howdy hi\u0026quot;)\n...\n\u0026gt;\u0026gt;\u0026gt; say_hi # just checking what it is, doesn't run anything\n\u0026lt;function say_hi at 0x7f997d2a8510\u0026gt;\n\u0026gt;\u0026gt;\u0026gt; say_hi() # this runs it\nhowdy hi\n\u0026gt;\u0026gt;\u0026gt;\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-k\"\u003edef\u003c/span\u003e \u003cspan class=\"pl-en\"\u003esay_hi\u003c/span\u003e():\n... \u003cspan class=\"pl-en\"\u003eprint\u003c/span\u003e(\u003cspan class=\"pl-s\"\u003e\"howdy hi\"\u003c/span\u003e)\n...\n\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003esay_hi\u003c/span\u003e \u003cspan class=\"pl-c\"\u003e# just checking what it is, doesn't run anything\u003c/span\u003e\n\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-s1\"\u003efunction\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003esay_hi\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eat\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e0x7f997d2a8510\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\n\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-en\"\u003esay_hi\u003c/span\u003e() \u003cspan class=\"pl-c\"\u003e# this runs it\u003c/span\u003e\n\u003cspan class=\"pl-s1\"\u003ehowdy\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003ehi\u003c/span\u003e\n\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eTyping \u003ccode\u003esay_hi\u003c/code\u003e just gives us the value of the \u003ccode\u003esay_hi\u003c/code\u003e variable, which\nis the function we defined. But \u003ccode\u003esay_hi()\u003c/code\u003e \u003cstrong\u003ecalls\u003c/strong\u003e that function, so\nit runs and gives us a return value. The return value is None so the\n\u003ccode\u003e\u0026gt;\u0026gt;\u0026gt;\u003c/code\u003e prompt \u003ca href=\"#variables.md#none\"\u003edoesn't show it\u003c/a\u003e.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eBut we know that the print function shows None, so what happens if we\nwrap the whole thing in \u003ccode\u003eprint()\u003c/code\u003e?\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-python notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"\u0026gt;\u0026gt;\u0026gt; print(say_hi) # prints the function, just like plain say_hi\n\u0026lt;function say_hi at 0x7fd913f58488\u0026gt;\n\u0026gt;\u0026gt;\u0026gt; print(say_hi()) # runs the function and then prints the return value\nhowdy hi\nNone\n\u0026gt;\u0026gt;\u0026gt;\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eprint\u003c/span\u003e(\u003cspan class=\"pl-s1\"\u003esay_hi\u003c/span\u003e) \u003cspan class=\"pl-c\"\u003e# prints the function, just like plain say_hi\u003c/span\u003e\n\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-s1\"\u003efunction\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003esay_hi\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eat\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e0x7fd913f58488\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\n\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eprint\u003c/span\u003e(\u003cspan class=\"pl-en\"\u003esay_hi\u003c/span\u003e()) \u003cspan class=\"pl-c\"\u003e# runs the function and then prints the return value\u003c/span\u003e\n\u003cspan class=\"pl-s1\"\u003ehowdy\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003ehi\u003c/span\u003e\n\u003cspan class=\"pl-c1\"\u003eNone\u003c/span\u003e\n\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThe \u003ccode\u003eprint(say_hi())\u003c/code\u003e thing looks a bit weird at first, but it's easy to\nunderstand. There's a print inside \u003ccode\u003esay_hi\u003c/code\u003e and there's also the print\nwe just wrote, so two things are printed. Python first ran \u003ccode\u003esay_hi()\u003c/code\u003e,\nand it returned None so Python did \u003ccode\u003eprint(None)\u003c/code\u003e. Adding an extra\n\u003ccode\u003eprint()\u003c/code\u003e around a function call is actually a common mistake, and I\nhave helped many people with this problem.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eExamples\u003c/h2\u003e\u003ca id=\"user-content-examples\" class=\"anchor\" aria-label=\"Permalink: Examples\" href=\"#examples\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eAsk yes/no questions.\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-python notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"def ask_yes_no(prompt):\n while True:\n answer = input(prompt + ' (y or n) ')\n if answer == 'y' or answer == 'Y':\n return True # returning ends the function\n if answer == 'n' or answer == 'N':\n return False\n print(\u0026quot;Answer 'y' or 'n'.\u0026quot;)\n\nif ask_yes_no(\u0026quot;Do you like ice cream?\u0026quot;):\n print(\u0026quot;You like ice cream!\u0026quot;)\nelse:\n print(\u0026quot;You don't like ice cream.\u0026quot;)\"\u003e\u003cpre\u003e\u003cspan class=\"pl-k\"\u003edef\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eask_yes_no\u003c/span\u003e(\u003cspan class=\"pl-s1\"\u003eprompt\u003c/span\u003e):\n \u003cspan class=\"pl-k\"\u003ewhile\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003eTrue\u003c/span\u003e:\n \u003cspan class=\"pl-s1\"\u003eanswer\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-en\"\u003einput\u003c/span\u003e(\u003cspan class=\"pl-s1\"\u003eprompt\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e+\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e' (y or n) '\u003c/span\u003e)\n \u003cspan class=\"pl-k\"\u003eif\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eanswer\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e==\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e'y'\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003eor\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eanswer\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e==\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e'Y'\u003c/span\u003e:\n \u003cspan class=\"pl-k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003eTrue\u003c/span\u003e \u003cspan class=\"pl-c\"\u003e# returning ends the function\u003c/span\u003e\n \u003cspan class=\"pl-k\"\u003eif\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eanswer\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e==\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e'n'\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003eor\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eanswer\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e==\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e'N'\u003c/span\u003e:\n \u003cspan class=\"pl-k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003eFalse\u003c/span\u003e\n \u003cspan class=\"pl-en\"\u003eprint\u003c/span\u003e(\u003cspan class=\"pl-s\"\u003e\"Answer 'y' or 'n'.\"\u003c/span\u003e)\n\n\u003cspan class=\"pl-k\"\u003eif\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eask_yes_no\u003c/span\u003e(\u003cspan class=\"pl-s\"\u003e\"Do you like ice cream?\"\u003c/span\u003e):\n \u003cspan class=\"pl-en\"\u003eprint\u003c/span\u003e(\u003cspan class=\"pl-s\"\u003e\"You like ice cream!\"\u003c/span\u003e)\n\u003cspan class=\"pl-k\"\u003eelse\u003c/span\u003e:\n \u003cspan class=\"pl-en\"\u003eprint\u003c/span\u003e(\u003cspan class=\"pl-s\"\u003e\"You don't like ice cream.\"\u003c/span\u003e)\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eAsk questions with multiple answers.\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-python notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"def ask_until_correct(prompt, correct_options,\n error_message=\u0026quot;I don't know what you meant.\u0026quot;):\n while True:\n answer = input(prompt + ' ')\n if answer in correct_options:\n return answer\n print(error_message)\n\n\ncolors = ['red', 'yellow', 'blue', 'green', 'orange', 'pink', 'black',\n 'gray', 'white', 'brown']\nchoice = ask_until_correct(\u0026quot;What's your favorite color?\u0026quot;, colors,\n error_message=\u0026quot;I don't know that color.\u0026quot;)\nprint(\u0026quot;Your favorite color is %s!\u0026quot; % choice)\"\u003e\u003cpre\u003e\u003cspan class=\"pl-k\"\u003edef\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eask_until_correct\u003c/span\u003e(\u003cspan class=\"pl-s1\"\u003eprompt\u003c/span\u003e, \u003cspan class=\"pl-s1\"\u003ecorrect_options\u003c/span\u003e,\n \u003cspan class=\"pl-s1\"\u003eerror_message\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"I don't know what you meant.\"\u003c/span\u003e):\n \u003cspan class=\"pl-k\"\u003ewhile\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003eTrue\u003c/span\u003e:\n \u003cspan class=\"pl-s1\"\u003eanswer\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-en\"\u003einput\u003c/span\u003e(\u003cspan class=\"pl-s1\"\u003eprompt\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e+\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e' '\u003c/span\u003e)\n \u003cspan class=\"pl-k\"\u003eif\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eanswer\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003ein\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003ecorrect_options\u003c/span\u003e:\n \u003cspan class=\"pl-k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eanswer\u003c/span\u003e\n \u003cspan class=\"pl-en\"\u003eprint\u003c/span\u003e(\u003cspan class=\"pl-s1\"\u003eerror_message\u003c/span\u003e)\n\n\n\u003cspan class=\"pl-s1\"\u003ecolors\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e [\u003cspan class=\"pl-s\"\u003e'red'\u003c/span\u003e, \u003cspan class=\"pl-s\"\u003e'yellow'\u003c/span\u003e, \u003cspan class=\"pl-s\"\u003e'blue'\u003c/span\u003e, \u003cspan class=\"pl-s\"\u003e'green'\u003c/span\u003e, \u003cspan class=\"pl-s\"\u003e'orange'\u003c/span\u003e, \u003cspan class=\"pl-s\"\u003e'pink'\u003c/span\u003e, \u003cspan class=\"pl-s\"\u003e'black'\u003c/span\u003e,\n \u003cspan class=\"pl-s\"\u003e'gray'\u003c/span\u003e, \u003cspan class=\"pl-s\"\u003e'white'\u003c/span\u003e, \u003cspan class=\"pl-s\"\u003e'brown'\u003c/span\u003e]\n\u003cspan class=\"pl-s1\"\u003echoice\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eask_until_correct\u003c/span\u003e(\u003cspan class=\"pl-s\"\u003e\"What's your favorite color?\"\u003c/span\u003e, \u003cspan class=\"pl-s1\"\u003ecolors\u003c/span\u003e,\n \u003cspan class=\"pl-s1\"\u003eerror_message\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"I don't know that color.\"\u003c/span\u003e)\n\u003cspan class=\"pl-en\"\u003eprint\u003c/span\u003e(\u003cspan class=\"pl-s\"\u003e\"Your favorite color is %s!\"\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e%\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003echoice\u003c/span\u003e)\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eSummary\u003c/h2\u003e\u003ca id=\"user-content-summary\" class=\"anchor\" aria-label=\"Permalink: Summary\" href=\"#summary\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eFunctions are a way to write code once, and then use that same\ncode in multiple places.\u003c/li\u003e\n\u003cli\u003eVariables inside functions are \u003cstrong\u003elocals\u003c/strong\u003e, and variables outside\nfunctions are \u003cstrong\u003eglobals\u003c/strong\u003e. Functions can access all variables, but\nby default, they can only create and change the value of local\nvariables.\u003c/li\u003e\n\u003cli\u003eFunctions can take \u003cstrong\u003earguments\u003c/strong\u003e and they can behave differently\ndepending on what arguments they get. Arguments are just local\nvariables.\u003c/li\u003e\n\u003cli\u003eFunctions can also \u003cstrong\u003ereturn\u003c/strong\u003e one value, like the built-in input\nfunction does. Returning also ends the function immediately.\u003c/li\u003e\n\u003cli\u003eReturn a value instead of printing it if you need to do something with\nit after calling the function.\u003c/li\u003e\n\u003cli\u003eRemember that \u003ccode\u003ething\u003c/code\u003e, \u003ccode\u003ething()\u003c/code\u003e, \u003ccode\u003eprint(thing)\u003c/code\u003e and \u003ccode\u003eprint(thing())\u003c/code\u003e\ndo different things.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eExercises\u003c/h2\u003e\u003ca id=\"user-content-exercises\" class=\"anchor\" aria-label=\"Permalink: Exercises\" href=\"#exercises\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eThere are many things to learn about functions, and I don't expect\nyou to learn everything at once.\u003c/strong\u003e However, there are also many free\nexercises about defining functions you can do.\u003c/p\u003e\n\u003col dir=\"auto\"\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003eWhat's wrong with this code?\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-python notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"def ask_name():\n name = input(\u0026quot;Enter your name: \u0026quot;)\n\nask_name()\nprint(\u0026quot;Your name is\u0026quot;, name)\"\u003e\u003cpre\u003e\u003cspan class=\"pl-k\"\u003edef\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eask_name\u003c/span\u003e():\n \u003cspan class=\"pl-s1\"\u003ename\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-en\"\u003einput\u003c/span\u003e(\u003cspan class=\"pl-s\"\u003e\"Enter your name: \"\u003c/span\u003e)\n\n\u003cspan class=\"pl-en\"\u003eask_name\u003c/span\u003e()\n\u003cspan class=\"pl-en\"\u003eprint\u003c/span\u003e(\u003cspan class=\"pl-s\"\u003e\"Your name is\"\u003c/span\u003e, \u003cspan class=\"pl-s1\"\u003ename\u003c/span\u003e)\u003c/pre\u003e\u003c/div\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003eHow about this code?\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-python notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"def get_greeting():\n return \u0026quot;Hello World!\u0026quot;\n\nprint(get_greeting)\"\u003e\u003cpre\u003e\u003cspan class=\"pl-k\"\u003edef\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eget_greeting\u003c/span\u003e():\n \u003cspan class=\"pl-k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\"Hello World!\"\u003c/span\u003e\n\n\u003cspan class=\"pl-en\"\u003eprint\u003c/span\u003e(\u003cspan class=\"pl-s1\"\u003eget_greeting\u003c/span\u003e)\u003c/pre\u003e\u003c/div\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003eWhy does this print None after greeting the world?\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-python notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"def greet(target):\n print(\u0026quot;Hello\u0026quot;, target)\n\nprint(greet(\u0026quot;World\u0026quot;))\"\u003e\u003cpre\u003e\u003cspan class=\"pl-k\"\u003edef\u003c/span\u003e \u003cspan class=\"pl-en\"\u003egreet\u003c/span\u003e(\u003cspan class=\"pl-s1\"\u003etarget\u003c/span\u003e):\n \u003cspan class=\"pl-en\"\u003eprint\u003c/span\u003e(\u003cspan class=\"pl-s\"\u003e\"Hello\"\u003c/span\u003e, \u003cspan class=\"pl-s1\"\u003etarget\u003c/span\u003e)\n\n\u003cspan class=\"pl-en\"\u003eprint\u003c/span\u003e(\u003cspan class=\"pl-en\"\u003egreet\u003c/span\u003e(\u003cspan class=\"pl-s\"\u003e\"World\"\u003c/span\u003e))\u003c/pre\u003e\u003c/div\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003eFind more exercises about defining functions online.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp dir=\"auto\"\u003eAnswers for the first, second and third exercise are\n\u003ca href=\"/sirena-rubia/python-tutorial/blob/master/basics/answers.md#defining-functions\"\u003ehere\u003c/a\u003e.\u003c/p\u003e\n\u003chr\u003e\n\u003cp dir=\"auto\"\u003eIf you have trouble with this tutorial please \u003ca href=\"/sirena-rubia/python-tutorial/blob/master/contact-me.md\"\u003etell me about\nit\u003c/a\u003e and I'll make this tutorial better. If you\nlike this tutorial, please \u003ca href=\"/sirena-rubia/python-tutorial/blob/master/README.md#how-can-i-thank-you-for-writing-and-sharing-this-tutorial\"\u003egive it a\nstar\u003c/a\u003e.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eYou may use this tutorial freely at your own risk. See\n\u003ca href=\"/sirena-rubia/python-tutorial/blob/master/LICENSE\"\u003eLICENSE\u003c/a\u003e.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003ca href=\"/sirena-rubia/python-tutorial/blob/master/basics/dicts.md\"\u003ePrevious\u003c/a\u003e | \u003ca href=\"/sirena-rubia/python-tutorial/blob/master/basics/larger-program.md\"\u003eNext\u003c/a\u003e |\n\u003ca href=\"/sirena-rubia/python-tutorial/blob/master/README.md#basics\"\u003eList of contents\u003c/a\u003e\u003c/p\u003e\n\u003c/article\u003e","renderedFileInfo":null,"shortPath":null,"symbolsEnabled":true,"tabSize":4,"topBannersInfo":{"overridingGlobalFundingFile":false,"globalPreferredFundingPath":null,"showInvalidCitationWarning":false,"citationHelpUrl":"https://docs.github.com/github/creating-cloning-and-archiving-repositories/creating-a-repository-on-github/about-citation-files","actionsOnboardingTip":null},"truncated":false,"viewable":true,"workflowRedirectUrl":null,"symbols":null},"copilotInfo":null,"copilotAccessAllowed":false,"modelsAccessAllowed":false,"modelsRepoIntegrationEnabled":false,"isMarketplaceEnabled":true,"csrf_tokens":{"/sirena-rubia/python-tutorial/branches":{"post":"oGdda1rEGhCm_YUgwSoOv4YCZvlSqE1ipwUwXucKXUzE3tAnFOGbcEtMXEse0etCtZR61pi7dR9UHwcvhYOcOw"},"/repos/preferences":{"post":"y_Ydy1fqVCrf-DhEhc0-JB1vhwxptYREjLN-ei270jYgOxgrh59hbOzfS_d5UocRfWhgxRgwT2CmGadrq4qwlw"}}},"title":"python-tutorial/basics/defining-functions.md at master · sirena-rubia/python-tutorial","appPayload":{"helpUrl":"https://docs.github.com","findFileWorkerPath":"/assets-cdn/worker/find-file-worker-b8decd09f5c5.js","findInFileWorkerPath":"/assets-cdn/worker/find-in-file-worker-92c7243ce930.js","githubDevUrl":null,"enabled_features":{"code_nav_ui_events":false,"react_blob_overlay":false,"accessible_code_button":true}}}
You can’t perform that action at this time.