Matplotlib Tutorial (Part 1): Creating and Customizing Our First Plots
35:01

Matplotlib Tutorial (Part 1): Creating and Customizing Our First Plots

Corey Schafer 10.06.2019 1 148 327 просмотров 20 226 лайков

Machine-readable: Markdown · JSON API · Site index

Поделиться Telegram VK Бот
Транскрипт Скачать .md
Анализ с AI
Описание видео
In this video, we will be learning how to get started with Matplotlib. This video is sponsored by Brilliant. Go to https://brilliant.org/cms to sign up for free. Be one of the first 200 people to sign up with this link and get 20% off your premium subscription. In this Python Programming video, we will be learning how to get started with Matplotlib. Matplotlib is a plotting library with a lot of functionality for visualizing our data in an easy to digest format. We will learn how to make simple line plots, customize our graphs, and the basics of working with Matplotlib. Let's get started... The code from this video (with added logging) can be found at: http://bit.ly/Matplotlib-01 Virtual Environment Tutorial - https://youtu.be/Kg1Yvry_Ydk Jupyter Notebook Tutorial - https://youtu.be/HW29067qVWk Matplotlib Format Strings - http://bit.ly/Matplotlib-Fmt-Str ✅ Support My Channel Through Patreon: https://www.patreon.com/coreyms ✅ Become a Channel Member: https://www.youtube.com/channel/UCCezIgC97PvUuR4_gbFUs5g/join ✅ One-Time Contribution Through PayPal: https://goo.gl/649HFY ✅ Cryptocurrency Donations: Bitcoin Wallet - 3MPH8oY2EAgbLVy7RBMinwcBntggi7qeG3 Ethereum Wallet - 0x151649418616068fB46C3598083817101d3bCD33 Litecoin Wallet - MPvEBY5fxGkmPQgocfJbxP6EmTo5UUXMot ✅ Corey's Public Amazon Wishlist http://a.co/inIyro1 ✅ Equipment I Use and Books I Recommend: https://www.amazon.com/shop/coreyschafer ▶️ You Can Find Me On: My Website - http://coreyms.com/ My Second Channel - https://www.youtube.com/c/coreymschafer Facebook - https://www.facebook.com/CoreyMSchafer Twitter - https://twitter.com/CoreyMSchafer Instagram - https://www.instagram.com/coreymschafer/ #Python #Matplotlib

Оглавление (23 сегментов)

Introduction

hey there how's it going everybody in this series of videos we're going to be learning how to use the matplotlib library and python so matplotlib is a plotting library for python that allows us to create some great looking graphs from our data so this is used a ton in the data science field and also in applications where we need to visualize our data so I have the matplotlib website open here and we can see on their example page that you can make some really nice visualizations using matplotlib and we'll be learning how to do several of these in this series so in this video we're going to be going over the basics of matplotlib and start out with an easy line plot we'll also learn how to customize the plot style and labels to the axes add a title create a legend and things like that now I'd also like to mention that we do have a sponsor for this series of videos and that is brilliant org so I really want to thank brilliant for sponsoring this series and it would be great if you all could check them out using the link in the description section below and support the sponsors and I'll talk more about their services in just a bit so with that said let's go ahead and get

Installing Matplotlib

started ok so first we need to install matplotlib so we can do this easily using pip so I'm going to open my terminal here and we can simply install this with a pip install now I have a virtual environment activated you don't need to be using a virtual environment but in my opinion it's always a good idea to create a new environment for when you're starting new projects even if we're just testing stuff out now if you don't know how to create virtual environments then I'll leave a link to my video explaining those in the description section below ok so to install matplotlib we can simply say pip install and that is Matt plot lib so let's install that and once we have this installed then we're going to go learn how to create a simple plot so I'm using sublime text for these videos so I'm going to open up sublime here and I just have a new folder here called matplotlib and I'm currently within this MPL demo dot Pi file here now it's also very popular to use Jupiter notebooks when working with data because you can run specific cells at a time and also you can see your visualizations in line but some people find it difficult to get up and running would you notebooks so I'm just going to use a regular editor since more people are probably familiar with this but if you're using Jupiter then you should be able to follow along just fine now if you'd like to learn how to use Jupiter notebooks then I do have a separate video specifically on that so I'll be sure to leave a link to that video in the description section below as well if anyone is interested ok so let's create some simple plots to

