[{"data":1,"prerenderedAt":1160},["ShallowReactive",2],{"page-\u002Fpython":3},{"id":4,"title":5,"body":6,"description":1153,"extension":1154,"meta":1155,"navigation":1062,"path":1156,"seo":1157,"stem":1158,"__hash__":1159},"content\u002Fpython\u002Findex.md","Learn Python — From Zero to Pro",{"type":7,"value":8,"toc":1133},"minimark",[9,14,18,23,58,62,79,83,88,335,339,493,497,590,594,714,718,841,845,849,852,856,875,879,889,893,913,917,992,996,1119,1123,1126,1129],[10,11,13],"h1",{"id":12},"learn-python-from-zero-to-pro","🐍 Learn Python — From Zero to Pro",[15,16,17],"p",{},"A comprehensive, edge-case-covering, idiomatic Python curriculum. Each document is self-contained and covers its concept deeply enough that a careful reader can go from beginner to pro Python developer.",[19,20,22],"h2",{"id":21},"how-to-use-this-course","How to Use This Course",[24,25,26,34,40,46,52],"ol",{},[27,28,29,33],"li",{},[30,31,32],"strong",{},"Read sequentially"," for a structured path (01 → 28).",[27,35,36,39],{},[30,37,38],{},"Jump to a chapter"," as a reference when you hit a concept in the wild.",[27,41,42,45],{},[30,43,44],{},"Run every example"," in a REPL or script as you read — Python rewards experimentation.",[27,47,48,51],{},[30,49,50],{},"Do the exercises"," in chapter 28 after every few chapters, not just at the end.",[27,53,54,57],{},[30,55,56],{},"Read the CPython source and the standard library"," alongside once you reach Part IV.",[19,59,61],{"id":60},"prerequisites","Prerequisites",[63,64,65,73,76],"ul",{},[27,66,67,68,72],{},"A working Python 3.11+ installation (managed via ",[69,70,71],"code",{},"pyenv"," is recommended — see chapter 01).",[27,74,75],{},"A code editor (VS Code + Pylance, or PyCharm).",[27,77,78],{},"Comfort with at least one other programming language helps but isn't required.",[19,80,82],{"id":81},"curriculum","Curriculum",[84,85,87],"h3",{"id":86},"part-i-foundations","Part I — Foundations",[89,90,91,107],"table",{},[92,93,94],"thead",{},[95,96,97,101,104],"tr",{},[98,99,100],"th",{},"#",[98,102,103],{},"Topic",[98,105,106],{},"Why It Matters",[108,109,110,137,168,189,223,247,271,291,312],"tbody",{},[95,111,112,116,123],{},[113,114,115],"td",{},"01",[113,117,118],{},[119,120,122],"a",{"href":121},"\u002Fpython\u002F01-introduction-and-setup","Introduction & Setup",[113,124,125,126,128,129,132,133,136],{},"CPython vs PyPy, ",[69,127,71],{},", the REPL, ",[69,130,131],{},".py"," vs ",[69,134,135],{},".pyc",".",[95,138,139,142,148],{},[113,140,141],{},"02",[113,143,144],{},[119,145,147],{"href":146},"\u002Fpython\u002F02-variables-and-data-types","Variables & Data Types",[113,149,150,151,154,155,154,158,154,161,154,164,167],{},"Dynamic typing, ",[69,152,153],{},"int","\u002F",[69,156,157],{},"float",[69,159,160],{},"bool",[69,162,163],{},"str",[69,165,166],{},"None",", duck typing.",[95,169,170,173,179],{},[113,171,172],{},"03",[113,174,175],{},[119,176,178],{"href":177},"\u002Fpython\u002F03-operators-and-expressions","Operators & Expressions",[113,180,181,182,132,185,188],{},"Arithmetic, ",[69,183,184],{},"is",[69,186,187],{},"==",", chained comparisons, the walrus operator.",[95,190,191,194,200],{},[113,192,193],{},"04",[113,195,196],{},[119,197,199],{"href":198},"\u002Fpython\u002F04-control-flow","Control Flow",[113,201,202,154,205,154,208,211,212,215,216,154,219,222],{},[69,203,204],{},"if",[69,206,207],{},"while",[69,209,210],{},"for",", loop ",[69,213,214],{},"else",", structural pattern matching (",[69,217,218],{},"match",[69,220,221],{},"case",").",[95,224,225,228,234],{},[113,226,227],{},"05",[113,229,230],{},[119,231,233],{"href":232},"\u002Fpython\u002F05-functions","Functions",[113,235,236,239,240,154,243,246],{},[69,237,238],{},"def",", ",[69,241,242],{},"*args",[69,244,245],{},"**kwargs",", the mutable default argument trap.",[95,248,249,252,258],{},[113,250,251],{},"06",[113,253,254],{},[119,255,257],{"href":256},"\u002Fpython\u002F06-strings-and-text","Strings & Text",[113,259,260,262,263,132,266,239,268,136],{},[69,261,163],{}," methods, f-strings, encodings, ",[69,264,265],{},"bytes",[69,267,163],{},[69,269,270],{},"re",[95,272,273,276,282],{},[113,274,275],{},"07",[113,277,278],{},[119,279,281],{"href":280},"\u002Fpython\u002F07-lists-and-tuples","Lists & Tuples",[113,283,284,285,154,288,136],{},"Mutability, slicing, comprehensions, packing\u002Funpacking, ",[69,286,287],{},"copy",[69,289,290],{},"deepcopy",[95,292,293,296,302],{},[113,294,295],{},"08",[113,297,298],{},[119,299,301],{"href":300},"\u002Fpython\u002F08-dictionaries-and-sets","Dictionaries & Sets",[113,303,304,305,239,308,311],{},"Insertion order, hashing, ",[69,306,307],{},"defaultdict",[69,309,310],{},"Counter",", set algebra.",[95,313,314,317,323],{},[113,315,316],{},"09",[113,318,319],{},[119,320,322],{"href":321},"\u002Fpython\u002F09-comprehensions-and-generators","Comprehensions & Generators",[113,324,325,326,239,329,239,332,136],{},"All four comprehension forms, ",[69,327,328],{},"yield",[69,330,331],{},"yield from",[69,333,334],{},"itertools",[84,336,338],{"id":337},"part-ii-functions-oop","Part II — Functions & OOP",[89,340,341,351],{},[92,342,343],{},[95,344,345,347,349],{},[98,346,100],{},[98,348,103],{},[98,350,106],{},[108,352,353,391,408,429,447,473],{},[95,354,355,358,364],{},[113,356,357],{},"10",[113,359,360],{},[119,361,363],{"href":362},"\u002Fpython\u002F10-functional-programming","Functional Programming",[113,365,366,239,369,154,372,154,375,239,378,381,382,239,385,239,388,222],{},[69,367,368],{},"lambda",[69,370,371],{},"map",[69,373,374],{},"filter",[69,376,377],{},"reduce",[69,379,380],{},"functools"," (",[69,383,384],{},"partial",[69,386,387],{},"lru_cache",[69,389,390],{},"wraps",[95,392,393,396,402],{},[113,394,395],{},"11",[113,397,398],{},[119,399,401],{"href":400},"\u002Fpython\u002F11-closures-and-decorators","Closures & Decorators",[113,403,404,407],{},[69,405,406],{},"nonlocal",", writing decorators, parameterized decorators.",[95,409,410,413,419],{},[113,411,412],{},"12",[113,414,415],{},[119,416,418],{"href":417},"\u002Fpython\u002F12-classes-and-objects","Classes & Objects",[113,420,421,424,425,428],{},[69,422,423],{},"__init__",", instance vs class attributes, ",[69,426,427],{},"self",", dunder overview.",[95,430,431,434,440],{},[113,432,433],{},"13",[113,435,436],{},[119,437,439],{"href":438},"\u002Fpython\u002F13-inheritance-and-polymorphism","Inheritance & Polymorphism",[113,441,442,443,446],{},"MRO\u002FC3 linearization, ",[69,444,445],{},"super()",", abstract base classes.",[95,448,449,452,458],{},[113,450,451],{},"14",[113,453,454],{},[119,455,457],{"href":456},"\u002Fpython\u002F14-magic-methods-and-protocols","Magic Methods & Protocols",[113,459,460,154,463,239,466,154,469,472],{},[69,461,462],{},"__eq__",[69,464,465],{},"__hash__",[69,467,468],{},"__getitem__",[69,470,471],{},"__iter__",", context managers.",[95,474,475,478,484],{},[113,476,477],{},"15",[113,479,480],{},[119,481,483],{"href":482},"\u002Fpython\u002F15-properties-and-descriptors","Properties & Descriptors",[113,485,486,489,490,136],{},[69,487,488],{},"@property",", the descriptor protocol, ",[69,491,492],{},"__slots__",[84,494,496],{"id":495},"part-iii-error-handling-modules","Part III — Error Handling & Modules",[89,498,499,509],{},[92,500,501],{},[95,502,503,505,507],{},[98,504,100],{},[98,506,103],{},[98,508,106],{},[108,510,511,539,560],{},[95,512,513,516,522],{},[113,514,515],{},"16",[113,517,518],{},[119,519,521],{"href":520},"\u002Fpython\u002F16-error-handling","Error Handling",[113,523,524,154,527,154,530,154,532,535,536,136],{},[69,525,526],{},"try",[69,528,529],{},"except",[69,531,214],{},[69,533,534],{},"finally",", exception hierarchy, ",[69,537,538],{},"raise ... from",[95,540,541,544,550],{},[113,542,543],{},"17",[113,545,546],{},[119,547,549],{"href":548},"\u002Fpython\u002F17-modules-and-packages","Modules & Packages",[113,551,552,553,556,557,136],{},"Import system, ",[69,554,555],{},"__init__.py",", circular imports, ",[69,558,559],{},"__name__ == '__main__'",[95,561,562,565,571],{},[113,563,564],{},"18",[113,566,567],{},[119,568,570],{"href":569},"\u002Fpython\u002F18-file-io-and-serialization","File I\u002FO & Serialization",[113,572,573,576,577,239,580,154,583,154,586,589],{},[69,574,575],{},"open()"," modes, ",[69,578,579],{},"pathlib",[69,581,582],{},"json",[69,584,585],{},"pickle",[69,587,588],{},"csv",", encoding pitfalls.",[84,591,593],{"id":592},"part-iv-advanced-language-features","Part IV — Advanced Language Features",[89,595,596,606],{},[92,597,598],{},[95,599,600,602,604],{},[98,601,100],{},[98,603,103],{},[98,605,106],{},[108,607,608,628,654,675,693],{},[95,609,610,613,619],{},[113,611,612],{},"19",[113,614,615],{},[119,616,618],{"href":617},"\u002Fpython\u002F19-iterators-and-context-managers","Iterators & Context Managers",[113,620,621,622,239,625,627],{},"The iterator protocol, ",[69,623,624],{},"contextlib",[69,626,334],{}," deep dive.",[95,629,630,633,639],{},[113,631,632],{},"20",[113,634,635],{},[119,636,638],{"href":637},"\u002Fpython\u002F20-type-hints-and-typing","Type Hints & Typing",[113,640,641,644,645,239,648,239,651,136],{},[69,642,643],{},"typing",", generics, ",[69,646,647],{},"Protocol",[69,649,650],{},"TypedDict",[69,652,653],{},"mypy",[95,655,656,659,665],{},[113,657,658],{},"21",[113,660,661],{},[119,662,664],{"href":663},"\u002Fpython\u002F21-concurrency-threading-and-multiprocessing","Concurrency: Threading & Multiprocessing",[113,666,667,668,239,671,674],{},"The GIL, ",[69,669,670],{},"threading",[69,672,673],{},"multiprocessing",", race conditions.",[95,676,677,680,686],{},[113,678,679],{},"22",[113,681,682],{},[119,683,685],{"href":684},"\u002Fpython\u002F22-async-await","Async \u002F Await",[113,687,688,689,692],{},"The event loop, coroutines vs tasks, ",[69,690,691],{},"asyncio.gather",", pitfalls.",[95,694,695,698,704],{},[113,696,697],{},"23",[113,699,700],{},[119,701,703],{"href":702},"\u002Fpython\u002F23-metaprogramming","Metaprogramming",[113,705,706,707,710,711,136],{},"Metaclasses, ",[69,708,709],{},"__new__",", class decorators, ",[69,712,713],{},"__getattr__",[84,715,717],{"id":716},"part-v-production-engineering","Part V — Production Engineering",[89,719,720,730],{},[92,721,722],{},[95,723,724,726,728],{},[98,725,100],{},[98,727,103],{},[98,729,106],{},[108,731,732,752,781,801,827],{},[95,733,734,737,743],{},[113,735,736],{},"24",[113,738,739],{},[119,740,742],{"href":741},"\u002Fpython\u002F24-testing","Testing",[113,744,745,132,748,751],{},[69,746,747],{},"unittest",[69,749,750],{},"pytest",", fixtures, mocking, parametrization, coverage.",[95,753,754,757,763],{},[113,755,756],{},"25",[113,758,759],{},[119,760,762],{"href":761},"\u002Fpython\u002F25-packaging-and-virtual-environments","Packaging & Virtual Environments",[113,764,765,239,768,239,771,239,774,154,777,780],{},[69,766,767],{},"venv",[69,769,770],{},"pip",[69,772,773],{},"pyproject.toml",[69,775,776],{},"uv",[69,778,779],{},"poetry",", publishing to PyPI.",[95,782,783,786,792],{},[113,784,785],{},"26",[113,787,788],{},[119,789,791],{"href":790},"\u002Fpython\u002F26-performance-and-optimization","Performance & Optimization",[113,793,794,797,798,800],{},[69,795,796],{},"cProfile",", memory views, ",[69,799,492],{},", when to reach for C extensions.",[95,802,803,806,812],{},[113,804,805],{},"27",[113,807,808],{},[119,809,811],{"href":810},"\u002Fpython\u002F27-security","Security",[113,813,814,816,817,154,820,823,824,136],{},[69,815,585],{}," risks, ",[69,818,819],{},"eval",[69,821,822],{},"exec"," dangers, SQL injection, ",[69,825,826],{},"secrets",[95,828,829,832,838],{},[113,830,831],{},"28",[113,833,834],{},[119,835,837],{"href":836},"\u002Fpython\u002F28-exercises-and-projects","Exercises & Projects",[113,839,840],{},"Capstone projects from beginner to advanced.",[19,842,844],{"id":843},"learning-path-suggestions","Learning Path Suggestions",[84,846,848],{"id":847},"if-youre-new-to-programming","If you're new to programming",[15,850,851],{},"Read 01–09 slowly, running every example. Don't skip the Edge Cases sections — Python's forgiving syntax hides real mechanics (mutability, references, truthiness) that will confuse you later if skipped now. Do the beginner exercises in chapter 28 after chapter 09, then continue to Part II.",[84,853,855],{"id":854},"if-youre-coming-from-javascript","If you're coming from JavaScript",[15,857,858,859,239,862,864,865,154,868,871,872,874],{},"Skim 01–04 (similar shape, different keywords: ",[69,860,861],{},"elif",[69,863,166],{},", no ",[69,866,867],{},"var",[69,869,870],{},"let"," distinction — Python has no block scope). Pay close attention to 05 (default argument mutation is a Python-specific trap JS doesn't have), 07–08 (Python's list\u002Fdict semantics around copying and mutation differ from JS arrays\u002Fobjects), and 21–22 (the GIL means Python's concurrency story is fundamentally different from Node's single-threaded event loop). Don't assume ",[69,873,187],{}," behaves like JS — read 03 carefully.",[84,876,878],{"id":877},"if-youre-coming-from-a-statically-typed-language-java-c-go","If you're coming from a statically-typed language (Java, C#, Go)",[15,880,881,882,885,886,888],{},"Python's duck typing (02) and dynamic dispatch will feel unfamiliar at first — lean into it rather than fighting it with excessive ",[69,883,884],{},"isinstance"," checks. Read 20 (Type Hints) early to get static-analysis safety back via ",[69,887,653],{},". Read 13–15 for how Python does OOP differently (multiple inheritance via MRO, properties instead of getters\u002Fsetters, duck-typed protocols instead of explicit interfaces).",[84,890,892],{"id":891},"if-you-have-a-data-science-background-pandasnumpy-but-shaky-on-core-python","If you have a data science background (pandas\u002Fnumpy but shaky on \"core\" Python)",[15,894,895,896,154,898,900,901,904,905,908,909,912],{},"You likely know 02, 04, 07–08 already — skim them for gaps (slicing edge cases, the ",[69,897,184],{},[69,899,187],{}," distinction). Focus on 05, 09–11 (comprehensions and generators are everywhere in idiomatic pipeline code), 16 (proper exception handling instead of bare ",[69,902,903],{},"except:","), 19 (iterators\u002Fcontext managers explain why ",[69,906,907],{},"with open(...)"," and generators in ",[69,910,911],{},"pandas","\u002Fnumpy code work the way they do), and 26 (performance — vectorization vs Python loops, memory views).",[19,914,916],{"id":915},"companion-resources","Companion Resources",[63,918,919,928,936,962,970,978],{},[27,920,921,927],{},[119,922,926],{"href":923,"rel":924},"https:\u002F\u002Fdocs.python.org\u002F3\u002F",[925],"nofollow","Python Official Documentation"," — the source of truth.",[27,929,930,935],{},[119,931,934],{"href":932,"rel":933},"https:\u002F\u002Frealpython.com\u002F",[925],"Real Python"," — deep, practical tutorials.",[27,937,938,943,944,949,950,955,956,961],{},[119,939,942],{"href":940,"rel":941},"https:\u002F\u002Fpeps.python.org\u002F",[925],"PEP Index"," — language design decisions, especially ",[119,945,948],{"href":946,"rel":947},"https:\u002F\u002Fpeps.python.org\u002Fpep-0008\u002F",[925],"PEP 8"," (style), ",[119,951,954],{"href":952,"rel":953},"https:\u002F\u002Fpeps.python.org\u002Fpep-0020\u002F",[925],"PEP 20"," (Zen of Python), ",[119,957,960],{"href":958,"rel":959},"https:\u002F\u002Fpeps.python.org\u002Fpep-0484\u002F",[925],"PEP 484"," (type hints).",[27,963,964,969],{},[119,965,968],{"href":966,"rel":967},"https:\u002F\u002Fdocs.python-guide.org\u002F",[925],"The Hitchhiker's Guide to Python"," — best practices and structure.",[27,971,972,977],{},[119,973,976],{"href":974,"rel":975},"https:\u002F\u002Fgithub.com\u002Fpython\u002Fcpython",[925],"CPython source"," — read the implementation once you're comfortable.",[27,979,980,985,986,991],{},[119,981,984],{"href":982,"rel":983},"https:\u002F\u002Freddit.com\u002Fr\u002Fpython",[925],"r\u002FPython"," and ",[119,987,990],{"href":988,"rel":989},"https:\u002F\u002Fdiscuss.python.org\u002F",[925],"Python Discourse"," — community.",[19,993,995],{"id":994},"tooling-to-install","Tooling to Install",[997,998,1000],"code-wrapper",{"language":999},"bash",[1001,1002,1006],"pre",{"className":1003,"code":1004,"language":999,"meta":1005,"style":1005},"language-bash shiki shiki-themes github-light github-dark","# Python version management\ncurl https:\u002F\u002Fpyenv.run | bash\npyenv install 3.12.4\npyenv global 3.12.4\n\n# Fast, modern package\u002Fproject manager (installs Python too)\ncurl -LsSf https:\u002F\u002Fastral.sh\u002Fuv\u002Finstall.sh | sh\n\n# Linting, formatting, static typing, testing\npip install ruff mypy pytest pytest-cov ipython\n","",[69,1007,1008,1017,1035,1047,1057,1064,1070,1086,1091,1097],{"__ignoreMap":1005},[1009,1010,1013],"span",{"class":1011,"line":1012},"line",1,[1009,1014,1016],{"class":1015},"sdCPZ","# Python version management\n",[1009,1018,1020,1024,1028,1032],{"class":1011,"line":1019},2,[1009,1021,1023],{"class":1022},"sIsaT","curl",[1009,1025,1027],{"class":1026},"sJ6F3"," https:\u002F\u002Fpyenv.run",[1009,1029,1031],{"class":1030},"svdQ7"," |",[1009,1033,1034],{"class":1022}," bash\n",[1009,1036,1038,1040,1043],{"class":1011,"line":1037},3,[1009,1039,71],{"class":1022},[1009,1041,1042],{"class":1026}," install",[1009,1044,1046],{"class":1045},"snvgF"," 3.12.4\n",[1009,1048,1050,1052,1055],{"class":1011,"line":1049},4,[1009,1051,71],{"class":1022},[1009,1053,1054],{"class":1026}," global",[1009,1056,1046],{"class":1045},[1009,1058,1060],{"class":1011,"line":1059},5,[1009,1061,1063],{"emptyLinePlaceholder":1062},true,"\n",[1009,1065,1067],{"class":1011,"line":1066},6,[1009,1068,1069],{"class":1015},"# Fast, modern package\u002Fproject manager (installs Python too)\n",[1009,1071,1073,1075,1078,1081,1083],{"class":1011,"line":1072},7,[1009,1074,1023],{"class":1022},[1009,1076,1077],{"class":1045}," -LsSf",[1009,1079,1080],{"class":1026}," https:\u002F\u002Fastral.sh\u002Fuv\u002Finstall.sh",[1009,1082,1031],{"class":1030},[1009,1084,1085],{"class":1022}," sh\n",[1009,1087,1089],{"class":1011,"line":1088},8,[1009,1090,1063],{"emptyLinePlaceholder":1062},[1009,1092,1094],{"class":1011,"line":1093},9,[1009,1095,1096],{"class":1015},"# Linting, formatting, static typing, testing\n",[1009,1098,1100,1102,1104,1107,1110,1113,1116],{"class":1011,"line":1099},10,[1009,1101,770],{"class":1022},[1009,1103,1042],{"class":1026},[1009,1105,1106],{"class":1026}," ruff",[1009,1108,1109],{"class":1026}," mypy",[1009,1111,1112],{"class":1026}," pytest",[1009,1114,1115],{"class":1026}," pytest-cov",[1009,1117,1118],{"class":1026}," ipython\n",[19,1120,1122],{"id":1121},"license","License",[15,1124,1125],{},"These notes are yours to use, share, and modify.",[15,1127,1128],{},"🐍",[1130,1131,1132],"style",{},"html pre.shiki code .sdCPZ, html code.shiki .sdCPZ{--shiki-default:#6A737D;--shiki-github-dark:#6A737D}html pre.shiki code .sIsaT, html code.shiki .sIsaT{--shiki-default:#6F42C1;--shiki-github-dark:#B392F0}html pre.shiki code .sJ6F3, html code.shiki .sJ6F3{--shiki-default:#032F62;--shiki-github-dark:#9ECBFF}html pre.shiki code .svdQ7, html code.shiki .svdQ7{--shiki-default:#D73A49;--shiki-github-dark:#F97583}html pre.shiki code .snvgF, html code.shiki .snvgF{--shiki-default:#005CC5;--shiki-github-dark:#79B8FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .github-dark .shiki span {color: var(--shiki-github-dark);background: var(--shiki-github-dark-bg);font-style: var(--shiki-github-dark-font-style);font-weight: var(--shiki-github-dark-font-weight);text-decoration: var(--shiki-github-dark-text-decoration);}html.github-dark .shiki span {color: var(--shiki-github-dark);background: var(--shiki-github-dark-bg);font-style: var(--shiki-github-dark-font-style);font-weight: var(--shiki-github-dark-font-weight);text-decoration: var(--shiki-github-dark-text-decoration);}",{"title":1005,"searchDepth":1019,"depth":1019,"links":1134},[1135,1136,1137,1144,1150,1151,1152],{"id":21,"depth":1019,"text":22},{"id":60,"depth":1019,"text":61},{"id":81,"depth":1019,"text":82,"children":1138},[1139,1140,1141,1142,1143],{"id":86,"depth":1037,"text":87},{"id":337,"depth":1037,"text":338},{"id":495,"depth":1037,"text":496},{"id":592,"depth":1037,"text":593},{"id":716,"depth":1037,"text":717},{"id":843,"depth":1019,"text":844,"children":1145},[1146,1147,1148,1149],{"id":847,"depth":1037,"text":848},{"id":854,"depth":1037,"text":855},{"id":877,"depth":1037,"text":878},{"id":891,"depth":1037,"text":892},{"id":915,"depth":1019,"text":916},{"id":994,"depth":1019,"text":995},{"id":1121,"depth":1019,"text":1122},"A comprehensive, edge-case-covering, idiomatic Python curriculum. 28 chapters covering syntax, data structures, OOP, decorators, async, typing, testing, packaging, performance, and security. Go from beginner to pro Python developer.","md",{},"\u002Fpython",{"title":5,"description":1153},"python\u002Findex","Q8MNrc-Dr7Q71PWGdnp1uoVKyNzkGCSdKxkIN_i9KsA",1789924651864]