[{"data":1,"prerenderedAt":1708},["ShallowReactive",2],{"/blog/learn-python-with-pj-part-3":3,"navigation-en-us":919,"banner-en-us":1347,"footer-en-us":1357,"blog-post-authors-en-us-PJ Metz":1602,"blog-related-posts-en-us-learn-python-with-pj-part-3":1618,"blog-promotions-en-us":1644,"next-steps-en-us":1698},{"id":4,"title":5,"authors":6,"body":8,"category":898,"date":899,"description":900,"extension":901,"externalUrl":902,"faq":902,"featured":903,"heroImage":904,"meta":905,"navigation":105,"path":906,"seo":907,"slug":911,"stem":912,"tags":913,"template":917,"updatedDate":902,"__hash__":918},"blogPosts/en-us/blog/learn-python-with-pj-part-3.md","Learn Python with Pj! Part 3 - Functions and strings",[7],"PJ Metz",{"type":9,"value":10,"toc":892},"minimark",[11,29,44,49,52,120,126,499,520,524,527,607,612,622,885,888],[12,13,14],"p",{},[15,16,17,18,23,24,28],"em",{},"This is the third installment in the Learn Python with Pj! series. Make sure to read ",[19,20,22],"a",{"href":21},"/blog/learn-python-with-pj-part-1/","Part 1"," and ",[19,25,27],{"href":26},"/blog/learn-python-with-pj-part-2/","Part 2",".",[12,30,31,32,36,37,36,40,43],{},"In learning Python, I’m happy to have found a language with a straightforward syntax that just seems to make sense. I don’t have to define a type; Python just knows. I don’t have to worry about ",[33,34,35],"code",{},"let"," or ",[33,38,39],{},"const",[33,41,42],{},"var"," for different use cases; I just make the variable. I’m very glad I learned C# and JavaScript first, as those feel important to understanding exactly what is happening when I write code. In turn, I think it’s made Python easier for me, which is usually true when learning another programming language: Your second and third are easier to learn since your brain understands “programming logic” better now than when you made your first “Hello World”. This week we’re going to talk about what I’ve learned in functions and strings.",[45,46,48],"h2",{"id":47},"functions","Functions",[12,50,51],{},"Functions are the backbone of any app you write. It’s an important step in learning any language to learn how to put a series of actions inside a single function that can be called later in the code. Python does this simply compared to other languages I’ve learned.",[53,54,59],"pre",{"className":55,"code":56,"language":57,"meta":58,"style":58},"language-python shiki shiki-themes github-light","def my_first_function(arg1, arg2):\n  print(f”Your input was {arg1} and {arg2}.”)\n\n#prints “Your input was hilarious and unnecessary”\nmy_first_function(“hilarious”, “unnecessary”)\n","python","",[33,60,61,78,100,107,114],{"__ignoreMap":58},[62,63,66,70,74],"span",{"class":64,"line":65},"line",1,[62,67,69],{"class":68},"sD7c4","def",[62,71,73],{"class":72},"s7eDp"," my_first_function",[62,75,77],{"class":76},"sgsFI","(arg1, arg2):\n",[62,79,81,85,88,91,94,97],{"class":64,"line":80},2,[62,82,84],{"class":83},"sYu0t","  print",[62,86,87],{"class":76},"(f”Your ",[62,89,90],{"class":83},"input",[62,92,93],{"class":76}," was {arg1} ",[62,95,96],{"class":68},"and",[62,98,99],{"class":76}," {arg2}.”)\n",[62,101,103],{"class":64,"line":102},3,[62,104,106],{"emptyLinePlaceholder":105},true,"\n",[62,108,110],{"class":64,"line":109},4,[62,111,113],{"class":112},"sAwPA","#prints “Your input was hilarious and unnecessary”\n",[62,115,117],{"class":64,"line":116},5,[62,118,119],{"class":76},"my_first_function(“hilarious”, “unnecessary”)\n",[12,121,122,123,125],{},"Using the keyword ",[33,124,69],{}," lets Python know that you’re about to write a function. Inside the parentheses, you put any parameters that must be included when calling the function. Some people use argument and parameter interchangeably, but technically, when defining a function, it’s a parameter, and when calling a function, it’s an argument. Either way, when defining the function, include some variables that you’ll expect when the function is called later. Finally, put a colon and then move to the next line. All the code for the function to run is indented. Inside the function, you can run loops, logic, or even other functions. Let’s check out a slightly more complex use.",[53,127,129],{"className":55,"code":128,"language":57,"meta":58,"style":58},"def halloween_horror_nights(days, link,):\n    named = input(\"What is your name?\")\n    name = named.capitalize()\n    if isinstance(days, int):\n        if days == 0:\n            print(f\" Hello, {name}. We're ready to see you at HHN. {link}\")\n        elif days \u003C= 30:\n            print(f\"{name}, You have {days} days until the terror is home. {link}\")\n        elif days \u003C= 60:\n            print(f\"{name}, The horror comes home in {days} days. Join us in the dark. {link}\")\n        elif days \u003C 365 and days > 60:\n            print(f\"{name}, Patience is a virtue. You're {days} days away from the top rated Halloween event in the world.{link}\")\n        else:\n            print(f\"{name}, it can't be more than a year away. It's closer than you think... {link}\")\n    else:\n        print(\"Days must be an int\")\n        #This will print “{Name input by user}, The horror comes home in 56 days. Join us in the dark. https://orlando.halloweenhorrornights.com/site\"\nhalloween_horror_nights(56, \"https://orlando.halloweenhorrornights.com/site\")\n",[33,130,131,141,162,172,189,206,244,260,300,314,353,378,417,425,455,463,476,482],{"__ignoreMap":58},[62,132,133,135,138],{"class":64,"line":65},[62,134,69],{"class":68},[62,136,137],{"class":72}," halloween_horror_nights",[62,139,140],{"class":76},"(days, link,):\n",[62,142,143,146,149,152,155,159],{"class":64,"line":80},[62,144,145],{"class":76},"    named ",[62,147,148],{"class":68},"=",[62,150,151],{"class":83}," input",[62,153,154],{"class":76},"(",[62,156,158],{"class":157},"sYBdl","\"What is your name?\"",[62,160,161],{"class":76},")\n",[62,163,164,167,169],{"class":64,"line":102},[62,165,166],{"class":76},"    name ",[62,168,148],{"class":68},[62,170,171],{"class":76}," named.capitalize()\n",[62,173,174,177,180,183,186],{"class":64,"line":109},[62,175,176],{"class":68},"    if",[62,178,179],{"class":83}," isinstance",[62,181,182],{"class":76},"(days, ",[62,184,185],{"class":83},"int",[62,187,188],{"class":76},"):\n",[62,190,191,194,197,200,203],{"class":64,"line":116},[62,192,193],{"class":68},"        if",[62,195,196],{"class":76}," days ",[62,198,199],{"class":68},"==",[62,201,202],{"class":83}," 0",[62,204,205],{"class":76},":\n",[62,207,209,212,214,217,220,223,226,229,232,234,237,239,242],{"class":64,"line":208},6,[62,210,211],{"class":83},"            print",[62,213,154],{"class":76},[62,215,216],{"class":68},"f",[62,218,219],{"class":157},"\" Hello, ",[62,221,222],{"class":83},"{",[62,224,225],{"class":76},"name",[62,227,228],{"class":83},"}",[62,230,231],{"class":157},". We're ready to see you at HHN. ",[62,233,222],{"class":83},[62,235,236],{"class":76},"link",[62,238,228],{"class":83},[62,240,241],{"class":157},"\"",[62,243,161],{"class":76},[62,245,247,250,252,255,258],{"class":64,"line":246},7,[62,248,249],{"class":68},"        elif",[62,251,196],{"class":76},[62,253,254],{"class":68},"\u003C=",[62,256,257],{"class":83}," 30",[62,259,205],{"class":76},[62,261,263,265,267,269,271,273,275,277,280,282,285,287,290,292,294,296,298],{"class":64,"line":262},8,[62,264,211],{"class":83},[62,266,154],{"class":76},[62,268,216],{"class":68},[62,270,241],{"class":157},[62,272,222],{"class":83},[62,274,225],{"class":76},[62,276,228],{"class":83},[62,278,279],{"class":157},", You have ",[62,281,222],{"class":83},[62,283,284],{"class":76},"days",[62,286,228],{"class":83},[62,288,289],{"class":157}," days until the terror is home. ",[62,291,222],{"class":83},[62,293,236],{"class":76},[62,295,228],{"class":83},[62,297,241],{"class":157},[62,299,161],{"class":76},[62,301,303,305,307,309,312],{"class":64,"line":302},9,[62,304,249],{"class":68},[62,306,196],{"class":76},[62,308,254],{"class":68},[62,310,311],{"class":83}," 60",[62,313,205],{"class":76},[62,315,317,319,321,323,325,327,329,331,334,336,338,340,343,345,347,349,351],{"class":64,"line":316},10,[62,318,211],{"class":83},[62,320,154],{"class":76},[62,322,216],{"class":68},[62,324,241],{"class":157},[62,326,222],{"class":83},[62,328,225],{"class":76},[62,330,228],{"class":83},[62,332,333],{"class":157},", The horror comes home in ",[62,335,222],{"class":83},[62,337,284],{"class":76},[62,339,228],{"class":83},[62,341,342],{"class":157}," days. Join us in the dark. ",[62,344,222],{"class":83},[62,346,236],{"class":76},[62,348,228],{"class":83},[62,350,241],{"class":157},[62,352,161],{"class":76},[62,354,356,358,360,363,366,369,371,374,376],{"class":64,"line":355},11,[62,357,249],{"class":68},[62,359,196],{"class":76},[62,361,362],{"class":68},"\u003C",[62,364,365],{"class":83}," 365",[62,367,368],{"class":68}," and",[62,370,196],{"class":76},[62,372,373],{"class":68},">",[62,375,311],{"class":83},[62,377,205],{"class":76},[62,379,381,383,385,387,389,391,393,395,398,400,402,404,407,409,411,413,415],{"class":64,"line":380},12,[62,382,211],{"class":83},[62,384,154],{"class":76},[62,386,216],{"class":68},[62,388,241],{"class":157},[62,390,222],{"class":83},[62,392,225],{"class":76},[62,394,228],{"class":83},[62,396,397],{"class":157},", Patience is a virtue. You're ",[62,399,222],{"class":83},[62,401,284],{"class":76},[62,403,228],{"class":83},[62,405,406],{"class":157}," days away from the top rated Halloween event in the world.",[62,408,222],{"class":83},[62,410,236],{"class":76},[62,412,228],{"class":83},[62,414,241],{"class":157},[62,416,161],{"class":76},[62,418,420,423],{"class":64,"line":419},13,[62,421,422],{"class":68},"        else",[62,424,205],{"class":76},[62,426,428,430,432,434,436,438,440,442,445,447,449,451,453],{"class":64,"line":427},14,[62,429,211],{"class":83},[62,431,154],{"class":76},[62,433,216],{"class":68},[62,435,241],{"class":157},[62,437,222],{"class":83},[62,439,225],{"class":76},[62,441,228],{"class":83},[62,443,444],{"class":157},", it can't be more than a year away. It's closer than you think... ",[62,446,222],{"class":83},[62,448,236],{"class":76},[62,450,228],{"class":83},[62,452,241],{"class":157},[62,454,161],{"class":76},[62,456,458,461],{"class":64,"line":457},15,[62,459,460],{"class":68},"    else",[62,462,205],{"class":76},[62,464,466,469,471,474],{"class":64,"line":465},16,[62,467,468],{"class":83},"        print",[62,470,154],{"class":76},[62,472,473],{"class":157},"\"Days must be an int\"",[62,475,161],{"class":76},[62,477,479],{"class":64,"line":478},17,[62,480,481],{"class":112},"        #This will print “{Name input by user}, The horror comes home in 56 days. Join us in the dark. https://orlando.halloweenhorrornights.com/site\"\n",[62,483,485,488,491,494,497],{"class":64,"line":484},18,[62,486,487],{"class":76},"halloween_horror_nights(",[62,489,490],{"class":83},"56",[62,492,493],{"class":76},", ",[62,495,496],{"class":157},"\"https://orlando.halloweenhorrornights.com/site\"",[62,498,161],{"class":76},[12,500,501,502,505,506,508,509,512,513,515,516,519],{},"For context, Halloween Horror Nights in Orlando is my favorite event of the year. This function takes in a number of days and a link (meant to be days until the event and a link to the HHN web page) and outputs a string that says how many days are left until the event. The string also includes a link to the web page and asks for user input to personalize each string. The function ",[33,503,504],{},"isinstance()"," checks if ",[33,507,284],{}," is an int to make sure the sentence makes sense and returns ",[33,510,511],{},"True"," if the first argument is the type of the second argument.\nI really found functions in Python to be a lot easier than in other languages, though I still miss the curly brackets of C# and JavaScript. Additionally, the simplicity of ",[33,514,69],{}," followed by the function name and any required parameters is really straightforward and makes reading the code easier. And since code is read more than it’s written, that makes Python pretty awesome in my book.\nI also used the f-string format for these print statements, and it’s still one of my favorite ways to concatenate. It feels easier than a lot of the other ways of inserting variables into a string in Python, and a little easier than the way it’s done in JavaScript, at least to me. I use a different method of including variables in a string called ",[33,517,518],{},".format()",".\nMaking your own functions is important, but there are a bunch of built-in functions in Python. There are also methods, which are similar to functions but are associated with the objects in a class they’re assigned to. Let’s talk about some strings and some methods that come with them.",[45,521,523],{"id":522},"strings","Strings",[12,525,526],{},"I thought it was strange that I had a whole section on strings in my Codecademy Python curriculum, but I soon realized that it was giving me a lot of very useful methods to use on strings that seemed very versatile. The most interesting thing to me is that strings are an object and act like a list of characters. I’m not entirely sure how strings are treated in other languages, but this really struck me as a cool idea. You can even call specific characters using the same syntax you would for a list.",[53,528,530],{"className":55,"code":529,"language":57,"meta":58,"style":58},"spooky = “Halloween Horror Nights is my favorite thing about Autumn.”\n\n#the following prints “l” since it’s the 3rd char in the string `spooky`. print(spooky[2]) ```\n\nOr you can use a for loop on a string.\n\n```python\n#This prints each letter on a new line and capitalizes it. The message now reads vertical in the output.\nfor letter in spooky:\n  print(letter.upper())\n",[33,531,532,548,552,557,561,572,576,582,587,600],{"__ignoreMap":58},[62,533,534,537,539,542,545],{"class":64,"line":65},[62,535,536],{"class":76},"spooky ",[62,538,148],{"class":68},[62,540,541],{"class":76}," “Halloween Horror Nights ",[62,543,544],{"class":68},"is",[62,546,547],{"class":76}," my favorite thing about Autumn.”\n",[62,549,550],{"class":64,"line":80},[62,551,106],{"emptyLinePlaceholder":105},[62,553,554],{"class":64,"line":102},[62,555,556],{"class":112},"#the following prints “l” since it’s the 3rd char in the string `spooky`. print(spooky[2]) ```\n",[62,558,559],{"class":64,"line":109},[62,560,106],{"emptyLinePlaceholder":105},[62,562,563,566,569],{"class":64,"line":116},[62,564,565],{"class":76},"Or you can use a ",[62,567,568],{"class":68},"for",[62,570,571],{"class":76}," loop on a string.\n",[62,573,574],{"class":64,"line":208},[62,575,106],{"emptyLinePlaceholder":105},[62,577,578],{"class":64,"line":246},[62,579,581],{"class":580},"sB1qb","```python\n",[62,583,584],{"class":64,"line":262},[62,585,586],{"class":112},"#This prints each letter on a new line and capitalizes it. The message now reads vertical in the output.\n",[62,588,589,591,594,597],{"class":64,"line":302},[62,590,568],{"class":68},[62,592,593],{"class":76}," letter ",[62,595,596],{"class":68},"in",[62,598,599],{"class":76}," spooky:\n",[62,601,602,604],{"class":64,"line":316},[62,603,84],{"class":83},[62,605,606],{"class":76},"(letter.upper())\n",[608,609,611],"h3",{"id":610},"string-methods","String methods",[12,613,614,615,23,618,621],{},"A few built-in methods exist for strings in Python, like ",[33,616,617],{},"capitalize()",[33,619,620],{},"upper()",", two I used in the above examples. In addition to those, there are many more that can do things like remove the whitespace or noise from the beginning and end of a string, tell you the index of the first appearance of something, or join a list of strings into a single string. There are lots of great included methods. Here’s an exercise I took from Codecademy and changed the content to fit this article's theme.",[53,623,625],{"className":55,"code":624,"language":57,"meta":58,"style":58},"#given a string that contains a ton of information separated by semicolons and commas. Each part is a haunted house name, Universal Studios location, and the year the house appeared at the event.\nhhn_houses_location_year = \"Chucky;Japan;2016, Run;Orlando;2001, The Orfanage: Ashes to Ashes;Orlando;2010, The Real: Haunted Village;Japan;2021, The Undertaker: No Mercy;Hollywood;2000, Welcome to Silent Hill;Hollywood;2012, American Werewolf in London;Orlando;2013\"  \n#this splits the string up into a list where each element of the list is the section separated by a comma.\nhhn_houses_list = hhn_houses_location_year.split(\",\")\n\n#empty list for the next step\nhhn_houses_stripped = []\n\n#this strips any whitespace from the element in the list and adds it to the empty list from before\nfor house in hhn_houses_list:\n    hhn_houses_stripped.append(house.strip())\n\n#empty list for next step\nhhn_house_details = []\n\n#the next few lines split the details into their own list. #first, each house, with the details, is split along the semicolons to make a list of lists, with each house being its own element in the larger list\n#next, empty lists are made for each detail\n#finally, using index numbers, each detail is placed in it’s own list so all the houses, locations, and years are separated. for info in hhn_houses_stripped:\n    hhn_house_details.append(info.split(\";\"))\n\nhouse = []\nlocation = []\nyear = []\n\nfor stuff in hhn_house_details:\n    house.append(stuff[0])\n    location.append(stuff[1])\n    year.append(stuff[2])\n\n#loops through and using .format() prints a sentence that tells about each house. for num in range(0, len(house)):\n  print(\"{} was located in {} for the {} event\".format(house[num], location[num], year[num]))\n",[33,626,627,632,645,650,665,669,674,684,688,693,705,710,714,719,728,732,737,742,747,759,764,774,784,794,799,812,824,835,846,851,857],{"__ignoreMap":58},[62,628,629],{"class":64,"line":65},[62,630,631],{"class":112},"#given a string that contains a ton of information separated by semicolons and commas. Each part is a haunted house name, Universal Studios location, and the year the house appeared at the event.\n",[62,633,634,637,639,642],{"class":64,"line":80},[62,635,636],{"class":76},"hhn_houses_location_year ",[62,638,148],{"class":68},[62,640,641],{"class":157}," \"Chucky;Japan;2016, Run;Orlando;2001, The Orfanage: Ashes to Ashes;Orlando;2010, The Real: Haunted Village;Japan;2021, The Undertaker: No Mercy;Hollywood;2000, Welcome to Silent Hill;Hollywood;2012, American Werewolf in London;Orlando;2013\"",[62,643,644],{"class":76},"  \n",[62,646,647],{"class":64,"line":102},[62,648,649],{"class":112},"#this splits the string up into a list where each element of the list is the section separated by a comma.\n",[62,651,652,655,657,660,663],{"class":64,"line":109},[62,653,654],{"class":76},"hhn_houses_list ",[62,656,148],{"class":68},[62,658,659],{"class":76}," hhn_houses_location_year.split(",[62,661,662],{"class":157},"\",\"",[62,664,161],{"class":76},[62,666,667],{"class":64,"line":116},[62,668,106],{"emptyLinePlaceholder":105},[62,670,671],{"class":64,"line":208},[62,672,673],{"class":112},"#empty list for the next step\n",[62,675,676,679,681],{"class":64,"line":246},[62,677,678],{"class":76},"hhn_houses_stripped ",[62,680,148],{"class":68},[62,682,683],{"class":76}," []\n",[62,685,686],{"class":64,"line":262},[62,687,106],{"emptyLinePlaceholder":105},[62,689,690],{"class":64,"line":302},[62,691,692],{"class":112},"#this strips any whitespace from the element in the list and adds it to the empty list from before\n",[62,694,695,697,700,702],{"class":64,"line":316},[62,696,568],{"class":68},[62,698,699],{"class":76}," house ",[62,701,596],{"class":68},[62,703,704],{"class":76}," hhn_houses_list:\n",[62,706,707],{"class":64,"line":355},[62,708,709],{"class":76},"    hhn_houses_stripped.append(house.strip())\n",[62,711,712],{"class":64,"line":380},[62,713,106],{"emptyLinePlaceholder":105},[62,715,716],{"class":64,"line":419},[62,717,718],{"class":112},"#empty list for next step\n",[62,720,721,724,726],{"class":64,"line":427},[62,722,723],{"class":76},"hhn_house_details ",[62,725,148],{"class":68},[62,727,683],{"class":76},[62,729,730],{"class":64,"line":457},[62,731,106],{"emptyLinePlaceholder":105},[62,733,734],{"class":64,"line":465},[62,735,736],{"class":112},"#the next few lines split the details into their own list. #first, each house, with the details, is split along the semicolons to make a list of lists, with each house being its own element in the larger list\n",[62,738,739],{"class":64,"line":478},[62,740,741],{"class":112},"#next, empty lists are made for each detail\n",[62,743,744],{"class":64,"line":484},[62,745,746],{"class":112},"#finally, using index numbers, each detail is placed in it’s own list so all the houses, locations, and years are separated. for info in hhn_houses_stripped:\n",[62,748,750,753,756],{"class":64,"line":749},19,[62,751,752],{"class":76},"    hhn_house_details.append(info.split(",[62,754,755],{"class":157},"\";\"",[62,757,758],{"class":76},"))\n",[62,760,762],{"class":64,"line":761},20,[62,763,106],{"emptyLinePlaceholder":105},[62,765,767,770,772],{"class":64,"line":766},21,[62,768,769],{"class":76},"house ",[62,771,148],{"class":68},[62,773,683],{"class":76},[62,775,777,780,782],{"class":64,"line":776},22,[62,778,779],{"class":76},"location ",[62,781,148],{"class":68},[62,783,683],{"class":76},[62,785,787,790,792],{"class":64,"line":786},23,[62,788,789],{"class":76},"year ",[62,791,148],{"class":68},[62,793,683],{"class":76},[62,795,797],{"class":64,"line":796},24,[62,798,106],{"emptyLinePlaceholder":105},[62,800,802,804,807,809],{"class":64,"line":801},25,[62,803,568],{"class":68},[62,805,806],{"class":76}," stuff ",[62,808,596],{"class":68},[62,810,811],{"class":76}," hhn_house_details:\n",[62,813,815,818,821],{"class":64,"line":814},26,[62,816,817],{"class":76},"    house.append(stuff[",[62,819,820],{"class":83},"0",[62,822,823],{"class":76},"])\n",[62,825,827,830,833],{"class":64,"line":826},27,[62,828,829],{"class":76},"    location.append(stuff[",[62,831,832],{"class":83},"1",[62,834,823],{"class":76},[62,836,838,841,844],{"class":64,"line":837},28,[62,839,840],{"class":76},"    year.append(stuff[",[62,842,843],{"class":83},"2",[62,845,823],{"class":76},[62,847,849],{"class":64,"line":848},29,[62,850,106],{"emptyLinePlaceholder":105},[62,852,854],{"class":64,"line":853},30,[62,855,856],{"class":112},"#loops through and using .format() prints a sentence that tells about each house. for num in range(0, len(house)):\n",[62,858,860,862,864,866,869,872,874,877,879,882],{"class":64,"line":859},31,[62,861,84],{"class":83},[62,863,154],{"class":76},[62,865,241],{"class":157},[62,867,868],{"class":83},"{}",[62,870,871],{"class":157}," was located in ",[62,873,868],{"class":83},[62,875,876],{"class":157}," for the ",[62,878,868],{"class":83},[62,880,881],{"class":157}," event\"",[62,883,884],{"class":76},".format(house[num], location[num], year[num]))\n",[12,886,887],{},"As you can see, I am obsessed with Halloween horror nights… er, wait, not the point of the article. As you can see, Python’s built-in methods for strings can be pretty useful, especially if you end up with a bunch of data sitting around in unformatted strings. Next time, we’re going to talk about Dictionaries and how they are used in Python!",[889,890,891],"style",{},"html pre.shiki code .sD7c4, html code.shiki .sD7c4{--shiki-default:#D73A49}html pre.shiki code .s7eDp, html code.shiki .s7eDp{--shiki-default:#6F42C1}html pre.shiki code .sgsFI, html code.shiki .sgsFI{--shiki-default:#24292E}html pre.shiki code .sYu0t, html code.shiki .sYu0t{--shiki-default:#005CC5}html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}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 pre.shiki code .sYBdl, html code.shiki .sYBdl{--shiki-default:#032F62}html pre.shiki code .sB1qb, html code.shiki .sB1qb{--shiki-default:#B31D28;--shiki-default-font-style:italic}",{"title":58,"searchDepth":80,"depth":80,"links":893},[894,895],{"id":47,"depth":80,"text":48},{"id":522,"depth":80,"text":523,"children":896},[897],{"id":610,"depth":102,"text":611},"engineering","2022-04-04","Pj shares his experiences learning how to program functions and strings.","md",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749664962/Blog/Hero%20Images/python.jpg",{},"/en-us/blog/learn-python-with-pj-part-3",{"title":5,"description":900,"ogTitle":5,"ogDescription":900,"noIndex":903,"ogImage":904,"ogUrl":908,"ogSiteName":909,"ogType":910,"canonicalUrls":908},"https://about.gitlab.com/blog/learn-python-with-pj-part-3","https://about.gitlab.com","article","learn-python-with-pj-part-3","en-us/blog/learn-python-with-pj-part-3",[914,915,916],"careers","growth","tutorial","BlogPost","3fQKI6wx4DgVFA0xm_lTnbPHBN3cP6AQ0gIsva7QjCY",{"logo":920,"freeTrial":925,"sales":930,"login":935,"items":940,"search":1267,"minimal":1298,"duo":1317,"switchNav":1326,"pricingDeployment":1337},{"config":921},{"href":922,"dataGaName":923,"dataGaLocation":924},"/","gitlab logo","header",{"text":926,"config":927},"Get free trial",{"href":928,"dataGaName":929,"dataGaLocation":924},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":931,"config":932},"Request a demo",{"href":933,"dataGaName":934,"dataGaLocation":924},"/sales/?contact-topic=request-demo","sales",{"text":936,"config":937},"Sign in",{"href":938,"dataGaName":939,"dataGaLocation":924},"https://gitlab.com/users/sign_in/","sign in",[941,970,1070,1075,1189,1245],{"text":942,"config":943,"menu":945},"Platform",{"dataNavLevelOne":944},"platform",{"type":946,"columns":947},"cards",[948,954,962],{"title":942,"description":949,"link":950},"The intelligent orchestration platform for DevSecOps",{"text":951,"config":952},"Explore our Platform",{"href":953,"dataGaName":944,"dataGaLocation":924},"/platform/",{"title":955,"description":956,"link":957},"GitLab Duo Agent Platform","Agentic AI for the entire software lifecycle",{"text":958,"config":959},"Meet GitLab Duo",{"href":960,"dataGaName":961,"dataGaLocation":924},"/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":963,"description":964,"link":965},"Why GitLab","See the top reasons enterprises choose GitLab",{"text":966,"config":967},"Learn more",{"href":968,"dataGaName":969,"dataGaLocation":924},"/why-gitlab/","why gitlab",{"text":971,"left":105,"config":972,"menu":974},"Product",{"dataNavLevelOne":973},"solutions",{"type":975,"link":976,"columns":980,"feature":1049},"lists",{"text":977,"config":978},"View all Solutions",{"href":979,"dataGaName":973,"dataGaLocation":924},"/solutions/",[981,1005,1028],{"title":982,"description":983,"link":984,"items":989},"Automation","CI/CD and automation to accelerate deployment",{"config":985},{"icon":986,"href":987,"dataGaName":988,"dataGaLocation":924},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[990,994,997,1001],{"text":991,"config":992},"CI/CD",{"href":993,"dataGaLocation":924,"dataGaName":991},"/solutions/continuous-integration/",{"text":955,"config":995},{"href":960,"dataGaLocation":924,"dataGaName":996},"gitlab duo agent platform - product menu",{"text":998,"config":999},"Source Code Management",{"href":1000,"dataGaLocation":924,"dataGaName":998},"/solutions/source-code-management/",{"text":1002,"config":1003},"Automated Software Delivery",{"href":987,"dataGaLocation":924,"dataGaName":1004},"Automated software delivery",{"title":1006,"description":1007,"link":1008,"items":1013},"Security","Deliver code faster without compromising security",{"config":1009},{"href":1010,"dataGaName":1011,"dataGaLocation":924,"icon":1012},"/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[1014,1018,1023],{"text":1015,"config":1016},"Application Security Testing",{"href":1010,"dataGaName":1017,"dataGaLocation":924},"Application security testing",{"text":1019,"config":1020},"Software Supply Chain Security",{"href":1021,"dataGaLocation":924,"dataGaName":1022},"/solutions/supply-chain/","Software supply chain security",{"text":1024,"config":1025},"Software Compliance",{"href":1026,"dataGaName":1027,"dataGaLocation":924},"/solutions/software-compliance/","software compliance",{"title":1029,"link":1030,"items":1035},"Measurement",{"config":1031},{"icon":1032,"href":1033,"dataGaName":1034,"dataGaLocation":924},"DigitalTransformation","/solutions/visibility-measurement/","visibility and measurement",[1036,1040,1044],{"text":1037,"config":1038},"Visibility & Measurement",{"href":1033,"dataGaLocation":924,"dataGaName":1039},"Visibility and Measurement",{"text":1041,"config":1042},"Value Stream Management",{"href":1043,"dataGaLocation":924,"dataGaName":1041},"/solutions/value-stream-management/",{"text":1045,"config":1046},"Analytics & Insights",{"href":1047,"dataGaLocation":924,"dataGaName":1048},"/solutions/analytics-and-insights/","Analytics and insights",{"title":1050,"type":975,"items":1051},"GitLab for",[1052,1058,1064],{"text":1053,"config":1054},"Enterprise",{"icon":1055,"href":1056,"dataGaLocation":924,"dataGaName":1057},"Building","/enterprise/","enterprise",{"text":1059,"config":1060},"Small Business",{"icon":1061,"href":1062,"dataGaLocation":924,"dataGaName":1063},"Work","/small-business/","small business",{"text":1065,"config":1066},"Public Sector",{"icon":1067,"href":1068,"dataGaLocation":924,"dataGaName":1069},"Organization","/solutions/public-sector/","public sector",{"text":1071,"config":1072},"Pricing",{"href":1073,"dataGaName":1074,"dataGaLocation":924,"dataNavLevelOne":1074},"/pricing/","pricing",{"text":1076,"config":1077,"menu":1079},"Resources",{"dataNavLevelOne":1078},"resources",{"type":975,"link":1080,"columns":1084,"feature":1178},{"text":1081,"config":1082},"View all resources",{"href":1083,"dataGaName":1078,"dataGaLocation":924},"/resources/",[1085,1118,1145],{"title":1086,"items":1087},"Getting started",[1088,1093,1098,1103,1108,1113],{"text":1089,"config":1090},"Install",{"href":1091,"dataGaName":1092,"dataGaLocation":924},"/install/","install",{"text":1094,"config":1095},"Quick start guides",{"href":1096,"dataGaName":1097,"dataGaLocation":924},"/get-started/","quick setup checklists",{"text":1099,"config":1100},"Learn",{"href":1101,"dataGaLocation":924,"dataGaName":1102},"https://university.gitlab.com/","learn",{"text":1104,"config":1105},"Product documentation",{"href":1106,"dataGaName":1107,"dataGaLocation":924},"https://docs.gitlab.com/","product documentation",{"text":1109,"config":1110},"Best practice videos",{"href":1111,"dataGaName":1112,"dataGaLocation":924},"/getting-started-videos/","best practice videos",{"text":1114,"config":1115},"Integrations",{"href":1116,"dataGaName":1117,"dataGaLocation":924},"/integrations/","integrations",{"title":1119,"items":1120},"Discover",[1121,1126,1131,1136,1140],{"text":1122,"config":1123},"Customer success stories",{"href":1124,"dataGaName":1125,"dataGaLocation":924},"/customers/","customer success stories",{"text":1127,"config":1128},"Blog",{"href":1129,"dataGaName":1130,"dataGaLocation":924},"/blog/","blog",{"text":1132,"config":1133},"Demo Hub",{"href":1134,"dataGaName":1135,"dataGaLocation":924},"/demo-hub/","demo hub",{"text":1137,"config":1138},"The Source",{"href":1139,"dataGaName":1130,"dataGaLocation":924},"/the-source/",{"text":1141,"config":1142},"Remote",{"href":1143,"dataGaName":1144,"dataGaLocation":924},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":1146,"items":1147},"Connect",[1148,1153,1158,1163,1168,1173],{"text":1149,"config":1150},"GitLab Services",{"href":1151,"dataGaName":1152,"dataGaLocation":924},"/services/","services",{"text":1154,"config":1155},"Contribute",{"href":1156,"dataGaName":1157,"dataGaLocation":924},"https://contributors.gitlab.com","contribute",{"text":1159,"config":1160},"Community",{"href":1161,"dataGaName":1162,"dataGaLocation":924},"/community/","community",{"text":1164,"config":1165},"Forum",{"href":1166,"dataGaName":1167,"dataGaLocation":924},"https://forum.gitlab.com/","forum",{"text":1169,"config":1170},"Events",{"href":1171,"dataGaName":1172,"dataGaLocation":924},"/events/","events",{"text":1174,"config":1175},"Partners",{"href":1176,"dataGaName":1177,"dataGaLocation":924},"/partners/","partners",{"config":1179,"title":1182,"text":1183,"link":1184},{"background":1180,"textColor":1181},"url('https://res.cloudinary.com/about-gitlab-com/image/upload/v1777322348/qpq8yrgn8knii57omj0c.png')","#000","What’s new in GitLab","Stay updated with our latest features and improvements.",{"text":1185,"config":1186},"Read the latest",{"href":1187,"dataGaName":1188,"dataGaLocation":924},"/whats-new/","whats new",{"text":1190,"config":1191,"menu":1193},"Company",{"dataNavLevelOne":1192},"company",{"type":975,"columns":1194},[1195],{"items":1196},[1197,1202,1208,1210,1215,1220,1225,1230,1235,1240],{"text":1198,"config":1199},"About",{"href":1200,"dataGaName":1201,"dataGaLocation":924},"/company/","about",{"text":1203,"config":1204,"footerGa":1207},"Jobs",{"href":1205,"dataGaName":1206,"dataGaLocation":924},"/jobs/","jobs",{"dataGaName":1206},{"text":1169,"config":1209},{"href":1171,"dataGaName":1172,"dataGaLocation":924},{"text":1211,"config":1212},"Leadership",{"href":1213,"dataGaName":1214,"dataGaLocation":924},"/company/team/e-group/","leadership",{"text":1216,"config":1217},"Handbook",{"href":1218,"dataGaName":1219,"dataGaLocation":924},"https://handbook.gitlab.com/","handbook",{"text":1221,"config":1222},"Investor relations",{"href":1223,"dataGaName":1224,"dataGaLocation":924},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":1226,"config":1227},"Trust Center",{"href":1228,"dataGaName":1229,"dataGaLocation":924},"/security/","trust center",{"text":1231,"config":1232},"AI Transparency Center",{"href":1233,"dataGaName":1234,"dataGaLocation":924},"/ai-transparency-center/","ai transparency center",{"text":1236,"config":1237},"Newsletter",{"href":1238,"dataGaName":1239,"dataGaLocation":924},"/company/contact/#contact-forms","newsletter",{"text":1241,"config":1242},"Press",{"href":1243,"dataGaName":1244,"dataGaLocation":924},"/press/","press",{"text":1246,"config":1247,"menu":1248},"Contact us",{"dataNavLevelOne":1192},{"type":975,"columns":1249},[1250],{"items":1251},[1252,1257,1262],{"text":1253,"config":1254},"Talk to sales",{"href":1255,"dataGaName":1256,"dataGaLocation":924},"/sales/","talk to sales",{"text":1258,"config":1259},"Support portal",{"href":1260,"dataGaName":1261,"dataGaLocation":924},"https://support.gitlab.com/hc/en-us","support portal",{"text":1263,"config":1264},"Customer portal",{"href":1265,"dataGaName":1266,"dataGaLocation":924},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":1268,"login":1269,"suggestions":1276},"Close",{"text":1270,"link":1271},"To search repositories and projects, login to",{"text":1272,"config":1273},"gitlab.com",{"href":938,"dataGaName":1274,"dataGaLocation":1275},"search login","search",{"text":1277,"default":1278},"Suggestions",[1279,1281,1285,1287,1291,1295],{"text":955,"config":1280},{"href":960,"dataGaName":955,"dataGaLocation":1275},{"text":1282,"config":1283},"Code Suggestions (AI)",{"href":1284,"dataGaName":1282,"dataGaLocation":1275},"/solutions/code-suggestions/",{"text":991,"config":1286},{"href":993,"dataGaName":991,"dataGaLocation":1275},{"text":1288,"config":1289},"GitLab on AWS",{"href":1290,"dataGaName":1288,"dataGaLocation":1275},"/partners/technology-partners/aws/",{"text":1292,"config":1293},"GitLab on Google Cloud",{"href":1294,"dataGaName":1292,"dataGaLocation":1275},"/partners/technology-partners/google-cloud-platform/",{"text":1296,"config":1297},"Why GitLab?",{"href":968,"dataGaName":1296,"dataGaLocation":1275},{"freeTrial":1299,"mobileIcon":1304,"desktopIcon":1309,"secondaryButton":1312},{"text":1300,"config":1301},"Start free trial",{"href":1302,"dataGaName":929,"dataGaLocation":1303},"https://gitlab.com/-/trials/new/","nav",{"altText":1305,"config":1306},"Gitlab Icon",{"src":1307,"dataGaName":1308,"dataGaLocation":1303},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":1305,"config":1310},{"src":1311,"dataGaName":1308,"dataGaLocation":1303},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":1313,"config":1314},"Get Started",{"href":1315,"dataGaName":1316,"dataGaLocation":1303},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/get-started/","get started",{"freeTrial":1318,"mobileIcon":1322,"desktopIcon":1324},{"text":1319,"config":1320},"Learn more about GitLab Duo",{"href":960,"dataGaName":1321,"dataGaLocation":1303},"gitlab duo",{"altText":1305,"config":1323},{"src":1307,"dataGaName":1308,"dataGaLocation":1303},{"altText":1305,"config":1325},{"src":1311,"dataGaName":1308,"dataGaLocation":1303},{"button":1327,"mobileIcon":1332,"desktopIcon":1334},{"text":1328,"config":1329},"/switch",{"href":1330,"dataGaName":1331,"dataGaLocation":1303},"#contact","switch",{"altText":1305,"config":1333},{"src":1307,"dataGaName":1308,"dataGaLocation":1303},{"altText":1305,"config":1335},{"src":1336,"dataGaName":1308,"dataGaLocation":1303},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":1338,"mobileIcon":1343,"desktopIcon":1345},{"text":1339,"config":1340},"Back to pricing",{"href":1073,"dataGaName":1341,"dataGaLocation":1303,"icon":1342},"back to pricing","GoBack",{"altText":1305,"config":1344},{"src":1307,"dataGaName":1308,"dataGaLocation":1303},{"altText":1305,"config":1346},{"src":1311,"dataGaName":1308,"dataGaLocation":1303},{"title":1348,"titleMobile":1349,"button":1350,"config":1355},"Duo Agent Platform delivers 400% ROI, per new Forrester Consulting study.","400% ROI: Forrester TEI for GitLab Duo",{"text":966,"config":1351},{"href":1352,"dataGaName":1353,"dataGaLocation":1354},"https://about.gitlab.com/blog/gitlab-duo-agent-platform-delivers-400-percent-roi/","forrester-tei-dap-banner","global-banner",{"layout":1356,"disabled":903},"release",{"data":1358},{"text":1359,"source":1360,"edit":1366,"contribute":1371,"config":1376,"items":1381,"minimal":1591},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":1361,"config":1362},"View page source",{"href":1363,"dataGaName":1364,"dataGaLocation":1365},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":1367,"config":1368},"Edit this page",{"href":1369,"dataGaName":1370,"dataGaLocation":1365},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":1372,"config":1373},"Please contribute",{"href":1374,"dataGaName":1375,"dataGaLocation":1365},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":1377,"facebook":1378,"youtube":1379,"linkedin":1380},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[1382,1429,1483,1527,1559],{"title":1071,"links":1383,"subMenu":1398},[1384,1388,1393],{"text":1385,"config":1386},"View plans",{"href":1073,"dataGaName":1387,"dataGaLocation":1365},"view plans",{"text":1389,"config":1390},"Why Premium?",{"href":1391,"dataGaName":1392,"dataGaLocation":1365},"/pricing/premium/","why premium",{"text":1394,"config":1395},"Why Ultimate?",{"href":1396,"dataGaName":1397,"dataGaLocation":1365},"/pricing/ultimate/","why ultimate",[1399],{"title":1400,"links":1401},"Contact Us",[1402,1405,1407,1409,1414,1419,1424],{"text":1403,"config":1404},"Contact sales",{"href":1255,"dataGaName":934,"dataGaLocation":1365},{"text":1258,"config":1406},{"href":1260,"dataGaName":1261,"dataGaLocation":1365},{"text":1263,"config":1408},{"href":1265,"dataGaName":1266,"dataGaLocation":1365},{"text":1410,"config":1411},"Status",{"href":1412,"dataGaName":1413,"dataGaLocation":1365},"https://status.gitlab.com/","status",{"text":1415,"config":1416},"Terms of use",{"href":1417,"dataGaName":1418,"dataGaLocation":1365},"/terms/","terms of use",{"text":1420,"config":1421},"Privacy statement",{"href":1422,"dataGaName":1423,"dataGaLocation":1365},"/privacy/","privacy statement",{"text":1425,"config":1426},"Cookie preferences",{"dataGaName":1427,"dataGaLocation":1365,"id":1428,"isOneTrustButton":105},"cookie preferences","ot-sdk-btn",{"title":971,"links":1430,"subMenu":1439},[1431,1435],{"text":1432,"config":1433},"DevSecOps platform",{"href":953,"dataGaName":1434,"dataGaLocation":1365},"devsecops platform",{"text":1436,"config":1437},"AI-Assisted Development",{"href":960,"dataGaName":1438,"dataGaLocation":1365},"ai-assisted development",[1440],{"title":1441,"links":1442},"Topics",[1443,1448,1453,1458,1463,1468,1473,1478],{"text":1444,"config":1445},"CICD",{"href":1446,"dataGaName":1447,"dataGaLocation":1365},"/topics/ci-cd/","cicd",{"text":1449,"config":1450},"GitOps",{"href":1451,"dataGaName":1452,"dataGaLocation":1365},"/topics/gitops/","gitops",{"text":1454,"config":1455},"DevOps",{"href":1456,"dataGaName":1457,"dataGaLocation":1365},"/topics/devops/","devops",{"text":1459,"config":1460},"Version Control",{"href":1461,"dataGaName":1462,"dataGaLocation":1365},"/topics/version-control/","version control",{"text":1464,"config":1465},"DevSecOps",{"href":1466,"dataGaName":1467,"dataGaLocation":1365},"/topics/devsecops/","devsecops",{"text":1469,"config":1470},"Cloud Native",{"href":1471,"dataGaName":1472,"dataGaLocation":1365},"/topics/cloud-native/","cloud native",{"text":1474,"config":1475},"AI for Coding",{"href":1476,"dataGaName":1477,"dataGaLocation":1365},"/topics/devops/ai-for-coding/","ai for coding",{"text":1479,"config":1480},"Agentic AI",{"href":1481,"dataGaName":1482,"dataGaLocation":1365},"/topics/agentic-ai/","agentic ai",{"title":1484,"links":1485},"Solutions",[1486,1488,1490,1495,1499,1502,1506,1509,1511,1514,1517,1522],{"text":1015,"config":1487},{"href":1010,"dataGaName":1015,"dataGaLocation":1365},{"text":1004,"config":1489},{"href":987,"dataGaName":988,"dataGaLocation":1365},{"text":1491,"config":1492},"Agile development",{"href":1493,"dataGaName":1494,"dataGaLocation":1365},"/solutions/agile-delivery/","agile delivery",{"text":1496,"config":1497},"SCM",{"href":1000,"dataGaName":1498,"dataGaLocation":1365},"source code management",{"text":1444,"config":1500},{"href":993,"dataGaName":1501,"dataGaLocation":1365},"continuous integration & delivery",{"text":1503,"config":1504},"Value stream management",{"href":1043,"dataGaName":1505,"dataGaLocation":1365},"value stream management",{"text":1449,"config":1507},{"href":1508,"dataGaName":1452,"dataGaLocation":1365},"/solutions/gitops/",{"text":1053,"config":1510},{"href":1056,"dataGaName":1057,"dataGaLocation":1365},{"text":1512,"config":1513},"Small business",{"href":1062,"dataGaName":1063,"dataGaLocation":1365},{"text":1515,"config":1516},"Public sector",{"href":1068,"dataGaName":1069,"dataGaLocation":1365},{"text":1518,"config":1519},"Education",{"href":1520,"dataGaName":1521,"dataGaLocation":1365},"/solutions/education/","education",{"text":1523,"config":1524},"Financial services",{"href":1525,"dataGaName":1526,"dataGaLocation":1365},"/solutions/finance/","financial services",{"title":1076,"links":1528},[1529,1531,1533,1535,1538,1540,1543,1545,1547,1549,1551,1553,1555,1557],{"text":1089,"config":1530},{"href":1091,"dataGaName":1092,"dataGaLocation":1365},{"text":1094,"config":1532},{"href":1096,"dataGaName":1097,"dataGaLocation":1365},{"text":1099,"config":1534},{"href":1101,"dataGaName":1102,"dataGaLocation":1365},{"text":1104,"config":1536},{"href":1106,"dataGaName":1537,"dataGaLocation":1365},"docs",{"text":1127,"config":1539},{"href":1129,"dataGaName":1130,"dataGaLocation":1365},{"text":1541,"config":1542},"What's new",{"href":1187,"dataGaName":1188,"dataGaLocation":1365},{"text":1122,"config":1544},{"href":1124,"dataGaName":1125,"dataGaLocation":1365},{"text":1141,"config":1546},{"href":1143,"dataGaName":1144,"dataGaLocation":1365},{"text":1149,"config":1548},{"href":1151,"dataGaName":1152,"dataGaLocation":1365},{"text":1154,"config":1550},{"href":1156,"dataGaName":1157,"dataGaLocation":1365},{"text":1159,"config":1552},{"href":1161,"dataGaName":1162,"dataGaLocation":1365},{"text":1164,"config":1554},{"href":1166,"dataGaName":1167,"dataGaLocation":1365},{"text":1169,"config":1556},{"href":1171,"dataGaName":1172,"dataGaLocation":1365},{"text":1174,"config":1558},{"href":1176,"dataGaName":1177,"dataGaLocation":1365},{"title":1190,"links":1560},[1561,1563,1565,1567,1569,1571,1575,1580,1582,1584,1586],{"text":1198,"config":1562},{"href":1200,"dataGaName":1192,"dataGaLocation":1365},{"text":1203,"config":1564},{"href":1205,"dataGaName":1206,"dataGaLocation":1365},{"text":1211,"config":1566},{"href":1213,"dataGaName":1214,"dataGaLocation":1365},{"text":1216,"config":1568},{"href":1218,"dataGaName":1219,"dataGaLocation":1365},{"text":1221,"config":1570},{"href":1223,"dataGaName":1224,"dataGaLocation":1365},{"text":1572,"config":1573},"Sustainability",{"href":1574,"dataGaName":1572,"dataGaLocation":1365},"/sustainability/",{"text":1576,"config":1577},"Diversity, inclusion and belonging (DIB)",{"href":1578,"dataGaName":1579,"dataGaLocation":1365},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":1226,"config":1581},{"href":1228,"dataGaName":1229,"dataGaLocation":1365},{"text":1236,"config":1583},{"href":1238,"dataGaName":1239,"dataGaLocation":1365},{"text":1241,"config":1585},{"href":1243,"dataGaName":1244,"dataGaLocation":1365},{"text":1587,"config":1588},"Modern Slavery Transparency Statement",{"href":1589,"dataGaName":1590,"dataGaLocation":1365},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":1592},[1593,1596,1599],{"text":1594,"config":1595},"Terms",{"href":1417,"dataGaName":1418,"dataGaLocation":1365},{"text":1597,"config":1598},"Cookies",{"dataGaName":1427,"dataGaLocation":1365,"id":1428,"isOneTrustButton":105},{"text":1600,"config":1601},"Privacy",{"href":1422,"dataGaName":1423,"dataGaLocation":1365},[1603],{"id":1604,"title":1605,"body":902,"config":1606,"content":1608,"description":902,"extension":1612,"meta":1613,"navigation":105,"path":1614,"seo":1615,"stem":1616,"__hash__":1617},"blogAuthors/en-us/blog/authors/pj-metz.yml","Pj Metz",{"template":1607},"BlogAuthor",{"name":7,"config":1609},{"headshot":1610,"ctfId":1611},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749659488/Blog/Author%20Headshots/gitlab-logo-extra-whitespace.png","PjMetz","yml",{},"/en-us/blog/authors/pj-metz",{},"en-us/blog/authors/pj-metz","SgW84Gu-lPq0zFzhy1aT23bZjx9kWViDG_WXzCPn04E",[1619,1628,1636],{"title":1620,"description":1621,"heroImage":1622,"category":898,"date":1623,"authors":1624,"slug":1627,"externalUrl":902},"Confidential AI for GitLab Self-Hosted","Give developers AI coding agents in GitLab Duo without source code leaving a hardware-encrypted boundary — no GPUs needed.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1773866173/vte9qh8rriznvyclhkes.png","2026-08-06",[1625,1626],"Mathias Ewald","Martin Paloncy, Edgeless Systems","confidential-ai-for-gitlab-self-hosted",{"title":1629,"description":1630,"heroImage":1631,"category":898,"date":1632,"authors":1633,"slug":1635,"externalUrl":902},"Green DevOps: Why carbon measurement belongs in your CI/CD pipeline","CI/CD pipelines have a hidden carbon cost. Here's why measuring it matters, and how you can get started with Eco CI and Carmen in GitLab.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1765809212/noh0mdfn9o94ry9ykura.png","2026-07-09",[1634],"Lysanne Pinto","green-devops-carbon-measurement-cicd-pipeline",{"title":1637,"description":1638,"heroImage":1639,"category":898,"date":1640,"authors":1641,"slug":1643,"externalUrl":902},"How to build CI/CD observability at scale","This practical guide to GitLab pipeline analytics helps self-managed users gain operational insights using Prometheus and Grafana.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1774465167/n5hlvrsrheadeccyr1oz.png","2026-04-28",[1642],"Paul Meresanu","how-to-build-ci-cd-observability-at-scale",{"promotions":1645},[1646,1660,1672,1684],{"id":1647,"categories":1648,"header":1650,"text":1651,"button":1652,"image":1657},"ai-modernization",[1649],"ai","Is AI achieving its promise at scale?","Quiz will take 5 minutes or less",{"text":1653,"config":1654},"Get your AI maturity score",{"href":1655,"dataGaName":1656,"dataGaLocation":1130},"/assessments/ai-modernization-assessment/","modernization assessment",{"config":1658},{"src":1659},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":1661,"categories":1662,"header":1664,"text":1651,"button":1665,"image":1669},"devops-modernization",[1663,1467],"product","Are you just managing tools or shipping innovation?",{"text":1666,"config":1667},"Get your DevOps maturity score",{"href":1668,"dataGaName":1656,"dataGaLocation":1130},"/assessments/devops-modernization-assessment/",{"config":1670},{"src":1671},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":1673,"categories":1674,"header":1676,"text":1651,"button":1677,"image":1681},"security-modernization",[1675],"security","Are you trading speed for security?",{"text":1678,"config":1679},"Get your security maturity score",{"href":1680,"dataGaName":1656,"dataGaLocation":1130},"/assessments/security-modernization-assessment/",{"config":1682},{"src":1683},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":1685,"paths":1686,"header":1689,"text":1690,"button":1691,"image":1696},"github-azure-migration",[1687,1688],"migration-from-azure-devops-to-gitlab","integrating-azure-devops-scm-and-gitlab","Is your team ready for GitHub's Azure move?","GitHub is already rebuilding around Azure. Find out what it means for you.",{"text":1692,"config":1693},"See how GitLab compares to GitHub",{"href":1694,"dataGaName":1695,"dataGaLocation":1130},"/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":1697},{"src":1671},{"header":1699,"blurb":1700,"button":1701,"secondaryButton":1706},"Start building faster today","See what your team can do with the intelligent orchestration platform for DevSecOps.\n",{"text":1702,"config":1703},"Get your free trial",{"href":1704,"dataGaName":929,"dataGaLocation":1705},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":1403,"config":1707},{"href":1255,"dataGaName":934,"dataGaLocation":1705},1786803753083]