Importing PIPlot

get us started out so first I'm going to import PI plot from the matplotlib module so I'm going to say from matplotlib and we want to import PI plot and I'm going to import this as PLT that's a common convention there to just import that as PLT so that we don't have to write out PI plot every time we want to use that and now let's create some sample data that we want to plot so in this video we're gonna add our own data here within Python and in the next video we'll see how to read in data from an external source like a CSV file so I'm gonna use some data that I grabbed from the annual stack overflow developer survey they actually just released the 2019 data publicly the day that I was putting this video together so it was good timing on that part so the data that I'm going to be using from that survey is the median salary for a developer based on their age and this is data that I parsed out of the results myself so I'll be sure to leave a link to my data files here in the description section below for those of you who'd like to follow along also I'm going to make a video in the near future showing how I cleaned and parsed out that data out of their results but for now let's just continue on with plotting this so

Creating a list

first I'm going to create a list and I'm going to call this dev underscore X and this will be the values for the x-axis on the plot and these will be age ranges now I'm a pretty slow typer sometimes so I'm going to use some snippets here and again I'm gonna post the link to these snippets and the description section below if anyone wants to grab these themselves so I'm just going to grab these from my snippets here just so I don't have to type all these out so I'm going to grab those and paste those in and this is just a list here from 25 to 35 now in the actual survey they did actually have all of the ages included but I didn't want to crowd the screen with data right off the bat so we're just gonna work with a subset of the ages between 25 and 35 for now but if you stick around to the end of the video then we'll plot out the median salaries for all of the ages that had enough data okay so now I'm going to create a list and I'm going to call this dev Y and this will be the values of our y-axis on the plot and these will be the median salaries for the ages that we added into our other list here so let me also grab these from my snippets file so I'm going to grab those and paste those in okay so now that we have a list of values that we want for our x-axis here as dev X and a list of values that we want for our y-axis here as dev Y so now let's plot this so to plot this data it's as easy as simply saying PLT dot plot and first we want to pass in what with the data for our x-axis which is going to be dev X and then the data for our y-axis which is dev Y now if you've ever looked at the matplotlib documentation or looked at other examples of people creating plots then you may have seen them create plots by creating figures and axes and subplots and all kinds of other stuff and we are going to look at that further on in the series but we're going to keep it simple now and just use what we have here with PLT dot plot so this is going to allow us to work with a single plot which is perfect for the data that we have right now so if we were to run this right now

Basic plot

it's not actually going to show us the plot if we want the plot to show then we have to say PLT dot show and now if we run this then we can see that we get a very basic plot here so what this plotted out is a basic plot where we have our ages down here on the x-axis so between 25 and 35 and those median salaries and that other list are on the y-axis here so this does make sense to me it looks like the salaries typically get higher as you get older so matplotlib comes built in with some nice features and we can see that this window here has some controls and options down here at the bottom left so let's go ahead and take a look at some of these so first we have a pan to where we can pan around if we want to see anything in particular we also have a zoom if we click on the magnifying glass and we want to zoom in on you know 26 to 28 then we can do that and then pan around from there we have the arrows here and I think these are undo and redo so if I hit back then that should take me back to what we did before and this resume Xand things like that and finally we have home here and also we have this which is just more finely detailed zoom configurations here I hardly ever use that I usually just use the pan and zoom here and lastly we can save this so if I wanted to save this as a PNG then I could click that and save this plot as a PNG file so that's a quick little overview of this window here ok so now

Adding labels

let me close this down and now let's look at how to add some more information to our plot so right now there's no way to actually tell what that data represents if we were to send this to somebody or look at this ourselves then no one would actually know what that X and that y axis were supposed to be there's no labels or anything like that now the point of these plots is to visualize the data and the easiest to digest format as possible and relay the information that could just get hidden in the numbers so we need to have some labels here to show what this actually represents so first let's give our entire plot a title so to do this I'm going to do this right above plot dot show I'm going to say PLT dot title and let's pass in a title of median salary and then I'll say that the salary is in USD by age okay and now to label our X and y axis it's as easy as saying PLT dot X label and we want our X label to be ages and right below that I'm gonna say PLT dot whoops wide label and that Y label let's say median salary and again we will specify USD okay so now if we run what we have here then now our plot is a little bit more detailed so now we have some more useful information here so we have a plot title up here that's top that tells us what this chart is about and our X and our Y axis now have labels explaining those as well okay so now let's add another line to our plot so let's say that I wanted to also plot the median salaries by age for Python developers specifically so the values that we have right now are for developers of any language so now let's do Python so to do this we can simply create more lists and plot just like we did the first ones here so let me close this down so I grab that

