From df5a8792e1038908105af2c10047ca412094a9ca Mon Sep 17 00:00:00 2001 From: Benjamin Reed Date: Tue, 19 Aug 2025 14:38:40 -0400 Subject: [PATCH 01/36] Update GradeTracker.py --- 1 gradetracker/GradeTracker.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1 gradetracker/GradeTracker.py b/1 gradetracker/GradeTracker.py index 54f12d7..3e79601 100644 --- a/1 gradetracker/GradeTracker.py +++ b/1 gradetracker/GradeTracker.py @@ -9,7 +9,7 @@ import statistics as s #add constants next -admins = {'Dominic':'Hacker','Faculty2':'ABC123','Faculty3':'123ABC'} +admins = {'Dominic':'Hacker','Faculty2':'ABC123','Faculty3':'123ABC','Benjamin':'Reed'} # Like the admins above is a dictionary but of students. # Dictionaries use curly brackets with colons to associate keys with values. From e6e895243c882396165c2c4fa3799bd8e0631fe3 Mon Sep 17 00:00:00 2001 From: Benjamin Reed Date: Thu, 28 Aug 2025 13:20:28 -0400 Subject: [PATCH 02/36] update --- .DS_Store | Bin 8196 -> 0 bytes 4 DB in Python/.DS_Store | Bin 6148 -> 0 bytes 5 RaspberryPi button/.DS_Store | Bin 6148 -> 0 bytes 6 Web Page with Flask/.DS_Store | Bin 6148 -> 0 bytes .../Module_1.0_Tutorials_START_HERE.ipynb | 194 +++++++++++++++--- 5 files changed, 164 insertions(+), 30 deletions(-) delete mode 100644 .DS_Store delete mode 100644 4 DB in Python/.DS_Store delete mode 100644 5 RaspberryPi button/.DS_Store delete mode 100644 6 Web Page with Flask/.DS_Store diff --git a/.DS_Store b/.DS_Store deleted file mode 100644 index 7d353cf39c7fe0723f3355730a1b360b7dc356be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8196 zcmeHMO>0v@6g|_1nqrWGRSIt2LU5-aA>bo2XJu%lUOJfRBLHQJ)jF}fA_dC8%AA#zm)yr8K z8fna-?BPS%k(E86C_Os+541W|&Pbno20R1949M9%h1;m3fq`>=PoKVvwza#3Lb=r~ zvyQJ?czU$@Wz%i1j&1MlMD7Nb-_jIUkmXxm$1X~!qK1JkRnTO4*TI4tKPTzC_>f6G zJP~|j$7pw>n5VOG{2+X$4DPbfL?3&UeN?m`J=9zuGS|oH#_%7%|D^Gc>^p{iqJ9GI zW!xj)3fXTle~cH{b`ckU5OIQ*i#0sic%rc;YDO6zr|IGgIWXt$KJgWhXWl@E`7<0a zN_Nmi$3d!|zL})&V#eW}bsHaJ#)xq|m5t+v`Ye8|Vx8EZljlBqC`)wncR+6%tS>Wa z2K>c+LaI57t?OU-(fT*_*sia$+dF=nP5c@j(7%`Tx2)%`#CN^M(!Q)UoW%fJj67kb z>C7fJe$n$8tfRiGZ?&VPTY7DpsfV*TJzo#5{~zc8FI6M)N^dvGL!a~9(lahho`A0KWB_wq#uWu1^sn)HO9*p`RH&5D4|UjI*bij zk@`+dEN#Cg8&g`2;9zR&M9-(RcKp30VKBF8(I8us^Z%pK_y2Q?-vjducm^)cfJzmL zg*^LFBl?oFcEINqA4#GY8mUc~iHg+g<2dD?KMYw8Y+KIC&`7p0{q>80#P5&j*N@-- RH1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0 \u001b[39m\u001b[32m1\u001b[39m \u001b[43mPrint\u001b[49m(\u001b[33m\"\u001b[39m\u001b[33mHello programmer!\u001b[39m\u001b[33m\"\u001b[39m)\n", + "\u001b[31mNameError\u001b[39m: name 'Print' is not defined" + ] + } + ], + "source": [ + "Print(\"Hello programmer!\")" + ] }, { "cell_type": "code", @@ -141,7 +171,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 10, "metadata": {}, "outputs": [], "source": [ @@ -163,10 +193,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 8, "metadata": {}, - "outputs": [], - "source": [] + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Hello App Dev 1!!!\n" + ] + } + ], + "source": [ + "# I am making this comment to explain the next line of code\n", + "print(\"Hello App Dev 1!!!\") # this is an inline comment" + ] }, { "cell_type": "markdown", @@ -239,6 +280,24 @@ "outputs": [], "source": [] }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "after edit, save!\n" + ] + } + ], + "source": [ + "# \"create a new cell\"\n", + "print(\"after edit, save!\")" + ] + }, { "cell_type": "code", "execution_count": null, @@ -270,6 +329,23 @@ "outputs": [], "source": [] }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "cntrl+s to save\n" + ] + } + ], + "source": [ + "print(\"cntrl+s to save\")" + ] + }, { "cell_type": "code", "execution_count": null, @@ -356,14 +432,24 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "This is a string with single quotes\n", + "This is a string with double quotes\n" + ] + } + ], "source": [ "# [ ] enter a string in the print() function using single quotes\n", + "print('This is a string with single quotes')\n", "\n", "# [ ] enter a string in the print() function using double quotes\n", - "\n" + "print(\"This is a string with double quotes\")\n" ] }, { @@ -391,9 +477,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "123\n", + "123\n" + ] + } + ], "source": [ "print(123) #integer, with numeric value\n", "print(\"123\") #string, represents text characters" @@ -454,15 +549,24 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "123\n", + "123\n" + ] + } + ], "source": [ "# [ ] print an Integer\n", - "\n", + "print(123)\n", "\n", "# [ ] print a strings made of Integer characters\n", - "\n", + "print('123')\n", "\n" ] }, @@ -520,13 +624,22 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "I am a string\n", + "I am a string\n" + ] + } + ], "source": [ "# [ ] Review code and Run\n", "# initialize the variable\n", - "#current_msg = \"I am a string\"\n", + "current_msg = \"I am a string\"\n", "\n", "# print literal string\n", "print(\"I am a string\")\n", @@ -537,15 +650,23 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 9, "metadata": { "scrolled": true }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "I ran this cell using ctrl+enter\n" + ] + } + ], "source": [ "# [ ] Review code and Run\n", "# assign a new string to the current_msg\n", - "current_msg = \"Run this cell using Ctrl+Enter\"\n", + "current_msg = \"I ran this cell using ctrl+enter\"\n", "\n", "print(current_msg)" ] @@ -566,12 +687,25 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 14, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "This is me changing current_msg\n", + "This is me changing current_msg\n" + ] + } + ], "source": [ "# { ] run cell above then run this cell after completing the code as directed\n", - "\n" + "print(current_msg)\n", + "\n", + "current_msg = \"This is me changing current_msg\"\n", + "\n", + "print(current_msg)\n" ] }, { @@ -3300,7 +3434,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.13.1" + "version": "3.13.7" } }, "nbformat": 4, From c6556d444174fcb44af6293e51a2e87ff119f4d1 Mon Sep 17 00:00:00 2001 From: Benjamin Reed Date: Thu, 28 Aug 2025 13:25:11 -0400 Subject: [PATCH 03/36] Test --- 2 ksu scrape/ksu_scrape_new.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2 ksu scrape/ksu_scrape_new.py b/2 ksu scrape/ksu_scrape_new.py index 20300ac..e22f953 100644 --- a/2 ksu scrape/ksu_scrape_new.py +++ b/2 ksu scrape/ksu_scrape_new.py @@ -5,7 +5,7 @@ from bs4 import BeautifulSoup import requests import csv -from datetime import datetime +from datetime import datetimegfhfgh def scrape_ksu(ksu_url,page): ''' From d34a2bf3b6516d3e61ef29a65b59f725f661bd7c Mon Sep 17 00:00:00 2001 From: Benjamin Reed Date: Thu, 28 Aug 2025 14:30:13 -0400 Subject: [PATCH 04/36] working on KSUscrape --- 2 ksu scrape/ksu_scrape_new.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2 ksu scrape/ksu_scrape_new.py b/2 ksu scrape/ksu_scrape_new.py index e22f953..20300ac 100644 --- a/2 ksu scrape/ksu_scrape_new.py +++ b/2 ksu scrape/ksu_scrape_new.py @@ -5,7 +5,7 @@ from bs4 import BeautifulSoup import requests import csv -from datetime import datetimegfhfgh +from datetime import datetime def scrape_ksu(ksu_url,page): ''' From 079a4b55cc36b26a6b9c7d63931baeee44aea11e Mon Sep 17 00:00:00 2001 From: Benjamin Reed Date: Thu, 28 Aug 2025 15:23:41 -0400 Subject: [PATCH 05/36] Changed code to output 1 csv page Added a new code file to output on csv page and edited the ksu_scrape_new to only output one csv page with all data in it instead of 9 different pages. --- 2 ksu scrape/ksu_scrape_new.py | 5 +- 2 ksu scrape/ksu_scrape_one_csv.py | 55 ++++++++++++++++++ ksu_news_08_28_2025_all.csv | 91 ++++++++++++++++++++++++++++++ 3 files changed, 149 insertions(+), 2 deletions(-) create mode 100644 2 ksu scrape/ksu_scrape_one_csv.py create mode 100644 ksu_news_08_28_2025_all.csv diff --git a/2 ksu scrape/ksu_scrape_new.py b/2 ksu scrape/ksu_scrape_new.py index 20300ac..0a295aa 100644 --- a/2 ksu scrape/ksu_scrape_new.py +++ b/2 ksu scrape/ksu_scrape_new.py @@ -16,10 +16,11 @@ def scrape_ksu(ksu_url,page): #using the lxml parser to process the web page text content soup = BeautifulSoup(source, 'lxml') #create a csv file in "w" write mode so we can add content to it. - ksu_news_csv = open("ksu_news_"+"{:%m_%d_%Y}".format(datetime.now())+"_p"+page+".csv","w") + ksu_news_csv = open("ksu_news_"+"{:%m_%d_%Y}".format(datetime.now())+"_all.csv", "a", newline="", encoding="utf-8") csv_writer = csv.writer(ksu_news_csv) #write the header row into our csv file - csv_writer.writerow(["Number","Title","URL","Date"]) + if page == "1": + csv_writer.writerow(["Number","Title","URL","Date"]) #show the content of the website we retrieved so that we can find the unique tags around the content we want #print(soup.prettify()) diff --git a/2 ksu scrape/ksu_scrape_one_csv.py b/2 ksu scrape/ksu_scrape_one_csv.py new file mode 100644 index 0000000..3bb7554 --- /dev/null +++ b/2 ksu scrape/ksu_scrape_one_csv.py @@ -0,0 +1,55 @@ +''' +To use this code, you will first need to install the three packages being imported below using pip or a manual install method. +This code was updated in August 2021 to use the new KSU news feed design. +''' +from bs4 import BeautifulSoup +import requests +import csv +from datetime import datetime + +def scrape_ksu(ksu_url, page): + ''' + This function is made for scraping the KSU news feed as of its redesign in August 2022. + Now returns rows instead of writing a CSV. + ''' + # grab the basic content from a web page + source = requests.get(ksu_url + page).text + # using the lxml parser to process the web page text content + soup = BeautifulSoup(source, 'lxml') + + # find posts + blog_list = soup.find('ul', class_='blog_listing') + blog_posts = blog_list.find_all('li') + + rows = [] + i = 1 + for blog_post in blog_posts: + title = blog_post.h3.text + + date = blog_post.p.text + date = date.strip().strip('"').strip() + + URL = blog_post.find('a')['href'] + + rows.append([i, title, URL, date]) + i += 1 + + return rows + +# -------- main driver: scrape many pages, write one CSV -------- +all_rows = [] +base_url = 'https://www.kennesaw.edu/news/news-releases/index.php?&p=' + +# loop the pages you want (1..9); adjust range as needed +for i in range(1, 10): + page_rows = scrape_ksu(base_url, str(i)) + all_rows.extend(page_rows) + +# write everything once into one CSV +outfile = f"ksu_news_{datetime.now():%m_%d_%Y}_all.csv" +with open(outfile, "w", newline="", encoding="utf-8") as f: + writer = csv.writer(f) + writer.writerow(["Number", "Title", "URL", "Date"]) + writer.writerows(all_rows) + +print(f"Wrote {len(all_rows)} rows to {outfile}") diff --git a/ksu_news_08_28_2025_all.csv b/ksu_news_08_28_2025_all.csv new file mode 100644 index 0000000..e11d5c0 --- /dev/null +++ b/ksu_news_08_28_2025_all.csv @@ -0,0 +1,91 @@ +Number,Title,URL,Date +1,Kennesaw State and Fukuoka University sign agreement to expand global fintech education,https://www.kennesaw.edu/coles/news/stories/2025-08-28-kennesaw-state-and-fukuoka-university-sign-agreement-to-expand-global-fintech-education.php,"August 28, 2025" +2,"Kennesaw State coach Jerry Mack embraces relationships, community as KSU football enters new era",https://www.kennesaw.edu/news/stories/2025/coach-embraces-community-ksu-football-enters-new-era.php,"August 28, 2025" +3,"Kennesaw State lab serves as hub for undergraduate research, scholarship",https://www.kennesaw.edu/news/stories/2025/andrew-haddow-lab-serves-hub-undergraduate-research.php,"August 27, 2025" +4,Kennesaw State passes SACSCOC Fifth-Year Interim Review,https://www.kennesaw.edu/news/stories/2025/kennesaw-state-passes-sacscoc-fifth-year-interim-review.php,"August 26, 2025" +5,Kennesaw State program earns 2025 Regents' Award,https://www.kennesaw.edu/news/stories/2025/kennesaw-state-program-earns-2025-regents-award.php,"August 26, 2025" +6,Kennesaw State researcher taps engineering background to discover solutions for stomach diseases,https://www.kennesaw.edu/news/stories/2025/researcher-taps-engineering-discover-solutions-stomach-diseases.php,"August 25, 2025" +7,AI expert Kathy Pham speaking at Kennesaw State to begin Presidential Lecture Series,https://www.kennesaw.edu/news/stories/2025/ksu-presidential-lecture-series-ai-expert-kathy-pham.php,"August 25, 2025" +8,Kennesaw State University recognized as Military Support College of Distinction,https://www.kennesaw.edu/news/stories/2025/ksu-recognized-military-support-college-distinction.php,"August 22, 2025" +9,Kennesaw State trio spend summer interning at Air Force Research Lab,https://www.kennesaw.edu/news/stories/2025/ksu-trio-summer-interning-air-force-research-lab.php,"August 21, 2025" +10,Kennesaw State student earns competitive internship with NBC's Today Show,https://www.kennesaw.edu/news/stories/2025/student-earns-competitive-internship-nbc-today-show.php,"August 20, 2025" +1,"Kennesaw State, Walens Family Announce Fifth Third Stadium Field Naming Partnership",https://ksuowls.com/news/2025/8/19/football-kennesaw-state-walens-family-announce-fifth-third-stadium-field-naming-partnership-halftime-ceremony.aspx,"August 19, 2025" +2,Kennesaw State associate professor appointed to national mathematics education commission,https://www.kennesaw.edu/news/stories/2025/associate-professor-appointed-national-mathematics-education-commission.php,"August 19, 2025" +3,"Kennesaw State researchers create low-cost system to monitor dams, prevent floods",https://www.kennesaw.edu/news/stories/2025/researchers-create-low-cost-system-monitor-dams.php,"August 18, 2025" +4,Dr. Luc Guglielmi appointed to full-time ombuds role at Kennesaw State,https://www.kennesaw.edu/news/stories/2025/luc-guglielmi-appointed-full-time-ombuds-kennesaw-state.php,"August 14, 2025" +5,Kennesaw State economic impact on the rise to $2.3 billion,https://www.kennesaw.edu/news/stories/2025/kennesaw-state-economic-impact-2.3-billion.php,"August 14, 2025" +6,Kennesaw State's MOVE Center aims to redefine the future of human mobility,https://www.kennesaw.edu/news/stories/2025/move-center-aims-to-redefine-future-of-human-mobility.php,"August 13, 2025" +7,Kennesaw State and VyStar Credit Union announce partnership and arena naming,https://ksuowls.com/news/2025/8/12/general-kennesaw-state-and-vystar-credit-union-announce-partnership-and-arena-naming.aspx,"August 12, 2025" +8,Kennesaw State student helps develop new index for cancer treatment time costs,https://www.kennesaw.edu/news/stories/2025/kennesaw-state-student-helps-develop-new-index-for-cancer-treatment-time-costs.php,"August 11, 2025" +9,Kennesaw State physics professor receives grant to help create precise simulations for particle colliders,https://www.kennesaw.edu/news/stories/2025/physics-professor-receives-grant-simulations-particle-colliders.php,"August 08, 2025" +10,"From criminology to the classroom, Kennesaw State graduate finds purpose in special education",https://www.kennesaw.edu/news/stories/2025/ksu-student-finds-purpose-in-special-education.php,"August 07, 2025" +1,Kennesaw State's Owl Cyber Team earns top finish in national cybersecurity competition,https://www.kennesaw.edu/news/stories/2025/owlcyberteamearnstopfinishinnationalcybersecurity.php,"August 06, 2025" +2,National publication recognizes Kennesaw State with Excellence in Mental Health and Well-Being Award,https://www.kennesaw.edu/news/stories/2025/publication-recognizes-ksu-excellence-mental-health-well-being-award.php,"August 05, 2025" +3,Kennesaw State researchers examine how parents navigate children's smartphone use,https://www.kennesaw.edu/news/stories/2025/ksu-researchers-examine-parents-navigate-children-smartphone-use.php,"August 04, 2025" +4,"Kennesaw State launches Center for Interactive Media to drive innovation in VR, gaming, and digital storytelling",https://www.kennesaw.edu/news/stories/2025/center-interactive-media-drive-innovation-vr-gaming-storytelling.php,"August 01, 2025" +5,Kennesaw State alumna to compete in international Deaflympics games in Tokyo,https://www.kennesaw.edu/news/stories/2025/ksu-alum-compete-international-deaflympics-games-tokyo.php,"July 31, 2025" +6,Kennesaw State nurses excel on the front lines and at home,https://www.kennesaw.edu/news/stories/2025/nurses-excel-on-front-lines-and-at-home.php,"July 30, 2025" +7,Kennesaw State graduates earn international recognition for award-winning architectural drawing,https://www.kennesaw.edu/news/stories/2025/graduates-earn-international-recognition-award-winning-architectural-drawing.php,"July 29, 2025" +8,Student's CrossFit passion leads to breakthrough research at Kennesaw State,https://www.kennesaw.edu/news/stories/2025/crossfit-passion-leads-to-breakthrough-research-ksu.php,"July 28, 2025" +9,Kennesaw State student and faculty use supercomputing to advance Alzheimer's drug research,https://www.kennesaw.edu/news/stories/2025/student-and-faculty-use-supercomputing-advance-alzheimers-drug-research.php,"July 25, 2025" +10,KSU student working to address challenges with elder care,https://www.kennesaw.edu/news/stories/2025/ksu-student-working-address-challenges-elder-care.php,"July 24, 2025" +1,Kennesaw State student researcher streamlining manufacturing automation through digital twin technology,https://www.kennesaw.edu/news/stories/2025/student-researchers-streamlining-manufacturing-digital-twin-technology.php,"July 23, 2025" +2,Discovery courses provide hands-on experiences for Kennesaw State Honors students,https://www.kennesaw.edu/news/stories/2025/discovery-courses-provide-hands-on-experience-honors-students.php,"July 22, 2025" +3,Kennesaw State student's research aims to create more confident math teachers,https://www.kennesaw.edu/news/stories/2025/student-research-aims-to-create-confident-math-teachers.php,"July 21, 2025" +4,Double Owl Pathways propels Kennesaw State student toward recognition in neuroscience research,https://www.kennesaw.edu/news/stories/2025/double-owl-pathways-propels-student-recognition-neuroscience-research.php,"July 18, 2025" +5,KSU student developing stroke-screening tool for children with sickle cell ,https://www.kennesaw.edu/news/stories/2025/student-stroke-screening-tool-for-children-with-sickle-cell.php,"July 17, 2025" +6,Kennesaw State associate professor honored with national award for excellence in engineering education,https://www.kennesaw.edu/news/stories/2025/national-award-excellence-engineering-education.php,"July 16, 2025" +7,Kennesaw State professor planting knowledge with his latest research,https://www.kennesaw.edu/news/stories/2025/professor-planting-knowledge-with-latest-research.php,"July 15, 2025" +8,Kennesaw State business students to benefit from the Madhuri and Jagdish N. Sheth Marketing Scholarship,https://www.kennesaw.edu/news/stories/2025/business-students-to-benefit-marketing-scholarship.php,"July 14, 2025" +9,Five recent Kennesaw State physics graduates to pursue doctoral studies,https://www.kennesaw.edu/news/stories/2025/five-recent-ksu-physics-graduates-pursue-doctoral-studies.php,"July 11, 2025" +10,"Kennesaw State researcher nominated to NSF center, wins American Chemical Society Petroleum Research Funds award",https://www.kennesaw.edu/news/stories/2025/researcher-award-american-chemical-society-petroleum-research-funds.php,"July 10, 2025" +1,Kennesaw State student selected for Georgia's American Society of Civil Engineers Student of the Year award,https://www.kennesaw.edu/news/stories/2025/student-selected-georgia-america-society-civil-engineers-award.php,"July 09, 2025" +2,Kennesaw State computer game design and development students turn stargazing into interactive learning,https://www.kennesaw.edu/news/stories/2025/game-design-students-turn-stargazing-interactive-learning.php,"July 08, 2025" +3,KSU researcher's exceptional mentorship prioritizes students first,https://www.kennesaw.edu/research/news/2025-undergraduate-research-mentor-award.php,"July 07, 2025" +4,Kennesaw State student working to simplify cardiovascular disease detection,https://www.kennesaw.edu/news/stories/2025/ksu-student-works-to-simplify-cardiovascular-disease-detection.php,"July 03, 2025" +5,Kennesaw State certification programs broaden reach of professional education,https://www.kennesaw.edu/news/stories/2025/ksu-certification-programs-broaden-reach-of-professional-education.php,"July 02, 2025" +6,Student-staffed marketing firm raising success of real-world clients,https://www.kennesaw.edu/news/stories/2025/ksu-student-staffed-marketing-raising-success-of-clients.php,"July 01, 2025" +7,Kennesaw State steel bridge team wins award for ingenuity in national competition,https://www.kennesaw.edu/news/stories/2025/steel-bridge-team-wins-award-ingenuity-national-competition.php,"June 30, 2025" +8,Kennesaw State expands support for student-parents through new grants,https://www.kennesaw.edu/news/stories/2025/ksu-expands-support-student-parents-through-new-grants.php,"June 30, 2025" +9,Kennesaw State professor inducted as International Organization for Physical Education in Higher Education fellow,https://www.kennesaw.edu/news/stories/2025/professor-inducted-international-organization-physical-education-fellow.php,"June 27, 2025" +10,KSU project designing automated exoskeleton to aid stroke victims,https://www.kennesaw.edu/news/stories/2025/ksu-project-designing-exoskeleton-aid-stroke-victims.php,"June 26, 2025" +1,Kennesaw State assistant professor named 2025 AIA Georgia Educator of the Year,https://www.kennesaw.edu/news/stories/2025/assistant-professor-named-aia-georgia-educator-of-year.php,"June 25, 2025" +2,Kennesaw State public health students win gold designation at national competition,https://www.kennesaw.edu/news/stories/2025/public-health-students-win-gold-designation-national-competititon.php,"June 24, 2025" +3,KSU researcher awarded prestigious NSF Medium Grant to advance balance technologies in VR,https://www.kennesaw.edu/news/stories/2025/researcher-awarded-grant-advance-balance-technologies-virtual-reality.php,"June 23, 2025" +4,Kennesaw State researchers developing AI-powered drones to protect peanut farms from wildlife,https://www.kennesaw.edu/news/stories/2025/researchers-developing-ai-powered-drones-protect-peanut-farms.php,"June 20, 2025" +5,Kennesaw State alumna triumphs through adversity to inspire as Gwinnett County educator,https://www.kennesaw.edu/news/stories/2025/alumna-triumphs-adversity-inspire-gwinnett-educator.php,"June 18, 2025" +6,Kennesaw State alumni awarded prestigious Fulbright scholarships,https://www.kennesaw.edu/news/stories/2025/ksu-alumni-awarded-fulbright-scholarships.php,"June 17, 2025" +7,Kennesaw State physics professor receives Department of Energy grant to explore light-matter interactions in quantum materials,https://www.kennesaw.edu/news/stories/2025/physics-grant-light-matter-interactions-quantum-materials.php,"June 13, 2025" +8,Triplets each find their own path to success at Kennesaw State,https://www.kennesaw.edu/news/stories/2025/triplets-find-path-to-success-at-ksu.php,"June 12, 2025" +9,Kennesaw State architecture students bring eco-centered design to global stage in Italy,https://www.kennesaw.edu/news/stories/2025/architecture-students-eco-centered-design-italy.php,"June 11, 2025" +10,Kennesaw State educator brings industry experience to the classroom,https://www.kennesaw.edu/news/stories/2025/educator-brings-industry-experience-to-classroom.php,"June 10, 2025" +1,Kennesaw State student draws on personal experience in graduate program,https://www.kennesaw.edu/news/stories/2025/student-draws-on-personal-experience-graduate-program.php,"June 09, 2025" +2,Growth fuels passion for Kennesaw State master's graduate,https://www.kennesaw.edu/news/stories/2025/growth-fuels-passion-for-ksu-masters-graduate.php,"June 06, 2025" +3,Kennesaw State public health grad seeks to make a difference,https://www.kennesaw.edu/news/stories/2025/public-health-grad-seeks-make-a-difference.php,"June 05, 2025" +4,"Kennesaw State professor uses speed, crash data to better understand how to protect school children ",https://www.kennesaw.edu/news/stories/2025/ksu-professor-speed-crash-data-protect-school-children.php,"June 04, 2025" +5,Kennesaw State students with Center for Sustainable Journalism hit the ground reporting,https://www.kennesaw.edu/news/stories/2025/ksu-students-center-for-sustainable-journalism-reporting.php,"June 03, 2025" +6,Kennesaw State student secures prestigious VICEROY Maven internship,https://www.kennesaw.edu/news/stories/2025/student-secures-viceroy-maven-internship.php,"June 02, 2025" +7,KSU Game Studio levels up with new release,https://www.kennesaw.edu/research/news/posts/chiba-launch.php,"May 30, 2025" +8,Research helps dual major forge path at Kennesaw State,https://www.kennesaw.edu/news/stories/2025/research-helps-dual-major-forge-path-at-ksu.php,"May 30, 2025" +9,Student-led public relations agency at Kennesaw State finds success with client campaign work,https://www.kennesaw.edu/news/stories/2025/student-led-public-relations-agency-ksu-finds-success-client-campaign.php,"May 29, 2025" +10,KSU dancers selected to participate in prestigious summer workshops,https://www.kennesaw.edu/news/stories/2025/dancers-participate-prestigious-summer-workshops.php,"May 28, 2025" +1,Kennesaw State researchers develop phone application to combat elderly loneliness,https://www.kennesaw.edu/news/stories/2025/researchers-develop-app-combat-elderly-loneliness.php,"May 27, 2025" +2,Kennesaw State graduates latest cohort of the Paul Radow Scholars Program,https://www.kennesaw.edu/news/stories/2025/ksu-graduates-latest-cohort-paul-radow-scholars.php,"May 23, 2025" +3,Kennesaw State faculty member wins prestigious Art Directors Club award for creative excellence,https://www.kennesaw.edu/news/stories/2025/faculty-member-wins-art-directors-club-award.php,"May 22, 2025" +4,Kennesaw State researcher develops AI robot to aid farmers in fight against pests,https://www.kennesaw.edu/news/stories/2025/researcher-develops-ai-robot-aid-farmers-against-pests.php,"May 21, 2025" +5,Kennesaw State recognized for environmental stewardship,https://www.kennesaw.edu/news/stories/2025/kennesaw-state-recognized-for-environmental-stewardship.php,"May 20, 2025" +6,Kennesaw State alum receives international scientific honor,https://www.kennesaw.edu/news/stories/2025/ksu-alum-recieves-international-scientific-honor.php,"May 19, 2025" +7,Kennesaw State men's team wins Conference USA Outdoor Championship,https://ksuowls.com/news/2025/5/19/mens-track-and-field-kennesaw-state-men-win-conference-usa-outdoor-championship.aspx,"May 19, 2025" +8,Parent and Family initiatives enhance sense of community at Kennesaw State,https://www.kennesaw.edu/news/stories/2025/parent-and-family-initiatives-enhance-sense-of-community.php,"May 16, 2025" +9,Kennesaw State to launch Bachelor of Science in Aerospace Engineering degree program,https://www.kennesaw.edu/news/stories/2025/ksu-launch-bachelor-science-aerospace-engineering-program.php,"May 15, 2025" +10,Kennesaw State student wins marketing competition at international conference,https://www.kennesaw.edu/news/stories/2025/student-wins-marketing-competition-international-conference.php,"May 14, 2025" +1,Recent Kennesaw State architecture graduate named to Metropolis Future100 list,https://www.kennesaw.edu/news/stories/2025/architecture-graduate-named-metropolis-future-100-list.php,"May 13, 2025" +2,Kennesaw State researchers earn National Institutes of Health grant to address diabetic eye care via technology,https://www.kennesaw.edu/news/stories/2025/nih-grant-address-diabetic-eye-care-technology.php,"May 12, 2025" +3,'Dynamic Duo' impact exercise science through undergraduate research at Kennesaw State,https://www.kennesaw.edu/news/stories/2025/dynamic-duo-impact-exercise-science-undergraduate-research.php,"May 08, 2025" +4,"Kennesaw State students, C-suite executives of Student Managed Investment Fund soon to begin finance careers",https://www.kennesaw.edu/news/stories/2025/executives-student-managed-investment-fund-begin-finance-careers.php,"May 07, 2025" +5,"Kennesaw State student, assistant principal sharpens educational leadership skills through doctoral program ",https://www.kennesaw.edu/news/stories/2025/student-sharpens-educational-leadership-skills-doctoral-program.php,"May 06, 2025" +6,Master's in robotics systems fulfills Kennesaw State online student's goal,https://www.kennesaw.edu/news/stories/2025/masters-robotics-systems-fulfills-online-student-goal.php,"May 05, 2025" +7,Honors biology student makes most of KSU experience,https://www.kennesaw.edu/news/stories/2025/honors-biology-student-makes-most-of-ksu-experience.php,"May 02, 2025" +8,College of Science and Mathematics recognizes faculty teaching excellence from 2024,https://www.kennesaw.edu/news/stories/2025/science-mathematics-recognizes-faculty-teaching-excellence.php,"May 01, 2025" +9,"Kennesaw State information technology student, Fulbright semifinalist chasing interest in cybersecurity",https://www.kennesaw.edu/news/stories/2025/information-technology-student-fulbright-interest-cybersecurity.php,"May 01, 2025" +10,Kennesaw State recognizes outstanding staff at annual awards ceremony,https://www.kennesaw.edu/news/stories/2025/ksu-recognizes-outstanding-staff-annual-awards.php,"April 30, 2025" From 72f83529e7f9b58799d206b7b2aea6560c50bf0a Mon Sep 17 00:00:00 2001 From: Benjamin Reed Date: Thu, 28 Aug 2025 17:03:07 -0400 Subject: [PATCH 06/36] Class work 8/28/25 --- .../Module_1.0_Tutorials_START_HERE.ipynb | 796 ++++++++++++++---- 1 file changed, 650 insertions(+), 146 deletions(-) diff --git a/P1 Python Absolute Beginner/Module_1.0_Tutorials_START_HERE.ipynb b/P1 Python Absolute Beginner/Module_1.0_Tutorials_START_HERE.ipynb index 1d66a94..4bc6565 100644 --- a/P1 Python Absolute Beginner/Module_1.0_Tutorials_START_HERE.ipynb +++ b/P1 Python Absolute Beginner/Module_1.0_Tutorials_START_HERE.ipynb @@ -742,18 +742,19 @@ "### Variables can start initialized as an Integer number data type \n", ">```python \n", "x = 22\n", - "``` \n", - "here the Integer `22`  value was assigned to the variable  **`x`** \n", + " \n", + "here the Integer `22` value was assigned to the variable **`x`** \n", "\n", "### The type of data a variable holds can be changed,\n", "### Python variables can change the **type** of data a variable holds \n", "\n", ">```python\n", "x = 22\n", + "\n", "x = \"I am a string\"\n", - "``` \n", "\n", - "**` x `**  changed type from Integer  **`x = 22`**  to string  **`x = \"I am a string\"`** \n", + "\n", + "**` x ` changed type from Integer  **`x = 22`**  to string  **`x = \"I am a string\"`** \n", " \n", ">>|Best Practice: Friendly Names |\n", "|------------------------------------------------------------------------------------------|\n", @@ -785,9 +786,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 13, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "22\n", + "Joana\n" + ] + } + ], "source": [ "test_value = 22\n", "print(test_value)\n", @@ -807,18 +817,26 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 14, "metadata": { "slideshow": { "slide_type": "subslide" } }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Ben Reed\n" + ] + } + ], "source": [ "# [ ] assign a string value to a variable student_name\n", - "\n", + "student_name = \"Ben Reed\"\n", "# [ ] print the value of variable student_name\n", - "\n" + "print(student_name)\n" ] }, { @@ -833,18 +851,27 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 15, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Mabel Reed\n", + "Rocky Balboa\n" + ] + } + ], "source": [ "# [ ] assign the student_name variable a different string value (a different name)\n", - "\n", + "student_name = \"Mabel Reed\"\n", "# [ ] print the value of variable student_name\n", - "\n", + "print(student_name)\n", "# [ ] assign a 3rd different string value, to the variable name \n", - "\n", + "student_name = \"Rocky Balboa\"\n", "# [ ] print the value of variable name\n", - "\n" + "print(student_name)\n" ] }, { @@ -860,18 +887,27 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 20, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "This is a bucket\n", + "123\n" + ] + } + ], "source": [ "# [ ] assigning a value to a variable called bucket\n", - "\n", + "bucket = \"This is a bucket\" # string\n", "# [ ] print the value of bucket \n", - "\n", + "print(bucket)\n", "# [ ] assign an Integer value (no quotes) to the variable bucket\n", - "\n", + "bucket = 123 # integer\n", "# [ ] print the value of bucket \n", - "\n", + "print(bucket)\n", "\n" ] }, @@ -934,9 +970,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 21, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "str" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# [ ] Read and run the code\n", "type(\"Hello World!\")" @@ -944,27 +991,60 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 22, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "int" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "type(501)" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 23, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "float" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "type(8.33333)" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 24, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "str" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "student_name = \"Colette Browning\"\n", "type(student_name)" @@ -984,103 +1064,220 @@ "cell_type": "code", "execution_count": null, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "int" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# [ ] show the type after assigning bucket = a whole number value such as 16 \n", - "\n", - "\n" + "bucket = 16\n", + "type(bucket)\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 26, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "str" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# [ ] show the type after assigning bucket = a word in \"double quotes\"\n", - "\n", - "\n" + "bucket = \"This is a bucket\"\n", + "type(bucket)\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 27, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "str" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# [ ] display the type of 'single quoting' (use single quotes) \n", - "\n", - "\n" + "bucket = 'single quotes'\n", + "type(bucket)\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 28, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "str" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# [ ] display the type of \"double quoting\" (use double quotes)\n", - "\n" + "bucket = \"double quotes\"\n", + "type(bucket)\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 29, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "str" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# [ ] display the type of \"12\" (use quotes)\n", + "bucket = \"12\"\n", + "type(bucket)\n", "\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 30, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "int" + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# [ ] display the type of 12 (no quotes)\n", - "\n" + "bucket = 12\n", + "type(bucket)\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 31, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "int" + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# [ ] display the type of -12 (no quotes)\n", - "\n" + "bucket = -12\n", + "type(bucket)\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 32, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "float" + ] + }, + "execution_count": 32, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# [ ] display the type of 12.0 (no quotes)\n", - "\n" + "bucket = 12.0\n", + "type(bucket)\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 33, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "float" + ] + }, + "execution_count": 33, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# [ ] display the type of 1.55\n", - "\n" + "bucket = 1.55\n", + "type(bucket)\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 35, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "type" + ] + }, + "execution_count": 35, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# [ ] find the type of the type(3) statement (no quotes) - just for fun\n", - "\n" + "type(type(3))\n" ] }, { @@ -1151,9 +1348,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 36, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "41" + ] + }, + "execution_count": 36, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# [ ] Review and run code for adding a pair of 2 digit Integers\n", "23 + 18" @@ -1161,19 +1369,45 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 54, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "'My name is Alyssa Brown'" + ] + }, + "execution_count": 54, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# [ ] Review and run code for adding 2 strings\n", - "\"my name is \" + \"Alyssa\" " + "Introduction = \"my name is\"\n", + "My_name = \"Alyssa\"\n", + "\n", + "\n", + "Introduction.capitalize() + \" \" + My_name + \" \" + shoe_color.capitalize()" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 53, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "'my shoe color is brown'" + ] + }, + "execution_count": 53, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# [ ] Review and run code for adding a variable string and a literal string\n", "shoe_color = \"brown\"\n", @@ -1191,52 +1425,110 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 62, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "6" + ] + }, + "execution_count": 62, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# [ ] add 3 integer numbers\n", - "\n" + "2 + 2 + 2\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 63, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "12.5" + ] + }, + "execution_count": 63, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# [ ] add a float number and an integer number\n", - "\n" + "10.5 + 2\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 64, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "'This notebook belongs to Ben'" + ] + }, + "execution_count": 64, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# [ ] Add the string \"This notebook belongs to \" and a string with your first name\n", - "\n" + "\"This notebook belongs to \"+ \"Ben\"\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 67, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "13" + ] + }, + "execution_count": 67, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# [ ] Create variables sm_number and big_number and assign numbers then add the numbers\n", - "\n" + "sm_number = 3\n", + "big_number = 10\n", + "sm_number + big_number\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 68, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "'Ben, remember to save the notebook frequently'" + ] + }, + "execution_count": 68, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# [ ] assign a string value to the variable first_name and add to the string \", remember to save the notebook frequently\"\n", - "\n" + "first_name = \"Ben\"\n", + "first_name + \", remember to save the notebook frequently\"\n" ] }, { @@ -1263,9 +1555,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 69, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "50\n", + "Happy Birthday Alton\n" + ] + } + ], "source": [ "# [ ] review & run code for assigning variables & using addition\n", "add_two = 34 + 16\n", @@ -1278,27 +1579,46 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 71, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "13\n", + "26\n", + "24\n" + ] + } + ], "source": [ "# [ ] review & run code for Integer addition in variables and in a print function\n", "int_sum = 6 + 7\n", "print(int_sum)\n", "print(11 + 15)\n", - "print()" + "print(11 + int_sum)" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 75, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "I do not wear a hat\n", + "I do not wear a hat at dinner, Alton\n" + ] + } + ], "source": [ "# string addition in variables and in print()function\n", "hat_msg = \"I do not wear \" + \"a hat\" \n", "print(hat_msg)\n", - "print(\"at \" + \"dinner\")" + "print(hat_msg +\" at \" + \"dinner\" + \",\" + \" \" + first_name)" ] }, { @@ -1312,37 +1632,62 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 76, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "My favorite food is pizza\n" + ] + } + ], "source": [ "# [ ] perform string addition in the variable named new_msg (add a string to \"my favorite food is \")\n", "new_msg = \"My favorite food is\"\n", - "print(new_msg)\n", + "print(new_msg + \" pizza\")\n", "\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 77, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "5\n" + ] + } + ], "source": [ "# [ ] perform Integer addition in the variable named new_sum (add 2 or more Integers)\n", "new_sum = 0\n", - "print(new_sum)\n", + "print(new_sum + 5)\n", "\n", "\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 79, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "My favorite food is ice cream\n" + ] + } + ], "source": [ "# [ ] create and print a new string variable, new_msg_2, that concatenates new_msg + a literal string\n", - "\n" + "new_msg_2 = new_msg + \" ice cream\"\n", + "print(new_msg_2)\n" ] }, { @@ -1364,13 +1709,22 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 81, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "my number is 123\n", + "my number is 123\n" + ] + } + ], "source": [ "# [ ] review & run code\n", "print(\"my number is \" + \"123\") #string, represents a text character\n", - "print(\"my number is \" + 123) #number, with numeric value " + "print(\"my number is \" + \"123\") #number, with numeric value " ] }, { @@ -1403,33 +1757,59 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 83, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "345\n" + ] + } + ], "source": [ "# [ ] review and run the code - then fix any Errors\n", - "total_cost = 3 + \"45\"\n", + "total_cost = \"3\" + \"45\"\n", "print(total_cost)\n", "\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 85, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "the street number of Central School is 123\n" + ] + } + ], "source": [ "# [ ] review and run the code - then fix any Errors\n", - "school_num = 123\n", + "school_num = \"123\"\n", "print(\"the street number of Central School is \" + school_num)\n", "\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 86, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n", + "6.3\n" + ] + } + ], "source": [ "# [ ] Read and run the code - write a hypothesis for what you observe adding float + int\n", "# [ ] HYPOTHESIS: \n", @@ -1471,14 +1851,23 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 90, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Hi!\n", + "I like the morning\n" + ] + } + ], "source": [ "# [ ] review and run the code for properly and improperly formatted print statement\n", "print(\"Hi!\")\n", "## Improper format - non matching quotes\n", - "print('I like the morning\") " + "print(\"I like the morning\") " ] }, { @@ -1490,12 +1879,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 93, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "hi\n" + ] + } + ], "source": [ "# [ ] review and run the code \n", - "prin('hi')" + "print('hi')" ] }, { @@ -1508,12 +1905,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 95, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "where are my socks?\n" + ] + } + ], "source": [ "# [ ] review and run the code missing the closing parenthesis \n", - "print(\"where are my socks?\" " + "print(\"where are my socks?\")" ] }, { @@ -1525,12 +1930,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 97, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "my socks are in the wrong bin\n" + ] + } + ], "source": [ "# { ] review and run the code \n", - "print(\"my socks are in the wrong bin)\" " + "print(\"my socks are in the wrong bin\")" ] }, { @@ -1551,58 +1964,98 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 99, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "my socks do not match\n" + ] + } + ], "source": [ "# [ ] repair the syntax error \n", - "print('my socks do not match\") \n", + "print(\"my socks do not match\") \n", " \n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 101, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "my socks match now\n" + ] + } + ], "source": [ "# [ ] repair the NameError \n", - "pront(\"my socks match now\") \n", + "print(\"my socks match now\") \n", "\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 104, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Save the notebook frequently\n" + ] + } + ], "source": [ "# [ ] repair the syntax error \n", - "print\"Save the notebook frequently\")\n", + "print(\"Save the notebook frequently\")\n", "\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 106, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Alton\n" + ] + } + ], "source": [ "# [ ] repair the NameError \n", "student_name = \"Alton\"\n", - "print(STUDENT_NAME)\n", + "print(student_name)\n", "\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 108, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "total students are signed up for tutoring\n" + ] + } + ], "source": [ "# [ ] repair the TypeError\n", "total = 3\n", - "print(total + \" students are signed up for tutoring\")\n", + "print(\"total\" + \" students are signed up for tutoring\")\n", "\n" ] }, @@ -1656,9 +2109,22 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 109, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " *\n", + " * *\n", + " *****\n", + " * *\n", + "* *\n", + "\n" + ] + } + ], "source": [ "# the letter 'A'\n", "print(\" *\")\n", @@ -1688,12 +2154,28 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 117, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "_ _\n", + " \\ / \n", + " \\ / \n", + " \\ . . / \n", + " V \n" + ] + } + ], "source": [ "# create # [ ] flying bird character art \n", - "\n" + "print(\"_ _\")\n", + "print(\" \\\\ / \")\n", + "print(\" \\\\ / \")\n", + "print(\" \\\\ . . / \")\n", + "print(\" V \")" ] }, { @@ -1706,10 +2188,32 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 120, "metadata": {}, - "outputs": [], - "source": [] + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "#######\n", + "##\n", + "####\n", + "##\n", + "#######\n", + "\n" + ] + } + ], + "source": [ + "print(\"\"\"\n", + "#######\n", + "##\n", + "####\n", + "##\n", + "#######\n", + "\"\"\")\n" + ] }, { "cell_type": "markdown", From 6746d6b0467c8710e11db63678cbfc5f33639c14 Mon Sep 17 00:00:00 2001 From: Benjamin Reed Date: Fri, 29 Aug 2025 14:09:48 -0400 Subject: [PATCH 07/36] Completing P1M1 assignment --- Module_1.2_required_ code_submission.py | 18 + .../Module_1.0_Tutorials_START_HERE.ipynb | 706 ++++++++++++++---- .../Module_1.1_Practice.ipynb | 69 +- .../Module_1.2_Required_Code.ipynb | 31 +- 4 files changed, 675 insertions(+), 149 deletions(-) create mode 100644 Module_1.2_required_ code_submission.py diff --git a/Module_1.2_required_ code_submission.py b/Module_1.2_required_ code_submission.py new file mode 100644 index 0000000..7e78099 --- /dev/null +++ b/Module_1.2_required_ code_submission.py @@ -0,0 +1,18 @@ +# Create name check code + +# [ ] get input for input_test variable +input_test = input("Please enter a names of people met in the last 24 hours: ") +# [ ] print "True" message if "John" is in the input or False message if not +print("John".lower() in input_test.lower()) + +# [ ] print True message if your name is in the input or False if not +my_name = "Ben" +print(my_name.lower() in input_test.lower()) + +# [ ] Challenge: Check if another person's name is in the input - print message +other_name = "Rhonda" +print(other_name.lower() in input_test.lower()) + +# [ ] Challenge: Check if a fourth person's name is in the input - print message +fourth_name = "Apple" +print(fourth_name.lower() in input_test.lower()) diff --git a/P1 Python Absolute Beginner/Module_1.0_Tutorials_START_HERE.ipynb b/P1 Python Absolute Beginner/Module_1.0_Tutorials_START_HERE.ipynb index 4bc6565..3ed3225 100644 --- a/P1 Python Absolute Beginner/Module_1.0_Tutorials_START_HERE.ipynb +++ b/P1 Python Absolute Beginner/Module_1.0_Tutorials_START_HERE.ipynb @@ -2188,7 +2188,7 @@ }, { "cell_type": "code", - "execution_count": 120, + "execution_count": 1, "metadata": {}, "outputs": [ { @@ -2267,9 +2267,19 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "enter a small int: \n", + "small int: \n", + "3\n" + ] + } + ], "source": [ "# review and run code - enter a small integer in the text box\n", "print(\"enter a small int: \")\n", @@ -2293,14 +2303,22 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Student name type is \n" + ] + } + ], "source": [ "# [ ] get input for the variable student_name\n", - "\n", + "student_name = input(\"Please give me a student name: \")\n", "# [ ] determine the type of student_name\n", - "\n", + "print(\"Student name type is \" + str(type(student_name)))\n", "\n" ] }, @@ -2321,13 +2339,23 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "enter a name or number\n", + "Test input is: 5\n" + ] + } + ], "source": [ "# [ ] run cell several times entering a name a int number and a float number after adding code below\n", "print(\"enter a name or number\")\n", "test_input = input()\n", + "print(\"Test input is: \" + test_input)\n", "# [ ] insert code below to check the type of test_input\n", "\n", "\n" @@ -2355,9 +2383,17 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Hi Ben Reed\n" + ] + } + ], "source": [ "student_name = input(\"enter the student name: \") \n", "print(\"Hi \" + student_name)" @@ -2376,14 +2412,22 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 11, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "City name is: Kennesaw\n" + ] + } + ], "source": [ "# [ ] get user input for a city name in the variable named city\n", - "\n", + "city = input(\"Please enter a city name\")\n", "# [ ] print the city name\n", - "\n", + "print(\"City name is:\" + \" \" + city)\n", "\n" ] }, @@ -2411,12 +2455,34 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 21, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Ben\n", + "36\n", + "Do you want email? no\n", + "No email provided\n" + ] + } + ], "source": [ "# [ ]create variables to store input: name, age, get_mail with prompts\n", "# for name, age and yes/no to being on an email list\n", + "name = input(\"please enter your name:\")\n", + "age = input(\"please enter your age: \")\n", + "get_email = input(\"Do you want email? (yes or no)\")\n", + "if get_email in (\"yes\", \"Yes\"):\n", + " email = input(\"Please enter your email address: \")\n", + "else:\n", + " email = \"No email provided\"\n", + "print(name)\n", + "print(age)\n", + "print(\"Do you want email?\" + \" \" + get_email)\n", + "print(email)\n", "\n", "\n", "# [ ] print a description + variable value for each variable\n", @@ -2492,9 +2558,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 22, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "41" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# [ ] Review and run code for adding a pair of 2 digit Integers\n", "23 + 18" @@ -2502,9 +2579,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 23, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "'my name is Alyssa'" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# [ ] Review and run code for adding 2 strings\n", "\"my name is \" + \"Alyssa\" " @@ -2512,9 +2600,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 24, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "'my shoe color is brown'" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# [ ] Review and run code for adding a variable string and a literal string\n", "shoe_color = \"brown\"\n", @@ -2532,42 +2631,88 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 25, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "14" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# [ ] add 3 integer numbers\n", - "\n" + "3 + 5 + 6\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 26, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "15.5" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# [ ] add a float number and an integer number\n", - "\n" + "10.5 + 5\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 28, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "'This notebook belongs to Ben'" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# [ ] Add the string \"This notebook belongs to \" and a string with your first name\n", - "\n" + "\"This notebook belongs to \" + \"Ben\"\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 29, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "8" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# [ ] Create variables sm_number and big_number and assign numbers then add the numbers\n", - "\n" + "sm_number = 3\n", + "big_number = 5\n", + "sm_number + big_number\n" ] }, { @@ -2624,9 +2769,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 30, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Hello Collette!\n", + "Hello to Collette who is from the city\n" + ] + } + ], "source": [ "# review and run code\n", "\n", @@ -2650,12 +2804,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 35, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Hello Collette welcome to our world.\n" + ] + } + ], "source": [ "# [ ] print 3 strings on the same line using commas inside the print() function \n", - "\n" + "print(\"Hello\", name, \"welcome to our world.\")\n" ] }, { @@ -2682,9 +2844,17 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 36, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "I will pick you up @ 6 for the party\n" + ] + } + ], "source": [ "# review and run code\n", "print(\"I will pick you up @\",6,\"for the party\")" @@ -2692,9 +2862,17 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 37, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "An Integer of 14 combined with strings causes 0 TypeErrors in comma formatted print!\n" + ] + } + ], "source": [ "# review and run code\n", "number_errors = 0\n", @@ -2712,11 +2890,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 38, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "I have 3 dogs and 2 cats\n" + ] + } + ], "source": [ "# [ ] use a print() function with comma separation to combine 2 numbers and 2 strings\n", + "print(\"I have\", 3, \"dogs and\", 2, \"cats\")\n", "\n" ] }, @@ -2739,16 +2926,26 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 41, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "115 Hemlock Street\n" + ] + } + ], "source": [ "# [ ] get user input for a street name in the variable, street\n", - "\n", + "st_number = input(\"What is your street number:\")\n", + "street = input(\"Enter your street name: \")\n", + "street_type = input(\"Enter your street type: \")\n", "# [ ] get user input for a street number in the variable, st_number\n", "\n", "# [ ] display a message about the street and st_number\n", - "\n", + "print(st_number, street, street_type)\n", "\n" ] }, @@ -2763,15 +2960,22 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 42, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The value of the variable is 3 and it is a number.\n" + ] + } + ], "source": [ "# [ ] define a variable with a string or numeric value\n", - "\n", + "variable = 3\n", "# [ ] display a message combining the variable, 1 or more literal strings and a number\n", - "\n", - "\n" + "print(\"The value of the variable is\", variable, \"and it is a number.\")\n" ] }, { @@ -2807,28 +3011,45 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 43, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Reminder: The class for Ben Reed is scheduled for 10:30am with 10 participants. Please arrive at least 5 minutes early.\n" + ] + } + ], "source": [ "# [ ] get input for variables: owner, num_people, training_time - use descriptive prompt text\n", - "owner = \n", - "num_people = \n", - "training_time = \n", + "owner = input(\"Owner of the Res? \")\n", + "num_people = input(\"How many people will be in the class? \")\n", + "training_time = input(\"What is the time of the class? \")\n", "# [ ] create a integer variable min_early and \"hard code\" the integer value (e.g. - 5, 10 or 15)\n", - "min_early = \n", + "min_early = 5\n", "# [ ] print reminder text using all variables & add additional strings - use comma separated print formatting\n", - "\n", - "\n" + "print(\"Reminder: The class for\", owner, \"is scheduled for\", training_time, \"with\", num_people, \"participants. Please arrive at least\", min_early, \"minutes early.\")\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 53, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Ben, remember to save the notebook frequently\n" + ] + } + ], "source": [ - "# [ ] assign a string value to the variable first_name and add to the string \", remember to save the notebook frequently\"\n" + "# [ ] assign a string value to the variable first_name and add to the string \", remember to save the notebook frequently\"\n", + "first_name = \"Ben\"\n", + "print(first_name + \",\" + \" remember to save the notebook frequently\")\n" ] }, { @@ -2886,9 +3107,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 54, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Hello Collette!\n", + "Hello to Collette who is from the city\n" + ] + } + ], "source": [ "# review and run code\n", "\n", @@ -2944,9 +3174,17 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 55, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "I will pick you up @ 6 for the party\n" + ] + } + ], "source": [ "# review and run code\n", "print(\"I will pick you up @\",6,\"for the party\")" @@ -2954,9 +3192,17 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 56, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "An Integer of 14 combined with strings causes 0 TypeErrors in comma formatted print!\n" + ] + } + ], "source": [ "# review and run code\n", "number_errors = 0\n", @@ -3135,9 +3381,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 62, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "It's time to save your code\n", + "I said to the class 'sometimes it's need to shut down and restart a notebook when cells refuse to run'\n" + ] + } + ], "source": [ "# review and run the code\n", "\n", @@ -3145,7 +3400,7 @@ "print(\"It's time to save your code\")\n", "\n", "# Double quote surrounded by Single\n", - "print('I said to the class \"sometimes you need to shut down and restart a notebook when cells refuse to run\"')" + "print('I said to the class \\'sometimes it\\'s need to shut down and restart a notebook when cells refuse to run\\'')" ] }, { @@ -3225,45 +3480,97 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 65, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 65, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "\"Python\".isalpha()" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 66, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 66, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "\"3rd\".isalnum()" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 69, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 69, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "\"A Cold Stromy Night\".istitle()" + "\"A Cold Stormy Night\".istitle()" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 70, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 70, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "\"1003\".isdigit()" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 71, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "cm height: 176 is all digits = True\n" + ] + } + ], "source": [ "cm_height = \"176\"\n", "print(\"cm height:\",cm_height, \"is all digits =\",cm_height.isdigit())" @@ -3271,9 +3578,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 72, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "False\n", + "True\n" + ] + } + ], "source": [ "print(\"SAVE\".islower())\n", "print(\"SAVE\".isupper())" @@ -3281,11 +3597,22 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 76, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "False" + ] + }, + "execution_count": 76, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "\"Boolean\".startswith(\"B\")" + "\"Boolean\".startswith(\"b\")" ] }, { @@ -3299,22 +3626,44 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 73, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 73, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# [ ] Use .isalpha() on the string \"alphabetical\"\n", - "\n" + "\"alphabetical\".isalpha()\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 74, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "False" + ] + }, + "execution_count": 74, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# [ ] Use .isalpha() on the string: \"Are spaces and punctuation Alphabetical?\"\n", - "\n" + "\"Are spaces and punctuation Alphabetical?\".isalpha()\n" ] }, { @@ -3558,7 +3907,7 @@ "outputs": [], "source": [ "# [ ] initailize variable alpha_test with input\n", - "\n", + "alpha_test = input(\"Please enter a string to test if it is alphabetical: \")\n", "# [ ] use .isalpha() on string variable alpha_test\n", "\n" ] @@ -3617,18 +3966,34 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 77, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Ms. browning is in her office.\n" + ] + } + ], "source": [ "print(\"ms. Browning is in her office.\".capitalize())" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 78, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Green green green and GREEN!\n" + ] + } + ], "source": [ "fav_color = \"green\"\n", "print(fav_color.capitalize(), fav_color, fav_color,\"and\", fav_color.upper()+\"!\")" @@ -3646,23 +4011,34 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 85, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "GRASS\n", + "grass\n", + "GRASS\n", + "Grass\n" + ] + } + ], "source": [ "# [ ] get input for a variable, fav_food, that describes a favorite food\n", - "\n", + "fav_food = input(\"please enter your favorite food: \")\n", "# [ ] display fav_food as ALL CAPS, used in a sentence\n", - "\n", + "print(fav_food.upper())\n", "\n", "# [ ] dispaly fav_food as all lower case, used in a sentence\n", - "\n", + "print(fav_food.lower())\n", "\n", "# [] display fav_food with swapped case, used in a sentence\n", - "\n", + "print(fav_food.swapcase())\n", "\n", "# [] display fav_food with capitalization, used in a sentence\n", - "\n", + "print(fav_food.capitalize())\n", "\n", "\n" ] @@ -3702,9 +4078,17 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 86, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "blue\n" + ] + } + ], "source": [ "# review and run code - test a capitalized color input\n", "fav_color = input('What is your favorite color?: ').lower()\n", @@ -3722,9 +4106,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 87, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "BLUE reversed\n", + "NBLAH blahblah\n" + ] + } + ], "source": [ "def short_rhyme(r1,r2):\n", " print(r1.upper(),r2.lower())\n", @@ -3761,11 +4154,19 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 88, "metadata": { "scrolled": true }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "True\n" + ] + } + ], "source": [ "# review and run code to test if a string is to be found in another string\n", "menu = \"salad, pasta, sandwich, pizza, drinks, dessert\"\n", @@ -3774,9 +4175,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 89, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "'hello' in greeting = False\n", + "'Hello' in greeting = True\n" + ] + } + ], "source": [ "# review and run code to test case sensitive examples \n", "greeting = \"Hello World!\"\n", @@ -3793,9 +4203,19 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 90, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "'hello' in greeting = False\n", + "'Hello' in greeting = True\n", + "'hello' in greeting if lower used = True\n" + ] + } + ], "source": [ "# review and run code to test removing case sensitivity from a string comparison\n", "greeting = \"Hello World!\"\n", @@ -3817,9 +4237,17 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 91, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Your name is BEN\n" + ] + } + ], "source": [ "# [] print 3 tests, with description text, testing the menu variable for 'pizza', 'soup' and 'dessert'\n", "menu = \"salad, pasta, sandwich, pizza, drinks, dessert\"\n", @@ -3842,13 +4270,25 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 96, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "cheeseburger is not available on the menu.\n" + ] + } + ], "source": [ "# Create a program where the user supplies input to search the menu\n", - "\n", - "\n" + "menu = \"salad, pasta, bread, cheese, sandwich, pizza, drinks, dessert\"\n", + "search_item = input(\"Please enter a menu item to search for: \")\n", + "if search_item in menu:\n", + " print(search_item, \"is available on the menu.\")\n", + "else:\n", + " print(search_item, \"is not available on the menu.\")\n" ] }, { @@ -3896,9 +4336,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 94, "metadata": {}, - "outputs": [], + "outputs": [ + { + "ename": "NameError", + "evalue": "name 'red' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[31m---------------------------------------------------------------------------\u001b[39m", + "\u001b[31mNameError\u001b[39m Traceback (most recent call last)", + "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[94]\u001b[39m\u001b[32m, line 3\u001b[39m\n\u001b[32m 1\u001b[39m \u001b[38;5;66;03m# [ ] fix the error\u001b[39;00m\n\u001b[32m 2\u001b[39m paint_colors = \u001b[33m\"\u001b[39m\u001b[33mred, blue, green, black, orange, pink\u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m----> \u001b[39m\u001b[32m3\u001b[39m \u001b[38;5;28mprint\u001b[39m(\u001b[33m'\u001b[39m\u001b[33mRed in paint colors = \u001b[39m\u001b[33m'\u001b[39m,\u001b[43mred\u001b[49m \u001b[38;5;129;01min\u001b[39;00m paint_colors)\n", + "\u001b[31mNameError\u001b[39m: name 'red' is not defined" + ] + } + ], "source": [ "# [ ] fix the error\n", "paint_colors = \"red, blue, green, black, orange, pink\"\n", diff --git a/P1 Python Absolute Beginner/Module_1.1_Practice.ipynb b/P1 Python Absolute Beginner/Module_1.1_Practice.ipynb index ad652b3..2722ee0 100644 --- a/P1 Python Absolute Beginner/Module_1.1_Practice.ipynb +++ b/P1 Python Absolute Beginner/Module_1.1_Practice.ipynb @@ -39,10 +39,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": {}, - "outputs": [], - "source": [] + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Hello and remember to save the notebook\n" + ] + } + ], + "source": [ + "print('Hello' + \" \" + \"and remember to save the notebook\")" + ] }, { "cell_type": "markdown", @@ -55,9 +65,17 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "watch for the cat\n" + ] + } + ], "source": [ "print('watch for the cat')" ] @@ -94,8 +112,21 @@ "metadata": { "collapsed": true }, - "outputs": [], - "source": [] + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "This is Ben Reed's notebook and today's date is 2025-08-29 13:15:49.094333\n" + ] + } + ], + "source": [ + "# this is Ben Reed's notebook, today is 8/29/25\n", + "from datetime import datetime\n", + "\n", + "print(\"This is Ben Reed\\'s notebook and today\\'s date is \" + str(datetime.now()))" + ] }, { "cell_type": "markdown", @@ -108,14 +139,23 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 16, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Ben Reed\n", + "is using python\n" + ] + } + ], "source": [ "# [ ] print your name\n", - "\n", + "print(\"Ben Reed\")\n", "# [ ] print \"is using Python\"\n", - "\n" + "print(\"is using python\")\n" ] }, { @@ -990,14 +1030,15 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 19, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "True\n" + "True\n", + "False\n" ] } ], @@ -1044,7 +1085,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.13.1" + "version": "3.13.7" } }, "nbformat": 4, diff --git a/P1 Python Absolute Beginner/Module_1.2_Required_Code.ipynb b/P1 Python Absolute Beginner/Module_1.2_Required_Code.ipynb index be0b3c0..2379e92 100644 --- a/P1 Python Absolute Beginner/Module_1.2_Required_Code.ipynb +++ b/P1 Python Absolute Beginner/Module_1.2_Required_Code.ipynb @@ -33,26 +33,41 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 48, "metadata": { "collapsed": true }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "False\n", + "True\n", + "True\n", + "False\n" + ] + } + ], "source": [ "# Create name check code\n", "\n", "# [ ] get input for input_test variable\n", - "\n", + "input_test = input(\"Please enter a names of people met in the last 24 hours: \")\n", "# [ ] print \"True\" message if \"John\" is in the input or False message if not\n", - "\n", + "print(\"John\".lower() in input_test.lower())\n", "\n", "# [ ] print True message if your name is in the input or False if not\n", - "\n", + "my_name = \"Ben\"\n", + "print(my_name.lower() in input_test.lower())\n", "\n", "# [ ] Challenge: Check if another person's name is in the input - print message\n", + "other_name = \"Rhonda\"\n", + "print(other_name.lower() in input_test.lower())\n", "\n", - "\n", - "# [ ] Challenge: Check if a fourth person's name is in the input - print message" + "# [ ] Challenge: Check if a fourth person's name is in the input - print message\n", + "fourth_name = \"Apple\"\n", + "print(fourth_name.lower() in input_test.lower())" ] }, { @@ -79,7 +94,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.8" + "version": "3.13.7" } }, "nbformat": 4, From ffbc81b5d67d080690dc896b3545cca03090c9e2 Mon Sep 17 00:00:00 2001 From: Benjamin Reed Date: Fri, 29 Aug 2025 14:17:48 -0400 Subject: [PATCH 08/36] Practice code P1M1 --- .../Module_1.1_Practice.ipynb | 7 ++++++- ...ed_ code_submission.py => P1M1BenReed.py.py | 0 P1M1_practice_code_screenshot.png | Bin 0 -> 184454 bytes 3 files changed, 6 insertions(+), 1 deletion(-) rename Module_1.2_required_ code_submission.py => P1M1BenReed.py.py (100%) create mode 100644 P1M1_practice_code_screenshot.png diff --git a/P1 Python Absolute Beginner/Module_1.1_Practice.ipynb b/P1 Python Absolute Beginner/Module_1.1_Practice.ipynb index 2722ee0..549c06d 100644 --- a/P1 Python Absolute Beginner/Module_1.1_Practice.ipynb +++ b/P1 Python Absolute Beginner/Module_1.1_Practice.ipynb @@ -1030,13 +1030,15 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ + "True\n", + "True\n", "True\n", "False\n" ] @@ -1054,9 +1056,12 @@ "\n", "# 4[ ] Check if \"nuts\" are in the input\n", "print(\"nuts\" in test_food)\n", + "\n", "# 4+[ ] Challenge: Check if \"seafood\" is in the input\n", + "print(\"seafood\" in test_food)\n", "\n", "# 4+[ ] Challenge: Check if \"chocolate\" is in the input\n", + "print(\"chocolate\" in test_food)\n", "\n" ] }, diff --git a/Module_1.2_required_ code_submission.py b/P1M1BenReed.py.py similarity index 100% rename from Module_1.2_required_ code_submission.py rename to P1M1BenReed.py.py diff --git a/P1M1_practice_code_screenshot.png b/P1M1_practice_code_screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..2b9d4d49d32df196401fd8a6d3803e405f521855 GIT binary patch literal 184454 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Π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%0DAr=-+e~3Lgcsvu-i>JtXYVKp@2367f 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 literal 0 HcmV?d00001 From f31a0193489a4e4c289a36e3596c6d8b26c1ee3f Mon Sep 17 00:00:00 2001 From: Benjamin Reed Date: Mon, 15 Sep 2025 10:10:56 -0400 Subject: [PATCH 09/36] Demo CalcGUI work --- 3 calcGUI/calcGUI.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/3 calcGUI/calcGUI.py b/3 calcGUI/calcGUI.py index 42c3fe1..e1950c7 100644 --- a/3 calcGUI/calcGUI.py +++ b/3 calcGUI/calcGUI.py @@ -1,5 +1,6 @@ from tkinter import * from math import sqrt as sqr +from math import sin, cos, tan class Calculator(Frame): @@ -144,6 +145,16 @@ def create_widgets(self): Creates the widgets to be used in the grid. :return: None """ + + self.sin_bttn = Button(self, text="sin", width=20, height=3, bg="lightgrey", command=lambda: self.add_chr("sin")) + self.sin_bttn.grid(row=2, column=6, columnspan=1) + + self.cos_bttn = Button(self, text="cos", width=20, height=3, bg="lightgrey", command=lambda: self.add_chr("cos")) + self.cos_bttn.grid(row=3, column=6, columnspan=1) + + self.tan_bttn = Button(self, text="tan", width=20, height=3, bg="lightgrey", command=lambda: self.add_chr("tan")) + self.tan_bttn.grid(row=4, column=6, columnspan=1) + self.eq_bttn = Button(self, text="=", width=20, height=3, bg="lightgrey", command=lambda: self.calculate()) self.eq_bttn.grid(row=4, column=4, columnspan=2) @@ -186,7 +197,7 @@ def create_widgets(self): self.six_bttn = Button(self, text="6", width=9, height=3, command=lambda: self.add_chr(6)) self.six_bttn.grid(row=2, column=2) - self.one_bttn = Button(self, text="1", width=9, height=3, command=lambda: self.add_chr(1)) + self.one_bttn = Button(self, text="Ben", width=9, height=3, command=lambda: self.add_chr("Reed")) self.one_bttn.grid(row=3, column=0) self.two_bttn = Button(self, text="2", width=9, height=3, command=lambda: self.add_chr(2)) From 802f861aded403831b87a01e26821bc20c977ad4 Mon Sep 17 00:00:00 2001 From: Benjamin Reed Date: Mon, 15 Sep 2025 16:08:48 -0400 Subject: [PATCH 10/36] Work on 1.3 --- .../Module_3.0_Tutorials_Conditionals.ipynb | 663 +++++++++++++++--- 1 file changed, 549 insertions(+), 114 deletions(-) diff --git a/P1 Python Absolute Beginner/Module_3.0_Tutorials_Conditionals.ipynb b/P1 Python Absolute Beginner/Module_3.0_Tutorials_Conditionals.ipynb index 12292b8..70fbff1 100644 --- a/P1 Python Absolute Beginner/Module_3.0_Tutorials_Conditionals.ipynb +++ b/P1 Python Absolute Beginner/Module_3.0_Tutorials_Conditionals.ipynb @@ -45,9 +45,17 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "True means do something\n" + ] + } + ], "source": [ "if True:\n", " print(\"True means do something\")\n", @@ -57,9 +65,17 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "enjoy some hot tea!\n" + ] + } + ], "source": [ "hot_tea = True\n", "\n", @@ -71,9 +87,17 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 8, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "pass executed\n" + ] + } + ], "source": [ "someone_i_know = False\n", "if someone_i_know:\n", @@ -86,9 +110,17 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 9, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "how have you been?\n" + ] + } + ], "source": [ "# changed the value of someone_i_know\n", "someone_i_know = True\n", @@ -114,11 +146,19 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 12, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "It is sunny.\n" + ] + } + ], "source": [ - "sunny_today = False\n", + "sunny_today = True\n", "# [ ] test if it is sunny_today and give proper responses using if and else\n", "if sunny_today:\n", " print(\"It is sunny.\")\n", @@ -128,13 +168,24 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 14, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "it is not sunny\n" + ] + } + ], "source": [ "sunny_today = False\n", "# [ ] use code you created above and test sunny_today = False\n", - "\n" + "if sunny_today:\n", + " print(\"It is sunny.\")\n", + "else:\n", + " print(\"it is not sunny\")\n" ] }, { @@ -165,9 +216,17 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 15, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Harry potter - consider capitalization throughout for book titles.\n" + ] + } + ], "source": [ "# review code and run cell\n", "favorite_book = input(\"Enter the title of a favorite book: \")\n", @@ -180,9 +239,17 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 20, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "- bear is not a positive integer\n" + ] + } + ], "source": [ "# review code and run cell\n", "a_number = input(\"enter a positive integer number: \")\n", @@ -201,9 +268,17 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 23, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "prowler starts with \"P\"\n" + ] + } + ], "source": [ "# review code and run cell\n", "vehicle_type = input('\"enter a type of vehicle that starts with \"P\": ')\n", @@ -230,14 +305,33 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 27, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "welcome is all lowercase\n", + "and\n", + "I have $3 is not lowercase\n" + ] + } + ], "source": [ "test_string_1 = \"welcome\"\n", "test_string_2 = \"I have $3\"\n", "# [ ] use if, else to test for islower() for the 2 strings\n", - "\n" + "if test_string_1.islower():\n", + " print(test_string_1, \"is all lowercase\")\n", + "else:\n", + " print(test_string_1, \"is not all lowercase\")\n", + "print(\"and\")\n", + "\n", + "if test_string_2.islower():\n", + " print(test_string_2, \"is all lowercase\")\n", + "else:\n", + " print(test_string_2, \"is not lowercase\")\n" ] }, { @@ -252,16 +346,26 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 29, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "True\n", + "False\n", + "True\n" + ] + } + ], "source": [ "test_string_1 = \"welcome\"\n", "test_string_2 = \"I have $3\"\n", "test_string_3 = \"With a function it's efficient to repeat code\"\n", "# [ ] create a function w_start_test() use if & else to test with startswith('w')\n", "def w_start_test(test_string):\n", - " print(test_string.startswith('w'))\n", + " print(test_string.lower().startswith('w'))\n", " \n", "# [ ] Test the 3 string variables provided by calling w_start_test()\n", "w_start_test(test_string_1)\n", @@ -315,9 +419,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 30, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "False" + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# [ ] review and run code to see if 3 greater than 5\n", "3 > 5" @@ -325,9 +440,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 31, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# [ ] review and run code to see if 3 less than or equal to 5\n", "3 <= 5" @@ -335,9 +461,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 32, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "False" + ] + }, + "execution_count": 32, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# [ ] review and run code \n", "\n", @@ -350,9 +487,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 33, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "x not equal 9 is True\n", + "x equal 3 is True\n" + ] + } + ], "source": [ "# [ ] review and run code \n", "x = 3\n", @@ -373,9 +519,17 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 34, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "True\n" + ] + } + ], "source": [ "x = 9 + 4\n", "# [ ] create a test to print() True or False for x is equal to 13\n", @@ -387,12 +541,24 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 37, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "true\n" + ] + } + ], "source": [ "# [ ] create a test to print True or False for 3 + 3 is greater than 2 + 4\n", - "\n" + "x = 3 + 3\n", + "if x >= 2 + 4:\n", + " print(\"true\")\n", + "else:\n", + " print(\"false\")\n" ] }, { @@ -419,9 +585,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 40, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "x was 21\n", + "now x is 25\n" + ] + } + ], "source": [ "# review code and run cell\n", "x = 21\n", @@ -435,9 +610,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 39, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "25\n", + "Pass: x + 18 is equal to 36\n" + ] + } + ], "source": [ "# review code and run cell\n", "print(x)\n", @@ -450,9 +634,17 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 41, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "x is 18\n" + ] + } + ], "source": [ "# review code and run cell. \"!\" means \"not\"\n", "x = 18\n", @@ -465,15 +657,23 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 43, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\"==\" tests for, is equal to\n" + ] + } + ], "source": [ "# review code and run cell\n", "# DON'T ASSIGN (x = 2) when you mean to COMPARE (x == 2)\n", "x = 2\n", "\n", - "if x = 2:\n", + "if x == 2:\n", " print('\"==\" tests for, is equal to')\n", "else:\n", " pass" @@ -492,14 +692,25 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 45, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "y is greater than or equal x + x is\n" + ] + } + ], "source": [ "# [ ] create an if/else statement that tests if y is greater than or equal x + x \n", "# [ ] print output: \"y greater than or equal x + x is\" True/False ...or a similar output\n", "x = 3\n", "y = x + 8\n", + "\n", + "if y >= x + x:\n", + " print(\"y is greater than or equal x + x is\")\n", "\n" ] }, @@ -546,9 +757,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 46, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "False" + ] + }, + "execution_count": 46, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# review and run code\n", "\"hello\" < \"Hello\"" @@ -556,19 +778,41 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 50, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 50, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# review and run code\n", - "\"Aardvark\" > \"Zebra\"" + "\"Aardvark\" < \"Zebra\"" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 48, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 48, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# review and run code\n", "'student' != 'Student'" @@ -576,9 +820,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 49, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "'student' >= 'Student' is True\n", + "'Student' != 'Student' is False\n" + ] + } + ], "source": [ "# review and run code\n", "print(\"'student' >= 'Student' is\", 'student' >= 'Student')\n", @@ -587,9 +840,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 51, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 51, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# review and run code\n", "\"Hello \" + \"World!\" == \"Hello World!\"" @@ -606,7 +870,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 52, "metadata": {}, "outputs": [], "source": [ @@ -617,15 +881,27 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 54, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "true\n" + ] + } + ], "source": [ "greeting = \"Hello\"\n", "# [ ] get input for variable named msg, and ask user to 'Say \"Hello\"'\n", "# [ ] print the results of testing if msg string equals greeting string\n", "\n", - "\n" + "msg = input('Say \"Hello\" ')\n", + "if msg == greeting:\n", + " print(\"true\")\n", + "else:\n", + " print(\"false\")\n" ] }, { @@ -646,9 +922,17 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 55, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "message as expected\n" + ] + } + ], "source": [ "# [ ] review and run code\n", "msg = \"Save the notebook\"\n", @@ -661,9 +945,17 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 56, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "message as expected\n" + ] + } + ], "source": [ "# [ ] review and run code\n", "msg = \"Save the notebook\"\n", @@ -686,12 +978,25 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 60, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "nope\n" + ] + } + ], "source": [ "# [ ] get input for a variable, answer, and ask user 'What is 8 + 13? : '\n", + "answer = input('What is 8 + 13? : ')\n", "# [ ] print messages for correct answer \"21\" or incorrect answer using if/else\n", + "if answer == \"21\":\n", + " print(\"correct\")\n", + "else:\n", + " print(\"nope\")\n", "# note: input returns a \"string\"\n", "\n", "\n" @@ -722,12 +1027,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 66, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The correct answer was True\n", + "The correct answer was Yes you can!\n" + ] + } + ], "source": [ "# [ ] Create the program, run tests\n", - "def tf_quiz(question=\"Should save your notebook after edit?(T/F): \",correct_ans=True):\n", + "def tf_quiz(question=\"Should save your notebook after edit?(T/F): \",correct_ans=\"True\"):\n", " user_answer = input(question)\n", " if user_answer == correct_ans:\n", " print(\"Correct!\",question,correct_ans)\n", @@ -795,9 +1109,17 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 68, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Bring an umbrella and boots\n" + ] + } + ], "source": [ "# [ ] review the code then run testing different inputs\n", "# WHAT TO WEAR\n", @@ -815,9 +1137,17 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 69, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Guess is too high\n" + ] + } + ], "source": [ "# [ ] review the code then run testing different inputs\n", "# SECRET NUMBER GUESS\n", @@ -854,12 +1184,30 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 72, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "We do not have an xs\n" + ] + } + ], "source": [ "# [ ] code and test SHIRT SALE\n", - "\n" + "shirt_size = input(\"Enter shirt size S,M,L, or XL: \")\n", + "if shirt_size.upper() == \"S\":\n", + " print(\"Small shirt is $6\")\n", + "elif shirt_size.upper() == \"M\":\n", + " print(\"Medium shirt is $7\")\n", + "elif shirt_size.upper() == \"L\":\n", + " print(\"Large shirt is $8\")\n", + "elif shirt_size.upper() == \"XL\":\n", + " print(\"Extra Large shirt is $9\")\n", + "else:\n", + " print(\"We do not have an\", shirt_size)\n" ] }, { @@ -910,28 +1258,46 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 77, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "36\n" + ] + } + ], "source": [ "str_num_1 = \"11\"\n", "str_num_2 = \"15\"\n", "int_num_3 = 10\n", "# [ ] Add the 3 numbers as integers and print the result\n", - "\n" + "total_number = int(str_num_1) + int(str_num_2) + int_num_3\n", + "print(total_number)\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 80, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "111510\n" + ] + } + ], "source": [ "str_num_1 = \"11\"\n", "str_num_2 = \"15\"\n", "int_num_3 = 10\n", "# [ ] Add the 3 numbers as test strings and print the result\n", - "\n" + "total_number = str_num_1 + str_num_2 + str(int_num_3)\n", + "print(total_number)\n" ] }, { @@ -948,12 +1314,23 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 84, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "8\n" + ] + } + ], "source": [ "# [ ] code and test: adding using int casting\n", - "\n" + "str_integer = \"3\"\n", + "int_number = 5\n", + "number_total = int(str_integer) + int_number\n", + "print(number_total)\n" ] }, { @@ -975,9 +1352,17 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 85, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Next year student will be 6\n" + ] + } + ], "source": [ "# [ ] review and run code\n", "student_age = input('enter student age (integer): ')\n", @@ -987,9 +1372,17 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 86, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "In a decade the student will be 15\n" + ] + } + ], "source": [ "# [ ] review and run code\n", "# cast to int at input\n", @@ -1018,12 +1411,23 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 89, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "12\n" + ] + } + ], "source": [ "# [ ] code and test the adding calculator\n", - "\n" + "first_number = input(\"enter first number\")\n", + "second_number = input(\"enter second nuber\")\n", + "total = int(first_number) + int(second_number)\n", + "print(total)\n" ] }, { @@ -1071,9 +1475,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 90, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "3 + 5 = 8\n", + "3 + 5 - 9 = -1\n", + "48/9 = 5.333333333333333\n", + "5*5 = 25\n", + "(14 - 8)*(19/4) = 28.5\n" + ] + } + ], "source": [ "# [ ] review and run example\n", "print(\"3 + 5 =\",3 + 5)\n", @@ -1085,9 +1501,17 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 91, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Now you have 5000000\n" + ] + } + ], "source": [ "# [ ] review and run example - 'million_maker'\n", "def million_maker():\n", @@ -1108,12 +1532,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 92, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "43 - 15 = 28\n" + ] + } + ], "source": [ "# [ ] print the result of subtracting 15 from 43\n", - "\n" + "print(\"43 - 15 = \", 43 - 15)\n" ] }, { @@ -1187,12 +1619,16 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 100, "metadata": {}, "outputs": [], "source": [ "# [ ] create and test multiply() function\n", - "\n", + "def multiply():\n", + " num1 = input(\"enter first number to multiply: \")\n", + " num2 = input(\"enter second number to multiply: \")\n", + " product = int(num1) * int(num2)\n", + " return f\"{num1_str} * {num2_str} = {product}\"\n", " " ] }, @@ -1236,15 +1672,14 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 102, "metadata": {}, "outputs": [ { - "ename": "SyntaxError", - "evalue": "invalid syntax (, line 5)", - "output_type": "error", - "traceback": [ - "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m5\u001b[0m\n\u001b[0;31m elif student_name.startswith(\"G\")\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n" + "name": "stdout", + "output_type": "stream", + "text": [ + "Ben please wait for students with names staring with 'F' and 'G' to go first today.\n" ] } ], @@ -1253,7 +1688,7 @@ "student_name = input(\"enter name: \").capitalize()\n", "if student_name.startswith(\"F\"):\n", " print(student_name,\"Congratulations, names starting with 'F' get to go first today!\")\n", - "elif student_name.startswith(\"G\")\n", + "elif student_name.startswith(\"G\"):\n", " print(student_name,\"Congratulations, names starting with 'G' get to go second today!\")\n", "else:\n", " print(student_name, \"please wait for students with names staring with 'F' and 'G' to go first today.\")\n", @@ -1285,7 +1720,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.8" + "version": "3.13.7" } }, "nbformat": 4, From 58d0fe402a71f7e747861d3a2a79206cf60be15a Mon Sep 17 00:00:00 2001 From: Benjamin Reed Date: Tue, 16 Sep 2025 17:22:03 -0400 Subject: [PATCH 11/36] update module 3.1 --- .../Module_3.1_Practice.ipynb | 39 ++++++++++++------- 1 file changed, 24 insertions(+), 15 deletions(-) diff --git a/P1 Python Absolute Beginner/Module_3.1_Practice.ipynb b/P1 Python Absolute Beginner/Module_3.1_Practice.ipynb index 8ee62fc..72b49d8 100644 --- a/P1 Python Absolute Beginner/Module_3.1_Practice.ipynb +++ b/P1 Python Absolute Beginner/Module_3.1_Practice.ipynb @@ -17,17 +17,16 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Input your age (use only whole numbers): 23\n", "Age's first type is: \n", "Age's second type is: \n", - "In ten years you will be 33.\n" + "In ten years you will be 28.\n" ] } ], @@ -51,7 +50,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 13, "metadata": { "collapsed": true }, @@ -60,8 +59,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "True\n", - "3\n" + "101 is greater than 100 is: True\n" ] } ], @@ -71,10 +69,11 @@ "# print number \"greater than 100 is\" True/False\n", "# if number is NOT a digit string then message the user that \"only int is accepted\"\n", "\n", - "print(\"Dominic\".isalpha())\n", - "my_var = \"123\"\n", - "\n", - "print(len(my_var))\n" + "number = input(\"Input a number here: \")\n", + "if number .isdigit():\n", + " print(number + \" is greater than 100 is: \", int(number) >100)\n", + "else:\n", + " print(\"only int is accepted\")\n" ] }, { @@ -90,7 +89,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 15, "metadata": { "collapsed": true }, @@ -100,7 +99,7 @@ "output_type": "stream", "text": [ "Low\n", - "Invalid - not alphabetical\n", + "Low\n", "Correct\n", "On the third try! Sortta slow.\n" ] @@ -160,10 +159,19 @@ "metadata": { "collapsed": true }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Correct\n", + "On the first try! What a mensch.\n" + ] + } + ], "source": [ "# [ ] call check_guess with user input\n", - "\n" + "letter_game(\"B\")\n" ] }, { @@ -189,6 +197,7 @@ "outputs": [], "source": [ "# [ ] create letter_guess() function, call the function to test\n", + "def letter_guess(answer, guess):\n", "\n", "\n" ] @@ -405,7 +414,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.13.1" + "version": "3.13.7" } }, "nbformat": 4, From 2f94c9cb93e7eef08f4bc5056c829a4f8e4b8d06 Mon Sep 17 00:00:00 2001 From: Benjamin Reed Date: Fri, 19 Sep 2025 08:08:13 -0400 Subject: [PATCH 12/36] 3.1 work --- .../Module_3.1_Practice.ipynb | 56 +++++++++++++++---- 1 file changed, 46 insertions(+), 10 deletions(-) diff --git a/P1 Python Absolute Beginner/Module_3.1_Practice.ipynb b/P1 Python Absolute Beginner/Module_3.1_Practice.ipynb index 72b49d8..fabca64 100644 --- a/P1 Python Absolute Beginner/Module_3.1_Practice.ipynb +++ b/P1 Python Absolute Beginner/Module_3.1_Practice.ipynb @@ -89,7 +89,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 6, "metadata": { "collapsed": true }, @@ -100,8 +100,8 @@ "text": [ "Low\n", "Low\n", - "Correct\n", - "On the third try! Sortta slow.\n" + "Low\n", + "You lose.\n" ] } ], @@ -194,12 +194,29 @@ "metadata": { "collapsed": true }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "High\n" + ] + }, + { + "data": { + "text/plain": [ + "False" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# [ ] create letter_guess() function, call the function to test\n", - "def letter_guess(answer, guess):\n", - "\n", - "\n" + "check_guess()\n", + " \n" ] }, { @@ -219,14 +236,33 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "metadata": { "collapsed": true }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "You should get a dog, cat, or bird\n", + "thank you for the story\n" + ] + } + ], "source": [ "# [ ] complete pet conversation\n", - "\n" + "about_pet = input(\"What kind of pet do you have? \")\n", + "if about_pet.lower() == \"dog\":\n", + " print(\"That is great that you have a dog\")\n", + "elif about_pet.lower() == \"cat\":\n", + " print(\"that is great that you have a cat\")\n", + "elif about_pet == \"bird\":\n", + " print(\"that is great that you have a bird\")\n", + "else:\n", + " print(\"You should get a dog, cat, or bird\")\n", + "\n", + "print(\"thank you for the story\")" ] }, { From 61e2e3b33aa0b685fc0f8b6a1859f11fd734a405 Mon Sep 17 00:00:00 2001 From: Benjamin Reed Date: Fri, 19 Sep 2025 15:01:19 -0400 Subject: [PATCH 13/36] P1M3 --- .../Module_3.1_Practice.ipynb | 308 +++++++++++++++--- .../Module_3.2_Required_Code.ipynb | 34 +- 2 files changed, 295 insertions(+), 47 deletions(-) diff --git a/P1 Python Absolute Beginner/Module_3.1_Practice.ipynb b/P1 Python Absolute Beginner/Module_3.1_Practice.ipynb index fabca64..2d121a2 100644 --- a/P1 Python Absolute Beginner/Module_3.1_Practice.ipynb +++ b/P1 Python Absolute Beginner/Module_3.1_Practice.ipynb @@ -89,7 +89,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 1, "metadata": { "collapsed": true }, @@ -98,9 +98,9 @@ "name": "stdout", "output_type": "stream", "text": [ - "Low\n", - "Low\n", - "Low\n", + "Invalid - not alphabetical\n", + "Invalid - not alphabetical\n", + "Invalid - not alphabetical\n", "You lose.\n" ] } @@ -190,7 +190,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "metadata": { "collapsed": true }, @@ -199,24 +199,35 @@ "name": "stdout", "output_type": "stream", "text": [ - "High\n" + "Correct\n", + "Correct\n", + "On the first try! What a mensch.\n" ] - }, - { - "data": { - "text/plain": [ - "False" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" } ], "source": [ "# [ ] create letter_guess() function, call the function to test\n", - "check_guess()\n", - " \n" + " \n", + "check_guess(\"A\", \"A\")\n", + "\n", + "def letter_guess(correct_answer):\n", + " this_guess = input(\"Guess the letter (provide one letter): \")\n", + " if True == check_guess(correct_answer,this_guess):\n", + " print(\"On the first try! What a mensch.\")\n", + " else:\n", + " #second guess\n", + " this_guess = input(\"Guess the letter (provide one letter): \")\n", + " if True == check_guess(correct_answer,this_guess):\n", + " print(\"On the second try! What a mensch.\")\n", + " else:\n", + " #third guess\n", + " this_guess = input(\"Guess the letter (provide one letter): \")\n", + " if True == check_guess(correct_answer,this_guess):\n", + " print(\"On the third try! Sortta slow.\")\n", + " else:\n", + " print(\"You lose.\")\n", + " \n", + "letter_guess(\"A\")\n" ] }, { @@ -307,25 +318,82 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 10, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Green\n", + "Thank you for playing\n" + ] + } + ], "source": [ "# [ ] complete rainbow colors\n", - "\n", + "fav_color = input(\"Give me your favorite color of the rainbow, only use first letter\")\n", + "if fav_color.lower() == \"r\":\n", + " print(\"Red\")\n", + "elif fav_color.lower() == \"o\":\n", + " print(\"Orange\")\n", + "elif fav_color.lower() == \"y\":\n", + " print(\"Yellow\")\n", + "elif fav_color.lower() == \"g\":\n", + " print(\"Green\")\n", + "elif fav_color.lower() == \"b\":\n", + " print(\"Blue\")\n", + "elif fav_color.lower() == \"i\":\n", + " print(\"Indigo\")\n", + "elif fav_color.lower() == \"v\":\n", + " print(\"Violet\")\n", + "else:\n", + " print(\"Not a rainbow color\")\n", + "print(\"Thank you for playing\")\n", "\n" ] }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 18, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Red\n" + ] + } + ], "source": [ "# [ ] make the code above into a function rainbow_color() that has a string parameter, \n", "# get input and call the function and return the matching color as a string or \"no match\" message.\n", "# Call the function and print the return string.\n", - "\n" + "def rainbow_color(fav_color):\n", + " letter = fav_color.lower()\n", + " if letter.lower() == \"r\":\n", + " return \"Red\"\n", + " elif letter.lower() == \"o\":\n", + " return \"Orange\"\n", + " elif letter.lower() == \"y\":\n", + " return \"Yellow\"\n", + " elif letter.lower() == \"g\":\n", + " return \"Green\"\n", + " elif letter.lower() == \"b\":\n", + " return \"Blue\"\n", + " elif letter.lower() == \"i\":\n", + " return \"Indigo\"\n", + " elif letter.lower() == \"v\":\n", + " return \"Violet\"\n", + " else:\n", + " return (\"No match\")\n", + "\n", + "user_input = input(\"Give me your favorite color of the rainbow, only use first letter\")\n", + "\n", + "matching_color = rainbow_color(user_input)\n", + "\n", + "print(matching_color)" ] }, { @@ -341,12 +409,32 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 34, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\"5 years old, 20 years diffence from now\"\n" + ] + } + ], "source": [ "# [ ] complete age_20()\n", - "\n" + "\n", + "def age_20(current_age):\n", + " if current_age >= 20:\n", + " return current_age - 20\n", + " else:\n", + " return current_age + 20\n", + " \n", + "age = input(\"Enter your age\")\n", + "age_int = int(age)\n", + "\n", + "new_age = age_20(age_int)\n", + "\n", + "print(f'\"{new_age} years old, 20 years diffence from now\"')" ] }, { @@ -361,66 +449,200 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 43, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "23" + ] + }, + "execution_count": 43, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# [ ] create rainbow_or_age()\n", - "\n" + "\n", + "def age_20(current_age):\n", + "\n", + " if current_age >= 20:\n", + " return current_age - 20\n", + " else:\n", + " return current_age + 20\n", + "\n", + "def rainbow_color(color_letter):\n", + "\n", + " letter = color_letter.lower()\n", + " \n", + " if letter == \"r\":\n", + " return \"Red\"\n", + " elif letter == \"o\":\n", + " return \"Orange\"\n", + " elif letter == \"y\":\n", + " return \"Yellow\"\n", + " elif letter == \"g\":\n", + " return \"Green\"\n", + " elif letter == \"b\":\n", + " return \"Blue\"\n", + " elif letter == \"i\":\n", + " return \"Indigo\"\n", + " elif letter == \"v\":\n", + " return \"Violet\"\n", + " else:\n", + " return \"no match\"\n", + "\n", + "\n", + "\n", + "def rainbow_or_age():\n", + " user_input = input(\"Give me your favorite color of the rainbow, only use first letter or your age as a number\")\n", + " if user_input.isdigit():\n", + " age = int(user_input)\n", + " return age_20(age)\n", + " elif user_input.isalpha():\n", + " return rainbow_color(user_input)\n", + " else:\n", + " return False\n", + " \n", + "rainbow_or_age()" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 45, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "12\n" + ] + } + ], "source": [ "# [ ] add 2 numbers from input using a cast to integer and display the answer \n", - "\n" + "age = input(\"enter your age: \")\n", + "age_2 = input(\"enter a second age: \")\n", + "\n", + "print(int(age) + int(age_2))\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 47, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "the answer is... 25\n" + ] + } + ], "source": [ "# [ ] Multiply 2 numbers from input using cast and save the answer as part of a string \"the answer is...\"\n", "# display the string using print\n", + "num_1 = input(\"Number 1\")\n", + "num_2 = input(\"Number 2\")\n", + "\n", + "product = int(num_1) * int(num_2)\n", + "\n", + "print(\"the answer is... \" + str(product)) \n", "\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 48, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "15.0\n" + ] + } + ], "source": [ "# [ ] get input of 2 numbers and display the average: (num1 + num2) divided by 2\n", - "\n" + "num_3 = input(\"Number 3\")\n", + "num_4 = input(\"Number 4\")\n", + "\n", + "print((int(num_3) + int(num_4)) / 2)\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 51, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The difference is: 10\n" + ] + } + ], "source": [ "# [ ] get input of 2 numbers and subtract the largest from the smallest (use an if statement to see which is larger)\n", "# show the answer\n", - "\n" + "num_5 = input(\"Number 5\")\n", + "num_6 = input(\"Number 6\")\n", + "\n", + "num_5_int = int(num_5)\n", + "num_6_int = int(num_6)\n", + "\n", + "if num_5_int > num_6_int:\n", + " differnece = num_5_int - num_6_int\n", + "\n", + "else:\n", + " differnece = num_6_int - num_5_int\n", + "\n", + "print(\"The difference is: \" + str(differnece))\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The integer result is: 0\n" + ] + } + ], "source": [ "# [ ] Divide a larger number by a smaller number and print the integer part of the result\n", "# don't divide by zero! if a zero is input make the result zero\n", "# [ ] cast the answer to an integer to cut off the decimals and print the result\n", - "\n" + "\n", + "\n", + "num1_str = input(\"Enter the first number: \")\n", + "num2_str = input(\"Enter the second number: \")\n", + "\n", + "num1 = float(num1_str)\n", + "num2 = float(num2_str)\n", + "\n", + "if num1 == 0 or num2 == 0:\n", + " result = 0\n", + "elif num1 > num2:\n", + " division_result = num1 / num2\n", + " result = int(division_result)\n", + "else: \n", + " division_result = num2 / num1\n", + " result = int(division_result)\n", + "\n", + "\n", + "print(f\"The integer result is: {result}\")\n" ] }, { diff --git a/P1 Python Absolute Beginner/Module_3.2_Required_Code.ipynb b/P1 Python Absolute Beginner/Module_3.2_Required_Code.ipynb index be37266..1785457 100644 --- a/P1 Python Absolute Beginner/Module_3.2_Required_Code.ipynb +++ b/P1 Python Absolute Beginner/Module_3.2_Required_Code.ipynb @@ -48,13 +48,39 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "metadata": { "trusted": false }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "50.0 costs $525.00\n" + ] + } + ], "source": [ - "# [ ] create fucntion, call and test \n" + "# [ ] create fucntion, call and test \n", + "def cheese_order(order_amount, max_order=100, min_order=1, price=10.50):\n", + "\n", + " \n", + " order_amount_num = float(order_amount)\n", + "\n", + "\n", + " if order_amount_num > max_order:\n", + " print(f\"{order_amount_num} is more than currently available stock\")\n", + " elif order_amount_num < min_order:\n", + " print(f\"{order_amount_num} is below minimum order amount\")\n", + " else:\n", + " cost = order_amount_num * price\n", + " print(f\"{order_amount_num} costs ${cost:.2f}\")\n", + "\n", + "order_weight = input(\"Ben Reed, enter cheese order weight (numeric value): \")\n", + "\n", + "\n", + "cheese_order(order_weight)" ] }, { @@ -81,7 +107,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.5.4" + "version": "3.13.7" } }, "nbformat": 4, From 3239ff7d090920838fe23fc46bf68e2e0be6d518 Mon Sep 17 00:00:00 2001 From: Benjamin Reed Date: Mon, 22 Sep 2025 16:53:10 -0400 Subject: [PATCH 14/36] class work --- ...le_4.0_Tutorials_Nested_Conditionals.ipynb | 562 +++++++++++++++--- .../Module_4.1_Practice.ipynb | 73 ++- 2 files changed, 548 insertions(+), 87 deletions(-) diff --git a/P1 Python Absolute Beginner/Module_4.0_Tutorials_Nested_Conditionals.ipynb b/P1 Python Absolute Beginner/Module_4.0_Tutorials_Nested_Conditionals.ipynb index 45bb4e8..cdd6552 100644 --- a/P1 Python Absolute Beginner/Module_4.0_Tutorials_Nested_Conditionals.ipynb +++ b/P1 Python Absolute Beginner/Module_4.0_Tutorials_Nested_Conditionals.ipynb @@ -42,9 +42,17 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Here is your Manchego Cheese sandwich\n" + ] + } + ], "source": [ "# simplified example\n", "# [ ] review the code then run and following the flowchart paths\n", @@ -69,9 +77,23 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Hi, welcome to the sandwich shop. Please select a sandwich.\n", + "\n", + "Please select a cheese.\n", + "\n", + "Here is your Manchego Cheese sandwich. Thank you.\n", + "\n", + "Goodbye!\n" + ] + } + ], "source": [ "# full example: handling some invalid input and elif statement\n", "# [ ] review the code then run following the flowchart paths including **invalid responses** like \"xyz123\"\n", @@ -119,13 +141,34 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 8, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Invalid input, please enter 'y' or 'n'.\n" + ] + } + ], "source": [ "# [ ] Say \"Hello\" with nested if\n", "# [ ] Challenge: handle input other than y/n\n", - "\n" + "\n", + "morning = input(\"Is it morning? (y/n): \")\n", + "if morning.lower() == \"y\":\n", + " print(\"Good morning!\")\n", + "elif morning == \"n\":\n", + " evening = input(\"Is it evening? (y/n): \")\n", + " if evening == \"y\":\n", + " print(\"Good evening!\")\n", + " elif evening == \"n\":\n", + " print(\"Hello!\")\n", + " else:\n", + " print(\"Invalid input, please enter 'y' or 'n'.\")\n", + "else:\n", + " print(\"Answer morning, please enter 'y' or 'n'.\")\n" ] }, { @@ -145,11 +188,32 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 11, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Sorry, no more tries. The birds were: parrot, jay, robin\n" + ] + } + ], "source": [ - "# [ ] Create the \"Guess the bird\" program \n" + "# [ ] Create the \"Guess the bird\" program \n", + "birds = \"parrot, jay, robin\"\n", + "bird_guess = input(\"Guess a bird name: \")\n", + "if bird_guess.lower() in birds:\n", + " print(\"you found one on the first try!\")\n", + "else:\n", + " guess2 = input(\"sorry your bird was not found, try again: \")\n", + " if guess2.lower() in birds:\n", + " print(\"you found one on the second try!\")\n", + " else:\n", + " guess3 = input(\"Sorry your bird was not found. Last try: \")\n", + " if guess3.lower() in birds:\n", + " print(\"finally! You got one.\")\n", + " else:print(\"Sorry, no more tries. The birds were:\", birds)" ] }, { @@ -202,9 +266,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 12, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Hello World!\n", + "I am formatting print \n" + ] + } + ], "source": [ "# review and run example using \\n (new line)\n", "print('Hello World!\\nI am formatting print ')" @@ -212,9 +285,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 13, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "STUDENT NAME\t\tAGE\n", + "Hiroto Yamaguchi \t17\n" + ] + } + ], "source": [ "# review and run code using \\t (tab)\n", "student_age = 17\n", @@ -225,9 +307,19 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 14, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\"quotes in quotes\"\n", + "I've said \"save your notebook,\" so let's do it!\n", + "for a newline use \\n\n" + ] + } + ], "source": [ "# review and run code \n", "# using \\\" and \\' (escaped quotes)\n", @@ -249,35 +341,60 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 32, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\"\\\\\\WARNING!///\"\n" + ] + } + ], "source": [ "# [ ] print \"\\\\\\WARNING!///\"\n", "\n", - "\n" + "print(\"\\\"\\\\\\\\\\\\WARNING!///\\\"\")\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 39, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\"What's that?\" isn't a specific question.\n" + ] + } + ], "source": [ "# [ ] print output that is exactly (with quotes): \"What's that?\" isn't a specific question.\n", - "\n" + "print(\"\\\"What\\'s that?\\\" isn\\'t a specific question.\")\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 43, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "One\tTwo\tThree\n", + "Four\tFive\tSix\n" + ] + } + ], "source": [ "# [ ] from 1 print statement output the text commented below using no spaces\n", "# One Two Three\n", "# Four Five Six\n", - "\n" + "print(\"One\\tTwo\\tThree\\nFour\\tFive\\tSix\")\n" ] }, { @@ -301,20 +418,52 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 45, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "nice job\n" + ] + } + ], "source": [ "# [ ] create and test pre_word()\n", - "\n" + "def pre_word(test_word):\n", + " if test_word.startswith(\"pre\"):\n", + " if test_word.isalpha():\n", + " return True\n", + " else:\n", + " return False\n", + " else:\n", + " print(\"you need to input a valid \\\"pre\\\" word\")\n", + " return False\n", + "result = pre_word(input(\"Enter a word that starts with \\\"pre\\\": \"))\n", + "if result:\n", + " print(\"nice job\")\n", + "else:\n", + " print(\"try again\")\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 46, "metadata": {}, - "outputs": [], - "source": [] + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "pre\n" + ] + } + ], + "source": [ + "x = \"pregame\"\n", + "print(x[:3])" + ] }, { "cell_type": "markdown", @@ -327,12 +476,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 49, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Hello\n", + "World!\n" + ] + } + ], "source": [ "# [ ] review, run, fix\n", - "print(\"Hello/nWorld!)\n", + "print(\"Hello\\nWorld!\")\n", "\n" ] }, @@ -384,9 +542,17 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 50, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "write forever, unless there is a \"break\"\n" + ] + } + ], "source": [ "# Review and run code\n", "# this example never loops because the break has no conditions\n", @@ -397,9 +563,26 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 51, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1 is incorrect\n", + "\n", + "2 is incorrect\n", + "\n", + "3 is incorrect\n", + "\n", + "4 is incorrect\n", + "\n", + "Yes 5 is correct!\n", + "\n" + ] + } + ], "source": [ "# [ ] review the NUMBER GUESS code then run - Q. what cause the break statement to run?\n", "number_guess = \"0\"\n", @@ -416,9 +599,24 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 53, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Sorry, not sure what to suggest for the\n", + "\n", + "\n", + "Sorry, not sure what to suggest for hot\n", + "\n", + "\n", + "\"quit\" detected, exiting\n" + ] + } + ], "source": [ "# [ ] review WHAT TO WEAR code then run testing different inputs\n", "while True:\n", @@ -458,12 +656,27 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 57, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Hello Ben\n" + ] + } + ], "source": [ "# [ ] create Get Name program\n", - "\n" + "\n", + "familiar_name = \"\"\n", + "\n", + "while True:\n", + " familiar_name = input(\"Give me a familiar name: \")\n", + " if familiar_name != \"\":\n", + " break\n", + "print(\"Hello\", familiar_name)" ] }, { @@ -493,9 +706,19 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 58, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "3\n", + "4\n", + "6\n" + ] + } + ], "source": [ "# [ ] review and run example\n", "votes = 3\n", @@ -510,9 +733,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 81, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-16\n", + "-17\n" + ] + } + ], "source": [ "print(votes)\n", "\n", @@ -522,9 +754,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 82, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "seat count: 0\n", + "seat count: 1\n", + "seat count: 2\n", + "seat count: 3\n", + "seat count: 4\n" + ] + } + ], "source": [ "# [ ] review the SEAT COUNT code then run \n", "\n", @@ -539,9 +783,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 84, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "invalid entry: counted as hard\n", + "\n", + "seats are full\n", + "4 Seats Total: 1 hard and 3 soft\n" + ] + } + ], "source": [ "# [ ] review the SEAT TYPE COUNT code then run entering: hard, soft, medium and exit\n", "\n", @@ -589,12 +844,49 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Total Shirts: 4\n", + "Small Total: 1\n", + "Medium total: 2\n", + "Large total: 1\n" + ] + } + ], "source": [ "# [ ] Create the Shirt Count program, run tests\n", - "\n" + "size_count = 0\n", + "small_shirt = 0\n", + "medium_shirt = 0\n", + "large_shirt = 0\n", + "num_shirt = 4\n", + "\n", + "# loops tallying seats using soft pads vs hard, until seats full or user \"exits\"\n", + "while size_count < num_shirt:\n", + " shirt_size = input('enter shirt size of \"S\", \"L\" or \"exit\" (to finish): ')\n", + " \n", + " if shirt_size.lower().startswith(\"s\"):\n", + " small_shirt += 1\n", + " size_count += 1\n", + " elif shirt_size.lower().startswith(\"m\"):\n", + " medium_shirt += 1\n", + " size_count += 1\n", + " elif shirt_size.lower().startswith(\"l\"):\n", + " large_shirt += 1\n", + " size_count += 1\n", + " elif shirt_size.lower() == \"exit\":\n", + " print(\"Exiting early.\")\n", + " break\n", + " else:\n", + " print(\"invalid entry\")\n", + "\n", + " \n", + "print(f\"Total Shirts: {size_count}\\nSmall Total: {small_shirt}\\nMedium total: {medium_shirt}\\nLarge total: {large_shirt}\")\n" ] }, { @@ -610,12 +902,56 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 16, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Small Total: 1\t\tSubTotal: 10.99\n", + "Medium total: 1\t\tSubTotal: 12.99\n", + "Large total: 2\t\tSubTotal: 29.98\n", + "Total Shirts: 4\t\t Total: 53.96\n" + ] + } + ], "source": [ "# [ ] Create the Shirt Register program, run tests\n", - "\n" + "\n", + "# [ ] Create the Shirt Count program, run tests\n", + "size_count = 0\n", + "small_shirt = 0\n", + "medium_shirt = 0\n", + "large_shirt = 0\n", + "num_shirt = 4\n", + "small_price = 10.99\n", + "medium_price = 12.99\n", + "large_price = 14.99\n", + "\n", + "# loops tallying seats using soft pads vs hard, until seats full or user \"exits\"\n", + "while size_count < num_shirt:\n", + " shirt_size = input('enter shirt size of \"S\", \"L\" or \"exit\" (to finish): ')\n", + " \n", + " if shirt_size.lower().startswith(\"s\"):\n", + " small_shirt += 1\n", + " size_count += 1\n", + " elif shirt_size.lower().startswith(\"m\"):\n", + " medium_shirt += 1\n", + " size_count += 1\n", + " elif shirt_size.lower().startswith(\"l\"):\n", + " large_shirt += 1\n", + " size_count += 1\n", + " elif shirt_size.lower() == \"exit\":\n", + " print(\"Exiting early.\")\n", + " break\n", + " else:\n", + " print(\"invalid entry\")\n", + "\n", + " \n", + "\n", + "print(f\"Small Total: {small_shirt}\\t\\tSubTotal: {small_shirt * small_price}\\nMedium total: {medium_shirt}\\t\\tSubTotal: {medium_shirt * medium_price}\\nLarge total: {large_shirt}\\t\\tSubTotal: {large_shirt * large_price}\")\n", + "print(f\"Total Shirts: {size_count}\\t\\t Total: {(small_shirt * small_price) + (medium_shirt * medium_price) + (large_shirt * large_price)}\")" ] }, { @@ -664,9 +1000,25 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 21, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "8 !\n", + "7 !\n", + "6 !\n", + "5 !\n", + "4 !\n", + "3 !\n", + "2 !\n", + "\n", + "IGNITION!\n" + ] + } + ], "source": [ "# review and run GREET COUNT\n", "greet_count = 8\n", @@ -699,12 +1051,31 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 25, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " dog cat fish bird\n" + ] + } + ], "source": [ "# [ ] Create the Animal Names program, run tests\n", - "\n" + "num_animals = 0 \n", + "all_animals = \"\"\n", + "\n", + "while num_animals < 4:\n", + " all_animals += \" \" + input(\"Enter an animal name: \")\n", + " num_animals += 1\n", + " if \"exit\" in all_animals:\n", + " break\n", + "if \"exit\" in all_animals:\n", + " print(\"Exiting early\")\n", + "else:\n", + " print(all_animals)" ] }, { @@ -731,15 +1102,24 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 29, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Ben has been entered as first name.\n" + ] + } + ], "source": [ "# review and run example that loops until a valid first name format is entered\n", - "student_fname = \".\"\n", + "student_fname = \"\"\n", "while student_fname.isalpha()==False:\n", - " student_fname = input(\"enter student\\'s first (Letters only, No spaces): \")\n", - "print(\"\\n\" + student_fname.title(),\"has been entered as first name\")" + " student_fname = input(\"enter student\\'s first name (Letters only, No spaces): \")\n", + "print(\"\\n\" + student_fname.title(),\"has been entered as first name.\")" ] }, { @@ -766,11 +1146,29 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 30, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Your long number is: 102030\n" + ] + } + ], "source": [ - "# [ ] Create the program, run tests\n" + "# [ ] Create the program, run tests\n", + "int_num = input(\"Enter some digits (or a non string digit to quit): \")\n", + "\n", + "long_num = \"\"\n", + "\n", + "while int_num.isdigit():\n", + " long_num += int_num\n", + " int_num = input(\"Enter some digits (or a non string digit to quit): \")\n", + "\n", + "print(\"\\nYour long number is: \", long_num)\n" ] }, { @@ -786,15 +1184,31 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 34, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1 x 1 = 1\n", + "2 x 2 = 4\n", + "3 x 3 = 9\n", + "4 x 4 = 16\n", + "5 x 5 = 25\n", + "6 x 6 = 36\n", + "7 x 7 = 49\n", + "8 x 8 = 64\n", + "9 x 9 = 81\n" + ] + } + ], "source": [ "# [ ] review the code, run, fix the Logic error\n", "count = 1\n", "\n", "# loop 5 times\n", - "while count > 5:\n", + "while count < 10:\n", " print(count, \"x\", count, \"=\", count*count)\n", " count +=1\n", " \n" @@ -825,7 +1239,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.8" + "version": "3.13.7" } }, "nbformat": 4, diff --git a/P1 Python Absolute Beginner/Module_4.1_Practice.ipynb b/P1 Python Absolute Beginner/Module_4.1_Practice.ipynb index 3ee967c..993e92e 100644 --- a/P1 Python Absolute Beginner/Module_4.1_Practice.ipynb +++ b/P1 Python Absolute Beginner/Module_4.1_Practice.ipynb @@ -21,36 +21,62 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The new line character is \\n\n" + ] + } + ], "source": [ "# [ ] print a string that outputs the following exactly: The new line character is \"\\n\"\n", - "\n" + "print(\"The new line character is \\\\n\")\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\"That's how we escape!\"\n" + ] + } + ], "source": [ "# [ ] print output that is exactly (with quotes): \"That's how we escape!\"\n", - "\n" + "print(\"\\\"That's how we escape!\\\"\")\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1\tone\n", + "22\ttwo\n", + "333\tthree\n" + ] + } + ], "source": [ "# [ ] with only 1 print statement and using No Space Characters, output the text commented below \n", "\n", "# 1 one\n", "# 22 two\n", "# 333 three\n", - "\n" + "print(\"1\\tone\\n22\\ttwo\\n333\\tthree\")\n" ] }, { @@ -68,13 +94,34 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 10, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Formatted string:\n", + "\"Hello\"\n" + ] + } + ], "source": [ "# [ ] create and test quote_me()\n", "\n", - "\n" + "def quote_me(text):\n", + "\n", + " if text.startswith('\"'):\n", + " return f\"'{text}'\"\n", + " else:\n", + " return f'\"{text}\"'\n", + "\n", + "user_input = input(\"enter a phrase or quote: \")\n", + "\n", + "formatted_string = quote_me(user_input)\n", + "\n", + "print(\"Formatted string:\")\n", + "print(formatted_string)" ] }, { @@ -352,7 +399,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.4" + "version": "3.13.7" } }, "nbformat": 4, From 99278dbfd513cd41bbd1166fa273c303514a547f Mon Sep 17 00:00:00 2001 From: Benjamin Reed Date: Tue, 23 Sep 2025 14:50:09 -0400 Subject: [PATCH 15/36] class work --- .../Module_4.1_Practice.ipynb | 71 +++++++++++++++++-- 1 file changed, 64 insertions(+), 7 deletions(-) diff --git a/P1 Python Absolute Beginner/Module_4.1_Practice.ipynb b/P1 Python Absolute Beginner/Module_4.1_Practice.ipynb index 993e92e..29522cd 100644 --- a/P1 Python Absolute Beginner/Module_4.1_Practice.ipynb +++ b/P1 Python Absolute Beginner/Module_4.1_Practice.ipynb @@ -144,11 +144,46 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Available\n", + "Your order for a Blue shirt in size M is confirmed.\n" + ] + } + ], "source": [ "# [ ] create shirt order using nested if \n", + "stock = {\n", + " \"white\": [\"l\", \"m\"],\n", + " \"blue\": [\"m\", \"s\"]\n", + "}\n", + "\n", + "color_input = input(\"What color shirt would you like?: White or Blue\")\n", + "size_input = input(\"What size would you like?: S, M, L\")\n", + "\n", + "color = color_input.lower()\n", + "size = size_input.lower()\n", + "\n", + "available = False\n", + "\n", + "if color in stock:\n", + " if size in stock [color]:\n", + " available = True\n", + "\n", + "if available:\n", + " print(\"Available\")\n", + " print(f\"Your order for a {color.capitalize()} shirt in size {size.upper()} is confirmed.\")\n", + "else:\n", + " print(\"Unavailable\")\n", + " print(\"The selected color and size combination is not in stock\")\n", + "\n", + "\n", + "\n", "\n" ] }, @@ -172,12 +207,34 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 10, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\"bart\" is all alpha\n" + ] + } + ], "source": [ "# [ ] create and test str_analysis()\n", + "def str_analysis(user_string): \n", + " if user_string.isdigit():\n", + " number = int(user_string)\n", + " if number > 99:\n", + " print(f'\"{user_string}\" is a big number')\n", + " else: print(f'\"{user_string}\" is a small number')\n", + " elif user_string.isalpha():\n", + " print(f'\"{user_string}\" is all alpha')\n", + " else:\n", + " print(f'\"{user_string}\" is niether all alpha or all digits.')\n", + "\n", + "user_input = input(\"Enter a word or a number: \")\n", "\n", + "str_analysis(user_input)\n", + " \n", " " ] }, @@ -204,7 +261,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 12, "metadata": {}, "outputs": [ { @@ -220,7 +277,7 @@ "True" ] }, - "execution_count": 9, + "execution_count": 12, "metadata": {}, "output_type": "execute_result" } @@ -236,7 +293,7 @@ " '''\n", " #TODO handle the situation in which user does not supply arguments; use input()\n", " if section == None:\n", - " section = input(\"Dominic Thomas Which section? (general or floor): \")\n", + " section = input(\"Ben Reed, Which section? (general or floor): \")\n", " \n", " if seats == None:\n", " seats = int(input(\"Seat number?: \"))\n", From 13302c94a5fd0a010dee555bbff520c45b1b33fd Mon Sep 17 00:00:00 2001 From: Benjamin Reed Date: Wed, 24 Sep 2025 07:14:17 -0400 Subject: [PATCH 16/36] P1M4 --- .../Module_4.1_Practice.ipynb | 152 ++++++++++++++++-- P1M4BenReed.py | 24 +++ 2 files changed, 159 insertions(+), 17 deletions(-) create mode 100644 P1M4BenReed.py diff --git a/P1 Python Absolute Beginner/Module_4.1_Practice.ipynb b/P1 Python Absolute Beginner/Module_4.1_Practice.ipynb index 29522cd..9cccf23 100644 --- a/P1 Python Absolute Beginner/Module_4.1_Practice.ipynb +++ b/P1 Python Absolute Beginner/Module_4.1_Practice.ipynb @@ -336,44 +336,124 @@ "cell_type": "code", "execution_count": null, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Existing loop\n", + "The total sum is: 15\n" + ] + } + ], "source": [ "# [ ] use a \"forever\" while loop to get user input of integers to add to sum, \n", "# until a non-digit is entered, then break the loop and print sum\n", "sum = 0\n", - "\n" + "\n", + "while True:\n", + " user_input = input(\"enter an integer to add (or a non_digit to quit):\")\n", + "\n", + " if user_input.isdigit():\n", + " number = int(user_input)\n", + " sum += number\n", + " if sum == 30:\n", + " break\n", + " else:\n", + " print(\"Exiting loop\")\n", + " break\n", + "print(f\"The total sum is: {sum}\")" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 8, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Try again\n", + "Try again\n", + "Winner winner, Chicken dinner\n" + ] + } + ], "source": [ "# [ ] use a while True loop (forever loop) to give 4 chances for input of a correct color in a rainbow\n", "# rainbow = \"red orange yellow green blue indigo violet\"\n", - "\n" + "\n", + "rainbow = \"red orange yellow green blue indigo violet\"\n", + "attempts = 1\n", + "\n", + "while True:\n", + " guess = input(f\"Attempt {attempts}: Guess a color of the rainbow: \")\n", + "\n", + " if guess.lower() in rainbow:\n", + " print(\"Winner winner, Chicken dinner\")\n", + " break\n", + " else:\n", + " print(\"Try again\")\n", + " attempts += 1\n", + "\n", + " if attempts >4:\n", + " print(\"\\nYou are out of guesses. Game over.\")\n", + " break\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "thanks for playing, title is in correct format\n" + ] + } + ], "source": [ "# [ ] Get input for a book title, keep looping while input is Not in title format (title is every word capitalized)\n", "title = \"\"\n", - "\n" + "\n", + "while True:\n", + " title = input(\"Enter a book title\")\n", + "\n", + " if title.istitle():\n", + " print(\"thanks for playing, title is in correct format\")\n", + " break\n", + " else:\n", + " print(\"Invalid format\")" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 8, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "👎 Wrong\n", + "✓ Correct.\n" + ] + } + ], "source": [ "# [ ] create a math quiz question and ask for the solution until the input is correct\n", - "\n" + "\n", + "while True:\n", + " answer = input(\"what is 10 + 5\")\n", + "\n", + " if answer == \"15\":\n", + " print(\"\\u2713 Correct.\")\n", + " break\n", + " else:\n", + " print(\"\\U0001F44E Wrong\")" ] }, { @@ -385,17 +465,28 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 11, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "sorry, not a winner.\n", + "you win!\n", + "Game ended\n" + ] + } + ], "source": [ "# [ ] review the code, run, fix the error\n", - "tickets = input(\"enter tickets remaining (0 to quit): \")\n", + "tickets = int(input(\"enter tickets remaining (0 to quit): \"))\n", "\n", "while tickets > 0:\n", " # if tickets are multiple of 3 then \"winner\"\n", " if int(tickets/3) == tickets/3:\n", " print(\"you win!\")\n", + " break\n", " else:\n", " print(\"sorry, not a winner.\")\n", " tickets = int(input(\"enter tickets remaining (0 to quit): \"))\n", @@ -420,13 +511,40 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 4, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Incorrect. Try again. \n", + "\n", + "Correct\n", + "Correct\n", + "Quiz complete\n" + ] + } + ], "source": [ "# Create quiz_item() and 2 or more quiz questions that call quiz_item()\n", "\n", - "#quiz_item()has 2 parameter strings: question and solution\n" + "#quiz_item()has 2 parameter strings: question and solution\n", + "def quiz_item(question, solution):\n", + " while True:\n", + " answer = input(question)\n", + " if answer.strip().lower() == solution.strip().lower():\n", + " print(\"Correct\")\n", + " return True\n", + " else:\n", + " print(\"Incorrect. Try again. \\n\")\n", + "\n", + "quiz_item(\"What is the capital of Georgia?.\\nAnswer: \", \"Atlanta\")\n", + "\n", + "question_2 = \"What is the first color in the rainbow?\\nAnswer: \"\n", + "quiz_item(question_2, \"Red\")\n", + "\n", + "print(\"Quiz complete\") " ] }, { diff --git a/P1M4BenReed.py b/P1M4BenReed.py new file mode 100644 index 0000000..8481d4c --- /dev/null +++ b/P1M4BenReed.py @@ -0,0 +1,24 @@ +# [ ] create, call and test the str_analysis() function + +def str_analysis(text): + if text.isdigit(): + number = int(text) + if number > 99: + return f'{number} is a big number' + else: + return f'{number} is a small number' + elif text.isalpha(): + return f'{text} is all alpha' + else: + return f'{text} has mutiple character types' + +while True: + + user_input = input("Benjamin Reed, enter word or integer: ") + + if user_input: + break + +analysis_message = str_analysis(user_input) + +print(analysis_message) From 9a1350903683903f5568ddcc504c41710eb1b88d Mon Sep 17 00:00:00 2001 From: Benjamin Reed Date: Thu, 25 Sep 2025 07:04:00 -0400 Subject: [PATCH 17/36] Module 5 Project --- .../Module_5_Required_FINAL_Project.ipynb | 63 +++++++++++++++++-- 1 file changed, 59 insertions(+), 4 deletions(-) diff --git a/P1 Python Absolute Beginner/Module_5_Required_FINAL_Project.ipynb b/P1 Python Absolute Beginner/Module_5_Required_FINAL_Project.ipynb index 7093cd2..36ff045 100644 --- a/P1 Python Absolute Beginner/Module_5_Required_FINAL_Project.ipynb +++ b/P1 Python Absolute Beginner/Module_5_Required_FINAL_Project.ipynb @@ -89,13 +89,68 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 3, "metadata": { "collapsed": true }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n", + "--- Running Report Type 'T' ---\n", + "Input an integer to add to the total or 'Q' to quit\n", + "\n", + "Total\n", + "35\n", + "Calculated by: Benjamin S. Reed\n" + ] + } + ], "source": [ - "# [ ] create, call and test the adding_report() function\n" + "# [ ] create, call and test the adding_report() function\n", + "def adding_report(report_type = \"T\"):\n", + " ##Takes integer input from the user until they quit, prints total.\n", + "\n", + " total = 0 ##resets the total sum for each time the function is called.\n", + " items = \"\" ##resets the string for each time the function is called for the A report.\n", + " print(\"Input an integer to add to the total or 'Q' to quit\")\n", + "\n", + " while True:\n", + " user_input = input('Enter an integer or \"Q\" to quit') # gets input from the user.\n", + "\n", + " if user_input.isdigit(): ##checks in input is a digit.\n", + " number = int(user_input) #if the number is a string, cast to integer.\n", + " total += number ##take the number and add it to the total\n", + "\n", + " if report_type == \"A\":\n", + " items += user_input + \"\\n\" ##if the report type is A, add the input to items list.\n", + " \n", + " elif user_input.lower().startswith(\"q\"): ##if input is not a digit, check if it is the quit command.\n", + "\n", + " if report_type == \"A\": ##If the report type is A, print all of the input integers and the total.\n", + " print(\"\\nItems\")\n", + " print(items)\n", + " print(\"Total\")\n", + " print(total)\n", + " else:\n", + " print(\"\\nTotal\") ##If the report type is T, or any other type, print only the total.\n", + " print(total)\n", + "\n", + " print(\"Calculated by: Benjamin S. Reed\")\n", + " break\n", + "\n", + " else:\n", + " print(f'\"{user_input}\" is invalid')\n", + "\n", + "##print(\"\\n--- Running Report Type 'A' ---\")\n", + "##adding_report(\"A\")\n", + "\n", + "print(\"\\n\\n--- Running Report Type 'T' ---\")\n", + "adding_report(\"T\")\n", + "\n" ] }, { @@ -122,7 +177,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.8" + "version": "3.13.7" } }, "nbformat": 4, From 080936604acb26d9ff07f644e1a2ba80b9533a71 Mon Sep 17 00:00:00 2001 From: Benjamin Reed Date: Thu, 25 Sep 2025 09:46:58 -0400 Subject: [PATCH 18/36] P1M5 --- .../Module_5_Required_FINAL_Project.ipynb | 4 +- P1M5BenjaminReed.py | 42 +++++++++++++++++++ 2 files changed, 44 insertions(+), 2 deletions(-) create mode 100644 P1M5BenjaminReed.py diff --git a/P1 Python Absolute Beginner/Module_5_Required_FINAL_Project.ipynb b/P1 Python Absolute Beginner/Module_5_Required_FINAL_Project.ipynb index 36ff045..e5ad40a 100644 --- a/P1 Python Absolute Beginner/Module_5_Required_FINAL_Project.ipynb +++ b/P1 Python Absolute Beginner/Module_5_Required_FINAL_Project.ipynb @@ -89,7 +89,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "metadata": { "collapsed": true }, @@ -119,7 +119,7 @@ " print(\"Input an integer to add to the total or 'Q' to quit\")\n", "\n", " while True:\n", - " user_input = input('Enter an integer or \"Q\" to quit') # gets input from the user.\n", + " user_input = input('Enter an integer or \"Q\" to quit: ') # gets input from the user.\n", "\n", " if user_input.isdigit(): ##checks in input is a digit.\n", " number = int(user_input) #if the number is a string, cast to integer.\n", diff --git a/P1M5BenjaminReed.py b/P1M5BenjaminReed.py new file mode 100644 index 0000000..0ae1128 --- /dev/null +++ b/P1M5BenjaminReed.py @@ -0,0 +1,42 @@ +# [ ] create, call and test the adding_report() function +def adding_report(report_type = "T"): + ##Takes integer input from the user until they quit, prints total. + + total = 0 ##resets the total sum for each time the function is called. + items = "" ##resets the string for each time the function is called for the A report. + print("Input an integer to add to the total or 'Q' to quit") + + while True: + user_input = input('Enter an integer or "Q" to quit: ') # gets input from the user. + + if user_input.isdigit(): ##checks in input is a digit. + number = int(user_input) #if the number is a string, cast to integer. + total += number ##take the number and add it to the total + + if report_type == "A": + items += user_input + "\n" ##if the report type is A, add the input to items list. + + elif user_input.lower().startswith("q"): ##if input is not a digit, check if it is the quit command. + + if report_type == "A": ##If the report type is A, print all of the input integers and the total. + print("\nItems") + print(items) + print("Total") + print(total) + else: + print("\nTotal") ##If the report type is T, or any other type, print only the total. + print(total) + + print("Calculated by: Benjamin S. Reed") + break + + else: + print(f'"{user_input}" is invalid') + + +print("\n--- Running Report Type 'A' ---") +adding_report("A") + +##print("\n\n--- Running Report Type 'T' ---") +##adding_report("T") + From a8e22e11a6cb0e62e2e23edcf53af4fbdb1309ca Mon Sep 17 00:00:00 2001 From: Benjamin Reed Date: Mon, 6 Oct 2025 16:38:04 -0400 Subject: [PATCH 19/36] Work on P2M1 --- ...String_Sequences_Python_Fundamentals.ipynb | 670 +++++++++++++++--- 1 file changed, 564 insertions(+), 106 deletions(-) diff --git a/P2 Python Fundamentals/Module_1.0_Tutorials_Indexes_String_Sequences_Python_Fundamentals.ipynb b/P2 Python Fundamentals/Module_1.0_Tutorials_Indexes_String_Sequences_Python_Fundamentals.ipynb index b71e164..78cd3ca 100644 --- a/P2 Python Fundamentals/Module_1.0_Tutorials_Indexes_String_Sequences_Python_Fundamentals.ipynb +++ b/P2 Python Fundamentals/Module_1.0_Tutorials_Indexes_String_Sequences_Python_Fundamentals.ipynb @@ -55,9 +55,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "A <-- first character at index 0\n", + "l\n", + "t\n", + "o\n", + "n\n" + ] + } + ], "source": [ "# [ ] review and run example - note the first element is always index = 0\n", "student_name = \"Alton\"\n", @@ -70,9 +82,17 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Winner! Name starts with J: Jin\n" + ] + } + ], "source": [ "# [ ] review and run example\n", "student_name = \"Jin\"\n", @@ -86,9 +106,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "s\n", + "s\n" + ] + } + ], "source": [ "# [ ] review and run ERROR example\n", "# cannot index out of range\n", @@ -116,26 +145,61 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "H\n", + "m\n", + "o\n" + ] + } + ], "source": [ "# [ ] assign a string 5 or more letters long to the variable: street_name\n", "# [ ] print the 1st, 3rd and 5th characters\n", "\n", + "street_name = \"Hemlock\"\n", + "\n", + "print(street_name[0])\n", + "print(street_name[2])\n", + "print(street_name[4])\n", "\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Winner! Name starts with I: Right Team\n" + ] + } + ], "source": [ "# [ ] Create an input variable: team_name - ask that second letter = \"i\", \"o\", or \"u\"\n", "# [ ] Test if team_name 2nd character = \"i\", \"o\", or \"u\" and print a message\n", "# note: use if, elif and else\n", - "\n" + "team_name = input(\"Create a team name with a second letter of i, o, or u: \")\n", + "\n", + "if team_name[1].lower() == \"i\":\n", + " print('Winner! Name starts with I:', team_name)\n", + "\n", + "elif team_name[1].lower() == \"o\":\n", + " print('Winner! Name starts with O:', team_name)\n", + "\n", + "elif team_name[1].lower() == \"u\":\n", + " print('Winner! Name starts with U:', team_name)\n", + "\n", + "else:\n", + " print('Not a match, try again tomorrow:', team_name)\n" ] }, { @@ -176,9 +240,17 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Joana ends with 'a'\n" + ] + } + ], "source": [ "# [ ] review and run example\n", "student_name = \"Joana\"\n", @@ -190,9 +262,17 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 8, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Joana has 2nd to last letter of 'n'\n" + ] + } + ], "source": [ "# [ ] review and run example\n", "# get second to last letter\n", @@ -202,9 +282,19 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 9, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "for Joana\n", + "index 3 = 'n'\n", + "index -2 = 'n'\n" + ] + } + ], "source": [ "# [ ] review and run example\n", "# you can get to the same letter with index counting + or -\n", @@ -225,25 +315,48 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 15, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "i n g\n" + ] + } + ], "source": [ "# [ ] assign a string 5 or more letters long to the variable: street_name\n", "# [ ] print the last 3 characters of street_name\n", - "\n" + "street_name = \"string\"\n", + "\n", + "print(street_name[3],street_name[4],street_name[5])\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 16, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "s\n", + "g\n" + ] + } + ], "source": [ "# [ ] create and assign string variable: first_name\n", "\n", "# [ ] print the first and last letters of name\n", - "\n" + "\n", + "first_name = \"string\"\n", + "\n", + "print(first_name[0])\n", + "print(first_name[-1])" ] }, { @@ -259,14 +372,22 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 18, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "s\n" + ] + } + ], "source": [ "# [ ] Review, Run, Fix the error using string index\n", "shoe = \"tennis\"\n", "# print the last letter\n", - "print(shoe(-1))\n", + "print(shoe[-1])\n", "\n" ] }, @@ -320,9 +441,17 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 19, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "slice student_name[2:5]: let\n" + ] + } + ], "source": [ "# [ ] review and run example\n", "# assign string to student_name\n", @@ -334,9 +463,17 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 20, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "index 2, 3 & 4 of student_name: let\n" + ] + } + ], "source": [ "# [ ] review and run example\n", "# assign string to student_name\n", @@ -348,9 +485,19 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 21, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "knowledge\n", + "knowledge is the 3rd char through the 11th char\n", + "knowledge is the index 2, \"k\", through index 10, \"e\"\n" + ] + } + ], "source": [ "# [ ] review and run example\n", "long_word = 'Acknowledgement'\n", @@ -374,25 +521,45 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 23, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "act\n", + "tic\n" + ] + } + ], "source": [ "# [ ] slice long_word to print \"act\" and to print \"tic\"\n", "long_word = \"characteristics\"\n", "\n", + "print(long_word[4:7])\n", + "print(long_word[11:14])\n", "\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 25, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "sequence\n" + ] + } + ], "source": [ "# [ ] slice long_word to print \"sequence\"\n", "long_word = \"Consequences\"\n", - "\n" + "\n", + "print(long_word[3:11])" ] }, { @@ -423,9 +590,17 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 26, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Col\n" + ] + } + ], "source": [ "# [ ] review and run example\n", "student_name = \"Colette\"\n", @@ -445,7 +620,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 27, "metadata": {}, "outputs": [ { @@ -510,9 +685,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 28, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "'ette'" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# [ ] review and run example\n", "student_name = \"Colette\"\n", @@ -532,13 +718,22 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 30, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "uences\n" + ] + } + ], "source": [ "# [ ] print the second half of the long_word\n", "long_word = \"Consequences\"\n", - "\n" + "\n", + "print(long_word[6:])\n" ] }, { @@ -570,9 +765,17 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 31, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Colette\n" + ] + } + ], "source": [ "# [ ] review and run example\n", "student_name = \"Colette\"\n", @@ -582,9 +785,17 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 32, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Clte\n" + ] + } + ], "source": [ "# [ ] review and run example\n", "student_name = \"Colette\"\n", @@ -594,9 +805,17 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 33, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ot\n" + ] + } + ], "source": [ "# [ ] review and run example\n", "student_name = \"Colette\"\n", @@ -606,9 +825,17 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 34, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "osqe\n" + ] + } + ], "source": [ "# [ ] review and run example\n", "long_word = \"Consequences\"\n", @@ -628,23 +855,40 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 37, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Anlge\n" + ] + } + ], "source": [ "# [ ] print the 1st and every 3rd letter of long_word\n", "long_word = \"Acknowledgement\"\n", - "\n" + "print(long_word[0::3])\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 39, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "koldeet\n" + ] + } + ], "source": [ "# [ ] print every other character of long_word starting at the 3rd character\n", - "long_word = \"Acknowledgement\"\n" + "long_word = \"Acknowledgement\"\n", + "print(long_word[2::2])" ] }, { @@ -673,11 +917,19 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 40, "metadata": { "scrolled": true }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "scitsiretcarahc\n" + ] + } + ], "source": [ "# [ ] review and run example of stepping backwards using [::-1]\n", "long_word = \"characteristics\"\n", @@ -687,9 +939,17 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 41, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "tcarahc\n" + ] + } + ], "source": [ "# [ ] review and run example of stepping backwards using [6::-1]\n", "long_word = \"characteristics\"\n", @@ -710,24 +970,41 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 44, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "desserts\n" + ] + } + ], "source": [ "# [ ] reverse long_word\n", "long_word = \"stressed\"\n", - "\n" + "\n", + "print(long_word[::-1])\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 48, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "arahc\n" + ] + } + ], "source": [ "# [ ] print the first 5 letters of long_word in reverse\n", "long_word = \"characteristics\"\n", - "\n" + "print(long_word[4::-1])\n" ] }, { @@ -743,15 +1020,32 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 63, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "8\n", + "time\n", + "emit\n", + "enil\n", + "nile\n" + ] + } + ], "source": [ "# [ ] print the first 4 letters of long_word\n", "# [ ] print the first 4 letters of long_word in reverse\n", "# [ ] print the last 4 letters of long_word in reverse\n", "# [ ] print the letters spanning indexes 3 to 6 of long_word in Reverse\n", - "long_word = \"timeline\"\n" + "long_word = \"timeline\"\n", + "print(len(long_word))\n", + "print(long_word[0:4])\n", + "print(long_word[3::-1])\n", + "print(long_word[:-5:-1])\n", + "print(long_word[6:2:-1])" ] }, { @@ -804,22 +1098,48 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 66, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "c\n", + "e\n", + "l\n", + "l\n", + "o\n" + ] + } + ], "source": [ "# [ ] review and run example\n", "word = \"cello\"\n", "\n", - "for x in word:\n", - " print(x)" + "for larry in word:\n", + " print(larry)" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 65, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "t\n", + "r\n", + "u\n", + "m\n", + "p\n", + "e\n", + "t\n" + ] + } + ], "source": [ "# [ ] review and run example\n", "# note: the variable 'letter' changed to 'item'\n", @@ -831,9 +1151,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 67, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "p\n", + "i\n", + "a\n", + "n\n", + "o\n" + ] + } + ], "source": [ "# [ ] review and run example\n", "# note: variable is now 'xyz' \n", @@ -846,9 +1178,17 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 68, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Skye to SkYe\n" + ] + } + ], "source": [ "# [ ] review and run example\n", "# creates a new string (new_name) adding a letter (ltr) each loop\n", @@ -879,15 +1219,32 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 70, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "B\n", + "e\n", + "n\n", + "j\n", + "a\n", + "m\n", + "i\n", + "n\n" + ] + } + ], "source": [ "# [ ] Get user input for first_name\n", "# [ ] iterate through letters in first_name \n", "# - print each letter on a new line\n", + "first_name = input(\"First Name?\")\n", "\n", - "\n", + "for x in first_name:\n", + " print(x)\n", "\n" ] }, @@ -909,12 +1266,29 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 80, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "wesley stuart reed to wEslEy stUArt rEEd\n" + ] + } + ], "source": [ "# [ ] Create capitalize-io\n", - "\n" + "\n", + "old_name = input(\"Give me your youngest son's name: \")\n", + "new_name = \"\"\n", + "\n", + "for ltr in old_name:\n", + " if ltr.lower() in \"aeiou\":\n", + " new_name += ltr.upper()\n", + " else:\n", + " new_name += ltr\n", + "print(old_name,\"to\",new_name)" ] }, { @@ -946,22 +1320,42 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 78, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Y\n", + "K\n", + "S\n" + ] + } + ], "source": [ "# [ ] review and run example\n", "student_name = \"Skye\"\n", "\n", "for letter in student_name[2::-1]:\n", - " print(letter.lower())" + " print(letter.upper())" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 79, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "y\n", + "k\n", + "S\n" + ] + } + ], "source": [ "# Iterate BACKWARDS\n", "# [ ] review and run example\n", @@ -985,26 +1379,52 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 81, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "jxaoiin\n" + ] + } + ], "source": [ "# [ ] create & print a variable, other_word, made of every other letter in long_word\n", "long_word = \"juxtaposition\"\n", - "\n" + "other_word = \"\"\n", + "\n", + "for index in range(len(long_word)):\n", + " if index % 2 == 0:\n", + " other_word += long_word[index]\n", + "\n", + " \n", + "print(other_word)\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 85, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "!sgwaD og ,deRRed, go Dawgs!\n" + ] + } + ], "source": [ "# Mirror Color\n", "# [ ] get user input, fav_color\n", "# [ ] print fav_color backwards + fav_color\n", "# example: \"Red\" prints \"deRRed\"\n", - "\n" + "\n", + "fav_color = input(\"Tell me your fav color: \")\n", + "\n", + "print(fav_color[::-1] + fav_color)" ] }, { @@ -1074,9 +1494,30 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 86, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "number of characters in string\n", + "14 \n", + "\n", + "letter \"e\" occurrences\n", + "2 \n", + "\n", + "find the index of the first space\n", + "4 \n", + "\n", + "find the index of \"u\" searching a slice work_tip[3:9] - e your\n", + "7 \n", + "\n", + "find the index of \"e\" searching a slice work_tip[4:] - your code\n", + "13\n" + ] + } + ], "source": [ "# [ ] review and run example\n", "work_tip = \"save your code\"\n", @@ -1107,9 +1548,17 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 87, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The sentence: \"good code is commented code\" has character length = 27\n" + ] + } + ], "source": [ "# [ ] review and run example\n", "work_tip = \"good code is commented code\"\n", @@ -1119,9 +1568,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 88, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "good code is c\n", + "ommented code.\n" + ] + } + ], "source": [ "# [ ] review and run example\n", "# find the middle index\n", @@ -1364,7 +1822,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.13.1" + "version": "3.13.7" } }, "nbformat": 4, From 443fdd690c8278ce649cca1282b858881739ad51 Mon Sep 17 00:00:00 2001 From: Benjamin Reed Date: Tue, 7 Oct 2025 13:10:06 -0400 Subject: [PATCH 20/36] P2M1 work --- 6 Web Page with Flask/basic page/script1.py | 4 + .../basic page/templates/benjamin.html | 11 + Ben_Reed_script1.py | 34 ++ .../Module_4.2_Required_Code.ipynb | 35 +- ...String_Sequences_Python_Fundamentals.ipynb | 176 +++++++-- ...ule_1.1_Practice_Python_Fundamentals.ipynb | 365 +++++++++++++++--- 6 files changed, 542 insertions(+), 83 deletions(-) create mode 100644 6 Web Page with Flask/basic page/templates/benjamin.html create mode 100644 Ben_Reed_script1.py diff --git a/6 Web Page with Flask/basic page/script1.py b/6 Web Page with Flask/basic page/script1.py index 6171753..c64d113 100644 --- a/6 Web Page with Flask/basic page/script1.py +++ b/6 Web Page with Flask/basic page/script1.py @@ -26,5 +26,9 @@ def home(): def about(): return render_template("about.html") +@app.route('/benjamin/') +def benjamin(): + return render_template("benjamin.html") + if __name__=="__main__": app.run(debug=True) diff --git a/6 Web Page with Flask/basic page/templates/benjamin.html b/6 Web Page with Flask/basic page/templates/benjamin.html new file mode 100644 index 0000000..8995312 --- /dev/null +++ b/6 Web Page with Flask/basic page/templates/benjamin.html @@ -0,0 +1,11 @@ +{% extends "layout.html" %} +{% block content %} +

+

Reed

+

This is Benjamin's Flask Website Demo project website. {{myName}}

+

+ Please type your name:
+ +

+
+{% endblock %} diff --git a/Ben_Reed_script1.py b/Ben_Reed_script1.py new file mode 100644 index 0000000..d14cd6d --- /dev/null +++ b/Ben_Reed_script1.py @@ -0,0 +1,34 @@ +''' +This is a basic web page running with Flask. +''' + +from flask import Flask, render_template, request +#This is the Flask object, we are creating an instance of the Flask class and storing it in the variable app +#__name__ is a special variable in Python that is the name of the module, which is this file's name without the .py extension +app=Flask(__name__) + +#This is a decorator, it is a function that takes a function as a parameter! +#A decorator is a function that wraps another function +#This decorator is saying that when someone goes to the URL /greet, run the greet function +@app.route('/greet', methods=['POST']) +def greet(): + inputName = request.form['myName'] + ip = request.remote_addr + #write data to file or to DB + inputName = inputName.upper()+" hi! Visiting from " + str(ip) + return render_template("home.html",myName=inputName) + +@app.route('/') +def home(): + return render_template("home.html",myName="Type your name in the box and click submit!") + +@app.route('/about/') +def about(): + return render_template("about.html") + +@app.route('/benjamin/') +def benjamin(): + return render_template("benjamin.html") + +if __name__=="__main__": + app.run(debug=True) \ No newline at end of file diff --git a/P1 Python Absolute Beginner/Module_4.2_Required_Code.ipynb b/P1 Python Absolute Beginner/Module_4.2_Required_Code.ipynb index fcd2e07..72f924e 100644 --- a/P1 Python Absolute Beginner/Module_4.2_Required_Code.ipynb +++ b/P1 Python Absolute Beginner/Module_4.2_Required_Code.ipynb @@ -83,15 +83,44 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "metadata": { "trusted": false }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "5 is a small number\n" + ] + } + ], "source": [ "# [ ] create, call and test the str_analysis() function \n", "\n", + "def str_analysis(text):\n", + " if text.isdigit():\n", + " number = int(text)\n", + " if number > 99:\n", + " return f'{number} is a big number'\n", + " else:\n", + " return f'{number} is a small number'\n", + " elif text.isalpha():\n", + " return f'{text} is all alpha'\n", + " else:\n", + " return f'{text} has mutiple character types'\n", "\n", + "while True:\n", + "\n", + " user_input = input(\"Benjamin Reed, enter word or integer: \")\n", + "\n", + " if user_input:\n", + " break\n", + "\n", + "analysis_message = str_analysis(user_input)\n", + "\n", + "print(analysis_message)\n", "\n", "\n" ] @@ -120,7 +149,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.5.4" + "version": "3.13.7" } }, "nbformat": 4, diff --git a/P2 Python Fundamentals/Module_1.0_Tutorials_Indexes_String_Sequences_Python_Fundamentals.ipynb b/P2 Python Fundamentals/Module_1.0_Tutorials_Indexes_String_Sequences_Python_Fundamentals.ipynb index 78cd3ca..5b4f355 100644 --- a/P2 Python Fundamentals/Module_1.0_Tutorials_Indexes_String_Sequences_Python_Fundamentals.ipynb +++ b/P2 Python Fundamentals/Module_1.0_Tutorials_Indexes_String_Sequences_Python_Fundamentals.ipynb @@ -1568,7 +1568,7 @@ }, { "cell_type": "code", - "execution_count": 88, + "execution_count": 2, "metadata": {}, "outputs": [ { @@ -1603,9 +1603,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "good code is commented code.\n", + "how many w's? 0\n", + "how many o's? 5\n", + "uses 'code', how many times? 2\n" + ] + } + ], "source": [ "# [ ] review and run example\n", "print(work_tip)\n", @@ -1616,9 +1627,23 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "good code is c\n", + "# o's in first half\n", + "3\n", + "\n", + "ommented code.\n", + "# o's in second half\n", + "2\n" + ] + } + ], "source": [ "# [ ] review and run example \n", "print(work_tip[:mid_pt])\n", @@ -1644,9 +1669,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "good code has meaningful variable names\n", + "5 = starting index for \"code\"\n" + ] + } + ], "source": [ "# [ ] review and run example \n", "work_tip = \"good code has meaningful variable names\"\n", @@ -1658,23 +1692,46 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 10, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "search for \"meaning\" in the sub-string: meaningful variable \n", + "\n", + "\"meaning\" found in work_tip[13:33] sub-string search at index 14\n", + "1\n" + ] + } + ], "source": [ "# [ ] review and run example \n", "# set start index = 13 and end index = 33\n", "print('search for \"meaning\" in the sub-string:', work_tip[13:33],\"\\n\")\n", - "meaning_here = work_tip.find(\"code\",13,33)\n", + "meaning_here = work_tip.find(\"meaning\",13,33)\n", "print('\"meaning\" found in work_tip[13:33] sub-string search at index', meaning_here)\n", - "print(work_tip[13:33].find(\"code\"))" + "print(work_tip[13:33].find(\"meaning\"))" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 13, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "work_tip: good code has meaningful variable names\n", + "'o' at index = 1\n", + "'o' at index = 2\n", + "'o' at index = 6\n", + "no more o's\n" + ] + } + ], "source": [ "# [ ] review and run example \n", "# if .find(\"o\") has No Match, -1 is returned\n", @@ -1703,14 +1760,25 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 17, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "wear a hat w\n", + "hen it rains\n" + ] + } + ], "source": [ "# [ ] use len() to find the midpoint of the string \n", "# [ ] print the halves on separate lines\n", "random_tip = \"wear a hat when it rains\"\n", - "\n", + "midpoint = len(random_tip) // 2\n", + "print(random_tip[:midpoint])\n", + "print(random_tip[midpoint:])\n", "\n" ] }, @@ -1726,16 +1794,37 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 20, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Count of 'e': 2\n", + "Count of 'a': 4\n", + "The letter 'a' is more frequent\n" + ] + } + ], "source": [ "# for letters: \"e\" and \"a\" in random_tip\n", "# [ ] print letter counts \n", "# [ ] BONUS: print which letter is most frequent\n", "random_tip = \"wear a hat when it rains\"\n", "\n", - "\n" + "e_count = random_tip.count(\"e\")\n", + "a_count = random_tip.count(\"a\")\n", + "\n", + "print(\"Count of 'e': \", e_count)\n", + "print(\"Count of 'a': \", a_count)\n", + "\n", + "if e_count > a_count:\n", + " print(\"The letter 'e' is more frequent\")\n", + "elif a_count > e_count:\n", + " print(\"The letter 'a' is more frequent\")\n", + "else:\n", + " print(\"The letters 'a' and 'e' appear the same amount of times\")\n" ] }, { @@ -1751,13 +1840,28 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 24, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "taposit\n" + ] + } + ], "source": [ "# [ ] print long_word from the location of the first and second \"t\"\n", "long_word = \"juxtaposition\"\n", - "\n" + "\n", + "first_t_index = long_word.find(\"t\") ##find the index of the first t\n", + "second_t_index = long_word.find(\"t\", first_t_index + 1)##find the t after the first t\n", + "\n", + "if first_t_index != -1 and second_t_index != +1:\n", + " print(long_word[first_t_index : second_t_index + 1])\n", + "\n", + "else: print(\"Could not find two 't's in the word.\")\n" ] }, { @@ -1788,12 +1892,36 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 27, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "they\n", + "stumble\n", + "who\n", + "run\n", + "fast\n" + ] + } + ], "source": [ "# [ ] Print each word in the quote on a new line \n", "quote = \"they stumble who run fast\"\n", + "\n", + "\n", + "while quote.find(\" \") != -1:\n", + " space_index = quote.find(\" \")\n", + "\n", + " print(quote[0:space_index])\n", + "\n", + " quote = quote[space_index + 1:]\n", + "\n", + "print(quote)\n", + "\n", + "\n", "\n" ] }, diff --git a/P2 Python Fundamentals/Module_1.1_Practice_Python_Fundamentals.ipynb b/P2 Python Fundamentals/Module_1.1_Practice_Python_Fundamentals.ipynb index 2633d36..2548ec2 100644 --- a/P2 Python Fundamentals/Module_1.1_Practice_Python_Fundamentals.ipynb +++ b/P2 Python Fundamentals/Module_1.1_Practice_Python_Fundamentals.ipynb @@ -26,46 +26,84 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "u\n" + ] + } + ], "source": [ "# [ ] access and print the second character from planet_name: \"u\"\n", "planet_name = \"Jupiter\"\n", - "\n" + "print(planet_name[1])\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "J\n" + ] + } + ], "source": [ "# [ ] access and print the first character from planet_name: \"J\"\n", "planet_name = \"Jupiter\"\n", - "\n" + "\n", + "print(planet_name[0])\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "First character: J\n", + "Last character: r\n" + ] + } + ], "source": [ "# [ ] access and print the first and last characters from planet_name\n", "planet_name = \"Jupiter\"\n", - "\n" + "\n", + "print(\"First character:\", planet_name[0])\n", + "\n", + "print(\"Last character:\", planet_name[-1])" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 11, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "J\n" + ] + } + ], "source": [ "# [ ] using a negative index access and print the first character from planet_name: \"J\"\n", "planet_name = \"Jupiter\"\n", - "\n" + "\n", + "print(planet_name[-7])" ] }, { @@ -81,35 +119,64 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 12, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Nep\n", + "tune\n" + ] + } + ], "source": [ "# [ ] print planet_name sliced into the first 3 characters and remaining characters\n", "planet_name = \"Neptune\"\n", - "\n" + "\n", + "print(planet_name[0:3])\n", + "print(planet_name[3::])" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 14, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Python\n" + ] + } + ], "source": [ "# [ ] print 1st char and then every 3rd char of wise_words\n", "# use string slice with a step\n", "wise_words = 'Play it who opens'\n", - "\n" + "\n", + "print(wise_words[0::3])" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 16, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "enutpeN\n" + ] + } + ], "source": [ "# [ ] print planet_name in reverse\n", - "\n" + "\n", + "print(planet_name[::-1])" ] }, { @@ -127,15 +194,30 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 17, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "P\n", + "i\n", + "z\n", + "z\n", + "a\n" + ] + } + ], "source": [ "# [ ] Get user input for 1 fav_food\n", "# [ ] iterate through letters in fav_food \n", "# - print each letter on a new line\n", "\n", + "fav_food = input(\"What is your favoriote food?: \")\n", "\n", + "for letter in fav_food:\n", + " print(letter)\n", "\n" ] }, @@ -143,36 +225,72 @@ "cell_type": "code", "execution_count": null, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Good-code-is-commented-code\n" + ] + } + ], "source": [ "# [ ] iterate work_tip string concatenate each letter to variable: new_string \n", - "# [ ] concatenate the letter or a \"-\" instead of a space \" \"\n", + "# [ ] concatenate the letter to a \"-\" instead of a space \" \"\n", "# tip: concatenate string example: word = word + \"a\"\n", "work_tip = \"Good code is commented code\"\n", "\n", + "new_string = \"\"\n", + "\n", + "for letter in work_tip:\n", + " if letter == \" \":\n", + " new_string += \"-\"\n", + "\n", + " else:\n", + " new_string += letter\n", + "\n", + "print(new_string)\n", "\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 20, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Hiro\n" + ] + } + ], "source": [ "# [ ] Print the first 4 letters of name on new line\n", "name = \"Hiroto\"\n", - "\n" + "\n", + "print(name[0:4])\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 25, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ioo\n" + ] + } + ], "source": [ "# [ ] Print every other letter from 2nd to last letter of name \n", "name = \"Hiroto\"\n", - "\n" + "\n", + "print(name[1::2])" ] }, { @@ -195,12 +313,35 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 26, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "d??R ?r?u?S nim?jn?B\n" + ] + } + ], "source": [ "# [ ] Create Mystery Name\n", - "\n" + "\n", + "first_name = input(\"What is the name\")\n", + "\n", + "new_name = \"\"\n", + "\n", + "for letter in first_name[::-1]:\n", + " if letter.lower() == \"e\":\n", + " new_name += \"?\"\n", + " elif letter.lower() == \"t\":\n", + " new_name += \"?\"\n", + " elif letter.lower() == \"a\":\n", + " new_name += \"?\"\n", + " else:\n", + " new_name += letter\n", + "\n", + "print(new_name)" ] }, { @@ -224,50 +365,95 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 27, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "36\n" + ] + } + ], "source": [ "# [ ] find and display the length of the string: topic\n", "topic = \"len() returns the length of a string\"\n", - "\n" + "\n", + "print(len(topic))" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 28, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The middle index is: 28\n" + ] + } + ], "source": [ "# [ ] use len() to find and display the mid_pt (middle) index (+/- 1) of the string: topic\n", "# note: index values are whole numbers\n", "topic = \"len() can take a sequence, like a string, as an argument\"\n", - "\n" + "\n", + "string_length = len(topic)\n", + "\n", + "mid_pt = string_length //2\n", + "print(\"The middle index is: \", mid_pt)" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 29, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "5\n" + ] + } + ], "source": [ "# [ ] print index where first instance of the word \"code\" starts using .find()\n", "work_tip = \"Good code is commented code\"\n", - "\n" + "\n", + "print(work_tip.find(\"code\"))" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 31, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\"code\" found at index 23\n" + ] + } + ], "source": [ "# [ ] search for \"code\" in code_tip using .find() \n", "# [ ] search substring with substring index start= 13,end = last char \n", "# [ ] save result in variable: code_index\n", "# [ ] display index of where \"code\" is found, or print \"not found\" if code_index == -1\n", "work_tip = \"Good code is commented code\"\n", - "\n" + "\n", + "code_index = work_tip.find(\"code\", 13)\n", + "\n", + "if code_index == -1:\n", + " print(\"not found\")\n", + "\n", + "else:\n", + " print(f'\"code\" found at index {code_index}')\n" ] }, { @@ -282,14 +468,17 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 36, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Ws = 0 Os= 5 Codes= 2 Number of letters: 27\n" + "Ws = 0 \n", + "Os = 5 \n", + "Codes = 2 \n", + "Number of letters: 27\n" ] } ], @@ -311,22 +500,56 @@ " codes += 1\n", " i += 1\n", "\n", - "print(\"Ws = \",ws,\" Os= \", os, \"Codes= \", codes, \"Number of letters: \", i)\n", - "print(work_tip[27])" + "print(\"Ws = \",ws, \"\\nOs = \", os, \"\\nCodes = \", codes, \"\\nNumber of letters: \", i)\n", + "##print(work_tip[27])" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 38, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "code_tip: code a conditional decision like you would say it\n", + "\n", + "The letter 'i' appears 6 times.\n", + "\n", + "Fiunding all occurances of the letter 'i': \n", + "Found 'i' at index: 11\n", + "Found 'i' at index: 13\n", + "Found 'i' at index: 22\n", + "Found 'i' at index: 24\n", + "Found 'i' at index: 29\n", + "Found 'i' at index: 47\n" + ] + } + ], "source": [ "# [ ] count times letter \"i\" appears in code_tip string\n", "# [ ] find and display the index of all the letter i's in code_tip\n", "# Remember: if .find(\"i\") has No Match, -1 is returned\n", "code_tip = \"code a conditional decision like you would say it\"\n", "print (\"code_tip:\" , code_tip)\n", - "\n" + "\n", + "i_count = code_tip.count('i')\n", + "print(f\"\\nThe letter 'i' appears {i_count} times.\")\n", + "\n", + "print(\"\\nFiunding all occurances of the letter 'i': \")\n", + "\n", + "search_start = 0\n", + "\n", + "while True:\n", + " i_index = code_tip.find('i', search_start)\n", + "\n", + " if i_index == -1:\n", + " break\n", + " else:\n", + " print(\"Found 'i' at index: \", i_index)\n", + "\n", + " search_start = i_index +1" ] }, { @@ -370,12 +593,42 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 40, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "WHERESOEVER\n", + "YOU\n", + "WITH\n", + "YOUR\n", + "HEART\n" + ] + } + ], "source": [ "# [] create words after \"G\"\n", "# sample quote \"Wheresoever you go, go with all your heart\" ~ Confucius (551 BC - 479 BC)\n", + "\n", + "quote = input(\"enter a 1 sentence quote, non-alpha septerate words: \")\n", + "\n", + "word = \"\"\n", + "\n", + "for character in quote:\n", + " if character.isalpha():\n", + " word += character\n", + " else:\n", + " if word:\n", + " if word[0].lower() > \"g\":\n", + " print(word.upper())\n", + " \n", + " word = \"\"\n", + "\n", + "if word:\n", + " if word[0].lower() > \"g\":\n", + " print(word.upper())\n", "\n" ] }, @@ -406,7 +659,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.4" + "version": "3.13.7" } }, "nbformat": 4, From 6fba22c0b251decad7fe17cbd63fc14ab14c96e8 Mon Sep 17 00:00:00 2001 From: Benjamin Reed Date: Wed, 8 Oct 2025 06:37:22 -0400 Subject: [PATCH 21/36] P2M1 required code --- P2M1BenjaminReed.py | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 P2M1BenjaminReed.py diff --git a/P2M1BenjaminReed.py b/P2M1BenjaminReed.py new file mode 100644 index 0000000..b46f692 --- /dev/null +++ b/P2M1BenjaminReed.py @@ -0,0 +1,22 @@ +# [] create words after "G" following the Assignment requirements use of functions, methods and keywords +# Sample quote: "Wheresoever you go, go with all your heart" ~ Confucius (551 BC - 479 BC) + +def word_after_g(): + + quote = input("Welcome, Ben Reed. Enter a 1 sentence quote, non_alpha seperate words: ") + word = "" + + for character in quote: + if character.isalpha(): + word += character + else: + if word: + if word[0].lower() > "g": + print(word.upper()) + word = "" + + if word: + if word[0].lower() >"g": + print(word.upper()) + +word_after_g() \ No newline at end of file From fd4e126d344a3a6ff9515d2376483072f6a55e94 Mon Sep 17 00:00:00 2001 From: Benjamin Reed Date: Wed, 8 Oct 2025 13:59:17 -0400 Subject: [PATCH 22/36] MySQL demo --- 4 DB in Python/SQLite Demo/myinventory.db | Bin 12288 -> 12288 bytes ....2_Required_Code_Python_Fundamentals.ipynb | 47 ++++++++++++++++-- 2 files changed, 43 insertions(+), 4 deletions(-) diff --git a/4 DB in Python/SQLite Demo/myinventory.db b/4 DB in Python/SQLite Demo/myinventory.db index 1164ad3825eaee5e0b74656447867675e3da704a..902425d26948969384674d0ab9ae69722bacab0d 100644 GIT binary patch delta 104 zcmZojXh@hK%_ufe##vB|L9a`Mmw|zSkzb5~UyM(1v!XyN&*rZ@^2|(p{y>f;pRpl3 zCxf`8B)_b \"g\":\n", + " print(word.upper())\n", + " word = \"\"\n", + "\n", + " if word:\n", + " if word[0].lower() >\"g\":\n", + " print(word.upper())\n", + "\n", + "word_after_g()\n", + "\n", "\n", "\n" ] @@ -92,7 +131,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.8" + "version": "3.13.7" } }, "nbformat": 4, From 10154cc5e19b9d6073d657106fe715d2d9c45633 Mon Sep 17 00:00:00 2001 From: Benjamin Reed Date: Tue, 14 Oct 2025 15:14:07 -0400 Subject: [PATCH 23/36] P2M2 work --- ...s_Sequence_Lists_Python_Fundamentals.ipynb | 770 +++++++++++++++--- 1 file changed, 648 insertions(+), 122 deletions(-) diff --git a/P2 Python Fundamentals/Module_2.0_Tutorials_Sequence_Lists_Python_Fundamentals.ipynb b/P2 Python Fundamentals/Module_2.0_Tutorials_Sequence_Lists_Python_Fundamentals.ipynb index 676a32a..c9d6ded 100644 --- a/P2 Python Fundamentals/Module_2.0_Tutorials_Sequence_Lists_Python_Fundamentals.ipynb +++ b/P2 Python Fundamentals/Module_2.0_Tutorials_Sequence_Lists_Python_Fundamentals.ipynb @@ -52,9 +52,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ft_bones: \n", + "['calcaneus', 'talus', 'cuboid', 'navicular', 'lateral cuneiform', 'intermediate cuneiform', 'medial cuneiform']\n" + ] + } + ], "source": [ "# [ ] review and run example\n", "# define list of strings\n", @@ -69,9 +78,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "age_survey: \n", + "[12, 14, 12, 29, 12, 14, 12, 12, 13, 12, 14, 13, 13, 46, 13, 12, 12, 13, 13, 12, 12]\n" + ] + } + ], "source": [ "# [ ] review and run example\n", "# define list of integers\n", @@ -86,9 +104,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "mixed_list: \n", + "[1, 34, 0.999, 'dog', 'cat', ['calcaneus', 'talus', 'cuboid', 'navicular', 'lateral cuneiform', 'intermediate cuneiform', 'medial cuneiform'], [12, 14, 12, 29, 12, 14, 12, 12, 13, 12, 14, 13, 13, 46, 13, 12, 12, 13, 13, 12, 12]]\n" + ] + } + ], "source": [ "# [ ] review and run example\n", "# define list of mixed data type\n", @@ -115,26 +142,44 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['footballs', 'baseballs', 'soccers']\n" + ] + } + ], "source": [ "# [ ] create team_names list and populate with 3-5 team name strings\n", - "\n", + "team_names = [\"footballs\", \"baseballs\", 'soccers']\n", "# [ ] print the list\n", - "\n" + "\n", + "print(team_names)" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['footballs', 'baseballs', 'soccers', 5, 10, 20]\n" + ] + } + ], "source": [ "# [ ] Create a list mix_list with numbers and strings with 4-6 items\n", - "\n", + "mixed_list = [\"footballs\", \"baseballs\", 'soccers', 5, 10, 20]\n", "# [ ] print the list\n", - "\n" + "\n", + "print(mixed_list)" ] }, { @@ -170,9 +215,19 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 8, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "calcaneus is the 1st bone on the list\n", + "cuboid is the 3rd bone on the list\n", + "medial cuneiform is the last bone on the list\n" + ] + } + ], "source": [ "# [ ] review and run example\n", "print(ft_bones[0], \"is the 1st bone on the list\")\n", @@ -182,9 +237,17 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 9, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "talus is connected to the navicular\n" + ] + } + ], "source": [ "# [ ] review and run example\n", "print(ft_bones[1], \"is connected to the\",ft_bones[3])" @@ -192,9 +255,17 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 10, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The first three ages total 38\n" + ] + } + ], "source": [ "# [ ] review and run example\n", "three_ages_sum = age_survey[0] + age_survey[1] + age_survey[2]\n", @@ -213,26 +284,42 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 17, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "there is no parking on hemlock or Main\n" + ] + } + ], "source": [ "# [ ] Create a list, streets, that lists the name of 5 street name strings\n", - "\n", + "streets = ['hemlock', 'habersham', 'Brick Mill', 'Forest Creek', 'Main']\n", "# [ ] print a message that there is \"No Parking\" on index 0 or index 4 streets\n", - "\n" + "print(\"there is no parking on\", streets[0], 'or', streets[4])\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 21, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "25\n" + ] + } + ], "source": [ "# [ ] Create a list, num_2_add, made of 5 different numbers between 0 - 25\n", - "\n", + "num_2_add = [1,3,5,7,9]\n", "# [ ] print the sum of the numbers\n", - "\n" + "print(sum(num_2_add))\n" ] }, { @@ -248,9 +335,17 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 24, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " Total of checks 3 & 4 = $ 16\n" + ] + } + ], "source": [ "# [ ] Review & Run, but ***Do Not Edit*** this code cell\n", "# [ ] Fix the error by only editing and running the block below\n", @@ -260,12 +355,12 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 23, "metadata": {}, "outputs": [], "source": [ "# [ ] Fix the error above by creating and running code in this cell\n", - "\n" + "pay_checks = [3,5,7,9]\n" ] }, { @@ -313,9 +408,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 36, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "sample_list before: [1, 1, 2]\n", + "sample_list after: [1, 1, 2, 3]\n" + ] + } + ], "source": [ "# [ ] review and run example\n", "# the list before append\n", @@ -329,9 +433,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 38, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "sample_list start: [1, 1, 2, 3, 3, 8, 5]\n", + "sample_list added: [1, 1, 2, 3, 3, 8, 5, 3]\n", + "sample_list added: [1, 1, 2, 3, 3, 8, 5, 3, 8]\n", + "sample_list added: [1, 1, 2, 3, 3, 8, 5, 3, 8, 5]\n" + ] + } + ], "source": [ "# [ ] review and run example\n", "# append number to sample_list\n", @@ -353,9 +468,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 39, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "mixed_types list: [1, 'cat', 3]\n", + "mixed_types list: [1, 'cat', 3, 'turtle']\n" + ] + } + ], "source": [ "# [ ] review and run example\n", "mixed_types = [1, \"cat\"]\n", @@ -382,35 +506,55 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 40, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1.0, 1.25, 0.25, 0.01, 0.05]\n", + "[1.0, 1.25, 0.25, 0.01, 0.05, 0.55]\n" + ] + } + ], "source": [ "# Currency Values\n", "# [ ] create a list of 3 or more currency denomination values, cur_values\n", "# cur_values, contains values of coins and paper bills (.01, .05, etc.)\n", - "\n", + "cur_values = [1.00, 1.25, .25, .01, .05]\n", "# [ ] print the list\n", - "\n", + "print(cur_values)\n", "\n", "# [ ] append an item to the list and print the list\n", - " \n" + "cur_values.append(.55)\n", + "print(cur_values)\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 43, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['dollar', 'penny', 'quarter', 'nickel']\n", + "['dollar', 'penny', 'quarter', 'nickel', 'Big Bill']\n" + ] + } + ], "source": [ "# Currency Names\n", "# [ ] create a list of 3 or more currency denomination NAMES, cur_names\n", "# cur_names contains the NAMES of coins and paper bills (penny, etc.)\n", - "\n", + "cur_names = ['dollar', 'penny', 'quarter', 'nickel']\n", "# [ ] print the list\n", - "\n", + "print(cur_names)\n", "# [ ] append an item to the list and print the list\n", - " \n" + "cur_names.append('Big Bill')\n", + "print(cur_names)" ] }, { @@ -426,14 +570,23 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 46, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['dollar', 'penny', 'quarter', 'nickel', 'Big Bill', 'bigger bill', 'bigger bill', 'small bill']\n" + ] + } + ], "source": [ "# [ ] append additional values to the Currency Names list using input()\n", - "\n", + "cur_names.append(input('give me a currency name'))\n", "# [ ] print the appended list\n", - "\n" + "\n", + "print(cur_names)" ] }, { @@ -453,11 +606,26 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 47, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['1', '3', '4', '5', '78', 'q']\n" + ] + } + ], "source": [ - "# [ ] complete the Birthday Survey task above\n" + "# [ ] complete the Birthday Survey task above\n", + "bday_survey = []\n", + "bday = \"\"\n", + "while bday.startswith(\"q\") == False:\n", + " bday = input(\"Tell me the day of the month you were born (1-31) or \\\"q\\\" to finish\")\n", + " bday_survey.append(bday)\n", + "\n", + "print(bday_survey)\n" ] }, { @@ -471,12 +639,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 49, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "an item in the list is: 3\n" + ] + } + ], "source": [ "# [ ] Fix the Error\n", - "three_numbers = [1, 1, 2]\n", + "three_numbers = [1, 1, 2,3]\n", "print(\"an item in the list is: \", three_numbers[3])\n", "\n" ] @@ -528,9 +704,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 50, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "party_list before: ['Joana', 'Alton', 'Tobias']\n", + "party_list after: ['Joana', 'Colette', 'Tobias']\n" + ] + } + ], "source": [ "# [ ] review and run example\n", "# the list before Insert\n", @@ -544,9 +729,19 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 51, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "before: ['Joana', 'Alton', 'Tobias']\n", + "\n", + "after: ['Joana', 'Alton Derosa', 'Tobias']\n" + ] + } + ], "source": [ "# [ ] review and run example\n", "party_list = [\"Joana\", \"Alton\", \"Tobias\"]\n", @@ -567,9 +762,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 52, "metadata": {}, - "outputs": [], + "outputs": [ + { + "ename": "IndexError", + "evalue": "list assignment index out of range", + "output_type": "error", + "traceback": [ + "\u001b[31m---------------------------------------------------------------------------\u001b[39m", + "\u001b[31mIndexError\u001b[39m Traceback (most recent call last)", + "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[52]\u001b[39m\u001b[32m, line 6\u001b[39m\n\u001b[32m 1\u001b[39m \u001b[38;5;66;03m# IndexError Example\u001b[39;00m\n\u001b[32m 2\u001b[39m \u001b[38;5;66;03m# [ ] review and run example which results in an IndexError\u001b[39;00m\n\u001b[32m 3\u001b[39m \u001b[38;5;66;03m# if result is NameError run cell above before running this cell\u001b[39;00m\n\u001b[32m 4\u001b[39m \n\u001b[32m 5\u001b[39m \u001b[38;5;66;03m# IndexError trying to append to end of list\u001b[39;00m\n\u001b[32m----> \u001b[39m\u001b[32m6\u001b[39m \u001b[43mparty_list\u001b[49m\u001b[43m[\u001b[49m\u001b[32;43m3\u001b[39;49m\u001b[43m]\u001b[49m = \u001b[33m\"\u001b[39m\u001b[33mAlton\u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m 7\u001b[39m \u001b[38;5;28mprint\u001b[39m(party_list)\n", + "\u001b[31mIndexError\u001b[39m: list assignment index out of range" + ] + } + ], "source": [ "# IndexError Example\n", "# [ ] review and run example which results in an IndexError\n", @@ -582,9 +789,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 53, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "single_digits: ['zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine']\n", + "single_digits[3]: three \n", + "\n", + "single_digits: ['zero', 'one', 'two', 3, 'four', 'five', 'six', 'seven', 'eight', 'nine']\n", + "single_digits[3]: 3 \n" + ] + } + ], "source": [ "# [ ] review and run example changes the data type of an element\n", "# replace a string with a number (int)\n", @@ -618,13 +837,30 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 59, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[10, 2, 3]\n", + "['large', 2, 3]\n" + ] + } + ], "source": [ "# [ ] complete \"replace items in a list\" task\n", + "three_num = [10,2,3]\n", "\n", - " \n" + "print(three_num)\n", + "if three_num[0] < 5:\n", + " three_num[0] = 'small' \n", + "\n", + "else:\n", + " three_num[0] = \"large\"\n", + "\n", + "print(three_num)\n" ] }, { @@ -643,11 +879,36 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 60, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Original List: [10, 2, 8, 4]\n", + "After Index 0: ['large', 2, 8, 4]\n" + ] + } + ], "source": [ - "# [ ] create challenge function\n" + "# [ ] create challenge function\n", + "def str_replace(int_list, index):\n", + "\n", + " value_to_check = int_list[index]\n", + "\n", + " if value_to_check < 5:\n", + " int_list[index] = 'small'\n", + " else:\n", + " int_list[index] = 'large'\n", + "\n", + " return int_list\n", + "\n", + "my_list = [10, 2, 8, 4]\n", + "\n", + "print(\"Original List:\", my_list)\n", + "modified_list_1 = str_replace(my_list, 0)\n", + "print(\"After Index 0:\", modified_list_1)\n" ] }, { @@ -669,11 +930,33 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 66, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['Alpha', 'Beta', 'Gamma']\n", + "['ALPHA', 'Beta', 'Gamma']\n", + "['ALPHA', 'Beta', 'gAMMA']\n" + ] + } + ], "source": [ "# [ ] complete coding task described above\n", + "three_words = ['Alpha', 'Beta', 'Gamma']\n", + "\n", + "print(three_words)\n", + "\n", + "three_words[0] = three_words[0].upper()\n", + "\n", + "print(three_words)\n", + "\n", + "three_words[2] = three_words[2].swapcase()\n", + "\n", + "print(three_words)\n", + "\n", "\n", " \n" ] @@ -704,9 +987,24 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 67, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "party_list before: ['Joana', 'Alton', 'Tobias']\n", + "index 1 is Alton \n", + "index 2 is Tobias \n", + "\n", + "party_list after: ['Joana', 'Colette', 'Alton', 'Tobias']\n", + "index 1 is Colette \n", + "index 2 is Alton \n", + "index 3 is Tobias\n" + ] + } + ], "source": [ "# [ ] review and run example\n", "# the list before Insert\n", @@ -733,15 +1031,28 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 69, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['Joana', 'Alton', 'Tobias']\n", + "['Joana', 'Alton', 'Benjamin', 'Tobias']\n" + ] + } + ], "source": [ "# [ ] insert a name from user input into the party_list in the second position (index 1)\n", "party_list = [\"Joana\", \"Alton\", \"Tobias\"]\n", "\n", + "print(party_list)\n", + "\n", + "party_list.insert(2, \"Benjamin\")\n", "# [ ] print the updated list\n", - "\n" + "\n", + "print(party_list)" ] }, { @@ -755,12 +1066,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 73, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "tree_list before = ['oak']\n", + "tree_list after = ['oak', 'pine']\n" + ] + } + ], "source": [ "# [ ] Fix the Error\n", - "tree_list = \"oak\"\n", + "tree_list = [\"oak\"]\n", "print(\"tree_list before =\", tree_list)\n", "tree_list.insert(1,\"pine\")\n", "print(\"tree_list after =\", tree_list)\n", @@ -812,9 +1132,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 74, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "sample_list before: [11, 21, 13, 14, 51, 161, 117, 181]\n", + "sample_list after: [11, 13, 14, 51, 161, 117, 181]\n" + ] + } + ], "source": [ "# [ ] review and run example\n", "# the list before delete\n", @@ -828,9 +1157,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 75, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "sample_list before: [11, 13, 14, 51, 161, 117, 181]\n", + "sample_list after: [13, 14, 51, 161, 117, 181]\n" + ] + } + ], "source": [ "# [ ] review and run example Multiple Times\n", "# [ ] consider how to reset the list values?\n", @@ -841,9 +1179,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 76, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "mixed_types list: [1, 'cat', 3]\n", + "mixed_types list: [1, 'cat', 3, 'turtle']\n" + ] + } + ], "source": [ "# [ ] review and run example\n", "mixed_types = [1, \"cat\"]\n", @@ -870,9 +1217,17 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 77, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['calcaneus', 'talus', 'navicular', 'lateral cuneiform', 'intermediate cuneiform', 'medial cuneiform']\n" + ] + } + ], "source": [ "# [ ] print ft_bones list\n", "# [ ] delete \"cuboid\" from ft_bones\n", @@ -880,7 +1235,9 @@ "ft_bones = [\"calcaneus\", \"talus\", \"cuboid\", \"navicular\", \"lateral cuneiform\", \n", " \"intermediate cuneiform\", \"medial cuneiform\"]\n", "\n", - "\n" + "del ft_bones[2]\n", + "\n", + "print(ft_bones)\n" ] }, { @@ -894,9 +1251,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 80, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['calcaneus', 'talus', 'cuboid', 'navicular', 'lateral cuneiform', 'intermediate cuneiform', 'medial cuneiform']\n", + "['calcaneus', 'talus', 'lateral cuneiform', 'intermediate cuneiform', 'medial cuneiform']\n" + ] + } + ], "source": [ "# [ ] print ft_bones list\n", "# [ ] delete \"cuboid\" from ft_bones\n", @@ -906,6 +1272,12 @@ "ft_bones = [\"calcaneus\", \"talus\", \"cuboid\", \"navicular\", \"lateral cuneiform\", \n", " \"intermediate cuneiform\", \"medial cuneiform\"]\n", "\n", + "print(ft_bones)\n", + "\n", + "del ft_bones[2:4]\n", + "\n", + "print(ft_bones)\n", + "\n", "\n" ] }, @@ -933,9 +1305,26 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 81, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['Joana', 'Alton', 'Tobias']\n", + "Hello, Tobias\n", + "\n", + " ['Joana', 'Alton']\n", + "Hello, Alton\n", + "\n", + " ['Joana']\n", + "Hello, Joana\n", + "\n", + " []\n" + ] + } + ], "source": [ "# [ ] review and run example\n", "# pop() gets the last item by default\n", @@ -954,9 +1343,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 82, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "before: [11, 21, 13, 14, 51, 161, 117, 181]\n", + "after : [11, 21, 13, 51, 161, 117, 181]\n" + ] + } + ], "source": [ "# [ ] review and run example\n", "# can pop specific index like pop(3)\n", @@ -968,9 +1366,19 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 83, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "list before: [11, 21, 13, 14, 51, 161, 117, 181]\n", + "list after : [11, 21, 13, 14, 51, 161]\n", + "add the popped values: 181 + 117 = 298\n" + ] + } + ], "source": [ "# [ ] review and run example\n", "# set a variable to a poped value\n", @@ -995,16 +1403,27 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 85, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['talus', 'cuboid', 'navicular', 'lateral cuneiform', 'intermediate cuneiform']\n" + ] + } + ], "source": [ "# [ ] pop() and print the first and last items from the ft_bones list\n", "ft_bones = [\"calcaneus\", \"talus\", \"cuboid\", \"navicular\", \"lateral cuneiform\", \n", " \"intermediate cuneiform\", \"medial cuneiform\"]\n", "\n", + "ft_bones.pop(0)\n", + "ft_bones.pop(-1)\n", "# [ ] print the remaining list\n", - "\n" + "\n", + "print(ft_bones)" ] }, { @@ -1031,9 +1450,19 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 86, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Poodle\n", + "Pug\n", + "Lab\n" + ] + } + ], "source": [ "dog_types = [\"Lab\", \"Pug\", \"Poodle\"]\n", "\n", @@ -1058,12 +1487,28 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 88, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['11.99', '12.99', '13.99', 'done']\n" + ] + } + ], "source": [ "#[ ] complete the Register Input task above\n", - "\n" + "purchase_amount = []\n", + "\n", + "while True:\n", + " item_input = input(\"Enter item price or type 'done' to finish:\" )\n", + " purchase_amount.append(item_input)\n", + " if item_input.lower() == 'done':\n", + " break\n", + "\n", + "print(purchase_amount)\n" ] }, { @@ -1085,12 +1530,50 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 93, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Purchase list (as strings): ['12']\n", + "\n", + "Purchase list (as strings): ['12', '13']\n", + "\n", + "Purchase list (as strings): ['12', '13', '14']\n", + "\n", + "Purchase list (as strings): ['12', '13', '14', '15']\n", + "-----------------------------------\n", + "Final Subtotal: 54.00\n" + ] + } + ], "source": [ "# [ ] complete the Register Total task above\n", - "\n" + "subtotal = 0\n", + "\n", + "purchase_amount = []\n", + "\n", + "while True:\n", + " item_input = input(\"Enter item price or type 'done' to finish: \")\n", + "\n", + " if item_input.lower() == 'done':\n", + " break\n", + "\n", + " purchase_amount.append(item_input)\n", + "\n", + " print(\"\\nPurchase list (as strings):\", purchase_amount)\n", + "\n", + "while purchase_amount:\n", + "\n", + " item_price = float(purchase_amount.pop())\n", + "\n", + " subtotal += item_price\n", + "\n", + "print(\"-----------------------------------\")\n", + "print(f\"Final Subtotal: {subtotal:.2f}\")\n" ] }, { @@ -1118,9 +1601,17 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 95, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['Lab', 'Poodle']\n" + ] + } + ], "source": [ "# [ ] review and run example\n", "dog_types = [\"Lab\", \"Pug\", \"Poodle\"]\n", @@ -1134,14 +1625,25 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 98, "metadata": { "scrolled": true }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['Lab', 'Collie', 'Pug', 'Poodle', 'Poodle', 'Pug', 'Poodle']\n", + "['Lab', 'Collie', 'Pug', 'Poodle', 'Pug', 'Poodle']\n", + "['Lab', 'Collie', 'Pug', 'Pug', 'Poodle']\n", + "['Lab', 'Collie', 'Pug', 'Pug']\n" + ] + } + ], "source": [ "# [ ] review and run example\n", - "dogs = [\"Lab\", \"Pug\", \"Poodle\", \"Poodle\", \"Pug\", \"Poodle\"]\n", + "dogs = [\"Lab\", \"Collie\", \"Pug\", \"Poodle\", \"Poodle\", \"Pug\", \"Poodle\"]\n", "\n", "print(dogs)\n", "while \"Poodle\" in dogs:\n", @@ -1158,9 +1660,17 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 99, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['Lab', 'Pug', 'Pug']\n" + ] + } + ], "source": [ "# [ ] review and run example\n", "# Change to \"Lab\", etc... to fix error\n", @@ -1181,14 +1691,30 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 108, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['Lab', 'Pug', 'Poodle', 'Poodle', 'Pug', 'Poodle']\n", + "['Lab', 'Pug', 'Poodle', 'Pug', 'Poodle']\n" + ] + } + ], "source": [ "# [ ] remove one \"Poodle\" from the list: dogs , or print \"no Poodle found\"\n", "# [ ] print list before and after\n", "dogs = [\"Lab\", \"Pug\", \"Poodle\", \"Poodle\", \"Pug\", \"Poodle\"]\n", - "\n" + "print(dogs)\n", + "\n", + "if \"Poodle\" in dogs:\n", + " dogs.remove(\"Poodle\")\n", + "else:\n", + " print(\"no Poodle found\")\n", + "\n", + "print(dogs)" ] }, { @@ -1205,7 +1731,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 109, "metadata": {}, "outputs": [ { @@ -1247,7 +1773,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.13.3" + "version": "3.13.7" } }, "nbformat": 4, From 7e007559450ee58a88949fab98726d8926842ddb Mon Sep 17 00:00:00 2001 From: Benjamin Reed Date: Wed, 15 Oct 2025 14:02:06 -0400 Subject: [PATCH 24/36] P2M2 required code --- ...ule_2.1_Practice_Python_Fundamentals.ipynb | 253 ++++++++++++++---- ....2_Required_Code_Python_Fundamentals.ipynb | 86 +++++- P2M2BenjaminReed.py | 45 ++++ 3 files changed, 321 insertions(+), 63 deletions(-) create mode 100644 P2M2BenjaminReed.py diff --git a/P2 Python Fundamentals/Module_2.1_Practice_Python_Fundamentals.ipynb b/P2 Python Fundamentals/Module_2.1_Practice_Python_Fundamentals.ipynb index 2e35c8d..5bc52e5 100644 --- a/P2 Python Fundamentals/Module_2.1_Practice_Python_Fundamentals.ipynb +++ b/P2 Python Fundamentals/Module_2.1_Practice_Python_Fundamentals.ipynb @@ -23,43 +23,47 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 3, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']\n" + ] + } + ], "source": [ "# [ ] create and populate list called days_of_week then print it\n", "\n", - "days_of_week = [\"Monday\",\"Tuesday\",\"Wednesday\"]\n", + "days_of_week = [\"Monday\",\"Tuesday\",\"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\", \"Sunday\"]\n", "\n", - "\n" + "print(days_of_week)\n" ] }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "1 ['Monday', 'Tuesday', 'Wednesday', 'Thursday']\n", - "2 ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']\n" + "['Tuesday', 'Thursday', 'Saturday']\n", + "['Monday', 'Tuesday', 'Wednesday', 'Friday', 'Saturday', 'Sunday']\n" ] } ], "source": [ "# [ ] after days_of_week is run above, print the days in the list at odd indexes 1,3,5\n", - "days_of_week.remove(\"Friday\")\n", - "print(\"1\",days_of_week)\n", + "print(days_of_week[1:6:2])\n", "\n", "#del days_of_week[3]\n", - "if \"Friday\" in days_of_week:\n", - " pass\n", - "else:\n", - " days_of_week.append(\"Friday\")\n", + "del days_of_week[3]\n", "\n", - "print(\"2\",days_of_week)\n" + "print(days_of_week)\n" ] }, { @@ -79,12 +83,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['', '', 'ABC', 'DEF', 'GHI', 'JKL', 'MNO', 'PQRS', 'TUV', 'WXYZ']\n" + ] + } + ], "source": [ "# [ ] create and populate list called phone_letters then print it\n", - "phone_letters = [\"\",\"\",\"ABC\",\"DEF\",\"GHI\"]\n", + "phone_letters = [\"\",\"\",\"ABC\",\"DEF\",\"GHI\", \"JKL\", \"MNO\", \"PQRS\", \"TUV\", \"WXYZ\"]\n", " \n", "print(phone_letters)" ] @@ -103,27 +115,46 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 8, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Tuesday\n" + ] + } + ], "source": [ "# [ ] create a variable: day, assign day to \"Tuesday\" using days_of_week[]\n", "# [ ] print day variable\n", "\n", + "day = days_of_week[1]\n", "\n", + "print(day)\n", "\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 9, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Sunday\n" + ] + } + ], "source": [ "# PART 2\n", "# [ ] assign day to days_of_week index = 5\n", + "day = days_of_week[5]\n", "# [ ] print day\n", - "\n", + "print(day)\n", "\n" ] }, @@ -141,14 +172,24 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 13, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['Monday', 'Tuesday', 'Wednesday', 'Friday', 'Saturday', 'Sunday', 'Bensday', 'Bensday']\n" + ] + } + ], "source": [ "# [ ] Make up a new day! - append an 8th day of the week to days_of_week \n", "# [ ] print days_of_week\n", "\n", - "\n" + "days_of_week.append('Bensday')\n", + "\n", + "print(days_of_week)\n" ] }, { @@ -162,26 +203,45 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 20, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['Monday', 'Tuesday', 'Wednesday', 'Whynotsday', 'Thursday', 'Friday', 'Saturday', 'Sunday']\n" + ] + } + ], "source": [ "# [ ] Make up another new day - insert a new day into the middle of days_of_week between Wed - Thurs\n", "# [ ] print days_of_week\n", + "days_of_week = [\"Monday\",\"Tuesday\",\"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\", \"Sunday\"]\n", + "days_of_week.insert(3,\"Whynotsday\")\n", "\n", - "\n" + "print(days_of_week)\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 21, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['Monday', 'Tuesday', 'Wednesday', 'Whynotsday', 'Thursday', 'Friday', 'Longday', 'Saturday', 'Sunday']\n" + ] + } + ], "source": [ "# [ ] Extend the weekend - insert a day between Fri & Sat in the days_of_week list\n", "# [ ] print days_of_week\n", "\n", - "\n" + "days_of_week.insert(-2, 'Longday')\n", + "print(days_of_week)\n" ] }, { @@ -195,40 +255,77 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 22, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['Monday', 'Tuesday', 'Wednesday', 'Whynotsday', 'Thursday', 'Friday', 'Longday', 'Saturday', 'Sunday']\n", + "['Monday', 'Tuesday', 'Wednesday', 'Whynotsday', 'Thursday', 'Friday', 'Longday', 'Saturday']\n" + ] + } + ], "source": [ "# [ ] print days_of_week \n", + "print(days_of_week)\n", "# [ ] modified week is too long - pop() the last index of days_of_week & print .pop() value\n", + "days_of_week.pop(-1)\n", "# [ ] print days_of_week\n", + "print(days_of_week)\n", "\n", "\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 26, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['Monday', 'Tuesday', 'Wednesday', 'Whynotsday', 'Thursday', 'Friday', 'Longday', 'Saturday']\n", + "['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Longday', 'Saturday']\n" + ] + } + ], "source": [ "# [ ] print days_of_week \n", - "# [ ] delete (del) the new day added to the middle of the week \n", + "print(days_of_week)\n", + "# [ ] delete (del) the new day added to the middle of the week\n", + "del days_of_week[3] \n", "# [ ] print days_of_week\n", + "print(days_of_week)\n", "\n", "\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 28, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Longday', 'Saturday']\n", + "The day I popped was: Longday\n", + "['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']\n" + ] + } + ], "source": [ "# [ ] print days_of_week \n", + "print(days_of_week)\n", "# [ ] programmers choice - pop() any day in days_of week & print .pop() value\n", + "popped_day = days_of_week.pop(-2)\n", + "print(f\"The day I popped was: {popped_day}\")\n", "# [ ] print days_of_week\n", - "\n" + "print(days_of_week)\n" ] }, { @@ -280,21 +377,45 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 33, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Input: ' ' \t\tOutput: Not Found\n", + "Input: 'j' \t\tOutput: 5\n", + "Input: 'Y' \t\tOutput: 9\n", + "Input: '7' \t\tOutput: Not Found\n" + ] + } + ], "source": [ "# [ ] create let_to_num()\n", - "\n" + "def let_to_num(letter):\n", + " if letter == \"\":\n", + " return 1 ##returns 1 it it finds an empty string.\n", + " \n", + " search_letter = letter.upper()\n", + "\n", + " key = 0\n", + "\n", + " while key < 10:\n", + " if search_letter in phone_letters[key]:\n", + " return key\n", + " \n", + " else:\n", + " key = key + 1\n", + "\n", + " return \"Not Found\"\n", + "\n", + "print(\"Input: ' ' \\t\\tOutput:\", let_to_num(\" \"))\n", + "print(\"Input: 'j' \\t\\tOutput:\", let_to_num(\"j\"))\n", + "print(\"Input: 'Y' \\t\\tOutput:\", let_to_num(\"Y\"))\n", + "print(\"Input: '7' \\t\\tOutput:\", let_to_num(\"7\"))" ] }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, { "cell_type": "markdown", "metadata": {}, @@ -310,23 +431,37 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 39, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Original List: ['Dog', 'Cat', 'Bird', 'Lion']\n", + "--------------------------------------------------\n", + "Final Reversed List: ['Lion', 'Bird', 'Cat', 'Dog']\n" + ] + } + ], "source": [ "# [ ] Challenge: write the code for \"reverse a string\"\n", + "my_list = ['Dog', 'Cat', 'Bird', 'Lion']\n", + "reversed_list = []\n", + "\n", + "print(f\"Original List: {my_list}\")\n", + "print(\"-\" * 50)\n", + "\n", + "while my_list:\n", + " last_word = my_list.pop()\n", + " reversed_list.append(last_word)\n", + "\n", + "print(f\"Final Reversed List: {reversed_list}\")\n", "\n", " \n", " " ] }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, { "cell_type": "markdown", "metadata": {}, @@ -352,7 +487,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.4" + "version": "3.13.7" } }, "nbformat": 4, diff --git a/P2 Python Fundamentals/Module_2.2_Required_Code_Python_Fundamentals.ipynb b/P2 Python Fundamentals/Module_2.2_Required_Code_Python_Fundamentals.ipynb index 7d295e8..7660f55 100644 --- a/P2 Python Fundamentals/Module_2.2_Required_Code_Python_Fundamentals.ipynb +++ b/P2 Python Fundamentals/Module_2.2_Required_Code_Python_Fundamentals.ipynb @@ -65,18 +65,96 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "metadata": { "collapsed": true }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Welcome, Benjamin Reed. Look at all the colors ['red', 'orange', 'yellow', 'green', 'blue', 'indigo', 'violet', 'magenta']\n", + "1 instance of blue removed from list.\n", + "\n", + "Welcome, Benjamin Reed. Look at all the colors ['red', 'orange', 'yellow', 'green', 'indigo', 'violet', 'magenta']\n", + "1 instance of orange removed from list.\n", + "\n", + "Welcome, Benjamin Reed. Look at all the colors ['red', 'yellow', 'green', 'indigo', 'violet', 'magenta']\n", + "1 instance of green removed from list.\n", + "\n", + "Welcome, Benjamin Reed. Look at all the colors ['red', 'yellow', 'indigo', 'violet', 'magenta']\n", + "1 instance of red removed from list.\n", + "\n", + "Welcome, Benjamin Reed. Look at all the colors ['yellow', 'indigo', 'violet', 'magenta']\n", + "1 instance of yellow removed from list.\n", + "\n", + "Welcome, Benjamin Reed. Look at all the colors ['indigo', 'violet', 'magenta']\n", + "1 instance of red appended to list.\n", + "\n", + "Welcome, Benjamin Reed. Look at all the colors ['indigo', 'violet', 'magenta', 'red']\n", + "1 instance of indigo removed from list.\n", + "\n", + "Welcome, Benjamin Reed. Look at all the colors ['violet', 'magenta', 'red']\n", + "1 instance of violet removed from list.\n", + "\n", + "Welcome, Benjamin Reed. Look at all the colors ['magenta', 'red']\n", + "1 instance of magenta removed from list.\n", + "\n", + "Welcome, Benjamin Reed. Look at all the colors ['red']\n", + "1 instance of red removed from list.\n", + "Goodbye\n" + ] + } + ], "source": [ "# [] create list-o-matic as a function and call it\n", "# [] be sure to include your spelled-out name in the welcome prompt\n", "# [] you are welcome to use any list you like for list-o-matic, does not have to be animals \n", "\n", "\n", - "\n" + "def list_o_matic(item_list, item_string):\n", + "\n", + " if item_string == \"\":\n", + "\n", + " if item_list:\n", + " popped_item = item_list.pop()\n", + " return f\"{popped_item} popped from list\"\n", + " else:\n", + " return \"List is already empty.\"\n", + " \n", + " elif item_string in item_list:\n", + "\n", + " item_list.remove(item_string)\n", + " return f\"1 instance of {item_string} removed from list.\"\n", + " \n", + " else:\n", + "\n", + " item_list.append(item_string)\n", + " return f\"1 instance of {item_string} appended to list.\"\n", + "\n", + "colors_list = ['red','orange', 'yellow', 'green', 'blue', 'indigo', 'violet', 'magenta']\n", + "program_name = \"colors\"\n", + "my_name = \"Benjamin Reed\"\n", + "\n", + "while True:\n", + "\n", + " if not colors_list:\n", + " print(\"Goodbye\")\n", + " break\n", + "\n", + " print(f\"\\nWelcome, {my_name}. Look at all the {program_name} {colors_list}\")\n", + "\n", + " color_input = input(f\"Enter a color: \")\n", + "\n", + " if color_input == \"quit\":\n", + " print(\"Goodbye!\")\n", + " break\n", + "\n", + " message = list_o_matic(colors_list, color_input)\n", + "\n", + " print(message)" ] }, { @@ -104,7 +182,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.8" + "version": "3.13.7" } }, "nbformat": 4, diff --git a/P2M2BenjaminReed.py b/P2M2BenjaminReed.py new file mode 100644 index 0000000..6ca768e --- /dev/null +++ b/P2M2BenjaminReed.py @@ -0,0 +1,45 @@ + + + + +def list_o_matic(item_list, item_string): + + if item_string == "": + + if item_list: + popped_item = item_list.pop() + return f"{popped_item} popped from list" + else: + return "List is already empty." + + elif item_string in item_list: + + item_list.remove(item_string) + return f"1 instance of {item_string} removed from list." + + else: + + item_list.append(item_string) + return f"1 instance of {item_string} appended to list." + +colors_list = ['red','orange', 'yellow', 'green', 'blue', 'indigo', 'violet', 'magenta'] +program_name = "colors" +my_name = "Benjamin Reed" + +while True: + + if not colors_list: + print("Goodbye") + break + + print(f"\nWelcome, {my_name}. Look at all the {program_name} {colors_list}") + + color_input = input(f"Enter a color: ") + + if color_input == "quit": + print("Goodbye!") + break + + message = list_o_matic(colors_list, color_input) + + print(message) \ No newline at end of file From dac03ffd16360df9e3a33f5a8aed60654a0080ce Mon Sep 17 00:00:00 2001 From: Benjamin Reed Date: Mon, 20 Oct 2025 19:54:49 -0400 Subject: [PATCH 25/36] M3 work --- ...0_List_Iteration_Python_Fundamentals.ipynb | 138 ++++++++++++++---- 1 file changed, 109 insertions(+), 29 deletions(-) diff --git a/P2 Python Fundamentals/Module_3.0_List_Iteration_Python_Fundamentals.ipynb b/P2 Python Fundamentals/Module_3.0_List_Iteration_Python_Fundamentals.ipynb index 011cab1..5eebadb 100644 --- a/P2 Python Fundamentals/Module_3.0_List_Iteration_Python_Fundamentals.ipynb +++ b/P2 Python Fundamentals/Module_3.0_List_Iteration_Python_Fundamentals.ipynb @@ -51,7 +51,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 2, "metadata": {}, "outputs": [ { @@ -60,10 +60,10 @@ "text": [ "New York\n", "Shanghai\n", - "MUNICH\n", + "Munich\n", "Tokyo\n", "Dubai\n", - "MEXICO CITY\n", + "Mexico City\n", "São Paulo\n", "Hyderabad\n" ] @@ -79,7 +79,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -111,7 +111,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 4, "metadata": {}, "outputs": [ { @@ -147,35 +147,81 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 16, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "hawk\n", + "turkey\n", + "pigeon\n", + "penguin\n", + "vulture\n" + ] + } + ], "source": [ "# [ ] create a list of 4 to 6 strings: birds\n", "# print each bird in the list\n", - "\n" + "birds = ['hawk', 'turkey', 'pigeon', 'penguin', 'vulture']\n", + "\n", + "for bird in birds:\n", + " print(bird)\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 11, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2\n", + "4\n", + "6\n", + "8\n", + "10\n", + "12\n", + "14\n" + ] + } + ], "source": [ "# [ ] create a list of 7 integers: player_points\n", "# [ ] print double the points for each point value\n", - "\n" + "player_points = ['1', '2', '3', '4', '5', '6', '7']\n", + "\n", + "for numb_2 in player_points:\n", + " print(int(numb_2) * 2)\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 27, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "list all the birds: hawk, turkey, pigeon, penguin, vulture, \n" + ] + } + ], "source": [ "# [ ] create long_string by concatenating the items in the \"birds\" list previously created\n", "# print long_string - make sure to put a space betweeen the bird names\n", - "\n" + "birds = ['hawk', 'turkey', 'pigeon', 'penguin', 'vulture']\n", + "long_string = \"\"\n", + "\n", + "for bird in birds:\n", + " long_string += bird + \", \"\n", + "\n", + "print('list all the birds: ', long_string)" ] }, { @@ -198,7 +244,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 29, "metadata": {}, "outputs": [ { @@ -218,7 +264,7 @@ } ], "source": [ - "# [ ] review and run example of sorting into strings to display\n", + "## [ ] review and run example of sorting into strings to display\n", "foot_bones = [\"calcaneus\", \"talus\", \"cuboid\", \"navicular\", \"lateral cuneiform\", \n", " \"intermediate cuneiform\", \"medial cuneiform\"]\n", "longer_names = \"\"\n", @@ -236,7 +282,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 30, "metadata": {}, "outputs": [ { @@ -279,24 +325,59 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 38, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Munich\n", + "Mexico City\n" + ] + } + ], "source": [ "# [ ] Using cities from the example above iterate throught the list using \"for\"/\"in\"\n", "# [ ] Print only cities starting with \"m\"\n", - "\n" + "cities = [\"New York\", \"Shanghai\", \"Munich\", \"Tokyo\", \"Dubai\", \"Mexico City\", \"São Paulo\", \"Hyderabad\"]\n", + "\n", + "for city in cities:\n", + " if city.lower().startswith('m'):\n", + " print(city)\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 40, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Cities with 'a': ['Shanghai', 'Dubai', 'São Paulo', 'Hyderabad']\n", + "Cities with 'a': ['New York', 'Munich', 'Tokyo', 'Mexico City']\n" + ] + } + ], "source": [ "# [ ] Using cities from the example above iterate throught the list using \"for\"/\"in\"\n", "# cities = [\"New York\", \"Shanghai\", \"Munich\", \"Tokyo\", \"Dubai\", \"Mexico City\", \"São Paulo\", \"Hyderabad\"]\n", "# [ ] sort into lists with \"A\" in the city name and without \"A\" in the name: a_city & no_a_city\n", + "cities = [\"New York\", \"Shanghai\", \"Munich\", \"Tokyo\", \"Dubai\", \"Mexico City\", \"São Paulo\", \"Hyderabad\"]\n", + "\n", + "a_city = []\n", + "no_a_city = []\n", + "\n", + "for city in cities:\n", + " if 'a' in city.lower():\n", + " a_city.append(city)\n", + "\n", + " else:\n", + " no_a_city.append(city)\n", + "print(\"Cities with 'a':\", a_city)\n", + "print(\"Cities with 'a':\", no_a_city)\n", "\n" ] }, @@ -325,14 +406,14 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 41, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "The total # of \"e\" found in the list is 3\n" + "The total # of \"a\" found in the list is 6\n" ] } ], @@ -359,16 +440,15 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 42, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "enter a city visited: new york\n", - "new york in default cities is True\n", - "new york in visitied_cites list is True\n" + "tokyo in default cities is True\n", + "tokyo in visited_cites list is True\n" ] } ], @@ -2326,7 +2406,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.8" + "version": "3.13.7" } }, "nbformat": 4, From e64571d66582523d74cc103c064ff4b5ef9d655c Mon Sep 17 00:00:00 2001 From: Benjamin Reed Date: Wed, 22 Oct 2025 14:19:43 -0400 Subject: [PATCH 26/36] mod3 work --- ...0_List_Iteration_Python_Fundamentals.ipynb | 508 ++++++++++++++---- 1 file changed, 410 insertions(+), 98 deletions(-) diff --git a/P2 Python Fundamentals/Module_3.0_List_Iteration_Python_Fundamentals.ipynb b/P2 Python Fundamentals/Module_3.0_List_Iteration_Python_Fundamentals.ipynb index 5eebadb..f9d9315 100644 --- a/P2 Python Fundamentals/Module_3.0_List_Iteration_Python_Fundamentals.ipynb +++ b/P2 Python Fundamentals/Module_3.0_List_Iteration_Python_Fundamentals.ipynb @@ -492,11 +492,36 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Red found\n" + ] + } + ], "source": [ "# [ ] complete paint stock\n", + "paint_colors = ['blue', 'red', 'green', 'purple', 'orange', 'black', 'white']\n", + "\n", + "color_request = input('What color would you like to search for?')\n", + "\n", + "found = False\n", + "\n", + "for color in paint_colors:\n", + " if color.lower() == color_request.lower():\n", + " found = True\n", + " break\n", + "\n", + "if found: \n", + " print(color_request.capitalize(), 'found')\n", + "\n", + "else:\n", + " print(color_request.capitalize(), 'not found')\n", + "\n", "\n" ] }, @@ -525,14 +550,56 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "welcome to the bone list quiz\n", + "Correct! 'talus' identified.\n", + "Incorrect. 'naicular' is not in the remaining list.\n", + "\n", + "Total # of foot_bones identified: 1\n" + ] + } + ], "source": [ "# [ ] Complete Foot Bones Quiz\n", - "# foot_bones = [\"calcaneus\", \"talus\", \"cuboid\", \"navicular\", \"lateral cuneiform\",\n", - "# \"intermediate cuneiform\", \"medial cuneiform\"]\n", - "\n" + "foot_bones = [\"calcaneus\", \"talus\", \"cuboid\", \"navicular\", \"lateral cuneiform\", \"intermediate cuneiform\", \"medial cuneiform\"]\n", + "\n", + "identified_count = 0\n", + "\n", + "def quiz_foot_bone(bone_name, bone_list):\n", + " global identified_count\n", + "\n", + " for i in range(len(bone_list)):\n", + " if bone_list[i].lower() == bone_name.lower():\n", + " identified_count += 1\n", + "\n", + " correct_bone = bone_list[i]\n", + "\n", + " bone_list.pop(i)\n", + "\n", + " return f\"Correct! '{correct_bone}' identified.\"\n", + " \n", + " return f\"Incorrect. '{bone_name}' is not in the remaining list.\"\n", + "\n", + "print(\"welcome to the bone list quiz\")\n", + "\n", + "answer_1 = input(\"Attempt 1: Name a foot bone.\")\n", + "feedback_1 = quiz_foot_bone(answer_1, foot_bones)\n", + "print(feedback_1)\n", + "\n", + "if len(foot_bones) > 0:\n", + " answer_2 = input(\"\\nAttempt 2: Name another foot bone: \")\n", + " feedback_2 = quiz_foot_bone(answer_2, foot_bones)\n", + " print(feedback_2)\n", + "else:\n", + " print(\"\\nAttempt 2 skipped: All foot bones have been identified!\")\n", + "\n", + "print(f\"\\nTotal # of foot_bones identified: {identified_count}\")" ] }, { @@ -599,7 +666,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 8, "metadata": {}, "outputs": [ { @@ -627,7 +694,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 9, "metadata": {}, "outputs": [ { @@ -660,7 +727,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 10, "metadata": {}, "outputs": [ { @@ -692,7 +759,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 11, "metadata": {}, "outputs": [ { @@ -753,7 +820,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 26, "metadata": {}, "outputs": [ { @@ -773,7 +840,16 @@ ], "source": [ "# [ ] using range(x) multiply the numbers 1 through 7\n", - "# 1x2x3x4x5x6x7 = 5040\n" + "# 1x2x3x4x5x6x7 = 5040\n", + "result = 1\n", + "\n", + "for num in range(1,8):\n", + " ##result = num * result\n", + " print(num, \"x\", result, end =\" \")\n", + " result = num * result\n", + " print(\"=\", result)\n", + "\n", + "print(result)\n" ] }, { @@ -929,37 +1005,80 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 29, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]\n" + ] + } + ], "source": [ "# [ ] using range(start,stop), .append() the numbers 5 to 15 to the list: five_fifteen\n", "# [ ] print list five_fifteen\n", - "\n" + "five_fifteen = []\n", + "\n", + "for number in range(5,16):\n", + " five_fifteen.append(number)\n", + "\n", + "print(five_fifteen)\n", + " \n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 37, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "February\n", + "November\n", + "Annual\n" + ] + } + ], "source": [ "# [ ] using range(start,stop) - print the 3rd, 4th and 5th words in spell_list\n", "# output should include \"February\", \"November\", \"Annual\"\n", "spell_list = [\"Tuesday\", \"Wednesday\", \"February\", \"November\", \"Annual\", \"Calendar\", \"Solstice\"]\n", - "\n" + "\n", + "for month in range(2,5):\n", + "\n", + " print (spell_list[month])" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 40, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The index of Annual is: 4\n", + "Annual\n", + "Calendar\n", + "Solstice\n" + ] + } + ], "source": [ "# [ ] using code find the index of \"Annual\" in spell_list\n", "# [ ] using range, print the spell_list including \"Annual\" to end of list\n", "spell_list = [\"Tuesday\", \"Wednesday\", \"February\", \"November\", \"Annual\", \"Calendar\", \"Solstice\"]\n", - "\n" + "\n", + "annual_index = spell_list.index(\"Annual\")\n", + "print(\"The index of Annual is:\", annual_index)\n", + "\n", + "for index in range(annual_index, len(spell_list)):\n", + " print(spell_list[index])" ] }, { @@ -991,7 +1110,7 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 41, "metadata": {}, "outputs": [ { @@ -1013,7 +1132,7 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 42, "metadata": {}, "outputs": [ { @@ -1042,7 +1161,7 @@ }, { "cell_type": "code", - "execution_count": 34, + "execution_count": 43, "metadata": {}, "outputs": [ { @@ -1066,7 +1185,7 @@ }, { "cell_type": "code", - "execution_count": 35, + "execution_count": 44, "metadata": {}, "outputs": [ { @@ -1096,35 +1215,68 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 46, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[10, 12, 14, 16, 18, 20]\n" + ] + } + ], "source": [ "# [ ] print numbers 10 to 20 by 2's using range\n", + "even_list = list(range(10,22,2))\n", "\n", + "print(even_list)\n", "\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 50, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10]\n" + ] + } + ], "source": [ "# [ ] print numbers 20 to 10 using range (need to countdown)\n", "# Hint: start at 20\n", - "\n" + "\n", + "backwards = list(range(20,9,-1))\n", + "\n", + "print(backwards)" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 53, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Tuesday\n", + "November\n", + "Solstice\n" + ] + } + ], "source": [ "# [ ] print first and every third word in spell_list\n", "spell_list = [\"Tuesday\", \"Wednesday\", \"February\", \"November\", \"Annual\", \"Calendar\", \"Solstice\"]\n", - "\n" + "\n", + "for index in range(0, len(spell_list), 3):\n", + " print(spell_list[index])" ] }, { @@ -1148,11 +1300,38 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 58, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Word length; 8\n", + "odd_indexed letter: ['b', 'l', 'y', 'o']\n", + "Even_indexewd letter: ['i', 'l', 'b', 'b']\n" + ] + } + ], "source": [ "# [ ] complete List of letters program- test with the word \"complexity\"\n", + "\n", + "word = input(\"input a word\")\n", + "\n", + "word_length = len(word)\n", + "print(\"Word length;\", word_length)\n", + "\n", + "odd_letters = []\n", + "even_letters = []\n", + "\n", + "for index in range(0, word_length, 2):\n", + " odd_letters.append(word[index])\n", + "\n", + "for index in range(1, word_length, 2):\n", + " even_letters.append(word[index])\n", + "\n", + "print(\"odd_indexed letter:\", odd_letters)\n", + "print(\"Even_indexewd letter:\", even_letters)\n", "\n" ] }, @@ -1166,24 +1345,24 @@ }, { "cell_type": "code", - "execution_count": 36, + "execution_count": 60, "metadata": {}, "outputs": [ { - "ename": "TypeError", - "evalue": "'type' object is not subscriptable", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;31m# [ ] fix the error printing odd numbers 1 - 9\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0;32mfor\u001b[0m \u001b[0mnum\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m10\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnum\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mTypeError\u001b[0m: 'type' object is not subscriptable" + "name": "stdout", + "output_type": "stream", + "text": [ + "1\n", + "3\n", + "5\n", + "7\n", + "9\n" ] } ], "source": [ "# [ ] fix the error printing odd numbers 1 - 9\n", - "for num in range[1,10,2]:\n", + "for num in range(1,10,2):\n", " print(num)\n", "\n", "\n" @@ -1242,7 +1421,7 @@ }, { "cell_type": "code", - "execution_count": 37, + "execution_count": 61, "metadata": {}, "outputs": [ { @@ -1266,7 +1445,7 @@ }, { "cell_type": "code", - "execution_count": 38, + "execution_count": 62, "metadata": {}, "outputs": [ { @@ -1304,7 +1483,7 @@ }, { "cell_type": "code", - "execution_count": 39, + "execution_count": 63, "metadata": {}, "outputs": [ { @@ -1330,14 +1509,14 @@ }, { "cell_type": "code", - "execution_count": 43, + "execution_count": 75, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Team_a extended [0, 2, 2, 2, 4, 4, 4, 5, 6, 6, 6, 0, 0, 0, 1, 1, 2, 3, 3, 3, 6, 8, 0, 0, 0, 1, 1, 2, 3, 3, 3, 6, 8, 0, 0, 0, 1, 1, 2, 3, 3, 3, 6, 8, 0, 0, 0, 1, 1, 2, 3, 3, 3, 6, 8]\n" + "Team_a extended [0, 2, 2, 2, 4, 4, 4, 5, 6, 6, 6, 0, 0, 0, 1, 1, 2, 3, 3, 3, 6, 8, 0, 0, 0, 1, 1, 2, 3, 3, 3, 6, 8, 0, 0, 0, 1, 1, 2, 3, 3, 3, 6, 8, 0, 0, 0, 1, 1, 2, 3, 3, 3, 6, 8, 0, 0, 0, 1, 1, 2, 3, 3, 3, 6, 8, 0, 0, 0, 1, 1, 2, 3, 3, 3, 6, 8, 0, 0, 0, 1, 1, 2, 3, 3, 3, 6, 8, 0, 0, 0, 1, 1, 2, 3, 3, 3, 6, 8, 0, 0, 0, 1, 1, 2, 3, 3, 3, 6, 8, 0, 0, 0, 1, 1, 2, 3, 3, 3, 6, 8, 0, 0, 0, 1, 1, 2, 3, 3, 3, 6, 8, 0, 0, 0, 1, 1, 2, 3, 3, 3, 6, 8]\n" ] } ], @@ -1364,24 +1543,55 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 76, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['chicken', 'blue jay', 'crow', 'pigeon', 'hawk', 'penguin', 'eagle']\n" + ] + } + ], "source": [ "# [ ] extend the list common_birds with list birds_seen which you must create\n", "common_birds = [\"chicken\", \"blue jay\", \"crow\", \"pigeon\"]\n", + "birds_seen = [\"hawk\", \"penguin\", 'eagle']\n", + "\n", + "common_birds.extend(birds_seen)\n", + "print(common_birds)\n", "\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 77, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100]\n" + ] + } + ], "source": [ "# [ ] Create 2 lists zero_nine and ten_onehundred that contain 1-9, and 10 - 100 by 10's.\n", "# [ ] use list addition to concatenate the lists into all_num and print\n", - "\n" + "\n", + "zero_nine = []\n", + "ten_onehundred = []\n", + "\n", + "for num in range(1,10):\n", + " zero_nine.append(num)\n", + "\n", + "for num in range(10,101,10):\n", + " ten_onehundred.append(num)\n", + "\n", + "all_num = zero_nine + ten_onehundred\n", + "print(all_num)\n" ] }, { @@ -1410,7 +1620,7 @@ }, { "cell_type": "code", - "execution_count": 44, + "execution_count": 82, "metadata": {}, "outputs": [ { @@ -1433,7 +1643,7 @@ }, { "cell_type": "code", - "execution_count": 45, + "execution_count": 79, "metadata": {}, "outputs": [ { @@ -1474,7 +1684,7 @@ }, { "cell_type": "code", - "execution_count": 46, + "execution_count": 83, "metadata": {}, "outputs": [ { @@ -1511,24 +1721,51 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 88, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95, 100]\n", + "[100, 95, 90, 85, 80, 75, 70, 65, 60, 55, 50, 45, 40, 35, 30, 25, 20, 15, 10, 5]\n" + ] + } + ], "source": [ "# [ ] create and print a list of multiples of 5 from 5 to 100\n", "# { ] reverse the list and print\n", - "\n" + "\n", + "list_1 = list(range(5,101,5))\n", + "print(list_1)\n", + "\n", + "list_1.reverse()\n", + "\n", + "print(list_1)" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 91, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[44, 40, 36, 32, 28, 24, 20, 16, 12, 8, 4, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44]\n" + ] + } + ], "source": [ "# [ ] Create two lists: fours & more_fours containing multiples of four from 4 to 44\n", "# [ ] combine and print so that the output is mirrored [44, 40,...8, 4, 4, 8, ...40, 44]\n", - "\n" + "\n", + "fours = list(range(4,45,4))\n", + "four_more = list(range(4,45,4))\n", + "fours.reverse()\n", + "print(fours + four_more)" ] }, { @@ -1566,25 +1803,30 @@ }, { "cell_type": "code", - "execution_count": 47, + "execution_count": 95, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "quiz_scores: [15, 18, 18, 18, 19, 19, 20, 20, 20, 20, 20]\n" + "[20, 19, 20, 15, 20, 20, 20, 18, 18, 18, 19]\n", + "quiz_scores: [15, 18, 18, 18, 19, 19, 20, 20, 20, 20, 20]\n", + "[15, 18, 18, 18, 19, 19, 20, 20, 20, 20, 20]\n" ] } ], "source": [ "# [ ] review and run example\n", "quiz_scores = [20, 19, 20, 15, 20, 20, 20, 18, 18, 18, 19]\n", - "\n", + "print(quiz_scores)\n", "# use .sort()\n", "quiz_scores.sort()\n", "\n", - "print(\"quiz_scores:\", quiz_scores)" + "print(\"quiz_scores:\", quiz_scores)\n", + "\n", + "sorted(quiz_scores)\n", + "print(quiz_scores)" ] }, { @@ -1614,7 +1856,7 @@ }, { "cell_type": "code", - "execution_count": 49, + "execution_count": 96, "metadata": {}, "outputs": [ { @@ -1648,27 +1890,72 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 98, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Sort List: ['Dubai', 'Hyderabad', 'Mexico City', 'Munich', 'New York', 'Shanghai', 'São Paulo', 'Toyko']\n", + "\n", + "Cities starting with Q or earlier:\n", + "Dubai\n", + "Hyderabad\n", + "Mexico City\n", + "Munich\n", + "New York\n" + ] + } + ], "source": [ "# [ ] print cites from visited_cities list in alphbetical order using .sort()\n", "# [ ] only print cities that names start \"Q\" or earlier\n", "visited_cities = [\"New York\", \"Shanghai\", \"Munich\", \"Toyko\", \"Dubai\", \"Mexico City\", \"São Paulo\", \"Hyderabad\"]\n", - "\n" + "\n", + "visited_cities.sort()\n", + "print(\"Sort List: \", visited_cities)\n", + "\n", + "print('\\nCities starting with Q or earlier:')\n", + "\n", + "for city in visited_cities:\n", + " first_letters = city[0]\n", + "\n", + " if first_letters.upper() <= 'Q':\n", + " print(city)" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 104, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['New York', 'Shanghai', 'Munich', 'Toyko', 'Dubai', 'Mexico City', 'São Paulo', 'Hyderabad']\n", + "['Dubai', 'Hyderabad', 'Mexico City', 'Munich', 'New York', 'Shanghai', 'São Paulo', 'Toyko']\n", + "Original vistited_cities (unchanged): ['New York', 'Shanghai', 'Munich', 'Toyko', 'Dubai', 'Mexico City', 'São Paulo', 'Hyderabad']\n", + "Filtered sorted_cities (> 5 chars): ['Hyderabad', 'Mexico City', 'Munich', 'New York', 'Shanghai', 'São Paulo']\n" + ] + } + ], "source": [ "# [ ] make a sorted copy (sorted_cities) of visited_cities list\n", "# [ ] remove city names 5 characters or less from sorted_cities \n", "# [ ] print visitied cites and sorted cities\n", "visited_cities = [\"New York\", \"Shanghai\", \"Munich\", \"Toyko\", \"Dubai\", \"Mexico City\", \"São Paulo\", \"Hyderabad\"]\n", - "\n" + "print(visited_cities)\n", + "sorted_cities = sorted(visited_cities)\n", + "print(sorted_cities)\n", + "\n", + "filtered_cities = [city for city in sorted_cities if len(city) > 5]\n", + "\n", + "sorted_cities = filtered_cities\n", + "\n", + "print(\"Original vistited_cities (unchanged):\", visited_cities)\n", + "print(\"Filtered sorted_cities (> 5 chars):\", sorted_cities)" ] }, { @@ -1696,24 +1983,29 @@ }, { "cell_type": "code", - "execution_count": 50, + "execution_count": 108, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Give me an animal to add or blank to stop: jay\n", - "Give me an animal to add or blank to stop: cat\n", - "Give me an animal to add or blank to stop: dog\n", - "Give me an animal to add or blank to stop: lio\n", - "Give me an animal to add or blank to stop: \n" + "['bird']\n" ] } ], "source": [ "# [ ] build a list (add_animals) using a while loop, stop adding when an empty string is entered\n", - "add_animals = []\n" + "add_animals = []\n", + "\n", + "while True:\n", + " next_animal = input(\"Give me an animal\")\n", + " if next_animal == \"\":\n", + " break\n", + " else:\n", + " add_animals.append(next_animal)\n", + "\n", + "print(add_animals)\n" ] }, { @@ -1726,20 +2018,27 @@ }, { "cell_type": "code", - "execution_count": 52, + "execution_count": 109, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "['jay', 'cat', 'dog', 'lio']\n" + "\n", + "Combined and Sorted Animals: ['Armadillo', 'Chimpanzee', 'Panther', 'Wolf', 'bird']\n" ] } ], "source": [ "# [ ] extend the lists into animals, then sort \n", - "animals = [\"Chimpanzee\", \"Panther\", \"Wolf\", \"Armadillo\"]" + "animals = [\"Chimpanzee\", \"Panther\", \"Wolf\", \"Armadillo\"]\n", + "\n", + "animals.extend(add_animals)\n", + "\n", + "animals.sort()\n", + "\n", + "print(\"\\nCombined and Sorted Animals:\", animals)" ] }, { @@ -1752,23 +2051,36 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 112, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Animals (Alphabetical Order): ['Armadillo', 'Chimpanzee', 'Panther', 'Wolf', 'bird']\n" + ] + } + ], "source": [ "# [ ] get input if list should be viewed alpha or reverse alpha and display list\n", - "\n" + "\n", + "animals = ['Armadillo', 'Chimpanzee', 'Panther', 'Wolf', 'bird']\n", + "\n", + "sort_preference = input(\"How would you like to view the animal list? Enter 'A' for alphabetical or 'R' for reverse-alphabetical: \")\n", + "\n", + "if sort_preference.lower() == 'a':\n", + " animals.sort()\n", + " print(\"\\nAnimals (Alphabetical Order):\", animals)\n", + "elif sort_preference.lower() == 'r':\n", + " animals.sort(reverse = True)\n", + " print('\\nAnimals (Reverse_Alphabetical Order):', animals)\n", + "else:\n", + "\n", + " print(\"\\nInvalid input. Displaying list in its current order:\", animals)" ] }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] - }, { "cell_type": "markdown", "metadata": {}, From b5bc323b0a68a163d3a9c11db6dee68fd4d2cd17 Mon Sep 17 00:00:00 2001 From: Benjamin Reed Date: Thu, 23 Oct 2025 08:38:57 -0400 Subject: [PATCH 27/36] m3 update --- ...0_List_Iteration_Python_Fundamentals.ipynb | 198 +++++- ...ule_3.1_Practice_Python_Fundamentals.ipynb | 667 +++++++++++++++--- 2 files changed, 721 insertions(+), 144 deletions(-) diff --git a/P2 Python Fundamentals/Module_3.0_List_Iteration_Python_Fundamentals.ipynb b/P2 Python Fundamentals/Module_3.0_List_Iteration_Python_Fundamentals.ipynb index f9d9315..79b0951 100644 --- a/P2 Python Fundamentals/Module_3.0_List_Iteration_Python_Fundamentals.ipynb +++ b/P2 Python Fundamentals/Module_3.0_List_Iteration_Python_Fundamentals.ipynb @@ -2131,7 +2131,7 @@ }, { "cell_type": "code", - "execution_count": 53, + "execution_count": 1, "metadata": {}, "outputs": [ { @@ -2164,7 +2164,7 @@ }, { "cell_type": "code", - "execution_count": 54, + "execution_count": 2, "metadata": {}, "outputs": [ { @@ -2205,25 +2205,51 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['Jack', 'and', 'Jill', 'went', 'up', 'the', 'hill', 'To', 'fetch', 'a', 'pail', 'of', 'water']\n" + ] + } + ], "source": [ "# [ ] split the string(rhyme) into a list of words (rhyme_words)\n", "# [ ] print each word on it's own line\n", "rhyme = 'Jack and Jill went up the hill To fetch a pail of water' \n", - "\n" + "\n", + "rhyme_words = rhyme.split()\n", + "\n", + "print(rhyme_words)\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Python\n", + "spaces\n", + "indentation\n" + ] + } + ], "source": [ "# [ ] split code_tip into a list and print the first and every other word\n", "code_tip = \"Python uses spaces for indentation\"\n", - "\n" + "code_list = code_tip.split()\n", + "\n", + "word_count = len(code_list)\n", + "\n", + "for index in range(0, word_count, 2):\n", + " print(code_list[index])\n" ] }, { @@ -2251,7 +2277,7 @@ }, { "cell_type": "code", - "execution_count": 55, + "execution_count": 8, "metadata": {}, "outputs": [ { @@ -2272,7 +2298,7 @@ }, { "cell_type": "code", - "execution_count": 56, + "execution_count": 9, "metadata": {}, "outputs": [ { @@ -2296,7 +2322,7 @@ }, { "cell_type": "code", - "execution_count": 59, + "execution_count": 10, "metadata": {}, "outputs": [ { @@ -2343,13 +2369,32 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 14, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['Write code frequently', 'Save code frequently', 'Comment code frequently', 'Study code frequently', '']\n", + "Write Code Frequently\n", + "Save Code Frequently\n", + "Comment Code Frequently\n", + "Study Code Frequently\n" + ] + } + ], "source": [ "# [ ] split poem into a list of phrases by splitting on \"*\" a\n", "# [ ] print each phrase on a new line in title case\n", - "poem = \"Write code frequently*Save code frequently*Comment code frequently*Study code frequently*\"\n" + "poem = \"Write code frequently*Save code frequently*Comment code frequently*Study code frequently*\"\n", + "poem_split = poem.split('*')\n", + "\n", + "print(poem_split)\n", + "\n", + "for this in poem_split:\n", + " if this:\n", + " print(this.title())" ] }, { @@ -2380,7 +2425,7 @@ }, { "cell_type": "code", - "execution_count": 60, + "execution_count": 15, "metadata": {}, "outputs": [ { @@ -2401,7 +2446,7 @@ }, { "cell_type": "code", - "execution_count": 61, + "execution_count": 19, "metadata": {}, "outputs": [ { @@ -2421,7 +2466,7 @@ }, { "cell_type": "code", - "execution_count": 62, + "execution_count": 20, "metadata": {}, "outputs": [ { @@ -2460,13 +2505,22 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 22, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Asterisk\n" + ] + } + ], "source": [ "# [ ] .join() letters list objects with an Asterisk: \"*\"\n", "letters = [\"A\", \"s\", \"t\", \"e\", \"r\", \"i\", \"s\", \"k\"]\n", - "\n" + "\n", + "print(''.join(letters))" ] }, { @@ -2484,13 +2538,24 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 23, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Jack5and5Jill5went5up5the5hill5To5fetch5a5pail5of5water\n" + ] + } + ], "source": [ "# [ ] complete Choose the separator\n", "phrase_words = ['Jack', 'and', 'Jill', 'went', 'up', 'the', 'hill', 'To', 'fetch', 'a', 'pail', 'of', 'water']\n", - "\n" + "\n", + "seperator = input('How would you like to join this? ')\n", + "\n", + "print(seperator.join(phrase_words))" ] }, { @@ -2522,7 +2587,7 @@ }, { "cell_type": "code", - "execution_count": 63, + "execution_count": 24, "metadata": {}, "outputs": [ { @@ -2541,7 +2606,7 @@ }, { "cell_type": "code", - "execution_count": 64, + "execution_count": 25, "metadata": {}, "outputs": [ { @@ -2564,7 +2629,7 @@ }, { "cell_type": "code", - "execution_count": 65, + "execution_count": 26, "metadata": {}, "outputs": [ { @@ -2583,7 +2648,7 @@ }, { "cell_type": "code", - "execution_count": 66, + "execution_count": 27, "metadata": {}, "outputs": [ { @@ -2604,7 +2669,7 @@ }, { "cell_type": "code", - "execution_count": 67, + "execution_count": 28, "metadata": {}, "outputs": [ { @@ -2634,13 +2699,23 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 29, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Write code frequently_ Save code frequently_ Comment code frequently\n" + ] + } + ], "source": [ "# [ ] use 3 print() statements to output text to one line \n", "# [ ] separate the lines by using \"- \" (dash space)\n", - "\n" + "print('Write code frequently', end=\"_ \")\n", + "print(\"Save code frequently\", end=\"_ \")\n", + "print(\"Comment code frequently\") \n" ] }, { @@ -2655,13 +2730,45 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 31, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The list of characters is: ['P', 'y', 't', 'h', 'o', 'n', ' ', 'i', 's', ' ', 'f', 'u', 'n', ' ', 'a', 'n', 'd', ' ', 'e', 'a', 's', 'y', ' ', 't', 'o', ' ', 'l', 'e', 'a', 'r', 'n']\n", + "\n", + "--- Output ---\n", + "Python\n", + "is\n", + "fun\n", + "and\n", + "easy\n", + "to\n", + "learn\n", + "--- End Output ---\n" + ] + } + ], "source": [ "# [ ] create a string (fact) of 20 or more characters and cast to a list (fact_letters)\n", "# [ ] iterate fact, printing each char on one line, except for spaces print a new line\n", - "\n" + "\n", + "fact = \"Python is fun and easy to learn\"\n", + "\n", + "facto_letters = list(fact)\n", + "print(\"The list of characters is:\", facto_letters)\n", + "\n", + "print(\"\\n--- Output ---\")\n", + "\n", + "for char in fact:\n", + " if char == \" \":\n", + " print()\n", + " else:\n", + " print(char, end=\"\")\n", + "\n", + "print(\"\\n--- End Output ---\")" ] }, { @@ -2682,12 +2789,31 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 32, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The equation is:\n", + "1+2+3+4+5+6+7+8+9+1+0+1+1+1+2+1+3+1+4+1+5+1+6+1+7+1+8+1+9+2+0 = 102\n" + ] + } + ], "source": [ "# [ ] create add the digits\n", "\n", + "digit_string = \"1234567891011121314151617181920\"\n", + "\n", + "digit_list = list(digit_string)\n", + "\n", + "total_sum = sum(int(d) for d in digit_list)\n", + "\n", + "equation = \"+\".join(digit_list)\n", + "\n", + "print(\"The equation is:\")\n", + "print(equation, \"=\", total_sum)\n", "\n" ] }, diff --git a/P2 Python Fundamentals/Module_3.1_Practice_Python_Fundamentals.ipynb b/P2 Python Fundamentals/Module_3.1_Practice_Python_Fundamentals.ipynb index 572b1d9..4ed3e58 100644 --- a/P2 Python Fundamentals/Module_3.1_Practice_Python_Fundamentals.ipynb +++ b/P2 Python Fundamentals/Module_3.1_Practice_Python_Fundamentals.ipynb @@ -27,37 +27,105 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Solid - is state of matter #1\n", + "Liquid - is state of matter #2\n", + "Gas - is state of matter #3\n", + "Plasma - is state of matter #4\n" + ] + } + ], "source": [ "# [ ] print out the \"physical states of matter\" (matter_states) in 4 sentences using list iteration\n", "# each sentence should be of the format: \"Solid - is state of matter #1\" \n", "matter_states = ['solid', 'liquid', 'gas', 'plasma']\n", - "\n" + "\n", + "for i, state in enumerate(matter_states):\n", + " print(f\"{state.title()} - is state of matter #{i + 1}\")" ] }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "OG birds list: ['turkey', 'hawk', 'chicken', 'dove', 'crow']\n", + "Birds list after removal: ['turkey', 'hawk', 'dove']\n" + ] + } + ], "source": [ "# [ ] iterate the list (birds) to see any bird names start with \"c\" and remove that item from the list\n", "# print the birds list before and after removals\n", "birds = [\"turkey\", \"hawk\", \"chicken\", \"dove\", \"crow\"]\n", + "\n", + "birds_to_keep = []\n", + "\n", + "print(\"OG birds list:\", birds)\n", + "\n", + "for bird in birds:\n", + " if not bird.lower().startswith(\"c\"):\n", + " birds_to_keep.append(bird)\n", + "\n", + "birds = birds_to_keep\n", + "\n", + "print(\"Birds list after removal:\", birds)\n", "\n" ] }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Basket Occurrences:\n", + "1pt Baskets: 4\n", + "2pt Baskets: 8\n", + "3pt Baskets: 3\n", + "\n", + "Total Points: 29\n" + ] + } + ], "source": [ "# the team makes 1pt, 2pt or 3pt baskets\n", "# [ ] print the occurace of each type of basket(1pt, 2pt, 3pt) & total points using the list baskets\n", "baskets = [2,2,2,1,2,1,3,3,1,2,2,2,2,1,3]\n", + "\n", + "one_point_baskets = 0\n", + "two_point_baskets = 0\n", + "three_point_baskets = 0\n", + "total_points = 0\n", + "\n", + "for basket in baskets:\n", + " total_points += basket\n", + "\n", + " if basket == 1:\n", + " one_point_baskets += 1\n", + " elif basket ==2:\n", + " two_point_baskets +=1\n", + " elif basket == 3:\n", + " three_point_baskets += 1\n", + "\n", + "print(\"Basket Occurrences:\")\n", + "print(\"1pt Baskets:\", one_point_baskets)\n", + "print(\"2pt Baskets:\", two_point_baskets)\n", + "print(\"3pt Baskets:\", three_point_baskets)\n", + "print(\"\\nTotal Points:\", total_points)\n", "\n" ] }, @@ -72,64 +140,158 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "hello\n", + "hello\n", + "hello\n", + "hello\n" + ] + } + ], "source": [ "# [ ] using range() print \"hello\" 4 times\n", "\n", - "\n" + "for i in range(4):\n", + " print(\"hello\")\n" ] }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "List Length: 7\n", + "------------------------------\n", + "FIRST HALF:\n", + "Tuesday\n", + "Wednesday\n", + "February\n", + "------------------------------\n", + "SECOND HALF:\n", + "November\n", + "Annual\n", + "Calendar\n", + "Solstice\n" + ] + } + ], "source": [ "# [ ] find spell_list length\n", "# [ ] use range() to iterate each half of spell_list \n", "# [ ] label & print the first and second halves\n", "spell_list = [\"Tuesday\", \"Wednesday\", \"February\", \"November\", \"Annual\", \"Calendar\", \"Solstice\"]\n", - "\n" + "\n", + "list_length = len(spell_list)\n", + "\n", + "midpoint = list_length // 2\n", + "\n", + "print(\"List Length:\", list_length)\n", + "print(\"-\" * 30)\n", + "\n", + "print(\"FIRST HALF:\")\n", + "\n", + "for index in range(0, midpoint):\n", + " print(spell_list[index])\n", + "\n", + "print(\"-\" * 30)\n", + "\n", + "print(\"SECOND HALF:\")\n", + "\n", + "for index in range(midpoint, list_length):\n", + " print(spell_list[index])\n" ] }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[20, 21, 22, 23, 24, 25, 26, 27, 28, 29]\n" + ] + } + ], "source": [ "# [ ] build a list of numbers from 20 to 29: twenties \n", "# append each number to twenties list using range(start,stop) iteration\n", "# [ ] print twenties\n", "twenties = []\n", - "\n" + "\n", + "for num in range(20, 30):\n", + "\n", + " twenties.append(num)\n", + "\n", + "print(twenties)" ] }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Total: 245\n" + ] + } + ], "source": [ "# [ ] iterate through the numbers populated in the list twenties and add each number to a variable: total\n", "# [ ] print total\n", "total = 0\n", - "\n" + "\n", + "twenties = [20, 21, 22, 23, 24, 25, 26, 27, 28, 29]\n", + "\n", + "total = 0\n", + "\n", + "for num in twenties:\n", + "\n", + " total += num\n", + "\n", + "\n", + "print(\"Total:\", total)" ] }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Total calculated using range(): 245\n" + ] + } + ], "source": [ "# check your answer above using range(start,stop)\n", "# [ ] iterate each number from 20 to 29 using range()\n", "# [ ] add each number to a variable (total) to calculate the sum\n", "# should match earlier task \n", "total = 0\n", + "\n", + "for num in range(20, 30):\n", + "\n", + " total += num\n", + "\n", + "print(\"Total calculated using range():\", total)\n", "\n" ] }, @@ -144,47 +306,127 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25]\n" + ] + } + ], "source": [ "# [ ] create a list of odd numbers (odd_nums) from 1 to 25 using range(start,stop,skip)\n", "# [ ] print odd_nums\n", "# hint: odd numbers are 2 digits apart\n", - "\n" + "\n", + "odd_nums = list(range(1, 26, 2))\n", + "\n", + "print(odd_nums)" ] }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[25, 23, 21, 19, 17, 15, 13, 11, 9, 7, 5, 3, 1]\n" + ] + } + ], "source": [ "# [ ] create a Decending list of odd numbers (odd_nums) from 25 to 1 using range(start,stop,skip)\n", "# [ ] print odd_nums, output should resemble [25, 23, ...]\n", "\n", - "\n" + "odd_nums = list(range(25, 0, -2))\n", + "\n", + "print(odd_nums)\n" ] }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2 - Helium\n", + "4 - Beryllium\n", + "6 - Carbon\n", + "8 - Oxygen\n", + "10 - Neon\n", + "12 - Magnesium\n", + "14 - Silicon\n", + "16 - Sulfur\n", + "18 - Argon\n", + "20 - Calcium\n" + ] + } + ], "source": [ "# the list, elements, contains the names of the first 20 elements in atomic number order\n", "# [ ] print the even number elements \"2 - Helium, 4 - Beryllium,..\" in the list with the atomic number\n", "elements = ['Hydrogen', 'Helium', 'Lithium', 'Beryllium', 'Boron', 'Carbon', 'Nitrogen', 'Oxygen', 'Fluorine', \\\n", " 'Neon', 'Sodium', 'Magnesium', 'Aluminum', 'Silicon', 'Phosphorus', 'Sulfur', 'Chlorine', 'Argon', \\\n", " 'Potassium', 'Calcium']\n", - "\n" + "\n", + "for i, element in enumerate(elements[1::2]):\n", + "\n", + " atomic_num = (i * 2) + 2\n", + "\n", + " print(f\"{atomic_num} - {element}\")" ] }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1 - Hydrogen\n", + "3 - Lithium\n", + "5 - Boron\n", + "7 - Nitrogen\n", + "9 - Fluorine\n", + "11 - Sodium\n", + "13 - Aluminum\n", + "15 - Phosphorus\n", + "17 - Chlorine\n", + "19 - Potassium\n", + "21 - Hydrogen\n", + "23 - Lithium\n", + "25 - Boron\n", + "27 - Nitrogen\n", + "29 - Fluorine\n", + "31 - Sodium\n", + "33 - Aluminum\n", + "35 - Phosphorus\n", + "37 - Chlorine\n", + "39 - Potassium\n", + "41 - Scandium\n", + "43 - Vanadium\n", + "45 - Manganese\n", + "47 - Cobalt\n", + "49 - Copper\n", + "51 - Gallium\n", + "53 - Arsenic\n", + "55 - Bromine\n", + "57 - Rubidium\n", + "59 - Yttrium\n" + ] + } + ], "source": [ "# [ ] # the list, elements_60, contains the names of the first 60 elements in atomic number order\n", "# [ ] print the odd number elements \"1 - Hydrogen, 3 - Lithium,..\" in the list with the atomic number elements_60\n", @@ -196,16 +438,14 @@ " 'Argon', 'Potassium', 'Calcium', 'Scandium', 'Titanium', 'Vanadium', 'Chromium', 'Manganese', \\\n", " 'Iron', 'Cobalt', 'Nickel', 'Copper', 'Zinc', 'Gallium', 'Germanium', 'Arsenic', 'Selenium', \\\n", " 'Bromine', 'Krypton', 'Rubidium', 'Strontium', 'Yttrium', 'Zirconium']\n", - "\n" + "\n", + "for i, element in enumerate(elements_60[0::2]):\n", + "\n", + " atomic_num = (i * 2) + 1\n", + "\n", + " print(f\"{atomic_num} - {element}\")" ] }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, { "cell_type": "markdown", "metadata": {}, @@ -217,9 +457,20 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "numbers_1: [20, 21, 22, 23, 24, 25, 26, 27, 28, 29]\n", + "numbers_2 [30, 32, 34, 36, 38, 40, 42, 44, 46, 48]\n", + "\n", + "Combined List (+ Operator): [20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48]\n" + ] + } + ], "source": [ "# [ ] print the combined lists (numbers_1 & numbers_2) using \"+\" operator\n", "numbers_1 = [20, 21, 22, 23, 24, 25, 26, 27, 28, 29]\n", @@ -229,14 +480,27 @@ "\n", "print(\"numbers_1:\",numbers_1)\n", "print(\"numbers_2\",numbers_2)\n", - "\n" + "\n", + "combined_list = numbers_1 + numbers_2\n", + "print(\"\\nCombined List (+ Operator):\", combined_list)" ] }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1st Row: ['Hydrogen', 'Helium']\n", + "2nd Row: ['Lithium', 'Beryllium', 'Boron', 'Carbon', 'Nitrogen', 'Oxygen', 'Fluorine', 'Neon']\n", + "\n", + "Combined List (.extend() Operator): ['Hydrogen', 'Helium', 'Lithium', 'Beryllium', 'Boron', 'Carbon', 'Nitrogen', 'Oxygen', 'Fluorine', 'Neon']\n" + ] + } + ], "source": [ "# [ ] print the combined element lists (first_row & second_row) using \".extend()\" method\n", "first_row = ['Hydrogen', 'Helium']\n", @@ -244,7 +508,10 @@ "\n", "print(\"1st Row:\", first_row)\n", "print(\"2nd Row:\", second_row)\n", - "\n" + "\n", + "first_row.extend(second_row)\n", + "\n", + "print(\"\\nCombined List (.extend() Operator):\", first_row)" ] }, { @@ -302,27 +569,63 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['Calcium', 'Potassium', 'Argon', 'Chlorine', 'Sulfur', 'Phosphorus', 'Silicon', 'Aluminum', 'Magnesium', 'Sodium', 'Neon', 'Fluorine', 'Oxygen', 'Nitrogen', 'Carbon', 'Boron', 'Beryllium', 'Lithium', 'Helium', 'Hydrogen']\n" + ] + } + ], "source": [ "# [ ] use .reverse() to print elements starting with \"Calcium\", \"Chlorine\",... in reverse order\n", "elements = ['Hydrogen', 'Helium', 'Lithium', 'Beryllium', 'Boron', 'Carbon', 'Nitrogen', 'Oxygen', 'Fluorine', \\\n", " 'Neon', 'Sodium', 'Magnesium', 'Aluminum', 'Silicon', 'Phosphorus', 'Sulfur', 'Chlorine', 'Argon', \\\n", " 'Potassium', 'Calcium']\n", - "\n" + "\n", + "elements.reverse()\n", + "\n", + "print(elements)" ] }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Original List: ['Tuesday', 'Wednesday', 'February', 'November', 'Annual', 'Calendar', 'Solstice']\n", + "Reversed List: ['Solstice', 'Calendar', 'Annual', 'November', 'February', 'Wednesday', 'Tuesday']\n", + "\n", + "Words 8 characters or longer:\n", + "Solstice\n", + "Calendar\n", + "November\n", + "February\n", + "Wednesday\n" + ] + } + ], "source": [ "# [ ] reverse order of the list... Then print only words that are 8 characters or longer from the now reversed order\n", "spell_list = [\"Tuesday\", \"Wednesday\", \"February\", \"November\", \"Annual\", \"Calendar\", \"Solstice\"]\n", "\n", - "\n" + "print(\"Original List:\", spell_list)\n", + "\n", + "spell_list.reverse()\n", + "\n", + "print(\"Reversed List:\", spell_list)\n", + "\n", + "print(\"\\nWords 8 characters or longer:\")\n", + "for word in spell_list:\n", + " if len(word) >= 8:\n", + " print(word)\n" ] }, { @@ -336,26 +639,49 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['Aluminum', 'Argon', 'Beryllium', 'Boron', 'Calcium', 'Carbon', 'Chlorine', 'Fluorine', 'Helium', 'Hydrogen', 'Lithium', 'Magnesium', 'Neon', 'Nitrogen', 'Oxygen', 'Phosphorus', 'Potassium', 'Silicon', 'Sodium', 'Sulfur']\n" + ] + } + ], "source": [ "# [ ] sort the list element, so names are in alphabetical order and print elements\n", "elements = ['Hydrogen', 'Helium', 'Lithium', 'Beryllium', 'Boron', 'Carbon', 'Nitrogen', 'Oxygen', 'Fluorine', \\\n", " 'Neon', 'Sodium', 'Magnesium', 'Aluminum', 'Silicon', 'Phosphorus', 'Sulfur', 'Chlorine', 'Argon', \\\n", " 'Potassium', 'Calcium']\n", - "\n" + "\n", + "elements.sort()\n", + "\n", + "print(elements)" ] }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Sorted List: [1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3]\n", + "Original List: [2, 2, 2, 1, 2, 1, 3, 3, 1, 2, 2, 2, 2, 1, 3]\n" + ] + } + ], "source": [ "# [ ] print the list, numbers, sorted and then below print the original numbers list \n", "numbers = [2,2,2,1,2,1,3,3,1,2,2,2,2,1,3]\n", - "\n" + "\n", + "print(\"Sorted List:\", sorted(numbers))\n", + "\n", + "print(\"Original List:\", numbers)" ] }, { @@ -369,37 +695,87 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "DID\n", + "YOU\n", + "KNOW\n", + "THAT\n", + "THERE\n", + "ARE\n", + "1.4\n", + "BILLION\n", + "STUDENTS\n", + "IN\n", + "THE\n", + "WORLD?\n" + ] + } + ], "source": [ "# [ ] split the string, daily_fact, into a list of word strings: fact_words\n", "# [ ] print each string in fact_words in upper case on it's own line\n", "daily_fact = \"Did you know that there are 1.4 billion students in the world?\"\n", - "\n" + "\n", + "fact_words = daily_fact.split()\n", + "\n", + "for word in fact_words:\n", + " print(word.upper())" ] }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['Pyth', 'n is fun and easy t', ' learn']\n" + ] + } + ], "source": [ "# [ ] convert the string, code_tip, into a list made from splitting on the letter \"o\"\n", "\n", - "\n" + "code_tip = \"Python is fun and easy to learn\"\n", + "\n", + "code_list = code_tip.split('o')\n", + "\n", + "print(code_list)\n" ] }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The \n", + "right \n", + "rain, has \n", + "ran!\n" + ] + } + ], "source": [ "# [ ] split poem on \"b\" to create a list: poem_words\n", "# [ ] print poem_words by iterating the list\n", "poem = \"The bright brain, has bran!\"\n", - "\n" + "\n", + "poem_words = poem.split('b')\n", + "\n", + "for word in poem_words:\n", + " print(word)" ] }, { @@ -414,26 +790,53 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Chlorine, Florine, Bromine, Iodine\n" + ] + } + ], "source": [ "# [ ] print a comma separated string output from the list of Halogen elements using \".join()\"\n", "halogens = ['Chlorine', 'Florine', 'Bromine', 'Iodine']\n", - "\n" + "\n", + "halogen_string = \", \".join(halogens)\n", + "\n", + "print(halogen_string)" ] }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 29, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ReadCodeAloudOrExplainTheCodeStepByStepToAPeer\n" + ] + } + ], "source": [ "# [ ] split the sentence, code_tip, into a words list\n", "# [ ] print the joined words in the list with no spaces in-between\n", "# [ ] Bonus: capitalize each word in the list before .join()\n", "code_tip =\"Read code aloud or explain the code step by step to a peer\"\n", - "\n" + "\n", + "code_list = code_tip.split()\n", + "\n", + "capitalized_list = []\n", + "for word in code_list:\n", + " capitalized_list.append(word.capitalize())\n", + "\n", + "no_space_string = \"\".join(capitalized_list)\n", + "print(no_space_string)" ] }, { @@ -450,33 +853,73 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 30, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "list of letters: ['d', 'e', 'c', 'e', 'l', 'e', 'r', 'a', 't', 'i', 'n', 'g']\n", + "\n", + "Individual letters on one line:\n", + "d e c e l e r a t i n g " + ] + } + ], "source": [ "# [ ] cast the long_word into individual letters list \n", "# [ ] print each letter on a line\n", "long_word = 'decelerating'\n", - "\n" + "\n", + "letter_list = list(long_word)\n", + "print(\"list of letters:\", letter_list)\n", + "\n", + "print(\"\\nIndividual letters on one line:\")\n", + "\n", + "for letter in letter_list:\n", + " print(letter, end=' ')\n" ] }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 34, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "What's the closest planet to the Sun?\n", + "How deep do Dolphins swim?\n", + "What time is it?\n" + ] + } + ], "source": [ "# [ ] use use end= in print to output each string in questions with a \"?\" and on new lines\n", "questions = [\"What's the closest planet to the Sun\", \"How deep do Dolphins swim\", \"What time is it\"]\n", "\n", - "\n" + "for question in questions:\n", + "\n", + " print(question, end='?')\n", + "\n", + " print()\n" ] }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 35, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Calcaneus, Talus, Cuboid, Navicular, Lateral Cuneiform, Intermediate Cuneiform, Medial Cuneiform" + ] + } + ], "source": [ "# [ ] print each item in foot bones \n", "# - capitalized, both words if two word name\n", @@ -484,6 +927,14 @@ "# - and keeping on a single print line\n", "foot_bones = [\"calcaneus\", \"talus\", \"cuboid\", \"navicular\", \"lateral cuneiform\", \n", " \"intermediate cuneiform\", \"medial cuneiform\"]\n", + "\n", + "list_length = len(foot_bones)\n", + "\n", + "for i in range(list_length):\n", + " print(foot_bones[i].title(), end='')\n", + "\n", + " if i < list_length - 1:\n", + " print(\", \", end='')\n", "\n" ] }, @@ -512,7 +963,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.8" + "version": "3.13.7" } }, "nbformat": 4, From 863899f516b24b541f0622069cf0b7f4bd196d61 Mon Sep 17 00:00:00 2001 From: Benjamin Reed Date: Thu, 23 Oct 2025 09:39:24 -0400 Subject: [PATCH 28/36] P2M3 code --- ....2_Required_Code_Python_Fundamentals.ipynb | 48 +++++++++++++++++-- P2M3BenjaminReed.py | 41 ++++++++++++++++ 2 files changed, 86 insertions(+), 3 deletions(-) create mode 100644 P2M3BenjaminReed.py diff --git a/P2 Python Fundamentals/Module_3.2_Required_Code_Python_Fundamentals.ipynb b/P2 Python Fundamentals/Module_3.2_Required_Code_Python_Fundamentals.ipynb index b6a3e87..f9d321d 100644 --- a/P2 Python Fundamentals/Module_3.2_Required_Code_Python_Fundamentals.ipynb +++ b/P2 Python Fundamentals/Module_3.2_Required_Code_Python_Fundamentals.ipynb @@ -68,15 +68,57 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": { "collapsed": true }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "tiger DECIDED ~ that FROSTED would some MACARONI was of OBSCURE was it PASSION the for REASON, tasty flakes There powers be Tony named\n" + ] + } + ], "source": [ "# [] create poem mixer function, call the function with the provided test string\n", "# [] test string: `Little fly, Thy summer’s play My thoughtless hand Has brushed away. Am not I A fly like thee? Or art not thou A man like me?` \n", "\n", + "def word_mixer(original_list):\n", + " original_list.sort()\n", + "\n", + " new_words = []\n", + "\n", + " while len(original_list) > 5:\n", + " new_words.append(original_list.pop(-5))\n", + "\n", + " new_words.append(original_list.pop(0))\n", + "\n", + " new_words.append(original_list.pop(-1))\n", + "\n", + " return new_words\n", + "\n", + "poem_input = input(\"Welcome Ben Reed, enter a saying or peom: \")\n", + "\n", + "word_list = poem_input.split()\n", + "\n", + "list_length = len(word_list)\n", + "\n", + "for word_string in range(list_length):\n", + " word = word_list[word_string]\n", + " word_length = len(word)\n", + "\n", + " if word_length <= 3:\n", + " word_list[word_string] = word.lower()\n", + "\n", + " elif word_length >= 7:\n", + " word_list[word_string] = word.upper()\n", + "\n", + "\n", + "mixed_words_list = word_mixer(word_list)\n", + "\n", + "print(\" \".join(mixed_words_list))\n", "\n", "\n" ] @@ -106,7 +148,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.8" + "version": "3.13.7" } }, "nbformat": 4, diff --git a/P2M3BenjaminReed.py b/P2M3BenjaminReed.py new file mode 100644 index 0000000..116331a --- /dev/null +++ b/P2M3BenjaminReed.py @@ -0,0 +1,41 @@ + + +# [] create poem mixer function, call the function with the provided test string +# [] test string: `Little fly, Thy summer’s play My thoughtless hand Has brushed away. Am not I A fly like thee? Or art not thou A man like me?` + +def word_mixer(original_list): + original_list.sort() + + new_words = [] + + while len(original_list) > 5: + new_words.append(original_list.pop(-5)) + + new_words.append(original_list.pop(0)) + + new_words.append(original_list.pop(-1)) + + return new_words + +poem_input = input("Welcome Ben Reed, enter a saying or peom: ") + +word_list = poem_input.split() + +list_length = len(word_list) + +for word_string in range(list_length): + word = word_list[word_string] + word_length = len(word) + + if word_length <= 3: + word_list[word_string] = word.lower() + + elif word_length >= 7: + word_list[word_string] = word.upper() + + +mixed_words_list = word_mixer(word_list) + +print(" ".join(mixed_words_list)) + + From 39167e3c49b4849bac36f61d007a46fe3160aa90 Mon Sep 17 00:00:00 2001 From: Benjamin Reed Date: Fri, 24 Oct 2025 15:51:14 -0400 Subject: [PATCH 29/36] P2M4 work --- ..._Tutorials_Files_Python_Fundamentals.ipynb | 647 +++- P2 Python Fundamentals/cities.txt | 7 + P2 Python Fundamentals/digits_of_pi.txt | 1 + P2 Python Fundamentals/poem1.txt | 7 + Python Intro to Pandas.ipynb | 2885 +++++++++++++++++ 5 files changed, 3455 insertions(+), 92 deletions(-) create mode 100644 P2 Python Fundamentals/cities.txt create mode 100644 P2 Python Fundamentals/digits_of_pi.txt create mode 100644 P2 Python Fundamentals/poem1.txt create mode 100644 Python Intro to Pandas.ipynb diff --git a/P2 Python Fundamentals/Module_4.0_Tutorials_Files_Python_Fundamentals.ipynb b/P2 Python Fundamentals/Module_4.0_Tutorials_Files_Python_Fundamentals.ipynb index e4fcbef..f94bda6 100644 --- a/P2 Python Fundamentals/Module_4.0_Tutorials_Files_Python_Fundamentals.ipynb +++ b/P2 Python Fundamentals/Module_4.0_Tutorials_Files_Python_Fundamentals.ipynb @@ -64,9 +64,22 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " % Total % Received % Xferd Average Speed Time Time Time Current\n", + " Dload Upload Total Spent Left Speed\n", + "\n", + " 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\n", + " 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\n", + "100 56 100 56 0 0 85 0 --:--:-- --:--:-- --:--:-- 85\n" + ] + } + ], "source": [ "# [ ] review and run example\n", "!curl https://raw.githubusercontent.com/MicrosoftLearning/intropython/master/poem1.txt -o poem1.txt\n" @@ -103,7 +116,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -113,9 +126,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "<_io.TextIOWrapper name='poem1.txt' mode='r' encoding='cp1252'>" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# [ ] run and review code to test if open worked \n", "# should display name='poem1.txt' and no errors\n", @@ -141,9 +165,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " % Total % Received % Xferd Average Speed Time Time Time Current\n", + " Dload Upload Total Spent Left Speed\n", + "\n", + " 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\n", + "100 56 100 56 0 0 346 0 --:--:-- --:--:-- --:--:-- 350\n" + ] + } + ], "source": [ "# [ ] import cities.txt\n", "!curl https://raw.githubusercontent.com/MicrosoftLearning/intropython/master/cities -o cities.txt\n" @@ -151,13 +187,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "<_io.TextIOWrapper name='cities.txt' mode='r' encoding='cp1252'>\n" + ] + } + ], "source": [ "# [ ] open cities.txt as cities_file\n", "# [ ] test cities.txt was opened \n", - "cities_file = open('cities.txt','r')\n", + "cities_file = open('cities.txt', 'r')\n", "print(cities_file)\n" ] }, @@ -188,7 +232,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "metadata": {}, "outputs": [], "source": [ @@ -198,9 +242,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 8, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "'Loops I repeat\\nloops\\nloops\\nloops\\nI repeat\\nuntil I\\nbreak\\n'" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# [ ] review and run example\n", "# shows the file as a string with formatting characters such as \"\\n\", output should be non-blank\n", @@ -209,9 +264,24 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 9, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Loops I repeat\n", + "loops\n", + "loops\n", + "loops\n", + "I repeat\n", + "until I\n", + "break\n", + "\n" + ] + } + ], "source": [ "# [ ] review and run example\n", "# since .read() loaded the file as a string it can be printed\n", @@ -238,24 +308,75 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "<_io.TextIOWrapper name='cities.txt' mode='r' encoding='cp1252'>\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " % Total % Received % Xferd Average Speed Time Time Time Current\n", + " Dload Upload Total Spent Left Speed\n", + "\n", + " 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\n", + "100 56 100 56 0 0 298 0 --:--:-- --:--:-- --:--:-- 301\n" + ] + }, + { + "data": { + "text/plain": [ + "'Beijing\\nCairo\\nLondon\\nNairobi\\nNew York City\\nSydney\\nTokyo\\n'" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# [ ] after import and open of cities.txt in task 1\n", "# [ ] read cities_file as cities\n", "# [ ] display the string: cities\n", - "\n" + "!curl https://raw.githubusercontent.com/MicrosoftLearning/intropython/master/cities -o cities.txt\n", + "cities_file = open('cities.txt', 'r')\n", + "print(cities_file)\n", + "\n", + "cities = cities_file.read()\n", + "\n", + "cities" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 14, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Beijing\n", + "Cairo\n", + "London\n", + "Nairobi\n", + "New York City\n", + "Sydney\n", + "Tokyo\n", + "\n" + ] + } + ], "source": [ "# [ ] print the string: cities\n", - "\n" + "\n", + "print(cities)" ] }, { @@ -286,9 +407,27 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 15, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Loops I re\n" + ] + }, + { + "data": { + "text/plain": [ + "'Loops I re'" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# [ ] review and run example to read poem1.txt 10 characters at a time\n", "poem_file = open('poem1.txt', 'r')\n", @@ -299,9 +438,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 16, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "'peat\\nloops'" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# [ ] review and run example, + 10 more characters\n", "# reads and displays without storing in a variable\n", @@ -310,9 +460,19 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 17, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "loops\n", + "loo\n" + ] + } + ], "source": [ "# [ ] review and run example, + 10 more characters\n", "# reads and stores in variable poem_parts\n", @@ -322,9 +482,23 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 27, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "loops\n", + "loops\n", + "I repeat\n", + "until I\n", + "break\n", + "\n" + ] + } + ], "source": [ "# [ ] REPEATEDLY RUN this cell, + 5 more characters each time run are appended using string addition\n", "# [ ] consider why no additional text displays after multiple runs\n", @@ -354,39 +528,79 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 35, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " % Total % Received % Xferd Average Speed Time Time Time Current\n", + " Dload Upload Total Spent Left Speed\n", + "\n", + " 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\n", + " 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\n", + "100 303 100 303 0 0 1837 0 --:--:-- --:--:-- --:--:-- 1847\n" + ] + } + ], "source": [ "# [ ] digits of pi\n", "# 1. import digits_of_pi.txt\n", - "\n" + "\n", + "! curl https://raw.githubusercontent.com/MicrosoftLearning/intropython/master/digits_of_pi -o digits_of_pi.txt" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 41, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "3.14\n" + ] + } + ], "source": [ "# [ ] digits of pi\n", "# 2. open as digits_of_pi_text \n", "# 3. read() 4 char of digits_of_pi_text to pi_digits variable \n", "# 4. print pi_digits \n", - "\n" + "dop = open(\"digits_of_pi.txt\", 'r')\n", + "pi_digits = dop.read(4)\n", + "\n", + "print(pi_digits)" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 42, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "3.141592\n" + ] + } + ], "source": [ "# [ ] digits of pi\n", "# 5. add to pi_digits string with string addition \n", "# a. add next 4 characters from digits_of_pi obtained from read() \n", "# b. run the cell multiple times to get more digits of *pi*\n", - "\n" + "\n", + "dop = open('digits_of_pi.txt', 'r')\n", + "\n", + "pi_digits = dop.read(4)\n", + "\n", + "pi_digits = pi_digits + dop.read(4)\n", + "\n", + "print(pi_digits)" ] }, { @@ -421,9 +635,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 47, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "LOOPS I REPEAT\n", + "\n" + ] + } + ], "source": [ "# [ ] review and run example\n", "poem_file = open('poem1.txt', 'r')\n", @@ -433,9 +656,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 48, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Loops\n", + "\n" + ] + } + ], "source": [ "# [ ] review and run example\n", "poem_part = poem_file.read(6).title()\n", @@ -444,9 +676,29 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 45, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "loops\n", + "\n", + "False isalpha() because of `\\n`\n" + ] + }, + { + "data": { + "text/plain": [ + "'loops\\n'" + ] + }, + "execution_count": 45, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# [ ] review and run example\n", "poem_part = poem_file.read(6)\n", @@ -457,9 +709,19 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 46, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "repeat\n", + "loops\n", + "loops\n" + ] + } + ], "source": [ "# [ ] review and run example\n", "poem_file = open('poem1.txt', 'r')\n", @@ -486,20 +748,68 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 49, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " % Total % Received % Xferd Average Speed Time Time Time Current\n", + " Dload Upload Total Spent Left Speed\n", + "\n", + " 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\n", + " 0 56 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\n", + "100 56 100 56 0 0 313 0 --:--:-- --:--:-- --:--:-- 314\n" + ] + } + ], "source": [ "# [ ] compelete the task\n", - "\n" + "! curl https://raw.githubusercontent.com/MicrosoftLearning/intropython/master/cities -o cities.txt\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 53, "metadata": {}, - "outputs": [], - "source": [] + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Beijing\n", + "Cairo\n", + "London\n", + "Nairobi\n", + "New York City\n", + "Sydney\n", + "Tokyo\n", + "\n", + "BCLNNYCST\n" + ] + } + ], + "source": [ + "cities_file = open('cities.txt', 'r')\n", + "\n", + "cities = cities_file.read()\n", + "print(cities)\n", + "\n", + "cities_file.close()\n", + "\n", + "initials = \"\"\n", + "\n", + "for char in cities:\n", + " if char.isupper():\n", + " initials += char\n", + "\n", + " elif char == \"]\\n\":\n", + " initials += char\n", + "\n", + "print(initials)\n", + "\n" + ] }, { "cell_type": "markdown", @@ -556,11 +866,23 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 54, "metadata": { "scrolled": false }, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " % Total % Received % Xferd Average Speed Time Time Time Current\n", + " Dload Upload Total Spent Left Speed\n", + "\n", + " 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\n", + "100 56 100 56 0 0 214 0 --:--:-- --:--:-- --:--:-- 215\n" + ] + } + ], "source": [ "# [ ] Run to download file to notebook\n", "!curl https://raw.githubusercontent.com/MicrosoftLearning/intropython/master/poem1.txt -o poem1.txt" @@ -568,9 +890,26 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 55, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "['Loops I repeat\\n',\n", + " 'loops\\n',\n", + " 'loops\\n',\n", + " 'loops\\n',\n", + " 'I repeat\\n',\n", + " 'until I\\n',\n", + " 'break\\n']" + ] + }, + "execution_count": 55, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# [ ] review and run example\n", "# open address to file\n", @@ -583,9 +922,30 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 56, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Loops I repeat\n", + "\n", + "loops\n", + "\n", + "loops\n", + "\n", + "loops\n", + "\n", + "I repeat\n", + "\n", + "until I\n", + "\n", + "break\n", + "\n" + ] + } + ], "source": [ "# [ ] review and run example\n", "for line in poem_lines:\n", @@ -613,32 +973,68 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 57, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " % Total % Received % Xferd Average Speed Time Time Time Current\n", + " Dload Upload Total Spent Left Speed\n", + "\n", + " 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\n", + "100 56 100 56 0 0 211 0 --:--:-- --:--:-- --:--:-- 212\n" + ] + } + ], "source": [ "# [ ] import cities\n", - "\n" + "! Curl https://raw.githubusercontent.com/MicrosoftLearning/intropython/master/cities -o cities.txt\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 61, "metadata": {}, "outputs": [], "source": [ "# [ ] open cities.txt as cities_file and read the file as a list: cities_lines\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "cities_file = open(\"cities.txt\", 'r')\n", + "cities_lines = cities_file.readlines()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 62, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Beijing\n", + "\n", + "Cairo\n", + "\n", + "London\n", + "\n", + "Nairobi\n", + "\n", + "New York City\n", + "\n", + "Sydney\n", + "\n", + "Tokyo\n", + "\n" + ] + } + ], "source": [ "# [ ] use list iteration to print each city in cities_lines list\n", - "\n" + "\n", + "for city in cities_lines:\n", + " print(city)" ] }, { @@ -677,9 +1073,17 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 91, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['Loops I repeat\\n', 'loops\\n', 'loops\\n', 'loops\\n', 'I repeat\\n', 'until I\\n', 'break\\n']\n" + ] + } + ], "source": [ "# [ ] review and run examples\n", "# [ ] re-open file and read file as a list of strings\n", @@ -690,20 +1094,42 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 92, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Loops I repeat\n", + "loops\n", + "loops\n", + "loops\n", + "I repeat\n", + "until I\n", + "break\n" + ] + } + ], "source": [ "# [ ] print each list item \n", "for line in poem_lines:\n", - " print(line)" + " print(line, end=\"\")" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 94, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['Loops I repeat', 'loops', 'loops', 'loops', 'I repeat', 'until I', 'break']\n" + ] + } + ], "source": [ "# [ ] remove the last character of each list item, which is \"\\n\"\n", "count = 0\n", @@ -717,9 +1143,23 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 96, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Loops I repeat\n", + "loops\n", + "loops\n", + "loops\n", + "I repeat\n", + "until I\n", + "break\n" + ] + } + ], "source": [ "# [ ] print each list item \n", "for line in poem_lines:\n", @@ -742,32 +1182,55 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 97, "metadata": {}, "outputs": [], "source": [ "# [ ] re-open file and read file as a list of strings \n", "# [ ] open cities.txt as cities_file and read the file as a list: cities_lines\n", - "\n" + "\n", + "cities_file = open(\"cities.txt\", 'r')\n", + "cities_lines = cities_file.readlines()\n", + "cities_file.close()" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 98, "metadata": {}, "outputs": [], "source": [ "# [ ] remove the last character, \"\\n\", of each cities_lines list item \n", - "\n" + "\n", + "cities_stripped = []\n", + "for city in cities_lines:\n", + " # Use .strip() to remove the newline character (and any other whitespace)\n", + " cities_stripped.append(city.strip())" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 99, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Beijing\n", + "Cairo\n", + "London\n", + "Nairobi\n", + "New York City\n", + "Sydney\n", + "Tokyo\n" + ] + } + ], "source": [ - "# [ ] print each list item in cities_lines\n" + "# [ ] print each list item in cities_lines\n", + "for city in cities_stripped:\n", + " print(city)" ] }, { @@ -2437,7 +2900,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.8" + "version": "3.13.7" } }, "nbformat": 4, diff --git a/P2 Python Fundamentals/cities.txt b/P2 Python Fundamentals/cities.txt new file mode 100644 index 0000000..c91f881 --- /dev/null +++ b/P2 Python Fundamentals/cities.txt @@ -0,0 +1,7 @@ +Beijing +Cairo +London +Nairobi +New York City +Sydney +Tokyo diff --git a/P2 Python Fundamentals/digits_of_pi.txt b/P2 Python Fundamentals/digits_of_pi.txt new file mode 100644 index 0000000..8577145 --- /dev/null +++ b/P2 Python Fundamentals/digits_of_pi.txt @@ -0,0 +1 @@ +3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067982148086513282306647093844609550582231725359408128481117450284102701938521105559644622948954930381964428810975665933446128475648233786783165271201909145648566923460348610454326648213393607260249141273 diff --git a/P2 Python Fundamentals/poem1.txt b/P2 Python Fundamentals/poem1.txt new file mode 100644 index 0000000..d8d57e3 --- /dev/null +++ b/P2 Python Fundamentals/poem1.txt @@ -0,0 +1,7 @@ +Loops I repeat +loops +loops +loops +I repeat +until I +break diff --git a/Python Intro to Pandas.ipynb b/Python Intro to Pandas.ipynb new file mode 100644 index 0000000..960efb1 --- /dev/null +++ b/Python Intro to Pandas.ipynb @@ -0,0 +1,2885 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 2, + "id": "57d270e7", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "^C\n", + "Note: you may need to restart the kernel to use updated packages.\n" + ] + } + ], + "source": [ + "pip install pandas" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "3d285a9b", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "import pandas as pd #import the pandas package\n", + "import os " + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "38874ba8", + "metadata": {}, + "outputs": [], + "source": [ + "fileName='Baby_Names.csv'\n", + "filePath=r'C:\\Users\\benjamin.reed\\Downloads'\n", + "file=os.path.join(filePath,fileName) #create a file reference for the file you want to import" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "81085702", + "metadata": {}, + "outputs": [], + "source": [ + "df=pd.read_csv(file) #read the csv file into a pandas dataframe" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "9054d31e", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Index(['state', 'gender', 'year', 'name', 'number'], dtype='object')" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.columns #display the columns" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "4817e8bc", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(1032683, 5)" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.shape #display the shape, rows and columns" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "bc2bbf13", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
stategenderyearnamenumber
0AKF2010Sophia62
1AKF2010Emma51
2AKF2010Isabella51
3AKF2010Olivia44
4AKF2010Ava33
\n", + "
" + ], + "text/plain": [ + " state gender year name number\n", + "0 AK F 2010 Sophia 62\n", + "1 AK F 2010 Emma 51\n", + "2 AK F 2010 Isabella 51\n", + "3 AK F 2010 Olivia 44\n", + "4 AK F 2010 Ava 33" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.head(5) #show first 5 records" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "f03f51c0", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
stategenderyearnamenumber
41729CAF2012Sophia3644
37735CAF2011Sophia3569
45830CAF2013Sophia3468
33638CAF2010Isabella3370
33639CAF2010Sophia3361
\n", + "
" + ], + "text/plain": [ + " state gender year name number\n", + "41729 CA F 2012 Sophia 3644\n", + "37735 CA F 2011 Sophia 3569\n", + "45830 CA F 2013 Sophia 3468\n", + "33638 CA F 2010 Isabella 3370\n", + "33639 CA F 2010 Sophia 3361" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.nlargest(5,'number') #show largest 5 records for column 'number'" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "229e30bc", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
stategenderyearnamenumber
175AKF2010Alayna5
176AKF2010Alicia5
177AKF2010Aliyah5
178AKF2010Amber5
179AKF2010Andrea5
\n", + "
" + ], + "text/plain": [ + " state gender year name number\n", + "175 AK F 2010 Alayna 5\n", + "176 AK F 2010 Alicia 5\n", + "177 AK F 2010 Aliyah 5\n", + "178 AK F 2010 Amber 5\n", + "179 AK F 2010 Andrea 5" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.nsmallest(5,'number') #show smallest 5 records for column 'number'" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "d3eda148", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(1032683, 5)" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.shape #rows,columns" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "cb6bf3ea", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Index(['state', 'gender', 'year', 'name', 'number'], dtype='object')" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.columns #list the column names" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "70192f41", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "state object\n", + "gender object\n", + "year int64\n", + "name object\n", + "number int64\n", + "dtype: object" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.dtypes #list the datatypes" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "792ad3f7", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
yearnumber
count1.032683e+061.032683e+06
mean2.015006e+033.231653e+01
std3.151887e+008.475111e+01
min2.010000e+035.000000e+00
25%2.012000e+037.000000e+00
50%2.015000e+031.100000e+01
75%2.018000e+032.500000e+01
max2.020000e+033.644000e+03
\n", + "
" + ], + "text/plain": [ + " year number\n", + "count 1.032683e+06 1.032683e+06\n", + "mean 2.015006e+03 3.231653e+01\n", + "std 3.151887e+00 8.475111e+01\n", + "min 2.010000e+03 5.000000e+00\n", + "25% 2.012000e+03 7.000000e+00\n", + "50% 2.015000e+03 1.100000e+01\n", + "75% 2.018000e+03 2.500000e+01\n", + "max 2.020000e+03 3.644000e+03" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.describe() #get the stats for all numeric fields" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "e9fbce12", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
stategenderyearnamenumber
0AKF2010Sophia62
1AKF2010Emma51
2AKF2010Isabella51
3AKF2010Olivia44
4AKF2010Ava33
..................
1032678WYM2020Simon5
1032679WYM2020Sterling5
1032680WYM2020Stetson5
1032681WYM2020Timothy5
1032682WYM2020Wesley5
\n", + "

1032683 rows × 5 columns

\n", + "
" + ], + "text/plain": [ + " state gender year name number\n", + "0 AK F 2010 Sophia 62\n", + "1 AK F 2010 Emma 51\n", + "2 AK F 2010 Isabella 51\n", + "3 AK F 2010 Olivia 44\n", + "4 AK F 2010 Ava 33\n", + "... ... ... ... ... ...\n", + "1032678 WY M 2020 Simon 5\n", + "1032679 WY M 2020 Sterling 5\n", + "1032680 WY M 2020 Stetson 5\n", + "1032681 WY M 2020 Timothy 5\n", + "1032682 WY M 2020 Wesley 5\n", + "\n", + "[1032683 rows x 5 columns]" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "944eb35e", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "year\n", + "2016 95357\n", + "2015 95214\n", + "2014 94782\n", + "2017 94449\n", + "2018 94060\n", + "2019 93961\n", + "2010 93424\n", + "2012 93237\n", + "2013 93052\n", + "2011 92707\n", + "2020 92440\n", + "Name: count, dtype: int64" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df['year'].value_counts() #get the number of rows for each value" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "0c347930", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0 2010\n", + "1 2010\n", + "2 2010\n", + "3 2010\n", + "4 2010\n", + " ... \n", + "1032678 2020\n", + "1032679 2020\n", + "1032680 2020\n", + "1032681 2020\n", + "1032682 2020\n", + "Name: year, Length: 1032683, dtype: int64" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df['year'] #return a single column from the dataframe, this is refered to as a 'series'" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "03c8a1f1", + "metadata": {}, + "outputs": [], + "source": [ + "years=df['year'].tolist() #create a list of all the years in the dataframe" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "c2dfe256", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2010,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2011,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2012,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2013,\n", + " 2014,\n", + " 2014,\n", + " 2014,\n", + " 2014,\n", + " 2014,\n", + " 2014,\n", + " 2014,\n", + " 2014,\n", + " 2014,\n", + " 2014,\n", + " 2014,\n", + " 2014,\n", + " 2014,\n", + " 2014,\n", + " 2014,\n", + " 2014,\n", + " 2014,\n", + " 2014,\n", + " 2014,\n", + " 2014,\n", + " 2014,\n", + " 2014,\n", + " 2014,\n", + " 2014,\n", + " 2014,\n", + " 2014,\n", + " 2014,\n", + " 2014,\n", + " 2014,\n", + " 2014,\n", + " 2014,\n", + " 2014,\n", + " 2014,\n", + " 2014,\n", + " 2014,\n", + " 2014,\n", + " 2014,\n", + " 2014,\n", + " 2014,\n", + " 2014,\n", + " 2014,\n", + " 2014,\n", + " 2014,\n", + " 2014,\n", + " 2014,\n", + " 2014,\n", + " 2014,\n", + " 2014,\n", + " 2014,\n", + " 2014,\n", + " 2014,\n", + " 2014,\n", + " 2014,\n", + " 2014,\n", + " 2014,\n", + " 2014,\n", + " 2014,\n", + " 2014,\n", + " 2014,\n", + " 2014,\n", + " 2014,\n", + " 2014,\n", + " 2014,\n", + " 2014,\n", + " 2014,\n", + " 2014,\n", + " 2014,\n", + " 2014,\n", + " 2014,\n", + " 2014,\n", + " 2014,\n", + " 2014,\n", + " 2014,\n", + " 2014,\n", + " 2014,\n", + " 2014,\n", + " 2014,\n", + " 2014,\n", + " 2014,\n", + " 2014,\n", + " 2014,\n", + " 2014,\n", + " 2014,\n", + " 2014,\n", + " 2014,\n", + " 2014,\n", + " 2014,\n", + " 2014,\n", + " 2014,\n", + " 2014,\n", + " 2014,\n", + " 2014,\n", + " 2014,\n", + " 2014,\n", + " 2014,\n", + " 2014,\n", + " 2014,\n", + " 2014,\n", + " 2014,\n", + " 2014,\n", + " 2014,\n", + " ...]" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "years" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "65e09d95", + "metadata": {}, + "outputs": [], + "source": [ + "years=df['year'].drop_duplicates().tolist() #drop the duplicates and then put in a list" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "0b5aff21", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0 2010\n", + "1 2011\n", + "2 2012\n", + "3 2013\n", + "4 2014\n", + "5 2015\n", + "6 2016\n", + "7 2017\n", + "8 2018\n", + "9 2019\n", + "10 2020\n" + ] + } + ], + "source": [ + "for i,y in enumerate(years):\n", + " print(i,y)" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "c27a0744", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
stategenderyearnamenumber
0AKF2010Sophia62
1AKF2010Emma51
2AKF2010Isabella51
3AKF2010Olivia44
4AKF2010Ava33
..................
1032678WYM2020Simon5
1032679WYM2020Sterling5
1032680WYM2020Stetson5
1032681WYM2020Timothy5
1032682WYM2020Wesley5
\n", + "

1032683 rows × 5 columns

\n", + "
" + ], + "text/plain": [ + " state gender year name number\n", + "0 AK F 2010 Sophia 62\n", + "1 AK F 2010 Emma 51\n", + "2 AK F 2010 Isabella 51\n", + "3 AK F 2010 Olivia 44\n", + "4 AK F 2010 Ava 33\n", + "... ... ... ... ... ...\n", + "1032678 WY M 2020 Simon 5\n", + "1032679 WY M 2020 Sterling 5\n", + "1032680 WY M 2020 Stetson 5\n", + "1032681 WY M 2020 Timothy 5\n", + "1032682 WY M 2020 Wesley 5\n", + "\n", + "[1032683 rows x 5 columns]" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "41b62d4f", + "metadata": {}, + "outputs": [], + "source": [ + "#here is a dictionary that maps state abbreviations to state names\n", + "states = {\n", + " 'AK': 'Alaska',\n", + " 'AL': 'Alabama',\n", + " 'AR': 'Arkansas',\n", + " 'AZ': 'Arizona',\n", + " 'CA': 'California',\n", + " 'CO': 'Colorado',\n", + " 'CT': 'Connecticut',\n", + " 'DC': 'District of Columbia',\n", + " 'DE': 'Delaware',\n", + " 'FL': 'Florida',\n", + " 'GA': 'Georgia',\n", + " 'HI': 'Hawaii',\n", + " 'IA': 'Iowa',\n", + " 'ID': 'Idaho',\n", + " 'IL': 'Illinois',\n", + " 'IN': 'Indiana',\n", + " 'KS': 'Kansas',\n", + " 'KY': 'Kentucky',\n", + " 'LA': 'Louisiana',\n", + " 'MA': 'Massachusetts',\n", + " 'MD': 'Maryland',\n", + " 'ME': 'Maine',\n", + " 'MI': 'Michigan',\n", + " 'MN': 'Minnesota',\n", + " 'MO': 'Missouri',\n", + " 'MS': 'Mississippi',\n", + " 'MT': 'Montana',\n", + " 'NC': 'North Carolina',\n", + " 'ND': 'North Dakota',\n", + " 'NE': 'Nebraska',\n", + " 'NH': 'New Hampshire',\n", + " 'NJ': 'New Jersey',\n", + " 'NM': 'New Mexico',\n", + " 'NV': 'Nevada',\n", + " 'NY': 'New York',\n", + " 'OH': 'Ohio',\n", + " 'OK': 'Oklahoma',\n", + " 'OR': 'Oregon',\n", + " 'PA': 'Pennsylvania',\n", + " 'RI': 'Rhode Island',\n", + " 'SC': 'South Carolina',\n", + " 'SD': 'South Dakota',\n", + " 'TN': 'Tennessee',\n", + " 'TX': 'Texas',\n", + " 'UT': 'Utah',\n", + " 'VA': 'Virginia',\n", + " 'VT': 'Vermont',\n", + " 'WA': 'Washington',\n", + " 'WI': 'Wisconsin',\n", + " 'WV': 'West Virginia',\n", + " 'WY': 'Wyoming'\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "04140052", + "metadata": {}, + "outputs": [], + "source": [ + "df['state']=df['state'].map(states) #replace the abbreviation with the full name in the 'state' column" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "e6a43188", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
stategenderyearnamenumber
0AlaskaF2010Sophia62
1AlaskaF2010Emma51
2AlaskaF2010Isabella51
3AlaskaF2010Olivia44
4AlaskaF2010Ava33
..................
1032678WyomingM2020Simon5
1032679WyomingM2020Sterling5
1032680WyomingM2020Stetson5
1032681WyomingM2020Timothy5
1032682WyomingM2020Wesley5
\n", + "

1032683 rows × 5 columns

\n", + "
" + ], + "text/plain": [ + " state gender year name number\n", + "0 Alaska F 2010 Sophia 62\n", + "1 Alaska F 2010 Emma 51\n", + "2 Alaska F 2010 Isabella 51\n", + "3 Alaska F 2010 Olivia 44\n", + "4 Alaska F 2010 Ava 33\n", + "... ... ... ... ... ...\n", + "1032678 Wyoming M 2020 Simon 5\n", + "1032679 Wyoming M 2020 Sterling 5\n", + "1032680 Wyoming M 2020 Stetson 5\n", + "1032681 Wyoming M 2020 Timothy 5\n", + "1032682 Wyoming M 2020 Wesley 5\n", + "\n", + "[1032683 rows x 5 columns]" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "385b7188", + "metadata": {}, + "outputs": [], + "source": [ + "df['gender']=df['gender'].map({'F' : 'FEMALE','M' : 'MALE'}) #update the gender column" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "3e80b4a1", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "gender\n", + "FEMALE 558670\n", + "MALE 474013\n", + "Name: count, dtype: int64" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df['gender'].value_counts()" + ] + }, + { + "cell_type": "markdown", + "id": "f98257f6", + "metadata": {}, + "source": [ + "Filtering" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "fb1c6dc4", + "metadata": {}, + "outputs": [], + "source": [ + "df_female=df.query(\"gender=='FEMALE'\") #filter on FEMALE" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "b6599745", + "metadata": {}, + "outputs": [], + "source": [ + "df_female=df.query(\"gender=='FEMALE' and state=='Georgia'\") #filter on FEMALE and Georgia" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "28383c29", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
stategenderyearnamenumber
125950GeorgiaFEMALE2010Isabella570
125951GeorgiaFEMALE2010Madison525
125952GeorgiaFEMALE2010Emma522
125953GeorgiaFEMALE2010Abigail463
125954GeorgiaFEMALE2010Olivia458
..................
145025GeorgiaFEMALE2020Zenobia5
145026GeorgiaFEMALE2020Zori5
145027GeorgiaFEMALE2020Zoriah5
145028GeorgiaFEMALE2020Zyla5
145029GeorgiaFEMALE2020Zylah5
\n", + "

19080 rows × 5 columns

\n", + "
" + ], + "text/plain": [ + " state gender year name number\n", + "125950 Georgia FEMALE 2010 Isabella 570\n", + "125951 Georgia FEMALE 2010 Madison 525\n", + "125952 Georgia FEMALE 2010 Emma 522\n", + "125953 Georgia FEMALE 2010 Abigail 463\n", + "125954 Georgia FEMALE 2010 Olivia 458\n", + "... ... ... ... ... ...\n", + "145025 Georgia FEMALE 2020 Zenobia 5\n", + "145026 Georgia FEMALE 2020 Zori 5\n", + "145027 Georgia FEMALE 2020 Zoriah 5\n", + "145028 Georgia FEMALE 2020 Zyla 5\n", + "145029 Georgia FEMALE 2020 Zylah 5\n", + "\n", + "[19080 rows x 5 columns]" + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_female" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "3e36eabc", + "metadata": {}, + "outputs": [], + "source": [ + "df['state']=df['state'].apply(lambda x : x.upper()) #convert state values to uppercase" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "53692ff6", + "metadata": {}, + "outputs": [], + "source": [ + "df.sort_values(by=['state','gender','name'],inplace=True) #sort the dataframe" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "2a32b3e6", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
stategenderyearnamenumber
2398ALABAMAFEMALE2010Aaliyah70
3303ALABAMAFEMALE2011Aaliyah88
4235ALABAMAFEMALE2012Aaliyah64
5081ALABAMAFEMALE2013Aaliyah83
5966ALABAMAFEMALE2014Aaliyah86
..................
1031948WYOMINGMALE2015Zayden6
1032081WYOMINGMALE2016Zayden7
1032212WYOMINGMALE2017Zayden8
1032337WYOMINGMALE2018Zayden9
1031428WYOMINGMALE2012Zayne5
\n", + "

1032683 rows × 5 columns

\n", + "
" + ], + "text/plain": [ + " state gender year name number\n", + "2398 ALABAMA FEMALE 2010 Aaliyah 70\n", + "3303 ALABAMA FEMALE 2011 Aaliyah 88\n", + "4235 ALABAMA FEMALE 2012 Aaliyah 64\n", + "5081 ALABAMA FEMALE 2013 Aaliyah 83\n", + "5966 ALABAMA FEMALE 2014 Aaliyah 86\n", + "... ... ... ... ... ...\n", + "1031948 WYOMING MALE 2015 Zayden 6\n", + "1032081 WYOMING MALE 2016 Zayden 7\n", + "1032212 WYOMING MALE 2017 Zayden 8\n", + "1032337 WYOMING MALE 2018 Zayden 9\n", + "1031428 WYOMING MALE 2012 Zayne 5\n", + "\n", + "[1032683 rows x 5 columns]" + ] + }, + "execution_count": 34, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "id": "0e2d4809", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Collecting openpyxl\n", + " Downloading openpyxl-3.1.5-py2.py3-none-any.whl.metadata (2.5 kB)\n", + "Collecting et-xmlfile (from openpyxl)\n", + " Downloading et_xmlfile-2.0.0-py3-none-any.whl.metadata (2.7 kB)\n", + "Downloading openpyxl-3.1.5-py2.py3-none-any.whl (250 kB)\n", + "Downloading et_xmlfile-2.0.0-py3-none-any.whl (18 kB)\n", + "Installing collected packages: et-xmlfile, openpyxl\n", + "\n", + " -------------------- ------------------- 1/2 [openpyxl]\n", + " -------------------- ------------------- 1/2 [openpyxl]\n", + " -------------------- ------------------- 1/2 [openpyxl]\n", + " -------------------- ------------------- 1/2 [openpyxl]\n", + " -------------------- ------------------- 1/2 [openpyxl]\n", + " -------------------- ------------------- 1/2 [openpyxl]\n", + " -------------------- ------------------- 1/2 [openpyxl]\n", + " -------------------- ------------------- 1/2 [openpyxl]\n", + " -------------------- ------------------- 1/2 [openpyxl]\n", + " -------------------- ------------------- 1/2 [openpyxl]\n", + " -------------------- ------------------- 1/2 [openpyxl]\n", + " -------------------- ------------------- 1/2 [openpyxl]\n", + " -------------------- ------------------- 1/2 [openpyxl]\n", + " -------------------- ------------------- 1/2 [openpyxl]\n", + " -------------------- ------------------- 1/2 [openpyxl]\n", + " -------------------- ------------------- 1/2 [openpyxl]\n", + " -------------------- ------------------- 1/2 [openpyxl]\n", + " -------------------- ------------------- 1/2 [openpyxl]\n", + " -------------------- ------------------- 1/2 [openpyxl]\n", + " ---------------------------------------- 2/2 [openpyxl]\n", + "\n", + "Successfully installed et-xmlfile-2.0.0 openpyxl-3.1.5\n", + "Note: you may need to restart the kernel to use updated packages.\n" + ] + } + ], + "source": [ + "pip install openpyxl" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "id": "37dc22c2", + "metadata": {}, + "outputs": [], + "source": [ + "xlr=pd.ExcelWriter(os.path.join(filePath,'babynames_by_year.xlsx')) #create a placeholder for an Excel file" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "id": "8f70533c", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "year==2010\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\benjamin.reed\\AppData\\Local\\Temp\\ipykernel_22704\\469401706.py:5: FutureWarning: Starting with pandas version 3.0 all arguments of to_excel except for the argument 'excel_writer' will be keyword-only.\n", + " df_temp.to_excel(xlr,str(y),index=False) #push the temporary dataframe to a tab in the Excel file\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "year==2011\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\benjamin.reed\\AppData\\Local\\Temp\\ipykernel_22704\\469401706.py:5: FutureWarning: Starting with pandas version 3.0 all arguments of to_excel except for the argument 'excel_writer' will be keyword-only.\n", + " df_temp.to_excel(xlr,str(y),index=False) #push the temporary dataframe to a tab in the Excel file\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "year==2012\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\benjamin.reed\\AppData\\Local\\Temp\\ipykernel_22704\\469401706.py:5: FutureWarning: Starting with pandas version 3.0 all arguments of to_excel except for the argument 'excel_writer' will be keyword-only.\n", + " df_temp.to_excel(xlr,str(y),index=False) #push the temporary dataframe to a tab in the Excel file\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "year==2013\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\benjamin.reed\\AppData\\Local\\Temp\\ipykernel_22704\\469401706.py:5: FutureWarning: Starting with pandas version 3.0 all arguments of to_excel except for the argument 'excel_writer' will be keyword-only.\n", + " df_temp.to_excel(xlr,str(y),index=False) #push the temporary dataframe to a tab in the Excel file\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "year==2014\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\benjamin.reed\\AppData\\Local\\Temp\\ipykernel_22704\\469401706.py:5: FutureWarning: Starting with pandas version 3.0 all arguments of to_excel except for the argument 'excel_writer' will be keyword-only.\n", + " df_temp.to_excel(xlr,str(y),index=False) #push the temporary dataframe to a tab in the Excel file\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "year==2015\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\benjamin.reed\\AppData\\Local\\Temp\\ipykernel_22704\\469401706.py:5: FutureWarning: Starting with pandas version 3.0 all arguments of to_excel except for the argument 'excel_writer' will be keyword-only.\n", + " df_temp.to_excel(xlr,str(y),index=False) #push the temporary dataframe to a tab in the Excel file\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "year==2016\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\benjamin.reed\\AppData\\Local\\Temp\\ipykernel_22704\\469401706.py:5: FutureWarning: Starting with pandas version 3.0 all arguments of to_excel except for the argument 'excel_writer' will be keyword-only.\n", + " df_temp.to_excel(xlr,str(y),index=False) #push the temporary dataframe to a tab in the Excel file\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "year==2017\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\benjamin.reed\\AppData\\Local\\Temp\\ipykernel_22704\\469401706.py:5: FutureWarning: Starting with pandas version 3.0 all arguments of to_excel except for the argument 'excel_writer' will be keyword-only.\n", + " df_temp.to_excel(xlr,str(y),index=False) #push the temporary dataframe to a tab in the Excel file\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "year==2018\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\benjamin.reed\\AppData\\Local\\Temp\\ipykernel_22704\\469401706.py:5: FutureWarning: Starting with pandas version 3.0 all arguments of to_excel except for the argument 'excel_writer' will be keyword-only.\n", + " df_temp.to_excel(xlr,str(y),index=False) #push the temporary dataframe to a tab in the Excel file\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "year==2019\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\benjamin.reed\\AppData\\Local\\Temp\\ipykernel_22704\\469401706.py:5: FutureWarning: Starting with pandas version 3.0 all arguments of to_excel except for the argument 'excel_writer' will be keyword-only.\n", + " df_temp.to_excel(xlr,str(y),index=False) #push the temporary dataframe to a tab in the Excel file\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "year==2020\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\benjamin.reed\\AppData\\Local\\Temp\\ipykernel_22704\\469401706.py:5: FutureWarning: Starting with pandas version 3.0 all arguments of to_excel except for the argument 'excel_writer' will be keyword-only.\n", + " df_temp.to_excel(xlr,str(y),index=False) #push the temporary dataframe to a tab in the Excel file\n" + ] + } + ], + "source": [ + "for y in years: #loop through each year\n", + " criteria=f\"year=={y}\" #create a criteria for each year\n", + " print(criteria)\n", + " df_temp=df.query(criteria) #create a temporary dataframe for each year\n", + " df_temp.to_excel(xlr,str(y),index=False) #push the temporary dataframe to a tab in the Excel file\n", + "xlr.close() #save the Excel file" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f4e8b8ff", + "metadata": {}, + "outputs": [], + "source": [ + "df_pivot=pd.pivot_table(data=df,values=['number'],columns=['gender'],aggfunc='sum') #create a pivot table" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.13.7" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From a7722db543d7633f37aa2087c7e9b8c4ac61a704 Mon Sep 17 00:00:00 2001 From: Benjamin Reed Date: Mon, 27 Oct 2025 12:56:26 -0400 Subject: [PATCH 30/36] P2M4 work --- ..._Tutorials_Files_Python_Fundamentals.ipynb | 1256 ++++++++++++++--- ...ule_4.1_Practice_Python_Fundamentals.ipynb | 228 ++- ....2_Required_Code_Python_Fundamentals.ipynb | 53 +- P2 Python Fundamentals/cities_messy.txt | 7 + P2 Python Fundamentals/code_tips.txt | 4 + P2 Python Fundamentals/count_file.txt | 1 + P2 Python Fundamentals/days.txt | 7 + P2 Python Fundamentals/inner_planets.txt | 4 + P2 Python Fundamentals/log_file.txt | 3 + P2 Python Fundamentals/mean_temp.txt | 10 + P2 Python Fundamentals/new_file.txt | 2 + P2 Python Fundamentals/outer_planets.txt | 4 + P2 Python Fundamentals/pi.txt | 1 + P2 Python Fundamentals/poem2.txt | 9 + P2 Python Fundamentals/poem2_messy.txt | 9 + P2 Python Fundamentals/rainbow.txt | 7 + P2 Python Fundamentals/rainbow_messy.txt | 7 + P2 Python Fundamentals/task4_file.txt | 8 + P2 Python Fundamentals/task5_file.txt | 10 + P2M4BenjaminReed.py | 34 + Python Intro to Pandas.ipynb | 193 ++- mean_temp.txt | 9 + poemJUSTNOW.txt | 7 + 23 files changed, 1572 insertions(+), 301 deletions(-) create mode 100644 P2 Python Fundamentals/cities_messy.txt create mode 100644 P2 Python Fundamentals/code_tips.txt create mode 100644 P2 Python Fundamentals/count_file.txt create mode 100644 P2 Python Fundamentals/days.txt create mode 100644 P2 Python Fundamentals/inner_planets.txt create mode 100644 P2 Python Fundamentals/log_file.txt create mode 100644 P2 Python Fundamentals/mean_temp.txt create mode 100644 P2 Python Fundamentals/new_file.txt create mode 100644 P2 Python Fundamentals/outer_planets.txt create mode 100644 P2 Python Fundamentals/pi.txt create mode 100644 P2 Python Fundamentals/poem2.txt create mode 100644 P2 Python Fundamentals/poem2_messy.txt create mode 100644 P2 Python Fundamentals/rainbow.txt create mode 100644 P2 Python Fundamentals/rainbow_messy.txt create mode 100644 P2 Python Fundamentals/task4_file.txt create mode 100644 P2 Python Fundamentals/task5_file.txt create mode 100644 P2M4BenjaminReed.py create mode 100644 mean_temp.txt create mode 100644 poemJUSTNOW.txt diff --git a/P2 Python Fundamentals/Module_4.0_Tutorials_Files_Python_Fundamentals.ipynb b/P2 Python Fundamentals/Module_4.0_Tutorials_Files_Python_Fundamentals.ipynb index f94bda6..8bfc618 100644 --- a/P2 Python Fundamentals/Module_4.0_Tutorials_Files_Python_Fundamentals.ipynb +++ b/P2 Python Fundamentals/Module_4.0_Tutorials_Files_Python_Fundamentals.ipynb @@ -973,7 +973,7 @@ }, { "cell_type": "code", - "execution_count": 57, + "execution_count": 7, "metadata": {}, "outputs": [ { @@ -984,7 +984,7 @@ " Dload Upload Total Spent Left Speed\n", "\n", " 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\n", - "100 56 100 56 0 0 211 0 --:--:-- --:--:-- --:--:-- 212\n" + "100 56 100 56 0 0 210 0 --:--:-- --:--:-- --:--:-- 211\n" ] } ], @@ -1260,9 +1260,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "False" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# [ ] review and run example: open and readlines of poem1.txt\n", "poem1 = open('poem1.txt', 'r')\n", @@ -1271,9 +1282,17 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['Loops I repeat\\n', 'loops\\n', 'loops\\n', 'loops\\n', 'I repeat\\n', 'until I\\n', 'break\\n']\n" + ] + } + ], "source": [ "# [ ] review and run example: readlines breaks if file is no longer open\n", "\n", @@ -1283,9 +1302,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# [ ] review and run example: Close poem1\n", "poem1.close()\n", @@ -1311,51 +1341,95 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 17, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "<_io.TextIOWrapper name='cities.txt' mode='r' encoding='cp1252'>\n" + ] + } + ], "source": [ "# [ ] open cities.txt as cities_file\n", - "\n" + "cities_file = open('cities.txt', 'r')\n", + "print(cities_file)\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 18, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['Beijing\\n', 'Cairo\\n', 'London\\n', 'Nairobi\\n', 'New York City\\n', 'Sydney\\n', 'Tokyo\\n']\n" + ] + } + ], "source": [ "# [ ] read the lines as cities_lines\n", - "\n" + "cities_lines = cities_file.readlines()\n", + "print(cities_lines)\n", + "\n", + "cities_file.close()" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 19, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "London\n", + "Nairobi\n", + "New York City\n", + "Sydney\n", + "Tokyo\n" + ] + } + ], "source": [ "# [ ] print the cities that start with the letter \"D\" or greater\n", - "\n" + "for city in cities_lines:\n", + " city_name = city.strip()\n", + "\n", + " if city_name:\n", + " if city_name[0] >= 'D':\n", + " print(city_name)\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 20, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "File closed status: True\n", + "The file is successfully closed.\n" + ] + } + ], "source": [ "# [ ] test that file is closed\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# [ ] close cities_file\n", + "is_closed = cities_file.closed\n", + "print(f'File closed status: {is_closed}')\n", + " \n", + "if is_closed:\n", + " print('The file is successfully closed.')\n", + " \n", + "else:\n", + " print('The file is still open.')\n", "\n" ] }, @@ -1378,52 +1452,116 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 21, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " % Total % Received % Xferd Average Speed Time Time Time Current\n", + " Dload Upload Total Spent Left Speed\n", + "\n", + " 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\n", + "100 57 100 57 0 0 355 0 --:--:-- --:--:-- --:--:-- 360\n" + ] + } + ], "source": [ "# [ ] import https://raw.githubusercontent.com/MicrosoftLearning/intropython/master/poem2.txt as poem2.txt\n", - "\n" + "\n", + "! curl https://raw.githubusercontent.com/MicrosoftLearning/intropython/master/poem2.txt -o poem2.txt" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 32, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "<_io.TextIOWrapper name='poem2.txt' mode='r' encoding='cp1252'>\n" + ] + } + ], "source": [ "# [ ] open poem2.txt as poem2_text in read mode\n", - "\n" + "poem2_text = open(\"poem2.txt\", \"r\")\n", + "print(poem2_text)\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 33, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['while True\\n', 'I loop\\n', 'True\\n', 'loop\\n', 'True\\n', 'loop\\n', 'not True\\n', 'False\\n', 'end\\n']\n" + ] + } + ], "source": [ "# [ ] create a list of strings, called poem2_lines, from each line of poem2_text\n", + "poem2_lines = poem2_text.readlines()\n", + "print(poem2_lines)\n", + "\n", + "poem2_text.close()\n", + "\n", "\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 35, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['while True', 'I loop', 'True', 'loop', 'True', 'loop', 'not True', 'False', 'end']\n" + ] + } + ], "source": [ "# [ ] remove the newline character for each list item in poem2_lines\n", - "\n" + "\n", + "poem2_lines = [line.strip() for line in poem2_lines]\n", + "\n", + "print(poem2_lines)" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 36, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "end\n", + "False\n", + "not True\n", + "loop\n", + "True\n", + "loop\n", + "True\n", + "I loop\n", + "while True\n" + ] + } + ], "source": [ "# [ ] print the poem2 lines in reverse order\n", - "\n" + "\n", + "for line in poem2_lines[::-1]:\n", + " print(line)" ] }, { @@ -1483,9 +1621,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 37, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " % Total % Received % Xferd Average Speed Time Time Time Current\n", + " Dload Upload Total Spent Left Speed\n", + "\n", + " 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\n", + "100 56 100 56 0 0 290 0 --:--:-- --:--:-- --:--:-- 293\n" + ] + } + ], "source": [ "# [ ]Run to download file poem1.txt\n", "!curl https://raw.githubusercontent.com/MicrosoftLearning/intropython/master/poem1.txt -o poem1.txt " @@ -1493,7 +1643,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 38, "metadata": {}, "outputs": [], "source": [ @@ -1504,7 +1654,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 39, "metadata": {}, "outputs": [], "source": [ @@ -1517,9 +1667,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 40, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Loops I repeat\n", + "loops\n", + "loops\n", + "\n" + ] + } + ], "source": [ "# [ ] review and run example: print the first 3 .readline() values\n", "print(poem_line1 + poem_line2 + poem_line3)" @@ -1527,9 +1688,17 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 46, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + } + ], "source": [ "# [ ] review and run example printing return value & re-run several times\n", "print(poem1.readline())" @@ -1537,7 +1706,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 47, "metadata": {}, "outputs": [], "source": [ @@ -1565,53 +1734,92 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 48, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " % Total % Received % Xferd Average Speed Time Time Time Current\n", + " Dload Upload Total Spent Left Speed\n", + "\n", + " 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\n", + " 0 43 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\n", + "100 43 100 43 0 0 154 0 --:--:-- --:--:-- --:--:-- 154\n" + ] + } + ], "source": [ "# [ ] import https://raw.githubusercontent.com/MicrosoftLearning/intropython/master/rainbow as rainbow.txt\n", - "\n" + "\n", + "!curl https://raw.githubusercontent.com/MicrosoftLearning/intropython/master/rainbow -o rainbow.txt" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 52, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "<_io.TextIOWrapper name='rainbow.txt' mode='r' encoding='cp1252'>\n" + ] + } + ], "source": [ - "# [ ] open rainbow.txt as rainbow_text\n" + "# [ ] open rainbow.txt as rainbow_text\n", + "rainbow_text = open(\"rainbow.txt\", \"r\")\n", + "print(rainbow_text)" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 53, "metadata": {}, "outputs": [], "source": [ - "# [ ] read the first 3 lines into variables: color1, color2, color3\n" + "# [ ] read the first 3 lines into variables: color1, color2, color3\n", + "color1 = rainbow_text.readline()\n", + "color2 = rainbow_text.readline()\n", + "color3 = rainbow_text.readline()" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 58, "metadata": {}, "outputs": [], "source": [ - "# [ ] close rainbow.txt\n" + "# [ ] close rainbow.txt\n", + "rainbow_text.close()\n" ] }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# [ ] print the first 3 colors\n", - "\n" - ] - }, - { - "cell_type": "markdown", + "execution_count": 59, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "red\n", + "orange\n", + "yellow\n", + "\n" + ] + } + ], + "source": [ + "# [ ] print the first 3 colors\n", + "print(color1 + color2 + color3)\n" + ] + }, + { + "cell_type": "markdown", "metadata": {}, "source": [ "#  \n", @@ -1640,7 +1848,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 64, "metadata": {}, "outputs": [], "source": [ @@ -1651,9 +1859,23 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 65, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "loops i repeat\n", + "loops\n", + "loops\n", + "loops\n", + "i repeat\n", + "until i\n", + "break\n" + ] + } + ], "source": [ "# [ ] review and run example - use a while loop to read each line of a file \n", "# remove last character ('\\n') and print as upper case\n", @@ -1666,7 +1888,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 66, "metadata": {}, "outputs": [], "source": [ @@ -1693,33 +1915,62 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 68, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "<_io.TextIOWrapper name='rainbow.txt' mode='r' encoding='cp1252'>\n" + ] + } + ], "source": [ "# [ ] open rainbow.txt as rainbow_text as read-only\n", - "\n" + "rainbow_file = open('rainbow.txt', 'r')\n", + "print(rainbow_file)\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 69, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Red\n", + "Orange\n", + "Yellow\n", + "Green\n", + "Blue\n", + "Indigo\n", + "Violet\n" + ] + } + ], "source": [ "# [ ] read the color from lines of rainbow_text in a while loop\n", "# [ ] print each color capitalized as the loop runs\n", - "\n" + "color = rainbow_file.readline()\n", + "\n", + "while color:\n", + " print(color.strip().capitalize())\n", + "\n", + " color = rainbow_file.readline()\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 70, "metadata": {}, "outputs": [], "source": [ "# [ ] close rainbow_text \n", - "\n" + "\n", + "rainbow_file.close()" ] }, { @@ -1747,7 +1998,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 71, "metadata": {}, "outputs": [], "source": [ @@ -1758,9 +2009,30 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 72, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Loops I repeat\n", + "\n", + "loops\n", + "\n", + "loops\n", + "\n", + "loops\n", + "\n", + "I repeat\n", + "\n", + "until I\n", + "\n", + "break\n", + "\n" + ] + } + ], "source": [ "# [ ] review and run example - readline while loop without removing '\\n'\n", "poem_line = poem1.readline()\n", @@ -1781,9 +2053,23 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 73, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Loops I repeat\n", + "loops\n", + "loops\n", + "loops\n", + "I repeat\n", + "until I\n", + "break\n" + ] + } + ], "source": [ "# [ ] review and run example - readline with .strip() to remove '\\n'\n", "poem1 = open('poem1.txt', 'r')\n", @@ -1815,24 +2101,45 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 75, "metadata": {}, "outputs": [], "source": [ "# [ ] open rainbow.txt as rainbow_text as read-only \n", + "rainbow_file = open(\"rainbow.txt\", \"r\")\n", "\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 76, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "RED\n", + "ORANGE\n", + "YELLOW\n", + "GREEN\n", + "BLUE\n", + "INDIGO\n", + "VIOLET\n" + ] + } + ], "source": [ "# [ ] read a color from each line of rainbow_text in a while loop \n", "# use .strip to remove the whitespace '\\n' character \n", "# print each color upper case \n", - "\n" + "color = rainbow_file.readline()\n", + "\n", + "while color:\n", + " print(color.strip().upper())\n", + " color = rainbow_file.readline()\n", + "\n", + "rainbow_file.close()\n" ] }, { @@ -1862,9 +2169,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 77, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " % Total % Received % Xferd Average Speed Time Time Time Current\n", + " Dload Upload Total Spent Left Speed\n", + "\n", + " 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\n", + "100 71 100 71 0 0 292 0 --:--:-- --:--:-- --:--:-- 295\n" + ] + } + ], "source": [ "# [ ] review and run example: import rainbow_messy.txt\n", "!curl https://raw.githubusercontent.com/MicrosoftLearning/intropython/master/rainbow_messy -o rainbow_messy.txt" @@ -1872,7 +2191,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 87, "metadata": {}, "outputs": [], "source": [ @@ -1882,9 +2201,30 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 88, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "**red**\n", + "\n", + "**orange**\n", + "\n", + "**yellow**\n", + "\n", + "**green**\n", + "\n", + "**blue**\n", + "\n", + "**indigo**\n", + "\n", + "**violet**\n", + "\n" + ] + } + ], "source": [ "# [ ] review and run example: .readline() without .strip()\n", "\n", @@ -1897,9 +2237,23 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 89, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "red\n", + "orange\n", + "yellow\n", + "green\n", + "blue\n", + "indigo\n", + "violet\n" + ] + } + ], "source": [ "# [ ] review and run example: strip \"*\" and newline ('\\n')\n", "rainbow_messy = open('rainbow_messy.txt', 'r')\n", @@ -1930,29 +2284,78 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 105, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " % Total % Received % Xferd Average Speed Time Time Time Current\n", + " Dload Upload Total Spent Left Speed\n", + "\n", + " 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\n", + "100 77 100 77 0 0 689 0 --:--:-- --:--:-- --:--:-- 700\n" + ] + } + ], "source": [ - "# [ ] import the file\n" + "# [ ] import the file\n", + "! curl https://raw.githubusercontent.com/MicrosoftLearning/intropython/master/cities_messy -o cities_messy.txt" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 106, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "<_io.TextIOWrapper name='cities_messy.txt' mode='r' encoding='cp1252'>\n", + " Beijing:\n", + "\n" + ] + } + ], "source": [ - "# [ ] run to read the file into memory\n" + "# [ ] run to read the file into memory\n", + "cities_messy_file = open(\"cities_messy.txt\", \"r\")\n", + "print(cities_messy_file)\n", + "\n", + "line = cities_messy_file.readline()\n", + "print(line)" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 107, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Beijing\n", + "Cairo\n", + "London\n", + "Nairobi\n", + "New York City\n", + "Sydney\n", + "Tokyo\n" + ] + } + ], "source": [ - "# [ ] edit the code to remove leading or trailing colon, newline and space characters\n" + "# [ ] edit the code to remove leading or trailing colon, newline and space characters\n", + "while line:\n", + "\n", + " cleaned_city = line.strip(\":\\n \")\n", + " print(cleaned_city)\n", + " line = cities_messy_file.readline()\n", + "\n", + "cities_messy_file.close()" ] }, { @@ -1971,34 +2374,82 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 111, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " % Total % Received % Xferd Average Speed Time Time Time Current\n", + " Dload Upload Total Spent Left Speed\n", + "\n", + " 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\n", + "100 75 100 75 0 0 577 0 --:--:-- --:--:-- --:--:-- 590\n" + ] + } + ], "source": [ "# [ ] import https://raw.githubusercontent.com/MicrosoftLearning/intropython/master/poem2_messy as poem2_messy.txt \n", - "\n" + "\n", + "! curl https://raw.githubusercontent.com/MicrosoftLearning/intropython/master/poem2_messy -o poem2_messy.txt" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 112, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "<_io.TextIOWrapper name='poem2_messy.txt' mode='r' encoding='cp1252'>\n" + ] + } + ], "source": [ "# [ ] open poem2_messy.txt as poem2_messy in read mode\n", - "\n" + "poem2_messy_file = open(\"poem2_messy.txt\", \"r\")\n", + "print(poem2_messy)\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 113, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "while True\n", + "I loop\n", + "True\n", + "loop\n", + "True\n", + "loop\n", + "not True\n", + "False\n", + "end\n" + ] + } + ], "source": [ "# [ ] edit while loop to strip the leading and trailing parentheses, and newlines\n", "# [ ] print the poem \n", "\n", + "line = poem2_messy_file.readline()\n", + "\n", + "while line:\n", + " cleaned_line = line.strip(\"()\\n \")\n", "\n", + " if cleaned_line:\n", + " print(cleaned_line)\n", + " \n", + " line = poem2_messy_file.readline()\n", + "\n", + "poem2_messy_file.close()\n", "\n" ] }, @@ -2059,7 +2510,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 114, "metadata": {}, "outputs": [], "source": [ @@ -2070,9 +2521,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 115, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "77" + ] + }, + "execution_count": 115, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# [ ] review and run example to write some text to the file\n", "new_file.write(\"This is line #1 with 'w'\\nThis is line #2 with 'w'\\nThis is line #3 withn 'w'!\\n\")" @@ -2080,7 +2542,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 116, "metadata": {}, "outputs": [], "source": [ @@ -2093,11 +2555,22 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 117, "metadata": { "scrolled": true }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "This is line #1 with 'w'\n", + "This is line #2 with 'w'\n", + "This is line #3 withn 'w'!\n", + "\n" + ] + } + ], "source": [ "# [ ] review and run example to see what was written to the file\n", "new_text = new_file.read()\n", @@ -2135,52 +2608,86 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 122, "metadata": {}, "outputs": [], "source": [ "# [ ] open planets.txt in write mode\n", - "\n" + "\n", + "planets_file = open(\"inner_planets.txt\", 'w')" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 123, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "5" + ] + }, + "execution_count": 123, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# [ ] write Mercury, Venus, Earth, Mars on separate lines\n", - "\n" + "\n", + "planets_file.write(\"Mercury\\n\")\n", + "planets_file.write(\"Venus\\n\")\n", + "planets_file.write(\"Earth\\n\")\n", + "planets_file.write(\"Mars\\n\")" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 124, "metadata": {}, "outputs": [], "source": [ "# [ ] close the file and re-open in read mode\n", - "\n" + "planets_file.close()\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 125, "metadata": {}, "outputs": [], "source": [ "# [ ] use .read() to read the entire file contents\n", - "\n" + "\n", + "planets_file = open(\"inner_planets.txt\", 'r')\n", + "\n", + "file_contents = planets_file.read()\n", + "\n", + "planets_file.close()" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 126, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Mercury\n", + "Venus\n", + "Earth\n", + "Mars\n", + "\n" + ] + } + ], "source": [ "# [ ] print the entire file contents and close the file\n", - "\n" + "\n", + "print(file_contents)" ] }, { @@ -2211,7 +2718,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 127, "metadata": {}, "outputs": [], "source": [ @@ -2231,9 +2738,17 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 128, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + } + ], "source": [ "# [ ] review and run example to see what was written to the file \n", "# - 'w+' overwrites, we can read, but the file is ***BLANK***\n", @@ -2243,9 +2758,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 129, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "52" + ] + }, + "execution_count": 129, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# [ ] review and run - write to the blank file\n", "new_file.write(\"This is line #1 with 'w+'\\nThis is line #2 with 'w+'\\n\")" @@ -2253,9 +2779,17 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 130, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + } + ], "source": [ "# [ ] review and run example - read and print (Note: the pointer is at the end of the file - result = empty string)\n", "new_text = new_file.read()\n", @@ -2281,9 +2815,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 131, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "0" + ] + }, + "execution_count": 131, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# [ ] review and run example - sets pointer to beginning of file\n", "new_file.seek(0)" @@ -2291,9 +2836,19 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 132, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "This is line #1 with 'w+'\n", + "This is line #2 with 'w+'\n", + "\n" + ] + } + ], "source": [ "# [ ] review and run example - now read starts from beginning of file\n", "new_text = new_file.read()\n", @@ -2302,7 +2857,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 133, "metadata": {}, "outputs": [], "source": [ @@ -2330,43 +2885,77 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 134, "metadata": {}, "outputs": [], "source": [ "# [ ] open outer_planets.txt in write mode 'w+' \n", - "\n" + "\n", + "outer_planets_file = open(\"outer_planets.txt\", 'w+')" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 135, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "8" + ] + }, + "execution_count": 135, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# [ ] write four outer planets in earth's solar system (Jupiter, Saturn, Uranus, Neptune) on separate lines\n", - "\n" + "\n", + "outer_planets_file.write(\"Jupiter\\n\")\n", + "outer_planets_file.write(\"Saturn\\n\")\n", + "outer_planets_file.write(\"Uranus\\n\")\n", + "outer_planets_file.write(\"Neptune\\n\")" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 136, "metadata": {}, "outputs": [], "source": [ "# [ ] use .seek() to move the pointer to the start of the file\n", "# [ ] use .read() to read the entire file contents\n", - "\n" + "\n", + "outer_planets_file.seek(0)\n", + "\n", + "file_contents = outer_planets_file.read()" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 137, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Jupiter\n", + "Saturn\n", + "Uranus\n", + "Neptune\n", + "\n" + ] + } + ], "source": [ "# [ ] print the entire file contents and close the file\n", - "\n" + "\n", + "print(file_contents)\n", + "\n", + "outer_planets_file.close()" ] }, { @@ -2423,9 +3012,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 138, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-use simple function and variable names\n", + "-comment code\n", + "-organize code into functions\n", + "\n" + ] + } + ], "source": [ "# [ ] review and run - create, write, read and print a file\n", "tips_file = open('code_tips.txt', 'w+')\n", @@ -2437,9 +3037,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 139, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "unction and variable names\n", + "-comment code\n", + "-organize code into functions\n", + "\n" + ] + } + ], "source": [ "# [ ] review and run example - setting a specific seek() index \n", "tips_file.seek(13)\n", @@ -2450,9 +3061,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 140, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "unction and variable names\n", + "-comment code\n", + "-organize code into functions\n", + "\n" + ] + } + ], "source": [ "# [ ] review and run example - string slicing on a read of an entire file\n", "# read from the start\n", @@ -2474,9 +3096,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 141, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-use simple function and variable names\n", + "-comment code\n", + "-organize code into functions\n", + "-use seek(0,2) to set read/write at end of file\n", + "\n" + ] + } + ], "source": [ "# [ ] review and run example - setting pointer to end of file with whence value = 2\n", "tips_file.seek(0,2)\n", @@ -2490,9 +3124,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 142, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "40" + ] + }, + "execution_count": 142, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# [ ] review and run example - point to file beginning and overwrite 1st line\n", "tips_file.seek(0)\n", @@ -2501,9 +3146,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 143, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-USE SIMPLE FUNCTION AND VARIABLE NAMES\n", + "-comment code\n", + "-organize code into functions\n", + "-use seek(0,2) to set read/write at end of file\n", + "\n" + ] + } + ], "source": [ "# [ ] review and run example - show new file contents\n", "tips_file.seek(0,0)\n", @@ -2531,49 +3188,129 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 149, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "7" + ] + }, + "execution_count": 149, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# [ ] open a new file days.txt in write plus read mode 'w+' \n", "# [ ] write week days (Monday - Friday) on separate lines to the file\n", - "\n" + "\n", + "days_file = open(\"days.txt\", 'w+')\n", + "\n", + "days_file.write(\"Monday\\n\")\n", + "days_file.write(\"Tuesday\\n\")\n", + "days_file.write(\"Wednesday\\n\")\n", + "days_file.write(\"Thursday\\n\")\n", + "days_file.write(\"Friday\\n\")" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 150, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-----Weekdays Only-----\n", + "Monday\n", + "Tuesday\n", + "Wednesday\n", + "Thursday\n", + "Friday\n", + "\n" + ] + } + ], "source": [ "# [ ] use .seek() to move the pointer to the start of the file\n", "# [ ] use .read() to read the entire file contents\n", "# [ ] print the entire file contents and close the file\n", - "\n" + "\n", + "days_file.seek(0)\n", + "\n", + "weekdays_contents = days_file.read()\n", + "\n", + "print(\"-----Weekdays Only-----\")\n", + "print(weekdays_contents)\n", + "\n", + "##days_file.close()\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 151, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "7" + ] + }, + "execution_count": 151, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# [ ] use .seek() to move the pointer to the end of the file\n", "# [ ] write the weekend days (Saturday & Sunday)\n", + "\n", + "days_file.seek(0,2)\n", + "\n", + "days_file.write(\"saturday\\n\")\n", + "days_file.write(\"sunday\\n\")\n", "\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 153, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-----Full Week-----\n", + "Monday\n", + "Tuesday\n", + "Wednesday\n", + "Thursday\n", + "Friday\n", + "saturday\n", + "sunday\n", + "\n" + ] + } + ], "source": [ "# [ ] use .seek() to move the pointer to the start of the file\n", "# [ ] use .read() to read the entire file contents\n", "# [ ] print the entire file contents and close the file\n", "\n", - "\n" + "days_file.seek(0)\n", + "\n", + "full_week_contents = days_file.read()\n", + "\n", + "print(\"-----Full Week-----\")\n", + "\n", + "print(full_week_contents)\n", + "\n", + "days_file.close()\n" ] }, { @@ -2639,7 +3376,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 154, "metadata": {}, "outputs": [], "source": [ @@ -2660,7 +3397,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 155, "metadata": {}, "outputs": [], "source": [ @@ -2672,7 +3409,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 156, "metadata": {}, "outputs": [], "source": [ @@ -2684,9 +3421,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 157, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "1: opened file\n", + "2: looked at file\n", + "3: closed file\n", + "\n" + ] + } + ], "source": [ "# [ ] review and run example - calls the above logger() function\n", "# what happens running the cell above (a+) again before running this cell again? \n", @@ -2713,9 +3462,17 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 158, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Count is: 0\n" + ] + } + ], "source": [ "# [ ] review and run example - create a file with initial count of 0\n", "count_file = open(\"count_file.txt\", \"w+\")\n", @@ -2729,9 +3486,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 160, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "BEFORE\n", + "Count is: 1\n", + "\n", + "AFTER\n", + "Count is: 2\n" + ] + } + ], "source": [ "# [ ] review and run example - can rerun this cell\n", "count_file = open(\"count_file.txt\", \"r+\")\n", @@ -2755,7 +3524,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 162, "metadata": {}, "outputs": [], "source": [ @@ -2772,9 +3541,33 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 163, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "BEFORE\n", + "Count is: 2\n", + "\n", + "AFTER inc_count() call 1 \n", + "Count is: 3\n", + "\n", + "AFTER inc_count() call 2 \n", + "Count is: 4\n", + "\n", + "AFTER inc_count() call 3 \n", + "Count is: 5\n", + "\n", + "AFTER inc_count() call 4 \n", + "Count is: 6\n", + "\n", + "AFTER inc_count() call 5 \n", + "Count is: 7\n" + ] + } + ], "source": [ "# [ ] review and run example with call to function: inc_count() - **Run cell multiple times**\n", "# opens file/prints initial value\n", @@ -2813,16 +3606,41 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 165, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Line1\n", + "Line2\n", + "Line3\n", + "append #0\n", + "append #1\n", + "append #2\n", + "append #3\n", + "append #4\n", + "\n" + ] + } + ], "source": [ "# [ ] complete the task\n", "# Provided Code creates and populates task4_file.txt\n", "task4_file = open('task4_file.txt', 'w+')\n", "task4_file.write(\"Line1\\nLine2\\nLine3\\n\")\n", "task4_file.close()\n", - "# [ ] code here\n" + "# [ ] code here\n", + "task4_file = open('task4_file.txt', 'a+')\n", + "\n", + "for item in range(5):\n", + " task4_file.write(\"append #\" + str(item) + \"\\n\")\n", + " task4_file.seek(0)\n", + "\n", + "print(task4_file.read())\n", + "\n", + "task4_file.close()\n" ] }, { @@ -2848,9 +3666,41 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 166, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Before:\n", + "Line---1\n", + "Line---2\n", + "Line---3\n", + "Line---4\n", + "Line---5\n", + "Line---6\n", + "Line---7\n", + "Line---8\n", + "Line---9\n", + "Line--10\n", + "\n", + "\n", + "After:\n", + "Line---1\n", + "Line---2append#1\n", + "\n", + "Line--append#2\n", + "-5\n", + "Lineappend#3\n", + "---7\n", + "Liappend#4\n", + "ne---9\n", + "Line--10\n", + "\n" + ] + } + ], "source": [ "# [ ] complete the task\n", "# Provided Code creates and populates task5_file.txt\n", @@ -2862,7 +3712,19 @@ "\n", "# [ ] code here\n", "\n", + "task5_file = open('task5_file.txt', 'r+')\n", + "\n", + "for item in range(1, 5):\n", + "\n", + " task5_file.seek(item * 18)\n", + "\n", + " task5_file.write(\"append#\" + str(item) + \"\\n\")\n", "\n", + "task5_file.seek(0)\n", + "\n", + "print(\"After:\\n\" + task5_file.read())\n", + "\n", + "task5_file.close()\n", "\n" ] }, diff --git a/P2 Python Fundamentals/Module_4.1_Practice_Python_Fundamentals.ipynb b/P2 Python Fundamentals/Module_4.1_Practice_Python_Fundamentals.ipynb index d47d3f4..3831e68 100644 --- a/P2 Python Fundamentals/Module_4.1_Practice_Python_Fundamentals.ipynb +++ b/P2 Python Fundamentals/Module_4.1_Practice_Python_Fundamentals.ipynb @@ -41,12 +41,25 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " % Total % Received % Xferd Average Speed Time Time Time Current\n", + " Dload Upload Total Spent Left Speed\n", + "\n", + " 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\n", + "100 43 100 43 0 0 294 0 --:--:-- --:--:-- --:--:-- 298\n" + ] + } + ], "source": [ "# [ ] import https://raw.githubusercontent.com/MicrosoftLearning/intropython/master/rainbow as rainbow.txt\n", - "\n" + "\n", + "!curl https://raw.githubusercontent.com/MicrosoftLearning/intropython/master/rainbow -o rainbow.txt" ] }, { @@ -59,13 +72,17 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "# [ ] Open rainbow.txt in read mode & read as list with .readlines()\n", "\n", - "\n" + "rainbow_file = open(\"rainbow.txt\", 'r')\n", + "rainbow_colors = rainbow_file.readlines()\n", + "rainbow_file.close()\n", + "\n", + "rainbow_colors = [color.strip() for color in rainbow_colors]\n" ] }, { @@ -80,12 +97,31 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "blue\n", + "green\n", + "indigo\n", + "orange\n", + "red\n", + "violet\n", + "yellow\n" + ] + } + ], "source": [ "# [ ] sort rainbow_colors list, iterate the list to print each color\n", - "\n" + "\n", + "rainbow_colors.sort()\n", + "\n", + "\n", + "for color in rainbow_colors:\n", + " print(color)" ] }, { @@ -107,12 +143,25 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " % Total % Received % Xferd Average Speed Time Time Time Current\n", + " Dload Upload Total Spent Left Speed\n", + "\n", + " 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\n", + "100 222 100 222 0 0 1519 0 --:--:-- --:--:-- --:--:-- 1541\n" + ] + } + ], "source": [ "# [ ] The Weather: import world_mean_team.csv as mean_temp.txt\n", - "\n" + "\n", + "! curl https://raw.githubusercontent.com/MicrosoftLearning/intropython/master/world_temp_mean.csv -o mean_temp.txt" ] }, { @@ -126,12 +175,28 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Original Heading Line: city,country,month ave: highest high,month ave: lowest low\n", + "Headings List: ['city', 'country', 'month ave: highest high', 'month ave: lowest low']\n" + ] + } + ], "source": [ "# [ ] The Weather: open file, read/print first line, convert line to list (splitting on comma)\n", - "\n" + "\n", + "mean_temps_file = open(\"mean_temp.txt\", 'r')\n", + "\n", + "headings = mean_temps_file.readline()\n", + "print(f\"Original Heading Line: {headings.strip()}\")\n", + "\n", + "headings_list = headings.strip().split(',')\n", + "print(f\"Headings List: {headings_list}\")" ] }, { @@ -152,12 +217,43 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The highest monthly average high in Beijing is -8.4 Celsius.\n", + "The highest monthly average high in Cairo is 1.2 Celsius.\n", + "The highest monthly average high in London is 2.1 Celsius.\n", + "The highest monthly average high in Nairobi is 10.5 Celsius.\n", + "The highest monthly average high in New York City is -2.8 Celsius.\n", + "The highest monthly average high in Sydney is 8.7 Celsius.\n", + "The highest monthly average high in Tokyo is 0.9 Celsius.\n" + ] + } + ], "source": [ "# [ ] The Weather: use while loop to print city and highest monthly average temp in celsius\n", - "\n" + "\n", + "city_temp_line = mean_temps_file.readline()\n", + "\n", + "while city_temp_line:\n", + "\n", + " city_temp_list = city_temp_line.strip().split(',')\n", + " \n", + "\n", + " if len(city_temp_list) > 3:\n", + "\n", + " city_name = city_temp_list[0]\n", + " highest_avg_temp = city_temp_list[3]\n", + " print(f\"The highest monthly average high in {city_name} is {highest_avg_temp} Celsius.\")\n", + " \n", + " city_temp_line = mean_temps_file.readline()\n", + "\n", + "\n", + "mean_temps_file.close()" ] }, { @@ -178,12 +274,25 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 20, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " % Total % Received % Xferd Average Speed Time Time Time Current\n", + " Dload Upload Total Spent Left Speed\n", + "\n", + " 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\n", + "100 303 100 303 0 0 3738 0 --:--:-- --:--:-- --:--:-- 3787\n" + ] + } + ], "source": [ "# [ ] use curl to download https://raw.githubusercontent.com/MicrosoftLearning/intropython/master/digits_of_pi as pi.txt\n", - "\n" + "\n", + "! curl https://raw.githubusercontent.com/MicrosoftLearning/intropython/master/digits_of_pi -o pi.txt" ] }, { @@ -202,12 +311,36 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 21, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Hi, Ben!\n" + ] + } + ], "source": [ "# [ ] Set up the project files and initial values\n", - "\n" + "\n", + "\n", + "pi_file = open(\"pi.txt\", 'r')\n", + "\n", + "name = input(\"Enter your name: \")\n", + "print(f\"Hi, {name}!\")\n", + "\n", + "seed = len(name)\n", + "\n", + "pi_file.seek(seed)\n", + "\n", + "digit = pi_file.read(1)\n", + "\n", + "guess = input('Enter a single digit guess or \"q\" to quit: ')\n", + "\n", + "correct = 0\n", + "wrong = 0" ] }, { @@ -229,11 +362,52 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 22, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "incorrect\n", + "correct\n", + "\n", + "Game Over! You got 1 correct and 1 incorrect guesses.\n" + ] + } + ], "source": [ - "\n" + "\n", + "\n", + "\n", + "while guess.isdigit():\n", + " \n", + " if digit == '.':\n", + " digit = pi_file.read(1)\n", + " continue\n", + " \n", + "\n", + " elif digit == '\\n':\n", + " seed += 1\n", + "\n", + " pi_file.seek(seed) \n", + " digit = pi_file.read(1)\n", + " continue\n", + " \n", + " else:\n", + " if guess == digit:\n", + " print(\"correct\")\n", + " correct += 1\n", + " else:\n", + " print(\"incorrect\")\n", + " wrong += 1\n", + " \n", + " digit = pi_file.read(1)\n", + " guess = input('Enter a single digit guess or \"q\" to quit: ')\n", + "\n", + "print(f\"\\nGame Over! You got {correct} correct and {wrong} incorrect guesses.\")\n", + "\n", + "pi_file.close()" ] }, { @@ -272,7 +446,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.8" + "version": "3.13.7" } }, "nbformat": 4, diff --git a/P2 Python Fundamentals/Module_4.2_Required_Code_Python_Fundamentals.ipynb b/P2 Python Fundamentals/Module_4.2_Required_Code_Python_Fundamentals.ipynb index 35ee8ef..4d31928 100644 --- a/P2 Python Fundamentals/Module_4.2_Required_Code_Python_Fundamentals.ipynb +++ b/P2 Python Fundamentals/Module_4.2_Required_Code_Python_Fundamentals.ipynb @@ -91,16 +91,61 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 4, "metadata": { "collapsed": true }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Ben Reed\n", + "City of Beijing month ave: Highest high is -8.4 Celsius\n", + "City of Cairo month ave: Highest high is 1.2 Celsius\n", + "City of London month ave: Highest high is 2.1 Celsius\n", + "City of Nairobi month ave: Highest high is 10.5 Celsius\n", + "City of New York City month ave: Highest high is -2.8 Celsius\n", + "City of Sydney month ave: Highest high is 8.7 Celsius\n", + "City of Tokyo month ave: Highest high is 0.9 Celsius\n", + "City of RIO de Janeiro month ave: Highest high is 18.0 Celsius\n", + "City of RIO de Janeiro month ave: Highest high is 18.0 Celsius\n" + ] + } + ], "source": [ "# [] create The Weather\n", "\n", + "##! curl https://raw.githubusercontent.com/MicrosoftLearning/intropython/master/world_temp_mean.csv -o mean_temp.txt\n", "\n", - "\n" + "mean_temps_file = open('mean_temp.txt', 'a+')\n", + "mean_temps_file.write(\"RIO de Janeiro, Brazil, 30.0,18.0\\n\")\n", + "\n", + "mean_temps_file.seek(0)\n", + "\n", + "headings = mean_temps_file.readline()\n", + "\n", + "headings_list = headings.strip().split(',')\n", + "\n", + "##print(headings_list)\n", + "\n", + "my_name = \"Ben Reed\"\n", + "\n", + "print(my_name)\n", + "\n", + "city_temp_line = mean_temps_file.readline()\n", + "\n", + "while city_temp_line:\n", + " city_temp_list = city_temp_line.strip().split(',')\n", + "\n", + " if len(city_temp_list) > 3:\n", + " city_name = city_temp_list[0]\n", + " highest_avg_temp = city_temp_list[3]\n", + "\n", + " print(f\"City of {city_name} month ave: Highest high is {highest_avg_temp} Celsius\")\n", + " city_temp_line = mean_temps_file.readline()\n", + "\n", + "mean_temps_file.close()\n" ] }, { @@ -128,7 +173,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.8" + "version": "3.13.7" } }, "nbformat": 4, diff --git a/P2 Python Fundamentals/cities_messy.txt b/P2 Python Fundamentals/cities_messy.txt new file mode 100644 index 0000000..af402e8 --- /dev/null +++ b/P2 Python Fundamentals/cities_messy.txt @@ -0,0 +1,7 @@ + Beijing: + Cairo: + London: + Nairobi: + New York City: + Sydney: + Tokyo: diff --git a/P2 Python Fundamentals/code_tips.txt b/P2 Python Fundamentals/code_tips.txt new file mode 100644 index 0000000..58e671e --- /dev/null +++ b/P2 Python Fundamentals/code_tips.txt @@ -0,0 +1,4 @@ +-USE SIMPLE FUNCTION AND VARIABLE NAMES +-comment code +-organize code into functions +-use seek(0,2) to set read/write at end of file diff --git a/P2 Python Fundamentals/count_file.txt b/P2 Python Fundamentals/count_file.txt new file mode 100644 index 0000000..a80d160 --- /dev/null +++ b/P2 Python Fundamentals/count_file.txt @@ -0,0 +1 @@ +Count is: 7 \ No newline at end of file diff --git a/P2 Python Fundamentals/days.txt b/P2 Python Fundamentals/days.txt new file mode 100644 index 0000000..9ca51e7 --- /dev/null +++ b/P2 Python Fundamentals/days.txt @@ -0,0 +1,7 @@ +Monday +Tuesday +Wednesday +Thursday +Friday +saturday +sunday diff --git a/P2 Python Fundamentals/inner_planets.txt b/P2 Python Fundamentals/inner_planets.txt new file mode 100644 index 0000000..6b75118 --- /dev/null +++ b/P2 Python Fundamentals/inner_planets.txt @@ -0,0 +1,4 @@ +Mercury +Venus +Earth +Mars diff --git a/P2 Python Fundamentals/log_file.txt b/P2 Python Fundamentals/log_file.txt new file mode 100644 index 0000000..0019ce7 --- /dev/null +++ b/P2 Python Fundamentals/log_file.txt @@ -0,0 +1,3 @@ +1: opened file +2: looked at file +3: closed file diff --git a/P2 Python Fundamentals/mean_temp.txt b/P2 Python Fundamentals/mean_temp.txt new file mode 100644 index 0000000..75bd47b --- /dev/null +++ b/P2 Python Fundamentals/mean_temp.txt @@ -0,0 +1,10 @@ +city,country,month ave: highest high,month ave: lowest low +Beijing,China,30.9,-8.4 +Cairo,Egypt,34.7,1.2 +London,UK,23.5,2.1 +Nairobi,Kenya,26.3,10.5 +New York City,USA,28.9,-2.8 +Sydney,Australia,26.5,8.7 +Tokyo,Japan,30.8,0.9 +RIO de Janeiro, Brazil, 30.0,18.0 +RIO de Janeiro, Brazil, 30.0,18.0 diff --git a/P2 Python Fundamentals/new_file.txt b/P2 Python Fundamentals/new_file.txt new file mode 100644 index 0000000..61ec3a7 --- /dev/null +++ b/P2 Python Fundamentals/new_file.txt @@ -0,0 +1,2 @@ +This is line #1 with 'w+' +This is line #2 with 'w+' diff --git a/P2 Python Fundamentals/outer_planets.txt b/P2 Python Fundamentals/outer_planets.txt new file mode 100644 index 0000000..eec8a67 --- /dev/null +++ b/P2 Python Fundamentals/outer_planets.txt @@ -0,0 +1,4 @@ +Jupiter +Saturn +Uranus +Neptune diff --git a/P2 Python Fundamentals/pi.txt b/P2 Python Fundamentals/pi.txt new file mode 100644 index 0000000..8577145 --- /dev/null +++ b/P2 Python Fundamentals/pi.txt @@ -0,0 +1 @@ +3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067982148086513282306647093844609550582231725359408128481117450284102701938521105559644622948954930381964428810975665933446128475648233786783165271201909145648566923460348610454326648213393607260249141273 diff --git a/P2 Python Fundamentals/poem2.txt b/P2 Python Fundamentals/poem2.txt new file mode 100644 index 0000000..ebec5a4 --- /dev/null +++ b/P2 Python Fundamentals/poem2.txt @@ -0,0 +1,9 @@ +while True +I loop +True +loop +True +loop +not True +False +end diff --git a/P2 Python Fundamentals/poem2_messy.txt b/P2 Python Fundamentals/poem2_messy.txt new file mode 100644 index 0000000..1c9b22f --- /dev/null +++ b/P2 Python Fundamentals/poem2_messy.txt @@ -0,0 +1,9 @@ +(while True) +(I loop) +(True) +(loop) +(True) +(loop) +(not True) +(False) +(end) diff --git a/P2 Python Fundamentals/rainbow.txt b/P2 Python Fundamentals/rainbow.txt new file mode 100644 index 0000000..26ec8e7 --- /dev/null +++ b/P2 Python Fundamentals/rainbow.txt @@ -0,0 +1,7 @@ +red +orange +yellow +green +blue +indigo +violet diff --git a/P2 Python Fundamentals/rainbow_messy.txt b/P2 Python Fundamentals/rainbow_messy.txt new file mode 100644 index 0000000..5b7eb88 --- /dev/null +++ b/P2 Python Fundamentals/rainbow_messy.txt @@ -0,0 +1,7 @@ +**red** +**orange** +**yellow** +**green** +**blue** +**indigo** +**violet** diff --git a/P2 Python Fundamentals/task4_file.txt b/P2 Python Fundamentals/task4_file.txt new file mode 100644 index 0000000..6fdcb98 --- /dev/null +++ b/P2 Python Fundamentals/task4_file.txt @@ -0,0 +1,8 @@ +Line1 +Line2 +Line3 +append #0 +append #1 +append #2 +append #3 +append #4 diff --git a/P2 Python Fundamentals/task5_file.txt b/P2 Python Fundamentals/task5_file.txt new file mode 100644 index 0000000..0c7a659 --- /dev/null +++ b/P2 Python Fundamentals/task5_file.txt @@ -0,0 +1,10 @@ +Line---1 +Line---2append#1 + +Line--append#2 +-5 +Lineappend#3 +---7 +Liappend#4 +ne---9 +Line--10 diff --git a/P2M4BenjaminReed.py b/P2M4BenjaminReed.py new file mode 100644 index 0000000..60dc359 --- /dev/null +++ b/P2M4BenjaminReed.py @@ -0,0 +1,34 @@ +# [] create The Weather + +import os + +os.system("curl https://raw.githubusercontent.com/MicrosoftLearning/intropython/master/world_temp_mean.csv -o mean_temp.txt") + +mean_temps_file = open('mean_temp.txt', 'a+') +mean_temps_file.write("RIO de Janeiro, Brazil, 30.0,18.0\n") + +mean_temps_file.seek(0) + +headings = mean_temps_file.readline() + +headings_list = headings.strip().split(',') + +##print(headings_list) + +my_name = "Ben Reed" + +print(my_name) + +city_temp_line = mean_temps_file.readline() + +while city_temp_line: + city_temp_list = city_temp_line.strip().split(',') + + if len(city_temp_list) > 3: + city_name = city_temp_list[0] + highest_avg_temp = city_temp_list[3] + + print(f"City of {city_name} month ave: Highest high is {highest_avg_temp} Celsius") + city_temp_line = mean_temps_file.readline() + +mean_temps_file.close() diff --git a/Python Intro to Pandas.ipynb b/Python Intro to Pandas.ipynb index 960efb1..d19c2ce 100644 --- a/Python Intro to Pandas.ipynb +++ b/Python Intro to Pandas.ipynb @@ -10,7 +10,12 @@ "name": "stdout", "output_type": "stream", "text": [ - "^C\n", + "Requirement already satisfied: pandas in c:\\users\\benjamin.reed\\appdata\\local\\programs\\python\\python313\\lib\\site-packages (2.3.3)\n", + "Requirement already satisfied: numpy>=1.26.0 in c:\\users\\benjamin.reed\\appdata\\local\\programs\\python\\python313\\lib\\site-packages (from pandas) (2.3.4)\n", + "Requirement already satisfied: python-dateutil>=2.8.2 in c:\\users\\benjamin.reed\\appdata\\roaming\\python\\python313\\site-packages (from pandas) (2.9.0.post0)\n", + "Requirement already satisfied: pytz>=2020.1 in c:\\users\\benjamin.reed\\appdata\\local\\programs\\python\\python313\\lib\\site-packages (from pandas) (2025.2)\n", + "Requirement already satisfied: tzdata>=2022.7 in c:\\users\\benjamin.reed\\appdata\\local\\programs\\python\\python313\\lib\\site-packages (from pandas) (2025.2)\n", + "Requirement already satisfied: six>=1.5 in c:\\users\\benjamin.reed\\appdata\\roaming\\python\\python313\\site-packages (from python-dateutil>=2.8.2->pandas) (1.17.0)\n", "Note: you may need to restart the kernel to use updated packages.\n" ] } @@ -21,7 +26,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 3, "id": "3d285a9b", "metadata": {}, "outputs": [], @@ -33,7 +38,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 4, "id": "38874ba8", "metadata": {}, "outputs": [], @@ -45,7 +50,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 6, "id": "81085702", "metadata": {}, "outputs": [], @@ -55,7 +60,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 7, "id": "9054d31e", "metadata": {}, "outputs": [ @@ -65,7 +70,7 @@ "Index(['state', 'gender', 'year', 'name', 'number'], dtype='object')" ] }, - "execution_count": 4, + "execution_count": 7, "metadata": {}, "output_type": "execute_result" } @@ -76,7 +81,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 8, "id": "4817e8bc", "metadata": {}, "outputs": [ @@ -86,7 +91,7 @@ "(1032683, 5)" ] }, - "execution_count": 5, + "execution_count": 8, "metadata": {}, "output_type": "execute_result" } @@ -97,7 +102,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 9, "id": "bc2bbf13", "metadata": {}, "outputs": [ @@ -183,7 +188,7 @@ "4 AK F 2010 Ava 33" ] }, - "execution_count": 6, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" } @@ -194,7 +199,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 10, "id": "f03f51c0", "metadata": {}, "outputs": [ @@ -280,7 +285,7 @@ "33639 CA F 2010 Sophia 3361" ] }, - "execution_count": 7, + "execution_count": 10, "metadata": {}, "output_type": "execute_result" } @@ -291,7 +296,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 11, "id": "229e30bc", "metadata": {}, "outputs": [ @@ -377,7 +382,7 @@ "179 AK F 2010 Andrea 5" ] }, - "execution_count": 8, + "execution_count": 11, "metadata": {}, "output_type": "execute_result" } @@ -388,7 +393,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 12, "id": "d3eda148", "metadata": {}, "outputs": [ @@ -398,7 +403,7 @@ "(1032683, 5)" ] }, - "execution_count": 9, + "execution_count": 12, "metadata": {}, "output_type": "execute_result" } @@ -409,7 +414,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 13, "id": "cb6bf3ea", "metadata": {}, "outputs": [ @@ -419,7 +424,7 @@ "Index(['state', 'gender', 'year', 'name', 'number'], dtype='object')" ] }, - "execution_count": 10, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } @@ -430,7 +435,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 14, "id": "70192f41", "metadata": {}, "outputs": [ @@ -445,7 +450,7 @@ "dtype: object" ] }, - "execution_count": 11, + "execution_count": 14, "metadata": {}, "output_type": "execute_result" } @@ -456,7 +461,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 15, "id": "792ad3f7", "metadata": {}, "outputs": [ @@ -542,7 +547,7 @@ "max 2.020000e+03 3.644000e+03" ] }, - "execution_count": 12, + "execution_count": 15, "metadata": {}, "output_type": "execute_result" } @@ -553,7 +558,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 16, "id": "e9fbce12", "metadata": {}, "outputs": [ @@ -696,7 +701,7 @@ "[1032683 rows x 5 columns]" ] }, - "execution_count": 13, + "execution_count": 16, "metadata": {}, "output_type": "execute_result" } @@ -707,7 +712,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 17, "id": "944eb35e", "metadata": {}, "outputs": [ @@ -729,7 +734,7 @@ "Name: count, dtype: int64" ] }, - "execution_count": 14, + "execution_count": 17, "metadata": {}, "output_type": "execute_result" } @@ -740,7 +745,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 18, "id": "0c347930", "metadata": {}, "outputs": [ @@ -761,7 +766,7 @@ "Name: year, Length: 1032683, dtype: int64" ] }, - "execution_count": 15, + "execution_count": 18, "metadata": {}, "output_type": "execute_result" } @@ -772,7 +777,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 19, "id": "03c8a1f1", "metadata": {}, "outputs": [], @@ -782,7 +787,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 20, "id": "c2dfe256", "metadata": {}, "outputs": [ @@ -1792,7 +1797,7 @@ " ...]" ] }, - "execution_count": 17, + "execution_count": 20, "metadata": {}, "output_type": "execute_result" } @@ -1803,7 +1808,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 21, "id": "65e09d95", "metadata": {}, "outputs": [], @@ -1813,7 +1818,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 22, "id": "0b5aff21", "metadata": {}, "outputs": [ @@ -1842,7 +1847,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 23, "id": "c27a0744", "metadata": {}, "outputs": [ @@ -1985,7 +1990,7 @@ "[1032683 rows x 5 columns]" ] }, - "execution_count": 21, + "execution_count": 23, "metadata": {}, "output_type": "execute_result" } @@ -1996,7 +2001,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 24, "id": "41b62d4f", "metadata": {}, "outputs": [], @@ -2059,7 +2064,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 25, "id": "04140052", "metadata": {}, "outputs": [], @@ -2069,7 +2074,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 26, "id": "e6a43188", "metadata": {}, "outputs": [ @@ -2212,7 +2217,7 @@ "[1032683 rows x 5 columns]" ] }, - "execution_count": 24, + "execution_count": 26, "metadata": {}, "output_type": "execute_result" } @@ -2613,7 +2618,7 @@ }, { "cell_type": "code", - "execution_count": 36, + "execution_count": 35, "id": "0e2d4809", "metadata": {}, "outputs": [ @@ -2621,36 +2626,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "Collecting openpyxl\n", - " Downloading openpyxl-3.1.5-py2.py3-none-any.whl.metadata (2.5 kB)\n", - "Collecting et-xmlfile (from openpyxl)\n", - " Downloading et_xmlfile-2.0.0-py3-none-any.whl.metadata (2.7 kB)\n", - "Downloading openpyxl-3.1.5-py2.py3-none-any.whl (250 kB)\n", - "Downloading et_xmlfile-2.0.0-py3-none-any.whl (18 kB)\n", - "Installing collected packages: et-xmlfile, openpyxl\n", - "\n", - " -------------------- ------------------- 1/2 [openpyxl]\n", - " -------------------- ------------------- 1/2 [openpyxl]\n", - " -------------------- ------------------- 1/2 [openpyxl]\n", - " -------------------- ------------------- 1/2 [openpyxl]\n", - " -------------------- ------------------- 1/2 [openpyxl]\n", - " -------------------- ------------------- 1/2 [openpyxl]\n", - " -------------------- ------------------- 1/2 [openpyxl]\n", - " -------------------- ------------------- 1/2 [openpyxl]\n", - " -------------------- ------------------- 1/2 [openpyxl]\n", - " -------------------- ------------------- 1/2 [openpyxl]\n", - " -------------------- ------------------- 1/2 [openpyxl]\n", - " -------------------- ------------------- 1/2 [openpyxl]\n", - " -------------------- ------------------- 1/2 [openpyxl]\n", - " -------------------- ------------------- 1/2 [openpyxl]\n", - " -------------------- ------------------- 1/2 [openpyxl]\n", - " -------------------- ------------------- 1/2 [openpyxl]\n", - " -------------------- ------------------- 1/2 [openpyxl]\n", - " -------------------- ------------------- 1/2 [openpyxl]\n", - " -------------------- ------------------- 1/2 [openpyxl]\n", - " ---------------------------------------- 2/2 [openpyxl]\n", - "\n", - "Successfully installed et-xmlfile-2.0.0 openpyxl-3.1.5\n", + "Requirement already satisfied: openpyxl in c:\\users\\benjamin.reed\\appdata\\local\\programs\\python\\python313\\lib\\site-packages (3.1.5)\n", + "Requirement already satisfied: et-xmlfile in c:\\users\\benjamin.reed\\appdata\\local\\programs\\python\\python313\\lib\\site-packages (from openpyxl) (2.0.0)\n", "Note: you may need to restart the kernel to use updated packages.\n" ] } @@ -2661,10 +2638,25 @@ }, { "cell_type": "code", - "execution_count": 37, + "execution_count": 36, "id": "37dc22c2", "metadata": {}, - "outputs": [], + "outputs": [ + { + "ename": "PermissionError", + "evalue": "[Errno 13] Permission denied: 'C:\\\\Users\\\\benjamin.reed\\\\Downloads\\\\babynames_by_year.xlsx'", + "output_type": "error", + "traceback": [ + "\u001b[31m---------------------------------------------------------------------------\u001b[39m", + "\u001b[31mPermissionError\u001b[39m Traceback (most recent call last)", + "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[36]\u001b[39m\u001b[32m, line 1\u001b[39m\n\u001b[32m----> \u001b[39m\u001b[32m1\u001b[39m xlr=\u001b[43mpd\u001b[49m\u001b[43m.\u001b[49m\u001b[43mExcelWriter\u001b[49m\u001b[43m(\u001b[49m\u001b[43mos\u001b[49m\u001b[43m.\u001b[49m\u001b[43mpath\u001b[49m\u001b[43m.\u001b[49m\u001b[43mjoin\u001b[49m\u001b[43m(\u001b[49m\u001b[43mfilePath\u001b[49m\u001b[43m,\u001b[49m\u001b[33;43m'\u001b[39;49m\u001b[33;43mbabynames_by_year.xlsx\u001b[39;49m\u001b[33;43m'\u001b[39;49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m \u001b[38;5;66;03m#create a placeholder for an Excel file\u001b[39;00m\n", + "\u001b[36mFile \u001b[39m\u001b[32mc:\\Users\\benjamin.reed\\AppData\\Local\\Programs\\Python\\Python313\\Lib\\site-packages\\pandas\\io\\excel\\_openpyxl.py:61\u001b[39m, in \u001b[36mOpenpyxlWriter.__init__\u001b[39m\u001b[34m(self, path, engine, date_format, datetime_format, mode, storage_options, if_sheet_exists, engine_kwargs, **kwargs)\u001b[39m\n\u001b[32m 57\u001b[39m \u001b[38;5;28;01mfrom\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34;01mopenpyxl\u001b[39;00m\u001b[34;01m.\u001b[39;00m\u001b[34;01mworkbook\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;28;01mimport\u001b[39;00m Workbook\n\u001b[32m 59\u001b[39m engine_kwargs = combine_kwargs(engine_kwargs, kwargs)\n\u001b[32m---> \u001b[39m\u001b[32m61\u001b[39m \u001b[38;5;28;43msuper\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m.\u001b[49m\u001b[34;43m__init__\u001b[39;49m\u001b[43m(\u001b[49m\n\u001b[32m 62\u001b[39m \u001b[43m \u001b[49m\u001b[43mpath\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 63\u001b[39m \u001b[43m \u001b[49m\u001b[43mmode\u001b[49m\u001b[43m=\u001b[49m\u001b[43mmode\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 64\u001b[39m \u001b[43m \u001b[49m\u001b[43mstorage_options\u001b[49m\u001b[43m=\u001b[49m\u001b[43mstorage_options\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 65\u001b[39m \u001b[43m \u001b[49m\u001b[43mif_sheet_exists\u001b[49m\u001b[43m=\u001b[49m\u001b[43mif_sheet_exists\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 66\u001b[39m \u001b[43m \u001b[49m\u001b[43mengine_kwargs\u001b[49m\u001b[43m=\u001b[49m\u001b[43mengine_kwargs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 67\u001b[39m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 69\u001b[39m \u001b[38;5;66;03m# ExcelWriter replaced \"a\" by \"r+\" to allow us to first read the excel file from\u001b[39;00m\n\u001b[32m 70\u001b[39m \u001b[38;5;66;03m# the file and later write to it\u001b[39;00m\n\u001b[32m 71\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[33m\"\u001b[39m\u001b[33mr+\u001b[39m\u001b[33m\"\u001b[39m \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m._mode: \u001b[38;5;66;03m# Load from existing workbook\u001b[39;00m\n", + "\u001b[36mFile \u001b[39m\u001b[32mc:\\Users\\benjamin.reed\\AppData\\Local\\Programs\\Python\\Python313\\Lib\\site-packages\\pandas\\io\\excel\\_base.py:1246\u001b[39m, in \u001b[36mExcelWriter.__init__\u001b[39m\u001b[34m(self, path, engine, date_format, datetime_format, mode, storage_options, if_sheet_exists, engine_kwargs)\u001b[39m\n\u001b[32m 1242\u001b[39m \u001b[38;5;28mself\u001b[39m._handles = IOHandles(\n\u001b[32m 1243\u001b[39m cast(IO[\u001b[38;5;28mbytes\u001b[39m], path), compression={\u001b[33m\"\u001b[39m\u001b[33mcompression\u001b[39m\u001b[33m\"\u001b[39m: \u001b[38;5;28;01mNone\u001b[39;00m}\n\u001b[32m 1244\u001b[39m )\n\u001b[32m 1245\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(path, ExcelWriter):\n\u001b[32m-> \u001b[39m\u001b[32m1246\u001b[39m \u001b[38;5;28mself\u001b[39m._handles = \u001b[43mget_handle\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m 1247\u001b[39m \u001b[43m \u001b[49m\u001b[43mpath\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmode\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mstorage_options\u001b[49m\u001b[43m=\u001b[49m\u001b[43mstorage_options\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mis_text\u001b[49m\u001b[43m=\u001b[49m\u001b[38;5;28;43;01mFalse\u001b[39;49;00m\n\u001b[32m 1248\u001b[39m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 1249\u001b[39m \u001b[38;5;28mself\u001b[39m._cur_sheet = \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[32m 1251\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m date_format \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n", + "\u001b[36mFile \u001b[39m\u001b[32mc:\\Users\\benjamin.reed\\AppData\\Local\\Programs\\Python\\Python313\\Lib\\site-packages\\pandas\\io\\common.py:882\u001b[39m, in \u001b[36mget_handle\u001b[39m\u001b[34m(path_or_buf, mode, encoding, compression, memory_map, is_text, errors, storage_options)\u001b[39m\n\u001b[32m 873\u001b[39m handle = \u001b[38;5;28mopen\u001b[39m(\n\u001b[32m 874\u001b[39m handle,\n\u001b[32m 875\u001b[39m ioargs.mode,\n\u001b[32m (...)\u001b[39m\u001b[32m 878\u001b[39m newline=\u001b[33m\"\u001b[39m\u001b[33m\"\u001b[39m,\n\u001b[32m 879\u001b[39m )\n\u001b[32m 880\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[32m 881\u001b[39m \u001b[38;5;66;03m# Binary mode\u001b[39;00m\n\u001b[32m--> \u001b[39m\u001b[32m882\u001b[39m handle = \u001b[38;5;28;43mopen\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mhandle\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mioargs\u001b[49m\u001b[43m.\u001b[49m\u001b[43mmode\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 883\u001b[39m handles.append(handle)\n\u001b[32m 885\u001b[39m \u001b[38;5;66;03m# Convert BytesIO or file objects passed with an encoding\u001b[39;00m\n", + "\u001b[31mPermissionError\u001b[39m: [Errno 13] Permission denied: 'C:\\\\Users\\\\benjamin.reed\\\\Downloads\\\\babynames_by_year.xlsx'" + ] + } + ], "source": [ "xlr=pd.ExcelWriter(os.path.join(filePath,'babynames_by_year.xlsx')) #create a placeholder for an Excel file" ] @@ -2852,13 +2844,68 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 37, "id": "f4e8b8ff", "metadata": {}, "outputs": [], "source": [ "df_pivot=pd.pivot_table(data=df,values=['number'],columns=['gender'],aggfunc='sum') #create a pivot table" ] + }, + { + "cell_type": "code", + "execution_count": 38, + "id": "1794e0ed", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
genderFEMALEMALE
number1552080317851928
\n", + "
" + ], + "text/plain": [ + "gender FEMALE MALE\n", + "number 15520803 17851928" + ] + }, + "execution_count": 38, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_pivot" + ] } ], "metadata": { diff --git a/mean_temp.txt b/mean_temp.txt new file mode 100644 index 0000000..ed6372c --- /dev/null +++ b/mean_temp.txt @@ -0,0 +1,9 @@ +city,country,month ave: highest high,month ave: lowest low +Beijing,China,30.9,-8.4 +Cairo,Egypt,34.7,1.2 +London,UK,23.5,2.1 +Nairobi,Kenya,26.3,10.5 +New York City,USA,28.9,-2.8 +Sydney,Australia,26.5,8.7 +Tokyo,Japan,30.8,0.9 +RIO de Janeiro, Brazil, 30.0,18.0 diff --git a/poemJUSTNOW.txt b/poemJUSTNOW.txt new file mode 100644 index 0000000..d8d57e3 --- /dev/null +++ b/poemJUSTNOW.txt @@ -0,0 +1,7 @@ +Loops I repeat +loops +loops +loops +I repeat +until I +break From 2f2b55c53dc977401d9fcb6b749ccfafa5d8e27c Mon Sep 17 00:00:00 2001 From: Benjamin Reed Date: Mon, 27 Oct 2025 16:42:24 -0400 Subject: [PATCH 31/36] P2M5 Final code work --- ...ed_FINAL_Project_Python_Fundamentals.ipynb | 96 ++++++++++++++++++- P2 Python Fundamentals/elements1_20.txt | 20 ++++ P2M5BenjaminReed.py | 92 ++++++++++++++++++ elements1_20.txt | 20 ++++ 4 files changed, 225 insertions(+), 3 deletions(-) create mode 100644 P2 Python Fundamentals/elements1_20.txt create mode 100644 P2M5BenjaminReed.py create mode 100644 elements1_20.txt diff --git a/P2 Python Fundamentals/Module_5.0_Required_FINAL_Project_Python_Fundamentals.ipynb b/P2 Python Fundamentals/Module_5.0_Required_FINAL_Project_Python_Fundamentals.ipynb index 42d507e..4a20164 100644 --- a/P2 Python Fundamentals/Module_5.0_Required_FINAL_Project_Python_Fundamentals.ipynb +++ b/P2 Python Fundamentals/Module_5.0_Required_FINAL_Project_Python_Fundamentals.ipynb @@ -83,14 +83,104 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 7, "metadata": { "collapsed": true }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Welcome Ben Reed, list any 5 of the first 20 elements in the Periodic Table: \n", + "\n", + "==============================\n", + "60 % correct\n", + "Found: Hydrogen Lithium Sodium\n", + "Not Found: Berries Zenon\n", + "==============================\n" + ] + } + ], "source": [ "# [] create Element_Quiz\n", "\n", + "##Download the data file for elements1_20.txt\n", + "!curl -s -O https://raw.githubusercontent.com/MicrosoftLearning/intropython/master/elements1_20.txt\n", + "\n", + "def get_names(): ## creates a function that gets the person's name, and gets input for the name of the element.\n", + " ## If the input is empty, it says space not allowed.\n", + " ## if it is a duplicate, it says no duplicates.\n", + " ## If it is a new input, it appemd it to the input_names list.\n", + "\n", + " input_names = []\n", + "\n", + " while len(input_names) < 5:\n", + " name = input(\"Enter the name of an element: \").lower().strip()\n", + "\n", + " if name == \"\":\n", + " print(\"Empty Space Not Allowed\")\n", + "\n", + " elif name in input_names:\n", + "\n", + " print(f\"{name} was already entered <--- no duplicates allowed\")\n", + "\n", + " else:\n", + " input_names.append(name)\n", + "\n", + " return input_names\n", + "\n", + "## The program welcomes the user and asks for 5 elements.\n", + "your_name = input(\"Please enter your full name: \")\n", + "print(f\"Welcome {your_name}, list any 5 of the first 20 elements in the Periodic Table: \")\n", + "\n", + "first_20_elements = []\n", + "\n", + "try: ## The program opens elements1_20.txt and reads one line at a time.\n", + " ## The program also removes any whitespace, makes it lowercase, and appends to the first_20_elements list.\n", + "\n", + " elements_file = open('elements1_20.txt', 'r')\n", + "\n", + " for line in elements_file:\n", + "\n", + " first_20_elements.append(line.strip().lower())\n", + "\n", + " elements_file.close()\n", + "\n", + "except FileNotFoundError: ## The code will exit the program and notify of the elements1_20.txt file was not found.\n", + " print(\"Error: The file 'elements1_20.txt' was not found.\")\n", + " exit()\n", + "\n", + "quiz_reponses = get_names() ## Call the get_names function.\n", + "correct_responses = [] ## Makes a list of correct responses.\n", + "incorrect_responses = [] ## Makes a list of incorrect repsonses.\n", + "\n", + "for response in quiz_reponses: ## Now we iterate through the 5 reponses from the user input.\n", + " ## It comparess each response to the list of 20 elements.\n", + " if response in first_20_elements:\n", + " ## If correct, the input is appended to the correct_response list.\n", + " correct_responses.append(response)\n", + "\n", + " else: ## if the input is incorrect, it appends it to the incorrect_response list.\n", + " incorrect_responses.append(response)\n", + "\n", + "percent_correct = len(correct_responses) * 20 ## the list of correct_reponse times 20 gives the percent correct.\n", + "percent_correct = int(percent_correct) ##turns percent correct into an int.\n", + "\n", + "print(\"\\n\" + \"=\"*30)\n", + "print(f\"{percent_correct} % correct\")\n", + "\n", + "found_list = [name.title() for name in correct_responses] ## turns correct responses into Title form for printing.\n", + "\n", + "print(\"Found: \", end=\"\")\n", + "print(' '.join(found_list)) ## Joins the found_list into a single string with spaces betweem.\n", + "\n", + "not_found_list = [name.title() for name in incorrect_responses]## turns incorrect responses into Title form for printing.\n", + "print(\"Not Found: \", end=\"\")\n", + "print(\" \".join(not_found_list)) ## Joins the found_list into a single string with spaces betweem.\n", + "\n", + "print(\"=\"*30)\n", + "\n", "\n", "\n" ] @@ -120,7 +210,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.8" + "version": "3.13.7" } }, "nbformat": 4, diff --git a/P2 Python Fundamentals/elements1_20.txt b/P2 Python Fundamentals/elements1_20.txt new file mode 100644 index 0000000..4748f17 --- /dev/null +++ b/P2 Python Fundamentals/elements1_20.txt @@ -0,0 +1,20 @@ +Hydrogen +Helium +Lithium +Beryllium +Boron +Carbon +Nitrogen +Oxygen +Fluorine +Neon +Sodium +Magnesium +Aluminum +Silicon +Phosphorus +Sulfur +Chlorine +Argon +Potassium +Calcium \ No newline at end of file diff --git a/P2M5BenjaminReed.py b/P2M5BenjaminReed.py new file mode 100644 index 0000000..d3a402b --- /dev/null +++ b/P2M5BenjaminReed.py @@ -0,0 +1,92 @@ +# [] create Element_Quiz + +##Download the data file for elements1_20.txt +import os + +os.system ("curl -s -O https://raw.githubusercontent.com/MicrosoftLearning/intropython/master/elements1_20.txt") + +def get_names(): ## creates a function that gets the person's name, and gets input for the name of the element. + ## If the input is empty, it says space not allowed. + ## if it is a duplicate, it says no duplicates. + ## If it is a new input, it appemd it to the input_names list. + + input_names = [] + + while len(input_names) < 5: + name = input("Enter the name of an element: ").lower().strip() + + if name == "": + print("Empty Space Not Allowed") + + elif name in input_names: + + print(f"{name} was already entered <--- no duplicates allowed") + + else: + input_names.append(name) + + return input_names + +## The program welcomes the user and asks for 5 elements. +your_name = input("Please enter your full name: ") +print(f"Welcome {your_name}, list any 5 of the first 20 elements in the Periodic Table: ") + +first_20_elements = [] + +try: ## The program opens elements1_20.txt and reads one line at a time. + ## The program also removes any whitespace, makes it lowercase, and appends to the first_20_elements list. + + elements_file = open('elements1_20.txt', 'r') + + for line in elements_file: + + first_20_elements.append(line.strip().lower()) + + elements_file.close() + +except FileNotFoundError: ## The code will exit the program and notify of the elements1_20.txt file was not found. + print("Error: The file 'elements1_20.txt' was not found.") + exit() + +quiz_reponses = get_names() ## Call the get_names function. +correct_responses = [] ## Makes a list of correct responses. +incorrect_responses = [] ## Makes a list of incorrect repsonses. + +for response in quiz_reponses: ## Now we iterate through the 5 reponses from the user input. + ## It comparess each response to the list of 20 elements. + if response in first_20_elements: + ## If correct, the input is appended to the correct_response list. + correct_responses.append(response) + + else: ## if the input is incorrect, it appends it to the incorrect_response list. + incorrect_responses.append(response) + +percent_correct = len(correct_responses) * 20 ## the list of correct_reponse times 20 gives the percent correct. +percent_correct = int(percent_correct) ##turns percent correct into an int. + +BOLD = '\033[1m' ## makes text bold +RED = '\033[91m' ## Specifies the color red. +ENDC = '\033[0m' ## Specifies the normal color. +B_GREEN = '\033[42m' + +if percent_correct < 70: ##If the user scores less than 70%, the putput is red. + COLOR = RED + +else: + COLOR = ENDC + +print("\n" + "<>"*30) +print() +print(f"{COLOR}{BOLD}{percent_correct} % correct{ENDC}") + +found_list = [f"{B_GREEN}{BOLD}{name.title()}{ENDC}" for name in correct_responses] ## turns correct responses into Title form for printing. + +print("Found: ", end="") +print(', '.join(found_list)) ## Joins the found_list into a single string with spaces betweem. + +not_found_list = [name.title() for name in incorrect_responses]## turns incorrect responses into Title form for printing. +print("Not Found: ", end="") +print(", ".join(not_found_list)) ## Joins the found_list into a single string with spaces betweem. + +print() +print("<>"*30) \ No newline at end of file diff --git a/elements1_20.txt b/elements1_20.txt new file mode 100644 index 0000000..4748f17 --- /dev/null +++ b/elements1_20.txt @@ -0,0 +1,20 @@ +Hydrogen +Helium +Lithium +Beryllium +Boron +Carbon +Nitrogen +Oxygen +Fluorine +Neon +Sodium +Magnesium +Aluminum +Silicon +Phosphorus +Sulfur +Chlorine +Argon +Potassium +Calcium \ No newline at end of file From 48e8d3768996d82824e8df0d3fd51c0a7cdde046 Mon Sep 17 00:00:00 2001 From: Benjamin Reed Date: Thu, 30 Oct 2025 13:03:29 -0400 Subject: [PATCH 32/36] Project work --- Grade Tracker App Project.py | 249 ++++++++++++++++++ ...ed_FINAL_Project_Python_Fundamentals.ipynb | 18 +- P2 Python Fundamentals/new_file.txt | 2 - P2 Python Fundamentals/outer_planets.txt | 4 - P2 Python Fundamentals/pi.txt | 1 - P2 Python Fundamentals/poem1.txt | 7 - P2 Python Fundamentals/poem2.txt | 9 - P2 Python Fundamentals/poem2_messy.txt | 9 - P2 Python Fundamentals/rainbow.txt | 7 - P2 Python Fundamentals/rainbow_messy.txt | 7 - P2 Python Fundamentals/task4_file.txt | 8 - P2 Python Fundamentals/task5_file.txt | 10 - category_weights.txt | 1 + grades_data.txt | 1 + 14 files changed, 260 insertions(+), 73 deletions(-) create mode 100644 Grade Tracker App Project.py delete mode 100644 P2 Python Fundamentals/new_file.txt delete mode 100644 P2 Python Fundamentals/outer_planets.txt delete mode 100644 P2 Python Fundamentals/pi.txt delete mode 100644 P2 Python Fundamentals/poem1.txt delete mode 100644 P2 Python Fundamentals/poem2.txt delete mode 100644 P2 Python Fundamentals/poem2_messy.txt delete mode 100644 P2 Python Fundamentals/rainbow.txt delete mode 100644 P2 Python Fundamentals/rainbow_messy.txt delete mode 100644 P2 Python Fundamentals/task4_file.txt delete mode 100644 P2 Python Fundamentals/task5_file.txt create mode 100644 category_weights.txt create mode 100644 grades_data.txt diff --git a/Grade Tracker App Project.py b/Grade Tracker App Project.py new file mode 100644 index 0000000..887b3b0 --- /dev/null +++ b/Grade Tracker App Project.py @@ -0,0 +1,249 @@ +# ---------------------------------------------------------------------- +# 🐍 Pure Python Grade Tracker App with Category Weighting and Deletion +# ---------------------------------------------------------------------- + +# GLOBAL DATA STRUCTURES +grades = {} # Structure: { 'Course Name': [ (score, category_name), ... ], ... } +category_weights = {} # Structure: { 'Category Name': weight_percentage, ... } +FILE_NAME = 'grades_data.txt' +WEIGHTS_FILE_NAME = 'category_weights.txt' + +# ---------------------------------------------------------------------- +## 1. Helper Functions (File I/O) + +def load_grades(): + """Loads grades and category weights data from plain text files.""" + global grades, category_weights + + # --- Load Grades --- + try: + with open(FILE_NAME, 'r') as file: + grades = {} + for line in file: + # Format: CourseName,Score,CategoryName + parts = line.strip().split(',') + if len(parts) == 3: + course, score_str, category = parts + score = float(score_str) + course = course.title() + category = category.title() + + if course not in grades: + grades[course] = [] + grades[course].append((score, category)) + print(f"Loaded {len(grades)} courses from {FILE_NAME}.") + + except FileNotFoundError: + print("No existing grades file found. Starting fresh.") + except Exception: + print("Error reading grades file. Starting fresh.") + + # --- Load Category Weights --- + try: + with open(WEIGHTS_FILE_NAME, 'r') as file: + category_weights = {} + for line in file: + # Format: CategoryName,Weight + parts = line.strip().split(',') + if len(parts) == 2: + category, weight_str = parts + weight = float(weight_str) + category_weights[category.title()] = weight + print(f"Loaded {len(category_weights)} assignment categories from {WEIGHTS_FILE_NAME}.") + + except FileNotFoundError: + print("No existing weights file found. Starting fresh.") + except Exception: + print("Error reading weights file. Starting fresh.") + + return grades, category_weights + +def save_grades(): + """Saves the current grades and category weights data to plain text files.""" + global grades, category_weights + + # --- Save Grades --- + try: + with open(FILE_NAME, 'w') as file: + for course, items in grades.items(): + for score, category in items: + # Write in the format: CourseName,Score,CategoryName + file.write(f"{course},{score},{category}\n") + print(f"Grades saved to {FILE_NAME}.") + except Exception as e: + print(f"Error saving grades: {e}") + + # --- Save Category Weights --- + try: + with open(WEIGHTS_FILE_NAME, 'w') as file: + for category, weight in category_weights.items(): + # Write in the format: CategoryName,Weight + file.write(f"{category},{weight}\n") + print(f"Category weights saved to {WEIGHTS_FILE_NAME}.") + except Exception as e: + print(f"Error saving weights: {e}") + +# ---------------------------------------------------------------------- +## 2. Core Logic Functions + +def add_course(course_name): + """Adds a new course to the grades dictionary.""" + course_name = course_name.title() + if course_name not in grades: + grades[course_name] = [] + print(f"Course '{course_name}' added.") + else: + print(f"Course '{course_name}' already exists.") + +def delete_course(course_name): + """Deletes a specified course from the grades dictionary.""" + global grades + course_name = course_name.title() + + if course_name in grades: + del grades[course_name] + print(f"Course '{course_name}' has been deleted. (Remember to save before exiting!)") + else: + print(f"Error: Course '{course_name}' not found.") + +def add_grade(course_name, score, category_name): + """Adds a specific grade item (score and category) to a course.""" + course_name = course_name.title() + category_name = category_name.title() + + if course_name not in grades: + print(f"Error: Course '{course_name}' not found. Please add the course first (Menu 1).") + return + + # Handle new category type and its weight + if category_name not in category_weights: + print(f"'{category_name}' is a new assignment type.") + while True: + try: + weight = float(input(f"Enter the percentage weight for ALL '{category_name}' assignments (e.g., 20): ")) + if 0 <= weight <= 100: + category_weights[category_name] = weight + print(f"Category '{category_name}' weight set to {weight}%.") + break + else: + print("Weight must be between 0 and 100.") + except ValueError: + print("Invalid input. Please enter a number for the weight.") + + # Add the grade + grades[course_name].append((score, category_name)) + print(f"Grade {score}% added to {course_name} under category '{category_name}'.") + +def calculate_gpa(course_name): + """Calculates the weighted average grade for a single course based on category weights.""" + course_name = course_name.title() + if course_name not in grades or not grades[course_name]: + return "N/A" + + category_scores = {} + + # Organize scores by category + for score, category in grades[course_name]: + # Explicitly convert to string to avoid 'AttributeError: 'float' object has no attribute 'title'' + category = str(category).title() + if category not in category_scores: + category_scores[category] = [] + category_scores[category].append(score) + + total_weighted_sum = 0 + total_category_weight = 0 + + # Calculate average for each category and apply the category's weight + for category, scores in category_scores.items(): + if category in category_weights: + category_weight = category_weights[category] + category_average = sum(scores) / len(scores) + + total_weighted_sum += (category_average * category_weight) + total_category_weight += category_weight + + # Print detailed breakdown + print(f" > {category} Avg: {category_average:.2f}% (Weight: {category_weight}%)") + + # Final GPA calculation + if total_category_weight > 0: + final_gpa = total_weighted_sum / total_category_weight + return f"{final_gpa:.2f}%" + else: + return "No grades in weighted categories." + +# ---------------------------------------------------------------------- +## 3. Main Application Loop + +def grade_tracker_app(): + """The main user interface for the application.""" + load_grades() + + while True: + print("\n--- Grade Tracker Menu ---") + print("1. Add a New Course") + print("2. Add a Grade (Score and Category)") + print("3. View Course GPA") + print("4. View All Category Weights") + print("5. Delete a Course 🗑️") + print("6. Save and Exit") + + choice = input("Enter your choice (1-6): ") + + if choice == '1': + name = input("Enter the course name: ") + add_course(name) + + elif choice == '2': + # Check if there are courses to add grades to + if grades: + print("\nAvailable Courses:", ", ".join(grades.keys())) + course = input("Enter course name to add grade: ") + category = input("Enter assignment type (e.g., Quiz, Test, Homework): ") + try: + score = float(input(f"Enter score for {category} (e.g., 92.5): ")) + add_grade(course, score, category) + except ValueError: + print("Invalid input for score. Please use a number.") + else: + print("Please add a course first (Menu 1).") + + elif choice == '3': + if grades: + print("\nAvailable Courses:", ", ".join(grades.keys())) + course = input("Enter course name to view GPA: ") + print(f"\n--- GPA Calculation for {course.title()} ---") + gpa = calculate_gpa(course) + print(f"\nFINAL GPA for {course.title()}: **{gpa}**") + else: + print("No courses available to calculate GPA.") + + elif choice == '4': + print("\n--- Current Assignment Category Weights ---") + if category_weights: + for cat, weight in category_weights.items(): + print(f" > {cat}: {weight}%") + else: + print("No categories defined yet.") + + elif choice == '5': + if grades: + print("\nAvailable Courses:", ", ".join(grades.keys())) + course_to_delete = input("Enter the course name to DELETE: ") + delete_course(course_to_delete) + else: + print("No courses available to delete.") + + elif choice == '6': + save_grades() + print("Exiting application. Goodbye!") + break + + else: + print("Invalid choice. Please enter a number from 1 to 6.") + +# ---------------------------------------------------------------------- + +# Run the application +if __name__ == "__main__": + grade_tracker_app() \ No newline at end of file diff --git a/P2 Python Fundamentals/Module_5.0_Required_FINAL_Project_Python_Fundamentals.ipynb b/P2 Python Fundamentals/Module_5.0_Required_FINAL_Project_Python_Fundamentals.ipynb index 4a20164..3147ac3 100644 --- a/P2 Python Fundamentals/Module_5.0_Required_FINAL_Project_Python_Fundamentals.ipynb +++ b/P2 Python Fundamentals/Module_5.0_Required_FINAL_Project_Python_Fundamentals.ipynb @@ -83,7 +83,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 9, "metadata": { "collapsed": true }, @@ -94,11 +94,11 @@ "text": [ "Welcome Ben Reed, list any 5 of the first 20 elements in the Periodic Table: \n", "\n", - "==============================\n", + "><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><\n", "60 % correct\n", - "Found: Hydrogen Lithium Sodium\n", - "Not Found: Berries Zenon\n", - "==============================\n" + "Found: Helium, Sodium, Silicon\n", + "Not Found: Zenon, Hyrdrogen\n", + "><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><\n" ] } ], @@ -167,19 +167,19 @@ "percent_correct = len(correct_responses) * 20 ## the list of correct_reponse times 20 gives the percent correct.\n", "percent_correct = int(percent_correct) ##turns percent correct into an int.\n", "\n", - "print(\"\\n\" + \"=\"*30)\n", + "print(\"\\n\" + \"><\"*30)\n", "print(f\"{percent_correct} % correct\")\n", "\n", "found_list = [name.title() for name in correct_responses] ## turns correct responses into Title form for printing.\n", "\n", "print(\"Found: \", end=\"\")\n", - "print(' '.join(found_list)) ## Joins the found_list into a single string with spaces betweem.\n", + "print(', '.join(found_list)) ## Joins the found_list into a single string with spaces betweem.\n", "\n", "not_found_list = [name.title() for name in incorrect_responses]## turns incorrect responses into Title form for printing.\n", "print(\"Not Found: \", end=\"\")\n", - "print(\" \".join(not_found_list)) ## Joins the found_list into a single string with spaces betweem.\n", + "print(\", \".join(not_found_list)) ## Joins the found_list into a single string with spaces betweem.\n", "\n", - "print(\"=\"*30)\n", + "print(\"><\"*30)\n", "\n", "\n", "\n" diff --git a/P2 Python Fundamentals/new_file.txt b/P2 Python Fundamentals/new_file.txt deleted file mode 100644 index 61ec3a7..0000000 --- a/P2 Python Fundamentals/new_file.txt +++ /dev/null @@ -1,2 +0,0 @@ -This is line #1 with 'w+' -This is line #2 with 'w+' diff --git a/P2 Python Fundamentals/outer_planets.txt b/P2 Python Fundamentals/outer_planets.txt deleted file mode 100644 index eec8a67..0000000 --- a/P2 Python Fundamentals/outer_planets.txt +++ /dev/null @@ -1,4 +0,0 @@ -Jupiter -Saturn -Uranus -Neptune diff --git a/P2 Python Fundamentals/pi.txt b/P2 Python Fundamentals/pi.txt deleted file mode 100644 index 8577145..0000000 --- a/P2 Python Fundamentals/pi.txt +++ /dev/null @@ -1 +0,0 @@ -3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067982148086513282306647093844609550582231725359408128481117450284102701938521105559644622948954930381964428810975665933446128475648233786783165271201909145648566923460348610454326648213393607260249141273 diff --git a/P2 Python Fundamentals/poem1.txt b/P2 Python Fundamentals/poem1.txt deleted file mode 100644 index d8d57e3..0000000 --- a/P2 Python Fundamentals/poem1.txt +++ /dev/null @@ -1,7 +0,0 @@ -Loops I repeat -loops -loops -loops -I repeat -until I -break diff --git a/P2 Python Fundamentals/poem2.txt b/P2 Python Fundamentals/poem2.txt deleted file mode 100644 index ebec5a4..0000000 --- a/P2 Python Fundamentals/poem2.txt +++ /dev/null @@ -1,9 +0,0 @@ -while True -I loop -True -loop -True -loop -not True -False -end diff --git a/P2 Python Fundamentals/poem2_messy.txt b/P2 Python Fundamentals/poem2_messy.txt deleted file mode 100644 index 1c9b22f..0000000 --- a/P2 Python Fundamentals/poem2_messy.txt +++ /dev/null @@ -1,9 +0,0 @@ -(while True) -(I loop) -(True) -(loop) -(True) -(loop) -(not True) -(False) -(end) diff --git a/P2 Python Fundamentals/rainbow.txt b/P2 Python Fundamentals/rainbow.txt deleted file mode 100644 index 26ec8e7..0000000 --- a/P2 Python Fundamentals/rainbow.txt +++ /dev/null @@ -1,7 +0,0 @@ -red -orange -yellow -green -blue -indigo -violet diff --git a/P2 Python Fundamentals/rainbow_messy.txt b/P2 Python Fundamentals/rainbow_messy.txt deleted file mode 100644 index 5b7eb88..0000000 --- a/P2 Python Fundamentals/rainbow_messy.txt +++ /dev/null @@ -1,7 +0,0 @@ -**red** -**orange** -**yellow** -**green** -**blue** -**indigo** -**violet** diff --git a/P2 Python Fundamentals/task4_file.txt b/P2 Python Fundamentals/task4_file.txt deleted file mode 100644 index 6fdcb98..0000000 --- a/P2 Python Fundamentals/task4_file.txt +++ /dev/null @@ -1,8 +0,0 @@ -Line1 -Line2 -Line3 -append #0 -append #1 -append #2 -append #3 -append #4 diff --git a/P2 Python Fundamentals/task5_file.txt b/P2 Python Fundamentals/task5_file.txt deleted file mode 100644 index 0c7a659..0000000 --- a/P2 Python Fundamentals/task5_file.txt +++ /dev/null @@ -1,10 +0,0 @@ -Line---1 -Line---2append#1 - -Line--append#2 --5 -Lineappend#3 ----7 -Liappend#4 -ne---9 -Line--10 diff --git a/category_weights.txt b/category_weights.txt new file mode 100644 index 0000000..32d72df --- /dev/null +++ b/category_weights.txt @@ -0,0 +1 @@ +Quiz,40.0 diff --git a/grades_data.txt b/grades_data.txt new file mode 100644 index 0000000..b1553ed --- /dev/null +++ b/grades_data.txt @@ -0,0 +1 @@ +Is 3020,90.0,Quiz From b9a936428f40e5db945a05d4c6609dc8633db80f Mon Sep 17 00:00:00 2001 From: Benjamin Reed Date: Thu, 30 Oct 2025 14:09:16 -0400 Subject: [PATCH 33/36] project work --- Grade Tracker App Project.py | 208 +++++++++++++---------- P2 Python Fundamentals/cities.txt | 7 - P2 Python Fundamentals/cities_messy.txt | 7 - P2 Python Fundamentals/code_tips.txt | 4 - P2 Python Fundamentals/count_file.txt | 1 - P2 Python Fundamentals/days.txt | 7 - P2 Python Fundamentals/digits_of_pi.txt | 1 - P2 Python Fundamentals/elements1_20.txt | 20 --- P2 Python Fundamentals/inner_planets.txt | 4 - P2 Python Fundamentals/log_file.txt | 3 - P2 Python Fundamentals/mean_temp.txt | 10 -- category_weights.txt | 1 - elements1_20.txt | 20 --- grades_data.txt | 4 +- 14 files changed, 119 insertions(+), 178 deletions(-) delete mode 100644 P2 Python Fundamentals/cities.txt delete mode 100644 P2 Python Fundamentals/cities_messy.txt delete mode 100644 P2 Python Fundamentals/code_tips.txt delete mode 100644 P2 Python Fundamentals/count_file.txt delete mode 100644 P2 Python Fundamentals/days.txt delete mode 100644 P2 Python Fundamentals/digits_of_pi.txt delete mode 100644 P2 Python Fundamentals/elements1_20.txt delete mode 100644 P2 Python Fundamentals/inner_planets.txt delete mode 100644 P2 Python Fundamentals/log_file.txt delete mode 100644 P2 Python Fundamentals/mean_temp.txt delete mode 100644 category_weights.txt delete mode 100644 elements1_20.txt diff --git a/Grade Tracker App Project.py b/Grade Tracker App Project.py index 887b3b0..2181d92 100644 --- a/Grade Tracker App Project.py +++ b/Grade Tracker App Project.py @@ -1,102 +1,89 @@ # ---------------------------------------------------------------------- -# 🐍 Pure Python Grade Tracker App with Category Weighting and Deletion +# 🐍 COMPLETE COURSE-SPECIFIC WEIGHTED GRADE TRACKER APP +# Features: Course-specific category weights, Add/Delete Course, +# Single GPA breakdown, All GPA summary. # ---------------------------------------------------------------------- # GLOBAL DATA STRUCTURES -grades = {} # Structure: { 'Course Name': [ (score, category_name), ... ], ... } -category_weights = {} # Structure: { 'Category Name': weight_percentage, ... } +# Structure: +# grades = { +# 'Course Name': { +# 'grades': [ (score, category_name), ... ], +# 'weights': { 'Category Name': weight_percentage, ... } +# }, +# } +grades = {} FILE_NAME = 'grades_data.txt' -WEIGHTS_FILE_NAME = 'category_weights.txt' # ---------------------------------------------------------------------- -## 1. Helper Functions (File I/O) +## 1. Helper Functions (Pure Python File I/O) def load_grades(): - """Loads grades and category weights data from plain text files.""" - global grades, category_weights + """Loads grades data from a plain text file, rebuilding the nested structure.""" + global grades - # --- Load Grades --- try: with open(FILE_NAME, 'r') as file: grades = {} for line in file: - # Format: CourseName,Score,CategoryName + # Format: CourseName,Score,CategoryName,CategoryWeight parts = line.strip().split(',') - if len(parts) == 3: - course, score_str, category = parts + if len(parts) == 4: + course, score_str, category, weight_str = parts score = float(score_str) + weight = float(weight_str) course = course.title() category = category.title() + # Rebuild the nested dictionary structure if course not in grades: - grades[course] = [] - grades[course].append((score, category)) + grades[course] = {'grades': [], 'weights': {}} + + grades[course]['grades'].append((score, category)) + grades[course]['weights'][category] = weight + print(f"Loaded {len(grades)} courses from {FILE_NAME}.") except FileNotFoundError: print("No existing grades file found. Starting fresh.") except Exception: - print("Error reading grades file. Starting fresh.") - - # --- Load Category Weights --- - try: - with open(WEIGHTS_FILE_NAME, 'r') as file: - category_weights = {} - for line in file: - # Format: CategoryName,Weight - parts = line.strip().split(',') - if len(parts) == 2: - category, weight_str = parts - weight = float(weight_str) - category_weights[category.title()] = weight - print(f"Loaded {len(category_weights)} assignment categories from {WEIGHTS_FILE_NAME}.") - - except FileNotFoundError: - print("No existing weights file found. Starting fresh.") - except Exception: - print("Error reading weights file. Starting fresh.") - - return grades, category_weights + print("Error reading grades file. Data might be corrupt. Starting fresh.") def save_grades(): - """Saves the current grades and category weights data to plain text files.""" - global grades, category_weights + """Saves all courses, grades, and their course-specific weights to one text file.""" + global grades - # --- Save Grades --- try: with open(FILE_NAME, 'w') as file: - for course, items in grades.items(): - for score, category in items: - # Write in the format: CourseName,Score,CategoryName - file.write(f"{course},{score},{category}\n") - print(f"Grades saved to {FILE_NAME}.") + for course, data in grades.items(): + course_weights = data['weights'] + + # Check if course has any grades before saving + if data['grades']: + for score, category in data['grades']: + # The weight must exist since it was required during add_grade + weight = course_weights[category] + + # Write in the format: CourseName,Score,CategoryName,CategoryWeight + file.write(f"{course},{score},{category},{weight}\n") + print(f"Grades and course-specific weights saved to {FILE_NAME}.") except Exception as e: print(f"Error saving grades: {e}") - # --- Save Category Weights --- - try: - with open(WEIGHTS_FILE_NAME, 'w') as file: - for category, weight in category_weights.items(): - # Write in the format: CategoryName,Weight - file.write(f"{category},{weight}\n") - print(f"Category weights saved to {WEIGHTS_FILE_NAME}.") - except Exception as e: - print(f"Error saving weights: {e}") - # ---------------------------------------------------------------------- ## 2. Core Logic Functions def add_course(course_name): - """Adds a new course to the grades dictionary.""" + """Adds a new course, initializing its nested data structure.""" course_name = course_name.title() if course_name not in grades: - grades[course_name] = [] + grades[course_name] = {'grades': [], 'weights': {}} print(f"Course '{course_name}' added.") else: print(f"Course '{course_name}' already exists.") def delete_course(course_name): - """Deletes a specified course from the grades dictionary.""" + """Deletes a specified course and all its grades/weights.""" global grades course_name = course_name.title() @@ -107,7 +94,7 @@ def delete_course(course_name): print(f"Error: Course '{course_name}' not found.") def add_grade(course_name, score, category_name): - """Adds a specific grade item (score and category) to a course.""" + """Adds a grade, checks for course-specific category weight, and prompts if needed.""" course_name = course_name.title() category_name = category_name.title() @@ -115,36 +102,41 @@ def add_grade(course_name, score, category_name): print(f"Error: Course '{course_name}' not found. Please add the course first (Menu 1).") return - # Handle new category type and its weight - if category_name not in category_weights: - print(f"'{category_name}' is a new assignment type.") + course_weights = grades[course_name]['weights'] + + # Handle new category type and its course-specific weight + if category_name not in course_weights: + print(f"'{category_name}' is a NEW assignment type for {course_name}.") while True: try: - weight = float(input(f"Enter the percentage weight for ALL '{category_name}' assignments (e.g., 20): ")) + weight = float(input(f"Enter the percentage weight for ALL '{category_name}' assignments in {course_name} (e.g., 20): ")) if 0 <= weight <= 100: - category_weights[category_name] = weight - print(f"Category '{category_name}' weight set to {weight}%.") + course_weights[category_name] = weight + print(f"Category '{category_name}' weight set to {weight}% for {course_name}.") break else: print("Weight must be between 0 and 100.") except ValueError: print("Invalid input. Please enter a number for the weight.") - # Add the grade - grades[course_name].append((score, category_name)) + # Add the grade to the course's grades list + grades[course_name]['grades'].append((score, category_name)) print(f"Grade {score}% added to {course_name} under category '{category_name}'.") -def calculate_gpa(course_name): - """Calculates the weighted average grade for a single course based on category weights.""" +def calculate_gpa(course_name, show_breakdown=True): + """Calculates the weighted average grade for a single course. + If show_breakdown is True, prints the category details.""" course_name = course_name.title() - if course_name not in grades or not grades[course_name]: + if course_name not in grades or not grades[course_name]['grades']: return "N/A" + course_data = grades[course_name] + course_weights = course_data['weights'] + category_scores = {} - # Organize scores by category - for score, category in grades[course_name]: - # Explicitly convert to string to avoid 'AttributeError: 'float' object has no attribute 'title'' + # 1. Organize scores by category + for score, category in course_data['grades']: category = str(category).title() if category not in category_scores: category_scores[category] = [] @@ -153,25 +145,43 @@ def calculate_gpa(course_name): total_weighted_sum = 0 total_category_weight = 0 - # Calculate average for each category and apply the category's weight + # 2. Calculate average for each category and apply the course's specific weight for category, scores in category_scores.items(): - if category in category_weights: - category_weight = category_weights[category] + if category in course_weights: + category_weight = course_weights[category] category_average = sum(scores) / len(scores) total_weighted_sum += (category_average * category_weight) total_category_weight += category_weight - # Print detailed breakdown - print(f" > {category} Avg: {category_average:.2f}% (Weight: {category_weight}%)") + if show_breakdown: + print(f" > {category} Avg: {category_average:.2f}% (Weight: {category_weight}%)") - # Final GPA calculation + # 3. Final GPA calculation if total_category_weight > 0: final_gpa = total_weighted_sum / total_category_weight return f"{final_gpa:.2f}%" else: return "No grades in weighted categories." +def calculate_all_gpas(): + """Calculates and prints the weighted average GPA for all stored courses.""" + global grades + + if not grades: + print("No courses added yet.") + return + + print("\n--- Summary of All Course GPAs 📈 ---") + print("-----------------------------------") + + for course_name in grades.keys(): + # Call calculate_gpa with show_breakdown=False to avoid clutter + gpa_result = calculate_gpa(course_name, show_breakdown=False) + print(f" > {course_name}: {gpa_result}") + + print("-----------------------------------") + # ---------------------------------------------------------------------- ## 3. Main Application Loop @@ -183,19 +193,19 @@ def grade_tracker_app(): print("\n--- Grade Tracker Menu ---") print("1. Add a New Course") print("2. Add a Grade (Score and Category)") - print("3. View Course GPA") - print("4. View All Category Weights") - print("5. Delete a Course 🗑️") - print("6. Save and Exit") + print("3. View GPA for ALL Courses 📈") + print("4. View GPA for a Single Course (with Breakdown)") + print("5. View Course Category Weights") + print("6. Delete a Course 🗑️") + print("7. Save and Exit") - choice = input("Enter your choice (1-6): ") + choice = input("Enter your choice (1-7): ") if choice == '1': name = input("Enter the course name: ") add_course(name) elif choice == '2': - # Check if there are courses to add grades to if grades: print("\nAvailable Courses:", ", ".join(grades.keys())) course = input("Enter course name to add grade: ") @@ -209,24 +219,38 @@ def grade_tracker_app(): print("Please add a course first (Menu 1).") elif choice == '3': + calculate_all_gpas() + + elif choice == '4': if grades: print("\nAvailable Courses:", ", ".join(grades.keys())) course = input("Enter course name to view GPA: ") print(f"\n--- GPA Calculation for {course.title()} ---") - gpa = calculate_gpa(course) + # Call calculate_gpa with default show_breakdown=True + gpa = calculate_gpa(course) print(f"\nFINAL GPA for {course.title()}: **{gpa}**") else: print("No courses available to calculate GPA.") - elif choice == '4': - print("\n--- Current Assignment Category Weights ---") - if category_weights: - for cat, weight in category_weights.items(): - print(f" > {cat}: {weight}%") + elif choice == '5': + if grades: + print("\nAvailable Courses:", ", ".join(grades.keys())) + course_to_view = input("Enter course name to view weights: ").title() + + if course_to_view in grades: + weights = grades[course_to_view]['weights'] + print(f"\n--- {course_to_view} Category Weights ---") + if weights: + for cat, weight in weights.items(): + print(f" > {cat}: {weight}%") + else: + print(f"No categories defined for {course_to_view} yet.") + else: + print(f"Error: Course '{course_to_view}' not found.") else: - print("No categories defined yet.") + print("No courses available to view weights.") - elif choice == '5': + elif choice == '6': if grades: print("\nAvailable Courses:", ", ".join(grades.keys())) course_to_delete = input("Enter the course name to DELETE: ") @@ -234,13 +258,13 @@ def grade_tracker_app(): else: print("No courses available to delete.") - elif choice == '6': + elif choice == '7': save_grades() print("Exiting application. Goodbye!") break else: - print("Invalid choice. Please enter a number from 1 to 6.") + print("Invalid choice. Please enter a number from 1 to 7.") # ---------------------------------------------------------------------- diff --git a/P2 Python Fundamentals/cities.txt b/P2 Python Fundamentals/cities.txt deleted file mode 100644 index c91f881..0000000 --- a/P2 Python Fundamentals/cities.txt +++ /dev/null @@ -1,7 +0,0 @@ -Beijing -Cairo -London -Nairobi -New York City -Sydney -Tokyo diff --git a/P2 Python Fundamentals/cities_messy.txt b/P2 Python Fundamentals/cities_messy.txt deleted file mode 100644 index af402e8..0000000 --- a/P2 Python Fundamentals/cities_messy.txt +++ /dev/null @@ -1,7 +0,0 @@ - Beijing: - Cairo: - London: - Nairobi: - New York City: - Sydney: - Tokyo: diff --git a/P2 Python Fundamentals/code_tips.txt b/P2 Python Fundamentals/code_tips.txt deleted file mode 100644 index 58e671e..0000000 --- a/P2 Python Fundamentals/code_tips.txt +++ /dev/null @@ -1,4 +0,0 @@ --USE SIMPLE FUNCTION AND VARIABLE NAMES --comment code --organize code into functions --use seek(0,2) to set read/write at end of file diff --git a/P2 Python Fundamentals/count_file.txt b/P2 Python Fundamentals/count_file.txt deleted file mode 100644 index a80d160..0000000 --- a/P2 Python Fundamentals/count_file.txt +++ /dev/null @@ -1 +0,0 @@ -Count is: 7 \ No newline at end of file diff --git a/P2 Python Fundamentals/days.txt b/P2 Python Fundamentals/days.txt deleted file mode 100644 index 9ca51e7..0000000 --- a/P2 Python Fundamentals/days.txt +++ /dev/null @@ -1,7 +0,0 @@ -Monday -Tuesday -Wednesday -Thursday -Friday -saturday -sunday diff --git a/P2 Python Fundamentals/digits_of_pi.txt b/P2 Python Fundamentals/digits_of_pi.txt deleted file mode 100644 index 8577145..0000000 --- a/P2 Python Fundamentals/digits_of_pi.txt +++ /dev/null @@ -1 +0,0 @@ -3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067982148086513282306647093844609550582231725359408128481117450284102701938521105559644622948954930381964428810975665933446128475648233786783165271201909145648566923460348610454326648213393607260249141273 diff --git a/P2 Python Fundamentals/elements1_20.txt b/P2 Python Fundamentals/elements1_20.txt deleted file mode 100644 index 4748f17..0000000 --- a/P2 Python Fundamentals/elements1_20.txt +++ /dev/null @@ -1,20 +0,0 @@ -Hydrogen -Helium -Lithium -Beryllium -Boron -Carbon -Nitrogen -Oxygen -Fluorine -Neon -Sodium -Magnesium -Aluminum -Silicon -Phosphorus -Sulfur -Chlorine -Argon -Potassium -Calcium \ No newline at end of file diff --git a/P2 Python Fundamentals/inner_planets.txt b/P2 Python Fundamentals/inner_planets.txt deleted file mode 100644 index 6b75118..0000000 --- a/P2 Python Fundamentals/inner_planets.txt +++ /dev/null @@ -1,4 +0,0 @@ -Mercury -Venus -Earth -Mars diff --git a/P2 Python Fundamentals/log_file.txt b/P2 Python Fundamentals/log_file.txt deleted file mode 100644 index 0019ce7..0000000 --- a/P2 Python Fundamentals/log_file.txt +++ /dev/null @@ -1,3 +0,0 @@ -1: opened file -2: looked at file -3: closed file diff --git a/P2 Python Fundamentals/mean_temp.txt b/P2 Python Fundamentals/mean_temp.txt deleted file mode 100644 index 75bd47b..0000000 --- a/P2 Python Fundamentals/mean_temp.txt +++ /dev/null @@ -1,10 +0,0 @@ -city,country,month ave: highest high,month ave: lowest low -Beijing,China,30.9,-8.4 -Cairo,Egypt,34.7,1.2 -London,UK,23.5,2.1 -Nairobi,Kenya,26.3,10.5 -New York City,USA,28.9,-2.8 -Sydney,Australia,26.5,8.7 -Tokyo,Japan,30.8,0.9 -RIO de Janeiro, Brazil, 30.0,18.0 -RIO de Janeiro, Brazil, 30.0,18.0 diff --git a/category_weights.txt b/category_weights.txt deleted file mode 100644 index 32d72df..0000000 --- a/category_weights.txt +++ /dev/null @@ -1 +0,0 @@ -Quiz,40.0 diff --git a/elements1_20.txt b/elements1_20.txt deleted file mode 100644 index 4748f17..0000000 --- a/elements1_20.txt +++ /dev/null @@ -1,20 +0,0 @@ -Hydrogen -Helium -Lithium -Beryllium -Boron -Carbon -Nitrogen -Oxygen -Fluorine -Neon -Sodium -Magnesium -Aluminum -Silicon -Phosphorus -Sulfur -Chlorine -Argon -Potassium -Calcium \ No newline at end of file diff --git a/grades_data.txt b/grades_data.txt index b1553ed..08d95f3 100644 --- a/grades_data.txt +++ b/grades_data.txt @@ -1 +1,3 @@ -Is 3020,90.0,Quiz +Is 3020,50.0,Quiz,60.0 +Is 3020,95.0,Homework,10.0 +Math 1101,90.0,Test,60.0 From 1a4818d88f1761a50ee7fb8482b48a7761cfb687 Mon Sep 17 00:00:00 2001 From: Benjamin Reed Date: Tue, 4 Nov 2025 08:55:58 -0500 Subject: [PATCH 34/36] P2M5 work --- elements1_20.txt | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 elements1_20.txt diff --git a/elements1_20.txt b/elements1_20.txt new file mode 100644 index 0000000..4748f17 --- /dev/null +++ b/elements1_20.txt @@ -0,0 +1,20 @@ +Hydrogen +Helium +Lithium +Beryllium +Boron +Carbon +Nitrogen +Oxygen +Fluorine +Neon +Sodium +Magnesium +Aluminum +Silicon +Phosphorus +Sulfur +Chlorine +Argon +Potassium +Calcium \ No newline at end of file From cd55617fa19dd5b2d6583456d79badbc505c7719 Mon Sep 17 00:00:00 2001 From: Benjamin Reed Date: Fri, 7 Nov 2025 09:08:48 -0500 Subject: [PATCH 35/36] Create SampleGradeTracker.py --- SampleGradeTracker.py | 73 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 SampleGradeTracker.py diff --git a/SampleGradeTracker.py b/SampleGradeTracker.py new file mode 100644 index 0000000..1243afd --- /dev/null +++ b/SampleGradeTracker.py @@ -0,0 +1,73 @@ +# Displaying the title and instructions for the user +print("-------- Weighted Course Grade Calculator --------") +print("\nInstructions: Enter the number of weighted assignments, then input each grade (0-100) and its weight (0-100). The total weight must not exceed 100. Use this calculator to determine your overall course grade, assess the impact of assignments, and track your academic progress throughout the semester.") + +# Initialize an empty list to store each assignment's grade and weight +assignments = [] + +# Ask the user how many assignments or sections they want to enter +num = int(input("\nHow many weighted assignments/sections do you have? ")) + +# Track the total weight entered by the user to ensure it doesn't exceed 100 +total_weight = 0 + +# Loop through each assignment +for i in range(num): + print("\nAssignment/Section", i + 1) + + # Get a valid grade from the user (between 0 and 100) + while True: + grade = float(input(" Enter the grade (0-100): ")) + if 0 <= grade <= 100: + break + else: + print(" Please enter a grade between 0 and 100.") + + # Get a valid weight from the user and ensure total doesn't exceed 100 + while True: + weight = float(input(" Enter the weight: ")) + if 0 <= weight <= 100 and total_weight + weight <= 100: + total_weight += weight + break + else: + print(" Weight must be between 0 and 100 and total weights cannot exceed 100.") + + # Store the grade and weight as a dictionary and add to the list + assignment = {"grade": grade, "weight": weight} + assignments.append(assignment) + + +# Function to calculate the weighted overall grade +def calculate_grade(assignments): + total = 0 + for a in assignments: + # Multiply each grade by its weight and add to the total + total += a["grade"] * a["weight"] + + # Check to avoid division by zero + if total_weight == 0: + print(" Weight must be between 0 and 100 and total weights cannot exceed 100.") + else: + overall = total / total_weight + return overall + + +# Function to return a motivational message based on the final grade +def grade_message(grade): + if grade >= 90: + return "Great job! You're doing excellent!" + elif grade >= 80: + return "Good work! Keep it up!" + elif grade >= 70: + return "You're getting there, keep pushing!" + else: + return "Don't give up! You can improve!" + + +# Call the calculation function and print the result and message +overall = calculate_grade(assignments) +print("\nYour current overall grade is:", overall, "%") +print(grade_message(overall)) + +# Closing message +print("\nThanks for using the calculator! Good luck!") \ No newline at end of file From 02d40c6ebbf650f8d64b51143da31b543bf1df7a Mon Sep 17 00:00:00 2001 From: Benjamin Reed Date: Fri, 14 Nov 2025 09:19:00 -0500 Subject: [PATCH 36/36] project work --- SampleGradeTracker.py | 73 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 SampleGradeTracker.py diff --git a/SampleGradeTracker.py b/SampleGradeTracker.py new file mode 100644 index 0000000..1243afd --- /dev/null +++ b/SampleGradeTracker.py @@ -0,0 +1,73 @@ +# Displaying the title and instructions for the user +print("-------- Weighted Course Grade Calculator --------") +print("\nInstructions: Enter the number of weighted assignments, then input each grade (0-100) and its weight (0-100). The total weight must not exceed 100. Use this calculator to determine your overall course grade, assess the impact of assignments, and track your academic progress throughout the semester.") + +# Initialize an empty list to store each assignment's grade and weight +assignments = [] + +# Ask the user how many assignments or sections they want to enter +num = int(input("\nHow many weighted assignments/sections do you have? ")) + +# Track the total weight entered by the user to ensure it doesn't exceed 100 +total_weight = 0 + +# Loop through each assignment +for i in range(num): + print("\nAssignment/Section", i + 1) + + # Get a valid grade from the user (between 0 and 100) + while True: + grade = float(input(" Enter the grade (0-100): ")) + if 0 <= grade <= 100: + break + else: + print(" Please enter a grade between 0 and 100.") + + # Get a valid weight from the user and ensure total doesn't exceed 100 + while True: + weight = float(input(" Enter the weight: ")) + if 0 <= weight <= 100 and total_weight + weight <= 100: + total_weight += weight + break + else: + print(" Weight must be between 0 and 100 and total weights cannot exceed 100.") + + # Store the grade and weight as a dictionary and add to the list + assignment = {"grade": grade, "weight": weight} + assignments.append(assignment) + + +# Function to calculate the weighted overall grade +def calculate_grade(assignments): + total = 0 + for a in assignments: + # Multiply each grade by its weight and add to the total + total += a["grade"] * a["weight"] + + # Check to avoid division by zero + if total_weight == 0: + print(" Weight must be between 0 and 100 and total weights cannot exceed 100.") + else: + overall = total / total_weight + return overall + + +# Function to return a motivational message based on the final grade +def grade_message(grade): + if grade >= 90: + return "Great job! You're doing excellent!" + elif grade >= 80: + return "Good work! Keep it up!" + elif grade >= 70: + return "You're getting there, keep pushing!" + else: + return "Don't give up! You can improve!" + + +# Call the calculation function and print the result and message +overall = calculate_grade(assignments) +print("\nYour current overall grade is:", overall, "%") +print(grade_message(overall)) + +# Closing message +print("\nThanks for using the calculator! Good luck!") \ No newline at end of file