[Python 爬虫这样学,一定是大拇指拉!] DAY02 - 关於 Python (1)

所谓工欲善其事,必先利其器。
选择 Python 的理由又是什麽?
那我们得先从语言的特性及优缺点来探讨。

Python 是什麽?爬虫类吗?

https://ithelp.ithome.com.tw/upload/images/20210916/201393582jOVQsMX5c.png
图片来源

Python 不是爬虫类,跟 Johnson 也没关系。

它,是个直译式、交互式、动态型别、物件导向的程序语言。

那这些特性是什麽意思呢?

  1. 直译式语言 (Interpreted language)

    首先我们要知道,Python 是一个 High-level programming language,以人类的日常语言为基础的一种程序语言,言下之意,你在 Editor 或 IDE 上写的程序码都是给人看的。所以当我们要让电脑去执行程序码时,必须将这些程序编译成电脑看得懂的语言,而直译式就是我们编译程序码的方式。

    直译式怎麽编译呢?就是编译一行,执行一行。
    而另一种跟直译式相反的则称为编译式语言 (Compiled language),编译式语言是全部编译完後才会去执行。
      

  2. 交互式程序设计 (Interactive programming)

    因为直译器的好处是每次程序更新後它不需要重新编译整个程序。Jupyter 就是 Python 的交互式程序设计的介面,而 VSCode 本身也有支援这种介面,可以参考这边的教学使用。
    https://ithelp.ithome.com.tw/upload/images/20210916/20139358HJCFaPJidz.png
    如图所示,程序可以一行一行的执行,假如遇到前置处理的资料很庞大的时候,不用从头跑一遍,可以只执行後面修改的部分,这样一来就能省下不少时间!
     

  3. 动态型别(Dynamic typing)
    让同一个变数在执行时能被赋予不同型别的值。

    dynamic = 5
    dynamic = "Hello world"
    print(dynamic)
    

    输出结果:
    https://ithelp.ithome.com.tw/upload/images/20210917/20139358cbSyTtjpLY.png
    但同样的作法在 Java 中就会出现错误(静态型别)

    public class Main {
    
        public static void main(String[] args) {
            int dynamic;
            dynamic = 5;
            dynamic = "Hello world";
            System.out.println(dynamic);
        }
    
    }
    

    输出结果:
    https://ithelp.ithome.com.tw/upload/images/20210917/201393583XFxWGOroL.png
     

  4. 物件导向程序设计(Object-oriented programming)
    以下是物件导向的简单概述。
    所谓物件导向,就是只能透过物件本身所提供的介面 (Interface) 来存取 (Access) 物件内部的属性或者方法。可以分成以下:

    • 类别 (Class): 定义了物件 (Object) 所拥有的属性、方法、结构。
    • 物件 (Object): 类别的实体 (Instance)。
    • 继承 (Inheritance): 类别彼此可以互相继承,子类别可拥有父类别 public 或 protected 的属性与方法。
    • 封装 (Encapsulation): 不需要知道如何实作,只要知道如何使用即可。
    • 多型 (Polymorphism): 相同名称的方法,传入不同的参数,会有不同的行为,包含以下。
      • 覆写(Overriding): 覆盖父类别原本的方法,在子类别中宣告与父类别相同的方法即可覆盖。

        class A:
            def foo(self):
                print("A")
        
        class B(A):  # 继承
            def foo(self):  # Overriding
                print("B")
        
      • 多载(Overloading): 在相同类别中,名称相同,但是参数个数不同,或是参数型态不同,进而执行不同的行为。

        这边先以 Java 作为范例:

        // Java Overloading Example
        
        public class A {
            public int calArea(int x, int y){
                return (x + y);
            }
            public double calArea(double x, double y){
                // 同名称,不同型态
                return (x + y);
            }  
            public int calArea(int x, int y, int z){
                // 同名称,不同参数个数
                return (x + y + z);
            }
        }
        
        

        那 Python 呢?

        # Python Overloading Example
        class A:
            def foo(self):
                print("A")
        
            def foo(self, number):  # Overloading
                print(number)
        
        
        a = A()
        a.foo()
        

        我们试着呼叫第一个没有任何参数的 function 看看:
        https://ithelp.ithome.com.tw/upload/images/20210916/20139358c17tyMfAb3.png

        可以发现我们呼叫的 foo function 被覆写掉了!为什麽!?
        因为 Python 是动态型别的语言,可以接受任何型态的参数,所以对 Python 来说 Overloading 是不太必要的,里面写个 if-else 就能解决了。

        难道 Python 就不能做"正规的" Overloading 吗?
        可以!但实作上较为复杂,且需要对 Decorator 有基本的了解。想知道更多可以参阅此文章
          

    • 另外要注意一下跟其他物件导向语言不同的地方, Python 的 Class 并没有所谓 protected 及 private 属性喔!至於原因就不另外说明了。有兴趣可以到这边参考。
        
      以上,就是 Python 的简单介绍!

<<:  [Day2] What is Pentest

>>:  [Day2] What is Cloud

DAY7-PHP和MYSQL(一)

前言: 在昨天的内容中我们大致介绍了什麽是SQL以及一些Mysql的用法,那今天的目标就是要来把资...

Day 18 Sort

演算法在程序设计中扮演重要的角色,而演算法和时间复杂度有很大的关联, 时间复杂度本意为程序执行的时间...

学习Python纪录Day15 - 使用模组取得网路资料

Python应用实务 使用urllib.request取得网路资料 urllib模组可以从网路取得资...

SQL Server Agent 权限 - 心得分享

DBABootcamp 没有 SA 权限的使用者,要如何管理 SQL Agent Jobs (作业)...

Chapter5 - 不介意的话,请玩玩看这个Canvas游戏!试图拾回一片片的落叶,拯救这颗树吧

(10/11更)私下有一些朋友反应手机不太能玩,我才想起这个问题,所以有对此demo在长版进行微调...