Adding data from Stack Overflow

data from the Stack Overflow survey as well and I added those to my snippets also so let me grab those from the snippets and those are right here median Python developer salaries by age so I'm going to grab this pydev X and this PI dev Y so I'm going to go back to my script here and right below my other data right below where I'm running PLT dot plot of that other data I'm going to paste this pydev data in and now I can plot those simply by saying PLT dot plot and now we want to pass in pi dev x and y let me get some spacing there so now if I were to actually run this right now then that would work but before I do that if we look at our x axis here then we are just repeating those same age ranges from the other list so we have 25 to 35 so instead of repeating these and both of our plots let's just rename our X values at the top here and use that for both plots so instead of dev X and pydev X I'm going to just remove that pydev X there and now this X list here at the top I'm going to rename this to ages underscore X and now I'm going to use that for both plots so it in my first plot there and replace Devex and in the second plot I'm going to replace that pydev X so now we're using this same data for our x-axis and the y-axis we are plotting a different data so like I said we could have had that repeated list in there and it would have worked just fine but this is just a way of cutting down on repeated code okay so now if we run this let me go ahead and make that output little smaller there since we're not using that so now if I run this then we can see that now we are getting two lines so that's nice but we don't know which line is which so we need to add a legend to tell us which line represents what data so let me close this plot here and there are two ways of adding legends so the first way is to do it like this I could add labels for the legend as a list of values and order in the order that they were added to the plot so down here at the bottom whoops actually let me actually put this below the title here so I could say PLT dot legend and now we can pass in a list of values in the order that they were added to the plot so our all of our developers this dev Y was added to our plot first where we did PLT dot plot and the Python developers was added second so PLT dot plot here with pi dev Y so I could pass in a list and just say all devs is the first value and Python is the second value and if I run this then we can see that works we get a plot and the legend is telling us which line is which here but there's a way that I actually like to do legends that I really think is better than this so let me close down this plot here now I don't really like

Plot labels

this method of adding legends because you have to know the order that all of these things were added to the plot and I feel like that's extremely error-prone so I think that this is a better way to do it so we can pass a label argument to our plot methods so instead let me copy this part here where I said all dibs instead up here where we did our first plot I can pass in a label argument and say label is equal to all devs for that one and for the second plot I can say label is equal to and this will be Python and now when we actually run this legend method here we can actually do that without any arguments so I'm just going to leave that empty and now it's just going to use these plot labels instead so now if I run this then we can see that works but I feel like this is a lot less error-prone and easier to read and it also kind of self documents our code as well if we look back here at the code then we can see that this is self documenting in a way where it's telling us what we're actually plotting here so I think that that's a much better way to do it okay so now that we have those plotted let's

Formatting the plot

look a bit at how we can change some of the formatting of this plot so let's say that I wanted some different colors and styles for the lines and things like that I feel like since one line is just developers in general I'm just going to make that line in gray and we'll make the Python line blue since that's one of the main colors and the Python logo now there's a way to pass all of this information in all at once but I hardly ever do it this way just because I think it's hard to read so I'll show you a quick example just in case you see this and someone else's code but then I'll show you how I normally do it as well so we could pass in all of the information at once by passing in a format string after our Y values in our plot method so let me pull up a web page here and show you what this format string actually expects so whoops and I did have it pulled up here but I may have over written it here so let me see okay here we are format strings and let me make this just a little bit larger here so that everybody can see so we can see here that it says that a format string consists of a part four color marker and a line so format string looks like this marker line color so let's say that for

Marker styles

our line graph we wanted a black dashed line so to do that we can scroll down here these are the marker styles we're not using markers right now we're using lines so I'm going to go down to the line styles so we can see that just a single dash here they saw the line style a dash is a dash line style so that's what I'm gonna use but then they also have a couple of others here now let's also look at the colors here so these are the general colors so B is blue so if I want it black then that is K so if I go back up to our format string here then it says that let's see here yeah so if I go up here yeah so color marker line okay so now let's go back to our code here and now let's pass in a format string after our Y value so I'm going to say that I want this one to be black so that was K and then - is the dashed line so for Python if I wanted this one to be blue then I could just pass in a B for blue and then I'll leave everything else as the default since a solid line is the default we don't have to change anything there so now if I save that and run it then we can see that now our line with all of our developers is this dashed black line here and our python line is this blue line so we were able to change that up a little bit now like I said I've never really liked these format

