{"@attributes":{"version":"2.0"},"channel":{"title":"DEV Community: Mario Pabon","description":"The latest articles on DEV Community by Mario Pabon (@restlessbit).","link":"https:\/\/dev.to\/restlessbit","image":{"url":"https:\/\/media2.dev.to\/dynamic\/image\/width=90,height=90,fit=cover,gravity=auto,format=auto\/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F17640%2Fe3806af9-23b7-42b6-8dd4-389a3de91c5e.png","title":"DEV Community: Mario Pabon","link":"https:\/\/dev.to\/restlessbit"},"language":"en","item":[{"title":"Adding animations to your React app with React Transition Group","pubDate":"Tue, 11 Jul 2017 15:57:57 +0000","link":"https:\/\/dev.to\/underdogio\/adding-animations-to-your-react-app-with-react-transition-group","guid":"https:\/\/dev.to\/underdogio\/adding-animations-to-your-react-app-with-react-transition-group","description":"<p>Adding <a href=\"https:\/\/www.smashingmagazine.com\/2017\/01\/how-functional-animation-helps-improve-user-experience\/\" rel=\"noopener noreferrer\">functional animations<\/a> to your app can be a great way to enhance its user experience. When used correctly, animation can help guide the user's attention to certain parts of your app, help re-enforce relationships within the interface, and prevent <a href=\"https:\/\/en.wikipedia.org\/wiki\/Change_blindness\" rel=\"noopener noreferrer\">change blindness<\/a>. <\/p>\n\n<p>An example of an animation that can improve the user's experience is fading in an item when it is added to a list. The steps for this animation might look something like this:<\/p>\n\n<ol>\n<li>Render the new item.<\/li>\n<li>Prepare the item for the animation. In this case, set its opacity to <code>0<\/code>.<\/li>\n<li>Transition the opacity of the element from <code>0<\/code> to <code>1<\/code> over a period of time.<\/li>\n<\/ol>\n\n<p>And for removing the item:<\/p>\n\n<ol>\n<li>Mark the item for removal.<\/li>\n<li>Transition the opacity of the element from <code>1<\/code> to <code>0<\/code> over a period of time.<\/li>\n<li>Remove the element once the transition has completed.<\/li>\n<\/ol>\n\n<p>Managing all of these states can get cumbersome, so let's try to find a library that can handle it for us. Enter <a href=\"https:\/\/github.com\/reactjs\/react-transition-group\/tree\/867cc33d79791d7d880092031adcf4cc378ce23e\" rel=\"noopener noreferrer\">React Transition Group<\/a>. <\/p>\n\n<p>React Transition Group contains a set of components that manage the state of a component mounting and un-mounting over time. It doesn't dictate how our components behave as they are mounted or unmounted\u2013 that part is up to us. This minimalism gives us the flexibility to define our animations however we want.<\/p>\n\n<p>In this article we are going to add transition animations to a board of cards, animating cards as they are added to and removed from the board.<\/p>\n\n<p>Here's the finished result:<\/p>\n\n<p><a href=\"https:\/\/media.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fkasojw34xb5u4552i7lk.gif\" class=\"article-body-image-wrapper\"><img src=\"https:\/\/media.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fkasojw34xb5u4552i7lk.gif\" alt=\"End result\"><\/a><\/p>\n\n<p>You can see a live demo of the animation <a href=\"https:\/\/restlessbit.github.io\/react-transition-demo\/index.html\" rel=\"noopener noreferrer\">here<\/a>.<\/p>\n\n<h2>\n  \n  \n  Prerequisites\n<\/h2>\n\n<p>You should have a basic understanding of <a href=\"https:\/\/facebook.github.io\/react\/\" rel=\"noopener noreferrer\">React<\/a> and <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/CSS\/CSS_Transitions\/Using_CSS_transitions\" rel=\"noopener noreferrer\">CSS transitions<\/a>.<\/p>\n\n<h3>\n  \n  \n  Packages used\n<\/h3>\n\n<ol>\n<li><a href=\"https:\/\/github.com\/facebook\/react\/tree\/v15.6.1\" rel=\"noopener noreferrer\">react v15.6.1<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/facebook\/react\/tree\/v15.6.1\" rel=\"noopener noreferrer\">react-dom v15.6.1<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/reactjs\/react-transition-group\/tree\/v2.0.2\" rel=\"noopener noreferrer\">react-transition-group v2.0.2<\/a><\/li>\n<\/ol>\n\n<h2>\n  \n  \n  Getting set up\n<\/h2>\n\n<p>Before we can add animations to our app, we're going to need an app to animate!<\/p>\n\n<p>The app we're going to be creating is fairly simple as it consists of just 3 components:<\/p>\n\n<ol>\n<li>\n<code>&lt;Card \/&gt;<\/code>\n\n<ul>\n<li>The component that will be animated in and out of existence.<\/li>\n<\/ul>\n<\/li>\n<li>\n<code>&lt;Board \/&gt;<\/code>\n\n<ul>\n<li>Renders a list of <code>&lt;Card\/&gt;<\/code> items.<\/li>\n<\/ul>\n<\/li>\n<li>\n<code>&lt;Application \/&gt;<\/code>\n\n<ul>\n<li>The root of our application. Manages the state of cards to be rendered in a <code>&lt;Board \/&gt;<\/code>, and contains buttons for adding and removing cards.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n<p>Here's the source code for these components:<\/p>\n\n<h3>\n  \n  \n  <code>&lt;Card\/&gt;<\/code>\n<\/h3>\n\n\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight jsx\"><code><span class=\"kd\">function<\/span> <span class=\"nf\">Card<\/span> <span class=\"p\">({<\/span><span class=\"nx\">children<\/span><span class=\"p\">,<\/span> <span class=\"nx\">onRemove<\/span><span class=\"p\">})<\/span> <span class=\"p\">{<\/span>\n  <span class=\"k\">return <\/span><span class=\"p\">(<\/span>\n    <span class=\"p\">&lt;<\/span><span class=\"nt\">div<\/span> <span class=\"na\">className<\/span><span class=\"p\">=<\/span><span class=\"s\">\"card\"<\/span><span class=\"p\">&gt;<\/span>\n      <span class=\"si\">{<\/span><span class=\"nx\">children<\/span><span class=\"si\">}<\/span>\n      <span class=\"p\">&lt;<\/span><span class=\"nt\">button<\/span> <span class=\"na\">onClick<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"nx\">onRemove<\/span><span class=\"si\">}<\/span><span class=\"p\">&gt;<\/span>Remove<span class=\"p\">&lt;\/<\/span><span class=\"nt\">button<\/span><span class=\"p\">&gt;<\/span>\n    <span class=\"p\">&lt;\/<\/span><span class=\"nt\">div<\/span><span class=\"p\">&gt;<\/span>\n  <span class=\"p\">)<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<h3>\n  \n  \n  <code>&lt;Board \/&gt;<\/code>\n<\/h3>\n\n\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight jsx\"><code><span class=\"kd\">function<\/span> <span class=\"nf\">Board<\/span> <span class=\"p\">({<\/span><span class=\"nx\">children<\/span><span class=\"p\">})<\/span> <span class=\"p\">{<\/span>\n  <span class=\"k\">return <\/span><span class=\"p\">(<\/span>\n    <span class=\"p\">&lt;<\/span><span class=\"nt\">ul<\/span> <span class=\"na\">className<\/span><span class=\"p\">=<\/span><span class=\"s\">\"board\"<\/span><span class=\"p\">&gt;<\/span>\n      <span class=\"si\">{<\/span><span class=\"nx\">children<\/span><span class=\"si\">}<\/span>\n    <span class=\"p\">&lt;\/<\/span><span class=\"nt\">ul<\/span><span class=\"p\">&gt;<\/span>\n  <span class=\"p\">)<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<h3>\n  \n  \n  <code>&lt;Application\/&gt;<\/code>\n<\/h3>\n\n\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight jsx\"><code><span class=\"kd\">class<\/span> <span class=\"nc\">Application<\/span> <span class=\"kd\">extends<\/span> <span class=\"nc\">React<\/span><span class=\"p\">.<\/span><span class=\"nx\">Component<\/span> <span class=\"p\">{<\/span>\n  <span class=\"nf\">constructor <\/span><span class=\"p\">(<\/span><span class=\"nx\">props<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n    <span class=\"k\">super<\/span><span class=\"p\">(<\/span><span class=\"nx\">props<\/span><span class=\"p\">)<\/span>\n\n    <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">state<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\n      <span class=\"na\">cards<\/span><span class=\"p\">:<\/span> <span class=\"p\">[]<\/span>\n    <span class=\"p\">}<\/span>\n\n    <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">addCard<\/span> <span class=\"o\">=<\/span> <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">addCard<\/span><span class=\"p\">.<\/span><span class=\"nf\">bind<\/span><span class=\"p\">(<\/span><span class=\"k\">this<\/span><span class=\"p\">)<\/span>\n    <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">removeCard<\/span> <span class=\"o\">=<\/span> <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">removeCard<\/span><span class=\"p\">.<\/span><span class=\"nf\">bind<\/span><span class=\"p\">(<\/span><span class=\"k\">this<\/span><span class=\"p\">)<\/span>\n    <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">removeLastCard<\/span> <span class=\"o\">=<\/span> <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">removeLastCard<\/span><span class=\"p\">.<\/span><span class=\"nf\">bind<\/span><span class=\"p\">(<\/span><span class=\"k\">this<\/span><span class=\"p\">)<\/span>\n  <span class=\"p\">}<\/span>\n\n  <span class=\"nf\">render <\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\n    <span class=\"kd\">const<\/span> <span class=\"p\">{<\/span><span class=\"nx\">cards<\/span><span class=\"p\">}<\/span> <span class=\"o\">=<\/span> <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">state<\/span>\n\n    <span class=\"k\">return <\/span><span class=\"p\">(<\/span>\n      <span class=\"p\">&lt;<\/span><span class=\"nt\">main<\/span> <span class=\"na\">className<\/span><span class=\"p\">=<\/span><span class=\"s\">\"container\"<\/span><span class=\"p\">&gt;<\/span>\n        <span class=\"p\">&lt;<\/span><span class=\"nt\">h1<\/span><span class=\"p\">&gt;<\/span>React Transition Demo<span class=\"p\">&lt;\/<\/span><span class=\"nt\">h1<\/span><span class=\"p\">&gt;<\/span>\n        <span class=\"p\">&lt;<\/span><span class=\"nt\">button<\/span> <span class=\"na\">onClick<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">addCard<\/span><span class=\"si\">}<\/span><span class=\"p\">&gt;<\/span>Add a card<span class=\"p\">&lt;\/<\/span><span class=\"nt\">button<\/span><span class=\"p\">&gt;<\/span>\n        <span class=\"p\">&lt;<\/span><span class=\"nt\">button<\/span> <span class=\"na\">onClick<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">removeLastCard<\/span><span class=\"si\">}<\/span><span class=\"p\">&gt;<\/span>Remove a card<span class=\"p\">&lt;\/<\/span><span class=\"nt\">button<\/span><span class=\"p\">&gt;<\/span>\n        <span class=\"p\">&lt;<\/span><span class=\"nc\">Board<\/span><span class=\"p\">&gt;<\/span>\n          <span class=\"si\">{<\/span>\n            <span class=\"nx\">cards<\/span><span class=\"p\">.<\/span><span class=\"nf\">map<\/span><span class=\"p\">(<\/span><span class=\"nx\">card<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n              <span class=\"k\">return <\/span><span class=\"p\">(<\/span>\n                <span class=\"p\">&lt;<\/span><span class=\"nt\">li<\/span> <span class=\"na\">className<\/span><span class=\"p\">=<\/span><span class=\"s\">\"board__item\"<\/span> <span class=\"na\">key<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"nx\">card<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span><span class=\"si\">}<\/span><span class=\"p\">&gt;<\/span>\n                  <span class=\"p\">&lt;<\/span><span class=\"nc\">Card<\/span> <span class=\"na\">onRemove<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n                    <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nf\">removeCard<\/span><span class=\"p\">(<\/span><span class=\"nx\">card<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span><span class=\"p\">)<\/span>\n                  <span class=\"p\">}<\/span><span class=\"si\">}<\/span><span class=\"p\">&gt;<\/span><span class=\"si\">{<\/span><span class=\"nx\">card<\/span><span class=\"p\">.<\/span><span class=\"nx\">content<\/span><span class=\"si\">}<\/span><span class=\"p\">&lt;\/<\/span><span class=\"nc\">Card<\/span><span class=\"p\">&gt;<\/span>\n                <span class=\"p\">&lt;\/<\/span><span class=\"nt\">li<\/span><span class=\"p\">&gt;<\/span>\n              <span class=\"p\">)<\/span>\n            <span class=\"p\">})<\/span>\n          <span class=\"si\">}<\/span>\n        <span class=\"p\">&lt;\/<\/span><span class=\"nc\">Board<\/span><span class=\"p\">&gt;<\/span>\n      <span class=\"p\">&lt;\/<\/span><span class=\"nt\">main<\/span><span class=\"p\">&gt;<\/span>\n    <span class=\"p\">)<\/span>\n  <span class=\"p\">}<\/span>\n\n  <span class=\"nf\">addCard <\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\n    <span class=\"kd\">const<\/span> <span class=\"p\">{<\/span><span class=\"nx\">cards<\/span><span class=\"p\">}<\/span> <span class=\"o\">=<\/span> <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">state<\/span>\n    <span class=\"kd\">const<\/span> <span class=\"nx\">id<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">cards<\/span><span class=\"p\">.<\/span><span class=\"nx\">length<\/span> <span class=\"o\">+<\/span> <span class=\"mi\">1<\/span>\n    <span class=\"kd\">const<\/span> <span class=\"nx\">newCard<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\n      <span class=\"nx\">id<\/span><span class=\"p\">,<\/span>\n      <span class=\"na\">content<\/span><span class=\"p\">:<\/span> <span class=\"s2\">`Card <\/span><span class=\"p\">${<\/span><span class=\"nx\">id<\/span><span class=\"p\">}<\/span><span class=\"s2\">`<\/span>\n    <span class=\"p\">}<\/span>\n    <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nf\">setState<\/span><span class=\"p\">({<\/span>\n      <span class=\"na\">cards<\/span><span class=\"p\">:<\/span> <span class=\"nx\">cards<\/span><span class=\"p\">.<\/span><span class=\"nf\">concat<\/span><span class=\"p\">([<\/span><span class=\"nx\">newCard<\/span><span class=\"p\">])<\/span>\n    <span class=\"p\">})<\/span>\n  <span class=\"p\">}<\/span>\n\n  <span class=\"nf\">removeCard <\/span><span class=\"p\">(<\/span><span class=\"nx\">id<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n    <span class=\"kd\">const<\/span> <span class=\"p\">{<\/span><span class=\"nx\">cards<\/span><span class=\"p\">}<\/span> <span class=\"o\">=<\/span> <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">state<\/span>\n    <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nf\">setState<\/span><span class=\"p\">({<\/span>\n      <span class=\"na\">cards<\/span><span class=\"p\">:<\/span> <span class=\"nx\">cards<\/span><span class=\"p\">.<\/span><span class=\"nf\">filter<\/span><span class=\"p\">(<\/span><span class=\"nx\">card<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"nx\">card<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span> <span class=\"o\">!==<\/span> <span class=\"nx\">id<\/span><span class=\"p\">)<\/span>\n    <span class=\"p\">})<\/span>\n  <span class=\"p\">}<\/span>\n\n  <span class=\"nf\">removeLastCard <\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\n    <span class=\"kd\">const<\/span> <span class=\"p\">{<\/span><span class=\"nx\">cards<\/span><span class=\"p\">}<\/span> <span class=\"o\">=<\/span> <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nx\">state<\/span>\n    <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nf\">setState<\/span><span class=\"p\">({<\/span>\n      <span class=\"na\">cards<\/span><span class=\"p\">:<\/span> <span class=\"nx\">cards<\/span><span class=\"p\">.<\/span><span class=\"nf\">slice<\/span><span class=\"p\">(<\/span><span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"o\">-<\/span><span class=\"mi\">1<\/span><span class=\"p\">)<\/span>\n    <span class=\"p\">})<\/span>\n  <span class=\"p\">}<\/span>\n<span class=\"p\">}<\/span> \n<\/code><\/pre>\n\n<\/div>\n\n\n\n<p>You can get the styles for these components <a href=\"https:\/\/github.com\/restlessbit\/react-transition-demo\/blob\/master\/styles.css\" rel=\"noopener noreferrer\">from GitHub<\/a>.<\/p>\n\n<p>If you run this app as-is, you will be able to add and remove cards (exciting stuff!). But the way the cards just pop in and out of existence isn't visually appealing. Let's fix that by adding transition animations.<\/p>\n\n<h2>\n  \n  \n  Adding animations\n<\/h2>\n\n<p>We want to make adding and removing cards feel seamless. We can do by fading and sliding cards as they are added and removed, like so:<\/p>\n\n<p><a href=\"https:\/\/media.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fraviwyzxqre7a04pjrtx.gif\" class=\"article-body-image-wrapper\"><img src=\"https:\/\/media.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fraviwyzxqre7a04pjrtx.gif\" alt=\"Slide and fade\"><\/a><\/p>\n\n<p>But before we can animate card transitions, we need a way to track the state of cards as they are added and removed from our <code>&lt;Board \/&gt;<\/code>, and run the appropriate animation as cards enter and exit.<\/p>\n\n<p>The card enter animation should run as soon as a card is added to the list. The card exit animation should run when a card is removed from the list, but the card should remain in the DOM until the animation is finished. Once the animation has completed, the card should be removed from the DOM. <\/p>\n\n<p>This sounds like a lot of work. So rather than implementing this functionality ourselves, let's use the <code>&lt;TransitionGroup \/&gt;<\/code> component provided by React Transition Group.<\/p>\n\n<h3>\n  \n  \n  Using <code>&lt;TransitionGroup \/&gt;<\/code>\n<\/h3>\n\n<p><code>&lt;TransitionGroup \/&gt;<\/code> should be wrapped around the list of elements to be animated. So let's replace the <code>&lt;Board \/&gt;<\/code> component in the render method of <code>&lt;Application \/&gt;<\/code> with <code>&lt;TransitionGroup \/&gt;<\/code>. <\/p>\n\n<p>By default <code>&lt;TransitionGroup \/&gt;<\/code> will wrap its list of child elements in a <code>&lt;span \/&gt;<\/code>, but we can have it wrap our cards in a <code>&lt;Board \/&gt;<\/code> instead by setting the <code>component<\/code> prop:<br>\n<\/p>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight jsx\"><code><span class=\"k\">import<\/span> <span class=\"nx\">TransitionGroup<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">react-transition-group\/TransitionGroup<\/span><span class=\"dl\">'<\/span>\n\n<span class=\"c1\">\/\/ ...<\/span>\n\n<span class=\"o\">&lt;<\/span><span class=\"nx\">TransitionGroup<\/span> <span class=\"nx\">component<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"nx\">Board<\/span><span class=\"p\">}<\/span><span class=\"o\">&gt;<\/span>\n  <span class=\"p\">{<\/span>\n    <span class=\"nx\">cards<\/span><span class=\"p\">.<\/span><span class=\"nf\">map<\/span><span class=\"p\">(<\/span><span class=\"nx\">card<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n      <span class=\"k\">return <\/span><span class=\"p\">(<\/span>\n    <span class=\"p\">&lt;<\/span><span class=\"nt\">li<\/span> <span class=\"na\">className<\/span><span class=\"p\">=<\/span><span class=\"s\">\"board__item\"<\/span> <span class=\"na\">key<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"nx\">card<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span><span class=\"si\">}<\/span><span class=\"p\">&gt;<\/span>\n      <span class=\"p\">&lt;<\/span><span class=\"nc\">Card<\/span> <span class=\"na\">onRemove<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n        <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nf\">removeCard<\/span><span class=\"p\">(<\/span><span class=\"nx\">card<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span><span class=\"p\">)<\/span>\n          <span class=\"p\">}<\/span><span class=\"si\">}<\/span><span class=\"p\">&gt;<\/span><span class=\"si\">{<\/span><span class=\"nx\">card<\/span><span class=\"p\">.<\/span><span class=\"nx\">content<\/span><span class=\"si\">}<\/span><span class=\"p\">&lt;\/<\/span><span class=\"nc\">Card<\/span><span class=\"p\">&gt;<\/span>\n    <span class=\"p\">&lt;\/<\/span><span class=\"nt\">li<\/span><span class=\"p\">&gt;<\/span>\n      <span class=\"p\">)<\/span>\n    <span class=\"p\">})<\/span>\n  <span class=\"p\">}<\/span>\n<span class=\"p\">&lt;<\/span><span class=\"err\">\/<\/span><span class=\"na\">TransitionGroup<\/span><span class=\"p\">&gt;<\/span>\n\n\/\/ ...\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<p>But if you run the app and start adding cards, you will notice that cards still pop in and out of existence like before. This is because we haven't yet defined how our cards should behave as they are added or removed. In order to do that, we need to wrap each of our cards in a <code>&lt;Transition \/&gt;<\/code> component.<\/p>\n\n<h3>\n  \n  \n  Using <code>&lt;Transition \/&gt;<\/code>\n<\/h3>\n\n<p>The <code>&lt;Transition \/&gt;<\/code> component from React Transition Group allows us to define how a component should behave when it is rendered or about to be removed from the DOM.<\/p>\n\n<p>The state of a component being added or removed is handled via an <code>in<\/code> prop. This prop is a <code>boolean<\/code> value that indicates if the component should be shown or not. A value of <code>true<\/code> means the component should be shown, and <code>false<\/code> means the component should be hidden.<\/p>\n\n<p>The value of <code>in<\/code> is provided by <code>&lt;TransitionGroup \/&gt;<\/code>, which will set this prop to <code>true<\/code> when a component is being added, and to <code>false<\/code> when a component is removed. <\/p>\n\n<p>A change in the value of the <code>in<\/code> prop will trigger a series of status changes over a period of time. These status changes allow us to animate a component by applying different styles to it as the status of the transition changes.<\/p>\n\n<p>We're going to create a <code>&lt;FadeAndSlideTransition \/&gt;<\/code> component that can be used to apply a transition animation to a component as it is mounted and unmounted.<\/p>\n\n<p>Here is the code for that component:<br>\n<\/p>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight jsx\"><code><span class=\"k\">import<\/span> <span class=\"nx\">Transition<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">react-transition-group\/Transition<\/span><span class=\"dl\">'<\/span>\n\n<span class=\"c1\">\/\/ &lt;FadeAndSlideTransition \/&gt; is a component that wraps children in <\/span>\n<span class=\"c1\">\/\/ a &lt;Transition \/&gt; component. <\/span>\n<span class=\"c1\">\/\/ 'children' is the element to be animated.<\/span>\n<span class=\"c1\">\/\/ 'duration' is the duration of the animation in milliseconds.<\/span>\n<span class=\"c1\">\/\/ The `in` prop will be provided by &lt;TransitionGroup \/&gt;. <\/span>\n<span class=\"kd\">function<\/span> <span class=\"nf\">FadeAndSlideTransition<\/span> <span class=\"p\">({<\/span><span class=\"nx\">children<\/span><span class=\"p\">,<\/span> <span class=\"nx\">duration<\/span><span class=\"p\">,<\/span> <span class=\"na\">in<\/span><span class=\"p\">:<\/span> <span class=\"nx\">inProp<\/span><span class=\"p\">})<\/span> <span class=\"p\">{<\/span>\n  <span class=\"c1\">\/\/ Styles to set on children which are necessary in order<\/span>\n  <span class=\"c1\">\/\/ for the animation to work.<\/span>\n  <span class=\"kd\">const<\/span> <span class=\"nx\">defaultStyle<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\n    <span class=\"c1\">\/\/ Transition \"opacity\" and \"transform\" CSS properties.<\/span>\n    <span class=\"c1\">\/\/ Set duration of the transition to the duration of the animation.<\/span>\n    <span class=\"na\">transition<\/span><span class=\"p\">:<\/span> <span class=\"s2\">`<\/span><span class=\"p\">${<\/span><span class=\"nx\">duration<\/span><span class=\"p\">}<\/span><span class=\"s2\">ms ease-in`<\/span><span class=\"p\">,<\/span>\n    <span class=\"na\">transitionProperty<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">opacity, transform<\/span><span class=\"dl\">'<\/span>\n  <span class=\"p\">}<\/span>\n\n  <span class=\"c1\">\/\/ Styles that will be applied to children as the status<\/span>\n  <span class=\"c1\">\/\/ of the transition changes. Each key of the<\/span>\n  <span class=\"c1\">\/\/ 'transitionStyles' object matches the name of a <\/span>\n  <span class=\"c1\">\/\/ 'status' provided by &lt;Transition \/&gt;. <\/span>\n  <span class=\"kd\">const<\/span> <span class=\"nx\">transitionStyles<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\n    <span class=\"c1\">\/\/ Start with component invisible and shifted up by 10%<\/span>\n    <span class=\"na\">entering<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n      <span class=\"na\">opacity<\/span><span class=\"p\">:<\/span> <span class=\"mi\">0<\/span><span class=\"p\">,<\/span>\n      <span class=\"na\">transform<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">translateY(-10%)<\/span><span class=\"dl\">'<\/span>\n    <span class=\"p\">},<\/span>\n    <span class=\"c1\">\/\/ Transition to component being visible and having its position reset. <\/span>\n    <span class=\"na\">entered<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n      <span class=\"na\">opacity<\/span><span class=\"p\">:<\/span> <span class=\"mi\">1<\/span><span class=\"p\">,<\/span>\n      <span class=\"na\">transform<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">translateY(0)<\/span><span class=\"dl\">'<\/span>\n    <span class=\"p\">},<\/span>\n    <span class=\"c1\">\/\/ Fade element out and slide it back up on exit.<\/span>\n    <span class=\"na\">exiting<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n      <span class=\"na\">opacity<\/span><span class=\"p\">:<\/span> <span class=\"mi\">0<\/span><span class=\"p\">,<\/span>\n      <span class=\"na\">transform<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">translateY(-10%)<\/span><span class=\"dl\">'<\/span>\n    <span class=\"p\">}<\/span>\n  <span class=\"p\">}<\/span>\n\n  <span class=\"c1\">\/\/ Wrap child node in &lt;Transition \/&gt;.<\/span>\n  <span class=\"k\">return <\/span><span class=\"p\">(<\/span>\n    <span class=\"p\">&lt;<\/span><span class=\"nc\">Transition<\/span> <span class=\"na\">in<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"nx\">inProp<\/span><span class=\"si\">}<\/span> <span class=\"na\">timeout<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"p\">{<\/span>\n      <span class=\"c1\">\/\/ Set 'enter' timeout to '0' so that enter animation<\/span>\n      <span class=\"c1\">\/\/ will start immediately.<\/span>\n      <span class=\"na\">enter<\/span><span class=\"p\">:<\/span> <span class=\"mi\">0<\/span><span class=\"p\">,<\/span>\n\n      <span class=\"c1\">\/\/ Set 'exit' timeout to 'duration' so that the 'exited'<\/span>\n      <span class=\"c1\">\/\/ status won't be applied until animation completes.<\/span>\n      <span class=\"na\">exit<\/span><span class=\"p\">:<\/span> <span class=\"nx\">duration<\/span>\n    <span class=\"p\">}<\/span><span class=\"si\">}<\/span><span class=\"p\">&gt;<\/span>\n      <span class=\"si\">{<\/span>\n        <span class=\"c1\">\/\/ Children is a function that receives the current<\/span>\n        <span class=\"c1\">\/\/ status of the animation.<\/span>\n        <span class=\"p\">(<\/span><span class=\"nx\">status<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n          <span class=\"c1\">\/\/ Don't render anything if component has 'exited'.<\/span>\n          <span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"nx\">status<\/span> <span class=\"o\">===<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">exited<\/span><span class=\"dl\">'<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n            <span class=\"k\">return<\/span> <span class=\"kc\">null<\/span>\n          <span class=\"p\">}<\/span>\n\n          <span class=\"c1\">\/\/ Apply different styles to children based<\/span>\n          <span class=\"c1\">\/\/ on the current value of 'status'. <\/span>\n          <span class=\"kd\">const<\/span> <span class=\"nx\">currentStyles<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">transitionStyles<\/span><span class=\"p\">[<\/span><span class=\"nx\">status<\/span><span class=\"p\">]<\/span>\n          <span class=\"k\">return<\/span> <span class=\"nx\">React<\/span><span class=\"p\">.<\/span><span class=\"nf\">cloneElement<\/span><span class=\"p\">(<\/span><span class=\"nx\">children<\/span><span class=\"p\">,<\/span> <span class=\"p\">{<\/span>\n            <span class=\"na\">style<\/span><span class=\"p\">:<\/span> <span class=\"nb\">Object<\/span><span class=\"p\">.<\/span><span class=\"nf\">assign<\/span><span class=\"p\">({},<\/span> <span class=\"nx\">defaultStyle<\/span><span class=\"p\">,<\/span> <span class=\"nx\">currentStyles<\/span><span class=\"p\">)<\/span>\n          <span class=\"p\">})<\/span>\n        <span class=\"p\">}<\/span>\n      <span class=\"si\">}<\/span>\n    <span class=\"p\">&lt;\/<\/span><span class=\"nc\">Transition<\/span><span class=\"p\">&gt;<\/span>\n  <span class=\"p\">)<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<p>We can apply our fade and slide transition to our cards by wrapping each <code>&lt;Card \/&gt;<\/code> in a <code>&lt;FadeAndSlideTransition \/&gt;<\/code> component:<br>\n<\/p>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight jsx\"><code><span class=\"c1\">\/\/ render method of &lt;Application \/&gt;<\/span>\n<span class=\"p\">&lt;<\/span><span class=\"nc\">TransitionGroup<\/span> <span class=\"na\">component<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"nx\">Board<\/span><span class=\"si\">}<\/span><span class=\"p\">&gt;<\/span>\n  <span class=\"si\">{<\/span>\n    <span class=\"nx\">cards<\/span><span class=\"p\">.<\/span><span class=\"nf\">map<\/span><span class=\"p\">(<\/span><span class=\"nx\">card<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n      <span class=\"k\">return <\/span><span class=\"p\">(<\/span>\n        <span class=\"p\">&lt;<\/span><span class=\"nc\">FadeAndSlideTransition<\/span> <span class=\"na\">duration<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"mi\">150<\/span><span class=\"si\">}<\/span> <span class=\"na\">key<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"nx\">card<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span><span class=\"si\">}<\/span><span class=\"p\">&gt;<\/span>\n          <span class=\"p\">&lt;<\/span><span class=\"nt\">li<\/span> <span class=\"na\">className<\/span><span class=\"p\">=<\/span><span class=\"s\">\"board__item\"<\/span><span class=\"p\">&gt;<\/span>\n            <span class=\"p\">&lt;<\/span><span class=\"nc\">Card<\/span> <span class=\"na\">onRemove<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n              <span class=\"k\">this<\/span><span class=\"p\">.<\/span><span class=\"nf\">removeCard<\/span><span class=\"p\">(<\/span><span class=\"nx\">card<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span><span class=\"p\">)<\/span>\n            <span class=\"p\">}<\/span><span class=\"si\">}<\/span><span class=\"p\">&gt;<\/span><span class=\"si\">{<\/span><span class=\"nx\">card<\/span><span class=\"p\">.<\/span><span class=\"nx\">content<\/span><span class=\"si\">}<\/span><span class=\"p\">&lt;\/<\/span><span class=\"nc\">Card<\/span><span class=\"p\">&gt;<\/span>\n          <span class=\"p\">&lt;\/<\/span><span class=\"nt\">li<\/span><span class=\"p\">&gt;<\/span>\n        <span class=\"p\">&lt;\/<\/span><span class=\"nc\">FadeAndSlideTransition<\/span><span class=\"p\">&gt;<\/span>\n      <span class=\"p\">)<\/span>\n    <span class=\"p\">})<\/span>\n  <span class=\"si\">}<\/span>\n<span class=\"p\">&lt;\/<\/span><span class=\"nc\">TransitionGroup<\/span><span class=\"p\">&gt;<\/span>\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<p>If you rerun the app now, you will see that a nice animation will be applied to cards as they are added and removed from the board.<\/p>\n\n<p>Here's a break down of how this all works.<\/p>\n\n<p>Whenever a card is added:<\/p>\n\n<ol>\n<li><p><code>&lt;TransitionGroup \/&gt;<\/code> will render a new <code>&lt;FadeAndSlideTransition \/&gt;<\/code> component, which renders a <code>&lt;Card \/&gt;<\/code> contained within a <code>&lt;Transition \/&gt;<\/code>.<\/p><\/li>\n<li><p>Each <code>&lt;Card \/&gt;<\/code> immediately has its <code>transition<\/code> styles set, which will cause the <code>opacity<\/code> and <code>transform<\/code> styles to be animated whenever they are changed.<\/p><\/li>\n<li><p>The <code>in<\/code> prop of <code>&lt;FadeAndSlideTransition \/&gt;<\/code> is set to <code>true<\/code>, which causes the <code>children<\/code> function of the <code>&lt;Transition \/&gt;<\/code> component to be called with a status of <code>entering<\/code>. The styles from <code>transitionStyles.entering<\/code> are then applied to <code>&lt;Card \/&gt;<\/code>. <\/p><\/li>\n<li><p>Because the timeout of the enter animation is set to <code>0<\/code>, <code>children<\/code> will be called again immediately with a status of <code>entered<\/code>. This updates the <code>&lt;Card \/&gt;<\/code>'s <code>opacity<\/code> and <code>transform<\/code> styles, which triggers a CSS transition.<\/p><\/li>\n<\/ol>\n\n<p>Whenever a card is removed:<\/p>\n\n<ol>\n<li>\n<code>&lt;TransitionGroup \/&gt;<\/code> will set the <code>in<\/code> prop of the <code>&lt;FadeAndSlideTransition \/&gt;<\/code> component that the card is rendered within to <code>false<\/code>.<\/li>\n<li> The <code>children<\/code> function of the <code>&lt;Transition \/&gt;<\/code> component will be called with a status of <code>exiting<\/code>. <code>exiting<\/code> styles are applied to the <code>&lt;Card \/&gt;<\/code> which causes it to fade out and slide up. <\/li>\n<li> Once the <code>duration<\/code> of the animation has elapsed, <code>children<\/code> is invoked with a status of <code>exited<\/code>. We return <code>null<\/code> in order to remove the <code>&lt;Card \/&gt;<\/code> from the DOM.<\/li>\n<\/ol>\n\n<p>Applying inline styles is just one way of creating an animation. You could also use the <code>status<\/code> variable from the <code>&lt;Transition \/&gt;<\/code> <code>children<\/code> function to apply a CSS class:<br>\n<\/p>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight jsx\"><code><span class=\"p\">&lt;<\/span><span class=\"nc\">Transition<\/span> <span class=\"na\">in<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"nx\">inProp<\/span><span class=\"si\">}<\/span> <span class=\"na\">timeout<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"p\">{<\/span>\n  <span class=\"na\">enter<\/span><span class=\"p\">:<\/span> <span class=\"mi\">0<\/span><span class=\"p\">,<\/span>\n  <span class=\"na\">exit<\/span><span class=\"p\">:<\/span> <span class=\"nx\">duration<\/span>\n  <span class=\"p\">}<\/span><span class=\"si\">}<\/span><span class=\"p\">&gt;<\/span>\n    <span class=\"si\">{<\/span>\n      <span class=\"p\">(<\/span><span class=\"nx\">status<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n        <span class=\"c1\">\/\/ Don't render anything if component has \"exited\".<\/span>\n        <span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"nx\">status<\/span> <span class=\"o\">===<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">exited<\/span><span class=\"dl\">'<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n          <span class=\"k\">return<\/span> <span class=\"kc\">null<\/span>\n        <span class=\"p\">}<\/span>\n\n        <span class=\"k\">return<\/span> <span class=\"p\">&lt;<\/span><span class=\"nc\">Card<\/span> <span class=\"na\">className<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"s2\">`fade fade-<\/span><span class=\"p\">${<\/span><span class=\"nx\">status<\/span><span class=\"p\">}<\/span><span class=\"s2\">`<\/span><span class=\"si\">}<\/span> <span class=\"p\">\/&gt;<\/span>\n      <span class=\"p\">}<\/span>\n   <span class=\"si\">}<\/span>\n<span class=\"p\">&lt;\/<\/span><span class=\"nc\">Transition<\/span><span class=\"p\">&gt;<\/span>\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<p>You would then create a CSS class for each status:<br>\n<\/p>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight css\"><code><span class=\"nc\">.fade<\/span> <span class=\"p\">{<\/span>\n  <span class=\"nl\">transition<\/span><span class=\"p\">:<\/span> <span class=\"n\">ease-in<\/span> <span class=\"m\">0.15s<\/span><span class=\"p\">;<\/span>\n  <span class=\"nl\">transition-property<\/span><span class=\"p\">:<\/span> <span class=\"n\">opacity<\/span><span class=\"p\">,<\/span> <span class=\"n\">transform<\/span><span class=\"p\">;<\/span>\n<span class=\"p\">}<\/span>\n\n<span class=\"nc\">.fade-entering<\/span> <span class=\"p\">{<\/span>\n  <span class=\"nl\">opacity<\/span><span class=\"p\">:<\/span> <span class=\"m\">0<\/span>\n  <span class=\"n\">transform<\/span><span class=\"p\">:<\/span> <span class=\"n\">translateY<\/span><span class=\"p\">(<\/span><span class=\"m\">-10%<\/span><span class=\"p\">);<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<p>Because <code>&lt;Transition \/&gt;<\/code> only manages the status of our animation, we're free to implement our animation how ever we see fit. Hopefully these two examples are enough for you to get started on a few animations of your own.<\/p>\n\n<p>If you'd like to see a working example with some code, you can check out the source code for this example <a href=\"https:\/\/github.com\/restlessbit\/react-transition-demo\" rel=\"noopener noreferrer\">on GitHub<\/a>.<\/p>\n\n<p>And if you'd like to learn more about React Transition Group, check out the <a href=\"https:\/\/github.com\/reactjs\/react-transition-group\" rel=\"noopener noreferrer\">GitHub repo<\/a> and <a href=\"https:\/\/reactcommunity.org\/react-transition-group\/\" rel=\"noopener noreferrer\">documentation<\/a>.<\/p>\n\n","category":["react","animations","javascript"]},{"title":"Python for JavaScript Developers","pubDate":"Mon, 01 May 2017 16:18:52 +0000","link":"https:\/\/dev.to\/underdogio\/python-for-javascript-developers","guid":"https:\/\/dev.to\/underdogio\/python-for-javascript-developers","description":"<p>So recently I began working at a little startup in New York City by the name of <a href=\"https:\/\/underdog.io\">Underdog.io<\/a>, where I discovered that they had a back-end written primarily in Python, a language that I had very little previous exposure to.<\/p>\n\n<p>While I was hired primarily for my experience with JavaScript and React, the small size of our team means that I frequently have to delve into all parts of the codebase in order to ship a feature. So I had to get well acquainted with Python, very fast.<\/p>\n\n<p>Unfortunately, I had a hard time finding good resources for learning Python that weren't targeted to people who haven't programmed before. I already knew how to program and am familiar with other languages, I just needed to learn the syntax and paradigms of this one specific programming language, Python.<\/p>\n\n<p>That's where this blog post comes in. To serve as a quick guide for JavaScript developers who want to get up to speed quickly with Python, but without having to learn what declaring a variable means or what a function is.<\/p>\n\n<p>This post is assuming you are using <strong><a href=\"https:\/\/www.python.org\/download\/releases\/3.0.1\/\">Python 3.0.1<\/a><\/strong>, so some of the examples might not work with older versions of Python.<\/p>\n\n<h2>\n  \n  \n  Syntax\n<\/h2>\n\n<h3>\n  \n  \n  Declaring variables\n<\/h3>\n\n<p>Declaring a variable in Python is super simple. Like JavaScript, you don't have to set the type of the variable when declaring it. And you don't have to declare the scope of the variable either (<code>let<\/code> vs <code>var<\/code>):<br>\n<\/p>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight python\"><code><span class=\"n\">x<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">5<\/span>\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<p>You can change the type of a variable by assigning a value of a different type to it:<br>\n<\/p>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight python\"><code><span class=\"n\">x<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">5<\/span> <span class=\"c1\"># x has a type of Integer\n<\/span><span class=\"n\">x<\/span> <span class=\"o\">=<\/span> <span class=\"s\">'Hewwo'<\/span> <span class=\"c1\"># x is now a String!\n<\/span><\/code><\/pre>\n\n<\/div>\n\n\n\n<p>Unlike JavaScript, variables in Python are always block scoped.<\/p>\n\n<h3>\n  \n  \n  Blocks\n<\/h3>\n\n<p>Python is a bit more strict than JavaScript when it comes to syntax. In Python, getting indentation off by a single space can prevent your programming from even running (!). This is because Python uses indentation to create blocks instead of braces. For example, this is how you would define a block in JavaScript vs. Python:<\/p>\n\n<h3>\n  \n  \n  Creating a block in JavaScript\n<\/h3>\n\n\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight javascript\"><code><span class=\"kd\">function<\/span> <span class=\"nx\">exampleFunction<\/span> <span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\n  <span class=\"c1\">\/\/ This is a block<\/span>\n  <span class=\"kd\">var<\/span> <span class=\"nx\">a<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">5<\/span><span class=\"p\">;<\/span>\n<span class=\"p\">}<\/span>\n\n<span class=\"p\">{<\/span>\n  <span class=\"c1\">\/\/ This is also a block<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<h3>\n  \n  \n  Creating a block in Python\n<\/h3>\n\n\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight python\"><code><span class=\"c1\"># This is a block with its own scope\n<\/span>\n<span class=\"k\">def<\/span> <span class=\"nf\">example_function<\/span><span class=\"p\">():<\/span>\n  <span class=\"c1\"># This is also a block with its own scope\n<\/span>  <span class=\"n\">x<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">5<\/span>\n  <span class=\"k\">print<\/span><span class=\"p\">(<\/span><span class=\"n\">x<\/span><span class=\"p\">)<\/span>\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<p>If the line containing <code>print(x)<\/code> had one or more extra spaces, the Python interpreter would throw an <code>IndentationError<\/code>, because those extra spaces would have created an invalid block.<br>\n<\/p>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight python\"><code><span class=\"k\">def<\/span> <span class=\"nf\">example_function<\/span><span class=\"p\">():<\/span>\n  <span class=\"n\">x<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">5<\/span>\n\n  <span class=\"c1\"># IndentationError!\n<\/span>    <span class=\"k\">print<\/span><span class=\"p\">(<\/span><span class=\"n\">x<\/span><span class=\"p\">)<\/span>\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<p>If that same line had one or more less spaces in it, like this:<br>\n<\/p>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight python\"><code><span class=\"k\">def<\/span> <span class=\"nf\">example_function<\/span><span class=\"p\">():<\/span>\n  <span class=\"n\">x<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">5<\/span>\n <span class=\"k\">print<\/span><span class=\"p\">(<\/span><span class=\"n\">x<\/span><span class=\"p\">)<\/span>\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<p>The Python interpreter would throw this error:<br>\n<\/p>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code>NameError: name <span class=\"s1\">'x'<\/span> is not defined\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<p>Because <code>print(x)<\/code> is in a block that is out of scope of the one that <code>x<\/code> is declared in.<\/p>\n\n<h3>\n  \n  \n  Control flow\n<\/h3>\n\n<p><code>if...else<\/code>, <code>while<\/code>, and <code>for<\/code> blocks in Python are very similar to JavaScript:<\/p>\n\n<h4>\n  \n  \n  if...else\n<\/h4>\n\n\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight python\"><code><span class=\"k\">if<\/span> <span class=\"n\">x<\/span> <span class=\"o\">&gt;<\/span> <span class=\"mi\">2<\/span><span class=\"p\">:<\/span>\n  <span class=\"k\">print<\/span><span class=\"p\">(<\/span><span class=\"s\">'hai!'<\/span><span class=\"p\">)<\/span>\n<span class=\"k\">elif<\/span> <span class=\"n\">x<\/span> <span class=\"o\">&gt;<\/span> <span class=\"mi\">3<\/span><span class=\"p\">:<\/span>\n  <span class=\"k\">print<\/span><span class=\"p\">(<\/span><span class=\"s\">'bye!'<\/span><span class=\"p\">)<\/span>\n<span class=\"k\">else<\/span><span class=\"p\">:<\/span>\n  <span class=\"k\">print<\/span><span class=\"p\">(<\/span><span class=\"s\">'hey now'<\/span><span class=\"p\">)<\/span>\n\n<span class=\"k\">if<\/span> <span class=\"ow\">not<\/span> <span class=\"n\">x<\/span><span class=\"p\">:<\/span>\n  <span class=\"k\">print<\/span><span class=\"p\">(<\/span><span class=\"s\">'x is falsy!'<\/span><span class=\"p\">)<\/span>\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<h4>\n  \n  \n  while loop\n<\/h4>\n\n\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight python\"><code><span class=\"k\">while<\/span> <span class=\"n\">x<\/span> <span class=\"o\">&gt;<\/span> <span class=\"mi\">0<\/span><span class=\"p\">:<\/span>\n  <span class=\"k\">print<\/span><span class=\"p\">(<\/span><span class=\"s\">'hey now'<\/span><span class=\"p\">)<\/span>\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<h4>\n  \n  \n  for loop\n<\/h4>\n\n<p>For loops are like JavaScript <code>foreach<\/code> loops:<br>\n<\/p>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight python\"><code><span class=\"n\">ex_list<\/span> <span class=\"o\">=<\/span> <span class=\"p\">[<\/span><span class=\"mi\">1<\/span><span class=\"p\">,<\/span> <span class=\"mi\">2<\/span><span class=\"p\">,<\/span> <span class=\"mi\">3<\/span><span class=\"p\">]<\/span>\n\n<span class=\"k\">for<\/span> <span class=\"n\">x<\/span> <span class=\"ow\">in<\/span> <span class=\"n\">ex_list<\/span><span class=\"p\">:<\/span>\n  <span class=\"k\">print<\/span><span class=\"p\">(<\/span><span class=\"n\">x<\/span><span class=\"p\">)<\/span>\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<h2>\n  \n  \n  Types\n<\/h2>\n\n<p>Python's type system is a lot like JavaScript's; it's there, but it's not as strict as in other languages like Java or C#.<\/p>\n\n<p>Practically speaking, variables have types, but you don't have to declare the types of your variables like you would in a statically typed language such as Java.<\/p>\n\n<p>Here's a quick overview of Python's built in data types:<\/p>\n\n<h3>\n  \n  \n  <a href=\"https:\/\/docs.python.org\/3\/library\/stdtypes.html#numeric-types-int-float-complex\">Numbers<\/a>\n<\/h3>\n\n<p>Unlike JavaScript, Python has more than one number type:<\/p>\n\n<ul>\n<li>Integers: <code>1<\/code>, <code>2<\/code>, <code>3<\/code>\n<\/li>\n<li>Floats: <code>4.20<\/code>, <code>4e420<\/code>\n<\/li>\n<li>Complex numbers: <code>4 + 20j<\/code>\n<\/li>\n<li>Booleans: <code>True<\/code>, <code>False<\/code>\n<\/li>\n<\/ul>\n\n<p>You can perform the same operations on numbers in Python as you can in JavaScript. There's also an exponentiation operator (**):<br>\n<\/p>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight python\"><code><span class=\"c1\"># a = 4\n<\/span><span class=\"n\">a<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">2<\/span> <span class=\"o\">**<\/span> <span class=\"mi\">2<\/span>\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<h3>\n  \n  \n  <a href=\"https:\/\/docs.python.org\/3\/library\/stdtypes.html#lists\">Lists<\/a>\n<\/h3>\n\n<p>Lists in Python are similar to arrays in JavaScript. Lists can contain a mixture of types:<br>\n<\/p>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight python\"><code><span class=\"p\">[<\/span><span class=\"mi\">4<\/span><span class=\"p\">,<\/span> <span class=\"s\">\"2\"<\/span><span class=\"p\">,<\/span> <span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"s\">\"zero\"<\/span><span class=\"p\">]]<\/span>\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<p>There's also a special syntax for slicing elements from lists:<br>\n<\/p>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight python\"><code><span class=\"n\">a_list<\/span> <span class=\"o\">=<\/span> <span class=\"p\">[<\/span><span class=\"mi\">1<\/span><span class=\"p\">,<\/span> <span class=\"mi\">2<\/span><span class=\"p\">,<\/span> <span class=\"mi\">3<\/span><span class=\"p\">,<\/span> <span class=\"mi\">4<\/span><span class=\"p\">,<\/span> <span class=\"mi\">5<\/span><span class=\"p\">]<\/span>\n\n<span class=\"c1\"># 1, 2, 3\n<\/span><span class=\"n\">a_list<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">:<\/span><span class=\"mi\">2<\/span><span class=\"p\">]<\/span>\n\n<span class=\"c1\"># 4, 5\n<\/span><span class=\"n\">a_list<\/span><span class=\"p\">[<\/span><span class=\"mi\">3<\/span><span class=\"p\">:]<\/span>\n\n<span class=\"c1\"># 3, 4\n<\/span><span class=\"n\">a_list<\/span><span class=\"p\">[<\/span><span class=\"mi\">2<\/span><span class=\"p\">,<\/span> <span class=\"o\">-<\/span><span class=\"mi\">2<\/span><span class=\"p\">]<\/span>\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<p>And some handy built-in methods for operating on lists:<br>\n<\/p>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight python\"><code><span class=\"c1\"># 3\n<\/span><span class=\"nb\">len<\/span><span class=\"p\">([<\/span><span class=\"mi\">1<\/span><span class=\"p\">,<\/span> <span class=\"mi\">2<\/span><span class=\"p\">,<\/span> <span class=\"mi\">3<\/span><span class=\"p\">])<\/span>\n\n<span class=\"c1\"># 3, 2, 1\n<\/span><span class=\"p\">[<\/span><span class=\"mi\">1<\/span><span class=\"p\">,<\/span> <span class=\"mi\">2<\/span><span class=\"p\">,<\/span> <span class=\"mi\">3<\/span><span class=\"p\">].<\/span><span class=\"n\">reverse<\/span><span class=\"p\">()<\/span>\n\n<span class=\"c1\"># 1, 2, 3\n<\/span><span class=\"p\">[<\/span><span class=\"mi\">1<\/span><span class=\"p\">,<\/span> <span class=\"mi\">2<\/span><span class=\"p\">].<\/span><span class=\"n\">append<\/span><span class=\"p\">(<\/span><span class=\"mi\">3<\/span><span class=\"p\">)<\/span>\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<p>You can even concatenate two lists with the <code>+<\/code> operator:<br>\n<\/p>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight python\"><code><span class=\"c1\"># 1, 2, 3, 4\n<\/span><span class=\"p\">[<\/span><span class=\"mi\">1<\/span><span class=\"p\">,<\/span> <span class=\"mi\">2<\/span><span class=\"p\">]<\/span> <span class=\"o\">+<\/span> <span class=\"p\">[<\/span><span class=\"mi\">3<\/span><span class=\"p\">,<\/span> <span class=\"mi\">4<\/span><span class=\"p\">]<\/span>\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<h3>\n  \n  \n  <a href=\"https:\/\/docs.python.org\/3\/library\/stdtypes.html#text-sequence-type-str\">Strings<\/a>\n<\/h3>\n\n<p>Strings in Python are a lot like strings in JavaScript. They are immutable, and individual characters can be accessed like elements in an array:<br>\n<\/p>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight python\"><code><span class=\"n\">name<\/span> <span class=\"o\">=<\/span> <span class=\"s\">'Mario'<\/span>\n\n<span class=\"c1\"># M\n<\/span><span class=\"k\">print<\/span><span class=\"p\">(<\/span><span class=\"n\">name<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">])<\/span>\n\n<span class=\"c1\"># Nope, name is still 'Mario'\n<\/span><span class=\"n\">name<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">]<\/span> <span class=\"o\">=<\/span> <span class=\"s\">'M'<\/span>\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<h3>\n  \n  \n  <a href=\"https:\/\/docs.python.org\/3\/tutorial\/datastructures.html#dictionaries\">Dictionaries<\/a>\n<\/h3>\n\n<p>Dictionaries are associative arrays, similar to objects in JavaScript. In fact, dictionaries can be declared with a JSON-like syntax:<br>\n<\/p>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight python\"><code><span class=\"c1\"># Dictionaries in python\n<\/span><span class=\"n\">person<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\n  <span class=\"s\">'name'<\/span><span class=\"p\">:<\/span> <span class=\"s\">'Mario'<\/span><span class=\"p\">,<\/span>\n  <span class=\"s\">'age'<\/span><span class=\"p\">:<\/span> <span class=\"mi\">24<\/span>\n<span class=\"p\">}<\/span>\n\n<span class=\"c1\"># Mario\n<\/span><span class=\"k\">print<\/span><span class=\"p\">(<\/span><span class=\"n\">person<\/span><span class=\"p\">[<\/span><span class=\"s\">'name'<\/span><span class=\"p\">])<\/span>\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<p>Dictionaries have a handy method for returning a default value when trying to get the value of a non-existent key:<br>\n<\/p>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight python\"><code><span class=\"c1\"># Because `gender` is not defined, non-binary will be returned\n<\/span><span class=\"n\">person<\/span><span class=\"p\">.<\/span><span class=\"n\">get<\/span><span class=\"p\">(<\/span><span class=\"s\">'gender'<\/span><span class=\"p\">,<\/span> <span class=\"s\">'non-binary'<\/span><span class=\"p\">)<\/span>\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<h3>\n  \n  \n  <a href=\"https:\/\/docs.python.org\/3\/library\/constants.html#None\">None<\/a>\n<\/h3>\n\n<p><code>None<\/code> is equivalent to <code>null<\/code> in JavaScript. It signifies the absence of a value, and is considered \"falsy\".<br>\n<\/p>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight python\"><code><span class=\"n\">x<\/span> <span class=\"o\">=<\/span> <span class=\"bp\">None<\/span>\n\n<span class=\"k\">if<\/span> <span class=\"ow\">not<\/span> <span class=\"n\">x<\/span><span class=\"p\">:<\/span>\n  <span class=\"k\">print<\/span><span class=\"p\">(<\/span><span class=\"s\">'x is falsy!'<\/span><span class=\"p\">)<\/span>\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<h2>\n  \n  \n  Functions\n<\/h2>\n\n<p>Like JavaScript, functions are objects in Python. That means you can pass functions as arguments, or even assign properties to functions:<br>\n<\/p>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight python\"><code><span class=\"k\">def<\/span> <span class=\"nf\">func<\/span><span class=\"p\">(<\/span><span class=\"n\">a<\/span><span class=\"p\">,<\/span> <span class=\"n\">fn<\/span><span class=\"p\">):<\/span>\n  <span class=\"k\">print<\/span><span class=\"p\">(<\/span><span class=\"n\">a<\/span><span class=\"p\">)<\/span>\n  <span class=\"n\">fn<\/span><span class=\"p\">()<\/span>\n\n<span class=\"n\">func<\/span><span class=\"p\">.<\/span><span class=\"n\">x<\/span> <span class=\"o\">=<\/span> <span class=\"s\">'meep'<\/span>\n\n<span class=\"c1\"># 'meep'\n<\/span><span class=\"k\">print<\/span><span class=\"p\">(<\/span><span class=\"n\">func<\/span><span class=\"p\">.<\/span><span class=\"n\">x<\/span><span class=\"p\">)<\/span>\n\n<span class=\"k\">def<\/span> <span class=\"nf\">another_func<\/span><span class=\"p\">():<\/span>\n  <span class=\"k\">print<\/span><span class=\"p\">(<\/span><span class=\"s\">'hey'<\/span><span class=\"p\">)<\/span>\n\n<span class=\"c1\"># 5\n# 'hey'\n<\/span><span class=\"n\">func<\/span><span class=\"p\">(<\/span><span class=\"mi\">5<\/span><span class=\"p\">,<\/span> <span class=\"n\">another_func<\/span><span class=\"p\">)<\/span>\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<h2>\n  \n  \n  Modules\n<\/h2>\n\n<p>Modules in Python aren't that far off from modules in ES6.<\/p>\n\n<h3>\n  \n  \n  Defining a module\n<\/h3>\n\n<p>A module in Python is simply a file that contains some Python code.<br>\n<\/p>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight python\"><code><span class=\"c1\"># my_module.py\n<\/span><span class=\"n\">hey<\/span> <span class=\"o\">=<\/span> <span class=\"s\">'heyyy'<\/span>\n\n<span class=\"k\">def<\/span> <span class=\"nf\">say_hey<\/span><span class=\"p\">():<\/span>\n  <span class=\"k\">print<\/span><span class=\"p\">(<\/span><span class=\"n\">hey<\/span><span class=\"p\">)<\/span>\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<p>Unlike JavaScript, you don't have to declare what is being exported; everything is exported by default.<\/p>\n\n<h3>\n  \n  \n  Importing a module\n<\/h3>\n\n<p>You can import an entire module in Python:<br>\n<\/p>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight python\"><code><span class=\"c1\"># importing my_module.py from another_module.py; both files are in the same\n# directory\n<\/span><span class=\"kn\">import<\/span> <span class=\"nn\">my_module<\/span>\n\n<span class=\"c1\"># Do things\n<\/span><span class=\"n\">my_module<\/span><span class=\"p\">.<\/span><span class=\"n\">say_hey<\/span><span class=\"p\">()<\/span>\n<span class=\"k\">print<\/span><span class=\"p\">(<\/span><span class=\"n\">my_module<\/span><span class=\"p\">.<\/span><span class=\"n\">hey<\/span><span class=\"p\">)<\/span>\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<p>Or import individual items from a module:<br>\n<\/p>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight python\"><code><span class=\"c1\"># another_module.py\n<\/span><span class=\"kn\">from<\/span> <span class=\"nn\">my_module<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">hey<\/span><span class=\"p\">,<\/span> <span class=\"n\">say_hey<\/span>\n\n<span class=\"c1\"># Do things\n<\/span><span class=\"n\">say_hey<\/span><span class=\"p\">()<\/span>\n<span class=\"k\">print<\/span><span class=\"p\">(<\/span><span class=\"n\">hey<\/span><span class=\"p\">)<\/span>\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<p>You can also install modules other people have written with<br>\n<a href=\"https:\/\/pypi.python.org\/pypi\/pip\">pip<\/a>, a package manager for Python.<br>\n<\/p>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code>pip <span class=\"nb\">install <\/span>simplejson\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<h2>\n  \n  \n  Object Oriented Programming\n<\/h2>\n\n<p>Python has support for object oriented programming with classes and classical inheritance, unlike JavaScript which has prototypes with prototypal inheritance.<\/p>\n\n<h3>\n  \n  \n  <a href=\"https:\/\/docs.python.org\/3\/tutorial\/classes.html#classes\">Classes<\/a>\n<\/h3>\n\n\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight python\"><code><span class=\"c1\"># Defining a class\n<\/span><span class=\"k\">class<\/span> <span class=\"nc\">Animal<\/span><span class=\"p\">:<\/span>\n  <span class=\"c1\"># Variable that is shared by all instances of the Animal class\n<\/span>  <span class=\"n\">default_age<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">1<\/span>\n\n  <span class=\"c1\"># Constructor\n<\/span>  <span class=\"k\">def<\/span> <span class=\"nf\">__init__<\/span><span class=\"p\">(<\/span><span class=\"bp\">self<\/span><span class=\"p\">,<\/span> <span class=\"n\">name<\/span><span class=\"p\">):<\/span>\n    <span class=\"c1\"># Defining a publicly available variable\n<\/span>    <span class=\"bp\">self<\/span><span class=\"p\">.<\/span><span class=\"n\">name<\/span> <span class=\"o\">=<\/span> <span class=\"n\">name<\/span>\n\n    <span class=\"c1\"># You can define private variables and methods by prepending the variable\n<\/span>    <span class=\"c1\"># name with 2 underscores (__):\n<\/span>    <span class=\"bp\">self<\/span><span class=\"p\">.<\/span><span class=\"n\">__age<\/span> <span class=\"o\">=<\/span> <span class=\"n\">default_age<\/span>\n\n  <span class=\"c1\"># Public method\n<\/span>  <span class=\"k\">def<\/span> <span class=\"nf\">get_age<\/span><span class=\"p\">(<\/span><span class=\"bp\">self<\/span><span class=\"p\">):<\/span>\n    <span class=\"k\">return<\/span> <span class=\"bp\">self<\/span><span class=\"p\">.<\/span><span class=\"n\">__age<\/span>\n\n  <span class=\"c1\"># Private method\n<\/span>  <span class=\"k\">def<\/span> <span class=\"nf\">__meow<\/span><span class=\"p\">():<\/span>\n    <span class=\"k\">print<\/span><span class=\"p\">(<\/span><span class=\"s\">'meowwww'<\/span><span class=\"p\">)<\/span>\n\n  <span class=\"c1\"># Defining a static method with the `staticmethod` decorator\n<\/span>  <span class=\"o\">@<\/span><span class=\"nb\">staticmethod<\/span>\n  <span class=\"k\">def<\/span> <span class=\"nf\">moo<\/span><span class=\"p\">():<\/span>\n    <span class=\"k\">print<\/span><span class=\"p\">(<\/span><span class=\"s\">'moooo'<\/span><span class=\"p\">)<\/span>\n\n<span class=\"c1\"># Creating an Animal object\n<\/span><span class=\"n\">animal<\/span> <span class=\"o\">=<\/span> <span class=\"n\">Animal<\/span><span class=\"p\">()<\/span>\n\n<span class=\"c1\"># Accessing public variables and methods\n<\/span><span class=\"k\">print<\/span><span class=\"p\">(<\/span><span class=\"n\">animal<\/span><span class=\"p\">.<\/span><span class=\"n\">name<\/span><span class=\"p\">)<\/span>\n<span class=\"k\">print<\/span><span class=\"p\">(<\/span><span class=\"n\">animal<\/span><span class=\"p\">.<\/span><span class=\"n\">default_age<\/span><span class=\"p\">)<\/span>\n<span class=\"k\">print<\/span><span class=\"p\">(<\/span><span class=\"n\">animal<\/span><span class=\"p\">.<\/span><span class=\"n\">get_age<\/span><span class=\"p\">())<\/span>\n\n<span class=\"c1\"># Accessing a static method\n<\/span><span class=\"n\">Animal<\/span><span class=\"p\">.<\/span><span class=\"n\">moo<\/span><span class=\"p\">()<\/span>\n\n<span class=\"c1\"># ERR!!!! .__age is private, so this won't work:\n<\/span><span class=\"k\">print<\/span><span class=\"p\">(<\/span><span class=\"n\">animal<\/span><span class=\"p\">.<\/span><span class=\"n\">__age<\/span><span class=\"p\">)<\/span>\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<h3>\n  \n  \n  <a href=\"https:\/\/docs.python.org\/3\/tutorial\/classes.html#inheritance\">Inheritance<\/a>\n<\/h3>\n\n<p>Classes can inherit from other classes:<br>\n<\/p>\n\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight python\"><code><span class=\"c1\"># Inheriting from the Animal class\n<\/span><span class=\"k\">class<\/span> <span class=\"nc\">Human<\/span><span class=\"p\">(<\/span><span class=\"n\">Animal<\/span><span class=\"p\">):<\/span>\n  <span class=\"k\">def<\/span> <span class=\"nf\">__init__<\/span><span class=\"p\">(<\/span><span class=\"bp\">self<\/span><span class=\"p\">,<\/span> <span class=\"n\">name<\/span><span class=\"p\">,<\/span> <span class=\"n\">address<\/span><span class=\"p\">):<\/span>\n    <span class=\"c1\"># Must call the __init__ method of the base class\n<\/span>    <span class=\"nb\">super<\/span><span class=\"p\">().<\/span><span class=\"n\">__init__<\/span><span class=\"p\">(<\/span><span class=\"n\">name<\/span><span class=\"p\">)<\/span>\n    <span class=\"bp\">self<\/span><span class=\"p\">.<\/span><span class=\"n\">__address<\/span> <span class=\"o\">=<\/span> <span class=\"n\">address<\/span>\n\n  <span class=\"k\">def<\/span> <span class=\"nf\">get_address<\/span><span class=\"p\">(<\/span><span class=\"bp\">self<\/span><span class=\"p\">):<\/span>\n    <span class=\"k\">return<\/span> <span class=\"bp\">self<\/span><span class=\"p\">.<\/span><span class=\"n\">address<\/span>\n\n<span class=\"c1\"># Using the Human class\n<\/span><span class=\"n\">human<\/span> <span class=\"o\">=<\/span> <span class=\"n\">Human<\/span><span class=\"p\">(<\/span><span class=\"s\">'Mario'<\/span><span class=\"p\">,<\/span> <span class=\"s\">'123 Jane Street, Brooklyn, NY 11211'<\/span><span class=\"p\">)<\/span>\n\n<span class=\"c1\"># Human objects have access to methods defined in the Animal base class\n<\/span><span class=\"n\">human<\/span><span class=\"p\">.<\/span><span class=\"n\">get_age<\/span><span class=\"p\">()<\/span>\n<span class=\"n\">human<\/span><span class=\"p\">.<\/span><span class=\"n\">get_address<\/span><span class=\"p\">()<\/span>\n<\/code><\/pre>\n\n<\/div>\n\n\n\n<h2>\n  \n  \n  Resources\n<\/h2>\n\n<p>There is a lot more to Python than what's in this guide. I highly recommend you check out the <a href=\"https:\/\/docs.python.org\/3\/\">Python docs<\/a> for tutorials and details about other language features.<\/p>\n\n<p>And remember, the best way to learn a language is to write it, a lot. So get to coding!<\/p>\n\n<p><em>P.S.: If you need an idea for a project, maybe try creating a simple API with <a href=\"http:\/\/flask.pocoo.org\/\">Flask<\/a>?<\/em><\/p>\n\n","category":["javascript","python"]}]}}