Format strings

strings that contain the colors and the marker styles and line styles all in one because I don't feel like that's very readable I always forget how to write these down and what these are supposed to be so I just wanted to show you these in case you saw them in someone else's code but I prefer to be more explicit and make our code a bit more readable so to do that we can pass these in as arguments instead so instead of doing it this way I'm going to say that color is equal to K and then I will say line style is equal to - now that's a little harder or that's a little more code there but I think that is much easier to read so also down here in the Python plot I'm going to say color is equal to B so for a blue and that should work exactly the same as our format string worked but in my opinion it's just more obvious what's going on there so if we that then we can see that we get the exact same results there now if you also

Add markers

wanted to add markers to your lines then we can do that as well to do that we could simply say so after line style here I'm gonna say marker is equal to and if you want to know what marker styles you can use you can go back to that formatting page where I showed all those different formatting options but I know that some of these off the top of my head I know that the dot is one and let me also put one in here for Python as well and I know that circle will do like a larger marker there so now if I save that and run it then we can see that now these have markers here so we have these small markers for all developers and these bigger markers for Python and I'll be sure to add a link in the description section below to that formatting page in case you want to check out more options that you have here now I don't really like these markers on this specific chart so I'm gonna go ahead and go back and just undo a couple of steps here before we put those markers in okay so we can also use

Add hex values

hex color values for our lines as well and that's normally what I use since you have a lot more color options and it's easier to find color palettes online that look good and contain those hex values so I have some written down here that I'm going to use for our plots so for the developers line I'm just going to use a hex value here so for color of four four four and if you don't know how hex values work the first pair of numbers are going to be for the red values the next two green values and the last blue values so with all those being the same it's going to generate a shade of gray and this is a darker you can find hex color palettes online if you'd like to come up with some of your own now for Python I'm going to set this to this steel blue color that I found online so I'm going to change this to be a hex value of five a 7d nine and just to show one more line of

Add JavaScript data

information and colors here let me also add in some JavaScript data that I have here in my snippets as well so I'm going to go back to the snippets and now since we're sharing the X we can just copy the Y values that I want here so I'm going to copy these Y values and these are the median JavaScript developer salaries by age and underneath our Python data I'm going to paste that in and let me actually get this plotting data here beside what it's actually plotting there okay and now let me copy the Python line here and I'm just going to use that for my JavaScript data but instead of plotting the pi dev Y I'm going to plot the j/s dev Y for the color I'm going to change this to a yellowish color so this will be ad 3b and for the label I'm going to say Java Script ok so if we run this then we can see that now we get three lines here on our plot all of them have labels and legends and they all have their own customized colors and styles as well so that looks pretty good now I'm not sure why the Python developers and the survey are reporting higher salaries like this I didn't expect it to be that much of a difference between you know the different types of developers but that's just what was in the data now I feel like these lines are a little bit thin right now so let's say that we wanted the lines for the specific languages to be a little bit wider so that they're more emphasized and just keep general developers as it is so to do that we can add another argument to both of our plot methods here and to make these lines a

Line width argument

little thicker I can just say line width is equal to and I think the default is 1 so let's try 3 and see what this looks like so I'll do that with both Python and JavaScript and I'm gonna leave the all developers as it is now this could actually cover up our dotted line because lines are layered in the order that they're added so instead I'm going to move our dotted line to the bottom here so I'm going to grab this plot and grab this data and I'm gonna move that to the bottom so that it's plotted on top just in case it would have been hidden behind any of those other two lines so do you remember earlier when we changed our legend to use these labels instead of passing them directly into our legend method well this is why that was a good idea because moving the plotting order like we did just now would have meant that we needed to manually come down here and change the order that we passed in those legends also and if we forgot that then our plot would just be wrong but since we did it this way by using these labels instead that just updates automatically so that's why I preferred that method so let's go ahead and run what we have here and we can see that now our language lines are a bit thicker but we can still see that all developers line overtop of the Java Script line here where it would have been hidden behind okay so that looks pretty good now I'm on a larger monitor here but whenever I was running this on my laptop I noticed some weird padding issues if you ever noticed that your padding isn't very good and that stuff is getting cut off then there's a way that we can take care of that and let me go back to the code here and to take care of that I'm just going to do this right above PLT dot show to do this I'm going to add

Adding padding

in a line if that automatically adjusts our plot parameters to give some padding and to do this it is just PLT dot tight underscore layout and that is a method so if I run this now then it kind of looks the same on my machine but on my laptop it made the padding a lot better whenever I ran that now there's one more thing about the plot that I think that we could improve here now if we look at this if we go out here further to the right it might be harder to tell when we cross certain salaries so if we put in a grid then I think it would make this a lot easier to read so if we go back to our code we can put in

Adding a grid

a grid really easily just by saying and I'll just do this above where we currently are I'll just say PLT dot grid and we just have to pass in a value of true so if we run that then now we can see we have a grid so we can tell exactly when each of these lines crosses certain salaries and ages here okay so that's looking pretty good now one more thing before we finish let's look at how we can change the style of our plots and make these look a bit better now we have some built in styles that we can use with matplotlib so let me go to the top

PLT styles

of our file here and let's use some of these here so underneath our imports I'm going to say PLT dot style and to see the available styles that we can use we can access a list of available styles by saying PLT style dot available now that's not a method so you don't want to put in parenthesis there it's just a attribute so don't execute that so now let's print that out to see what styles we have available and I'm going to comment out our PLT show so that a plot doesn't show up when we run this so I'm going to run this and I'm gonna make our output a little bigger here so that we can see these and these are the available styles that we can use that are built in the matplotlib and you can experiment around with these and see which ones you like personally I really like the 5:38 style and I also like the Seabourn and the ggplot styles and I'll probably use a you know a few of those throughout the series just so we can get an idea of what some of these different styles looks like so let's say that I wanted to use the 538 style so to do this I could simply say I'm going to overwrite our print statement here I'm gonna say peel T dot style dot use and then pass in the string of 538 so now let me uncomment out PLT show and let me run this so when I run this I don't know if you remembered what that looked like before but now this is a bit of a different style and these Styles all have their own unique way of coloring lines and stuff like that too so you could also draw try plotting these without your custom colors and see if you like the Styles default colors more than the ones that we specifically added for our line so I'm actually gonna try that I'm gonna remove my colors and line wits for Python and JavaScript plots and I'll

Python and JavaScript styles

just leave the all devs plot as it is so for Python and JavaScript I'm going to remove the line width and I'm gonna remove the color and I'll do that for JavaScript as well and let me make this output a little smaller here and I'm also going to remove the grid as well since some of these Styles also have their own grid preferences as well so I'm going to remove that okay so now with all those in place first let me comment out where I'm using the style and run that plot so that is the default matplotlib style and now let me plot with the 538 so if I look at both of these then you can see the difference here there is a definitely a different style with the 538 plot over here and I really like the 538 default colors and styles here now if you want to play around with the different styles then it's as easy as choosing another one from the list that we printed out just a second ago so if I wanted to try a ggplot style instead then I could just say that use ggplot if I run that then we can see that now we get a different looking style and this one kind of has like a grayish background with some thinner lines here

Matplotlib xkcd comics

now speaking of styles let me show you something else that I think is pretty cool that's built-in the matplotlib and it's nice if you have like a blog or something where you're making some plots and want to have a little bit of fun with it now most of you have probably heard of xkcd comics they published some online comics that are usually pretty funny and a lot of those are tech related also for those of you that have watched my videos in the past then you might know that the python has a standard library module called antigravity and it actually opens up one of their comics and at the browser anyways they have a pretty distinct style with their comics and matplotlib actually has a method that will mimic the style of their comics and it's super easy to use so in order to use that all we'd have to do I'm going to overwrite this style line here now this is actually a method instead of a style so this will be PLT dot xkcd and that is a method and with that small change in place if I run this and make this a little larger then now you can see that this is kind of in the style of those xkcd comics so it kind of looks like a graph that you would see embedded in a comic somewhere it's kind of got these squiggly lines here that kind of makes it look like it was hand drawn by somebody so I think that's a pretty cool built-in feature that matplotlib has and it's fun way to mix up your plots if you're making them for something that isn't too serious so if you wanted to actually put this on

Save as PNG

your website or something then you could just save this as a PNG like we saw before and then upload it that way now we saw how to do that here within the window but we can also do this programmatically as well so if I close this plot here if we go back to the code I'm just going to save this right here before PLT dot show in order to save this as a PNG then we can simply say PLT dot save fig and now I'm going to just save that as plot dot PNG or something like that and that will save an image called plot PNG to my current directory now if I wanted to save it somewhere else then you can also pass in a full path here as well and it'll save it to whatever path you pass in so I'm going to run this and it's going to show that graph there but if I open up my current directory we can see that I have a plot dot PNG here and if I open that then we can see that it saved that PNG file here in my directory okay so real quick let

Older Data

me do one more thing before we finish up here so I mentioned towards the beginning of the video that I'd plot the data for ages of 18 to 55 that's the larger set of data that they had in the survey if anyone was interested in seeing that now I didn't do it earlier because I didn't want to crowd the screen with tons of data but let me grab that from my snippets file and see what this looks like so here within the snippets these are all of the ages that had enough data here they had more data ages than this but these were the only ones that had I think it was like over a hundred answers to the question or something like that I can't remember exactly the not the cutoff that I used there but it was something like that there were some people who you know in their 80s and 90s that answered the survey but there were so few of them that it was hard to get a mean that was trustworthy so these are the ones that had you know hundreds of answers so lastly let me grab this last list here this will be the last one that I need to replace and again these will be available for download on my github page if anybody else wants to follow along so now that we have all that data copied and pasted into our script now let me save that and run it and now this is the data for all of those ages and the median salaries so it looks like that big gap between Python developers and other developers it was mainly between the ages of 25 and 35 that's what we saw here and once we plot the rest of these then they're a bit more in line the other languages catch up around in here and Python doesn't have such a big gap anymore but it still looks like Python it does have the leverage here in most of these ages though okay so before we end here I'd

Outro

like to also mention the sponsor of this video and that is brilliant org so in this series we've been learning about matplotlib and how to plot data in python and brilliant would be an excellent way to supplement what you learn here with their hands-on courses they have some excellent courses covering the fundamentals of statistics and these lessons do a deep dive on how to think about and analyze data correctly they even use Python in their statistics courses and will quiz you on how to correctly analyze the data within the language they're guided lessons will challenge you but you also have the ability to get hints or even solutions if you need them it's really tailored towards understanding the material they've also recently released a programming with Python course and they even have a coding environment built into their website so that you can run code directly in the browser and that is a great way to compliment watching my tutorials because you can apply what you've learned in their active problem-solving environment and that helps to solidify that so to support my channel and learn more about brilliant you can go to brilliant org ford slash CMS to sign up for free and also the first 200 people that go to that link will get 20% off the annual premium subscription and you can find that link in the description section below again that's brilliant dot org forge slash c m/s okay so I think that is going to do it for our first matplotlib video I hope you feel like you got a good introduction for how to create some simple plots and Python and also how to customize these in different ways in the next videos in this series we're going to be learning how to create all kinds of different plots so we're gonna learn how to create bar charts pie charts scatter plots histograms stack plots we're gonna be plotting time series data and things like that now we're also going to learn how to create multiple subplots in case you want to plot more than one thing at a time so in the next video we're going to be learning how to create bar charts and we're also going to learn how to load in data from a CSV instead of having the data directly in our Python scripts like we did here so be sure to stick around for that but if anyone has any questions about what we covered in this video then feel free to ask in the comment section below and I'll do my best to answer those and if you enjoy these tutorials and would like to support them then there are several ways you can do that the easiest ways to simply like the video and give it a thumbs up and also it's a huge help to share these videos with anyone who you think would find them useful and if you have the means you can contribute through patreon and there's the link to that page in the description section below be sure to subscribe for future videos and thank you all for watching

Методичка по этому видео

Структурированный конспект

Matplotlib с нуля: создаём и настраиваем графики в Python

Полное руководство по основам библиотеки Matplotlib в Python: построение линейных графиков, настройка стилей, цветов, подписей и легенд на реальных данных из опроса Stack Overflow.

Другие видео автора — Corey Schafer

Ctrl+V

Экстракт Знаний в Telegram

Экстракты и дистилляты из лучших YouTube-каналов — сразу после публикации.

Подписаться

Дайджест Экстрактов

Лучшие методички за неделю — каждый понедельник