《電子技術(shù)應(yīng)用》
您所在的位置:首頁(yè) > 可編程邏輯 > 業(yè)界動(dòng)態(tài) > 一文讀懂為什么要選擇 Python做機(jī)器學(xué)習(xí)

一文讀懂為什么要選擇 Python做機(jī)器學(xué)習(xí)

2018-08-18
關(guān)鍵詞: Python

  隨著機(jī)器學(xué)習(xí)的興起,Python 逐步成為了「最受歡迎」的語(yǔ)言。它簡(jiǎn)單易用、邏輯明確并擁有海量的擴(kuò)展包,因此其不僅成為機(jī)器學(xué)習(xí)與數(shù)據(jù)科學(xué)的首選語(yǔ)言,同時(shí)在網(wǎng)頁(yè)、數(shù)據(jù)爬取可科學(xué)研究等方面成為不二選擇。此外,很多入門級(jí)的機(jī)器學(xué)習(xí)開發(fā)者都是跟隨大流選擇 Python,但到底為什么要選擇 Python 就是本文的核心內(nèi)容。

  本教程的目的是讓你相信兩件事:首先,Python 是一種非常棒的編程語(yǔ)言;其次,如果你是一名科學(xué)家,Python 很可能值得你去學(xué)習(xí)。本教程并非想要說(shuō)明 Python 是一種萬(wàn)能的語(yǔ)言;相反,作者明確討論了在幾種情況下,Python 并不是一種明智的選擇。本教程的目的只是提供對(duì) Python 一些核心特征的評(píng)論,并闡述作為一種通用的科學(xué)計(jì)算語(yǔ)言,它比其他常用的替代方案(最著名的是 R 和 Matlab)更有優(yōu)勢(shì)。

  本教程的其余部分假定你已經(jīng)有了一些編程經(jīng)驗(yàn),如果你非常精通其他以數(shù)據(jù)為中心的語(yǔ)言(如 R 或 Matlab),理解本教程就會(huì)非常容易。本教程不能算作一份關(guān)于 Python 的介紹,且文章重點(diǎn)在于為什么應(yīng)該學(xué)習(xí) Python 而不是怎樣寫 Python 代碼(盡管其他地方有大量的優(yōu)秀教程)。

  概述

  Python 是一種廣泛使用、易于學(xué)習(xí)、高級(jí)、通用的動(dòng)態(tài)編程語(yǔ)言。這很令人滿意,所以接下來(lái)分開討論一些特征。

  Python(相對(duì)來(lái)說(shuō))易于學(xué)習(xí)

  編程很難,因此從絕對(duì)意義上來(lái)說(shuō),除非你已經(jīng)擁有編程經(jīng)驗(yàn),否則編程語(yǔ)言難以學(xué)習(xí)。但是,相對(duì)而言,Python 的高級(jí)屬性(見下一節(jié))、語(yǔ)法可讀性和語(yǔ)義直白性使得它比其他語(yǔ)言更容易學(xué)習(xí)。例如,這是一個(gè)簡(jiǎn)單 Python 函數(shù)的定義(故意未注釋),它將一串英語(yǔ)單詞轉(zhuǎn)換為(crummy)Pig Latin:

  def pig_latin(text):

  ''' Takes in a sequence of words and converts it to (imperfect) pig latin. '''

  word_list = text.split(' ')

  output_list = []

  for word in word_list:

  word = word.lower()

  if word.isalpha():

  first_char = word[0]

  if first_char in 'aeiou':

  word = word + 'ay'

  else:

  word = word[1:] + first_char + 'yay'

  output_list.append(word)

  pygged = ' '.join(output_list)

  return pygged

  以上函數(shù)事實(shí)上無(wú)法生成完全有效的 Pig Latin(假設(shè)存在「有效 Pig Latin」),但這沒有關(guān)系。有些情況下它是可行的:

  test1 = pig_latin("let us see if this works")

  print(test1)

  拋開 Pig Latin 不說(shuō),這里的重點(diǎn)只是,出于幾個(gè)原因,代碼是很容易閱讀的。首先,代碼是在高級(jí)抽象中編寫的(下面將詳細(xì)介紹),因此每行代碼都會(huì)映射到一個(gè)相當(dāng)直觀的操作。這些操作可以是「取這個(gè)單詞的第一個(gè)字符」,而不是映射到一個(gè)沒那么直觀的低級(jí)操作,例如「為一個(gè)字符預(yù)留一個(gè)字節(jié)的內(nèi)存,稍后我會(huì)傳入一個(gè)字符」。其次,控制結(jié)構(gòu)(如,for—loops,if—then 條件等)使用諸如「in」,「and」和「not」的簡(jiǎn)單單詞,其語(yǔ)義相對(duì)接近其自然英語(yǔ)含義。第三,Python 對(duì)縮進(jìn)的嚴(yán)格控制強(qiáng)加了一種使代碼可讀的規(guī)范,同時(shí)防止了某些常見的錯(cuò)誤。第四,Python 社區(qū)非常強(qiáng)調(diào)遵循樣式規(guī)定和編寫「Python 式的」代碼,這意味著相比使用其他語(yǔ)言的程序員而言,Python 程序員更傾向于使用一致的命名規(guī)定、行的長(zhǎng)度、編程習(xí)慣和其他許多類似特征,它們共同使別人的代碼更易閱讀(盡管這可以說(shuō)是社區(qū)的一個(gè)特征而不是語(yǔ)言本身)。

  Python 是一種高級(jí)語(yǔ)言

  與其他許多語(yǔ)言相比,Python 是一種相對(duì)「高級(jí)」的語(yǔ)言:它不需要(并且在許多情況下,不允許)用戶擔(dān)心太多底層細(xì)節(jié),而這是其他許多語(yǔ)言需要去處理的。例如,假設(shè)我們想創(chuàng)建一個(gè)名為「my_box_of_things」的變量當(dāng)作我們所用東西的容器。我們事先不知道我們想在盒子中保留多少對(duì)象,同時(shí)我們希望在添加或刪除對(duì)象時(shí),對(duì)象數(shù)量可以自動(dòng)增減。所以這個(gè)盒子需要占據(jù)一個(gè)可變的空間:在某個(gè)時(shí)間點(diǎn),它可能包含 8 個(gè)對(duì)象(或「元素」),而在另一個(gè)時(shí)間點(diǎn),它可能包含 257 個(gè)對(duì)象。在像 C 這樣的底層語(yǔ)言中,這個(gè)簡(jiǎn)單的要求就已經(jīng)給我們的程序帶來(lái)了一些復(fù)雜性,因?yàn)槲覀冃枰崆奥暶骱凶有枰紦?jù)多少空間,然后每次我們想要增加盒子需要的空間時(shí),我么需要明確創(chuàng)建一個(gè)占據(jù)更多空間的全新的盒子,然后將所有東西拷貝到其中。

  相比之下,在 Python 中,盡管在底層這些過(guò)程或多或少會(huì)發(fā)生(效率較低),但我們?cè)谑褂酶呒?jí)語(yǔ)言編寫時(shí)并不需要擔(dān)心這一部分。從我們的角度來(lái)看,我們可以創(chuàng)建自己的盒子并根據(jù)喜好添加或刪除對(duì)象:

  # Create a box (really, a 'list') with 5 things# Create

  my_box_of_things = ['Davenport', 'kettle drum', 'swallow-tail coat', 'table cloth', 'patent leather shoes']

  print(my_box_of_things)

  ['Davenport', 'kettle drum', 'swallow-tail coat', 'table cloth', 'patent leather shoes']

  # Add a few more things

  my_box_of_things += ['bathing suit', 'bowling ball', 'clarinet', 'ring']

  # Maybe add one last thing

  my_box_of_things.append('radio that only needs a fuse')

  # Let's see what we have...

  print(my_box_of_things)

  更一般來(lái)說(shuō),Python(以及根據(jù)定義的其他所有高級(jí)語(yǔ)言)傾向于隱藏需要在底層語(yǔ)言中明確表達(dá)的各種死記硬背的聲明。這使得我們可以編寫非常緊湊、清晰的代碼(盡管它通常以降低性能為代價(jià),因?yàn)閮?nèi)部不再可訪問,因此優(yōu)化變得更加困難)。

  例如,考慮從文件中讀取純文本這樣看似簡(jiǎn)單的行為。對(duì)于與文件系統(tǒng)直接接觸而傷痕累累的開發(fā)者來(lái)說(shuō),從概念上看似乎只需要兩個(gè)簡(jiǎn)單的操作就可以完成:首先打開一個(gè)文件,然后從其中讀取。實(shí)際過(guò)程遠(yuǎn)不止這些,并且比 Python 更底層的語(yǔ)言通常強(qiáng)制(或至少是鼓勵(lì))我們?nèi)コ姓J(rèn)這一點(diǎn)。例如,這是在 Java 中從文件中讀取內(nèi)容的規(guī)范(盡管肯定不是最簡(jiǎn)潔的)方法:

  import java.io.BufferedReader;

  import java.io.FileReader;

  import java.io.IOException;

  public class ReadFile {

  public static void main(String[] args) throws IOException{

  String fileContents = readEntireFile("./foo.txt");

  }

  private static String readEntireFile(String filename) throws IOException {

  FileReader in = new FileReader(filename);

  StringBuilder contents = new StringBuilder();

  char[] buffer = new char[4096];

  int read = 0;

  do {

  contents.append(buffer, 0, read);

  read = in.read(buffer);

  } while (read >= 0);

  return contents.toString();

  }

  }

  你可以看到我們不得不做一些令人苦惱的事,例如導(dǎo)入文件讀取器、為文件中的內(nèi)容創(chuàng)建一個(gè)緩存,以塊的形式讀取文件塊并將它們分配到緩存中等等。相比之下,在 Python 中,讀取文件中的全部?jī)?nèi)容只需要如下代碼:

  # Read the contents of "hello_world.txt"

  text = open("hello_world.txt").read()

  當(dāng)然,這種簡(jiǎn)潔性并不是 Python 獨(dú)有的;還有其他許多高級(jí)語(yǔ)言同樣隱藏了簡(jiǎn)單請(qǐng)求所暗含的大部分令人討厭的內(nèi)部過(guò)程(如,Ruby,R,Haskell 等)。但是,相對(duì)來(lái)說(shuō)比較少有其他語(yǔ)言能與接下來(lái)探討的 Python 特征相媲美。

  Python 是一種通用語(yǔ)言

  根據(jù)設(shè)計(jì),Python 是一種通用的語(yǔ)言。也就是說(shuō),它旨在允許程序員在任何領(lǐng)域編寫幾乎所有類型的應(yīng)用,而不是專注于一類特定的問題。在這方面,Python 可以與(相對(duì))特定領(lǐng)域的語(yǔ)言進(jìn)行對(duì)比,如 R 或 PHP。這些語(yǔ)言原則上可用于很多情形,但仍針對(duì)特定用例進(jìn)行了明確優(yōu)化(在這兩個(gè)示例中,分別用于統(tǒng)計(jì)和網(wǎng)絡(luò)后端開發(fā))。

  Python 通常被親切地成為「所有事物的第二個(gè)最好的語(yǔ)言」,它很好地捕捉到了這樣的情緒,盡管在很多情況下 Python 并不是用于特定問題的最佳語(yǔ)言,但它通常具有足夠的靈活性和良好的支持性,使得人們?nèi)匀豢梢韵鄬?duì)有效地解決問題。事實(shí)上,Python 可以有效地應(yīng)用于許多不同的應(yīng)用中,這使得學(xué)習(xí) Python 成為一件相當(dāng)有價(jià)值的事。因?yàn)樽鳛橐粋€(gè)軟件開發(fā)人員,能夠使用單一語(yǔ)言實(shí)現(xiàn)所有事情,而不是必須根據(jù)所執(zhí)行的項(xiàng)目在不同語(yǔ)言和環(huán)境間進(jìn)行切換,是一件非常棒的事。


本站內(nèi)容除特別聲明的原創(chuàng)文章之外,轉(zhuǎn)載內(nèi)容只為傳遞更多信息,并不代表本網(wǎng)站贊同其觀點(diǎn)。轉(zhuǎn)載的所有的文章、圖片、音/視頻文件等資料的版權(quán)歸版權(quán)所有權(quán)人所有。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無(wú)法一一聯(lián)系確認(rèn)版權(quán)者。如涉及作品內(nèi)容、版權(quán)和其它問題,請(qǐng)及時(shí)通過(guò)電子郵件或電話通知我們,以便迅速采取適當(dāng)措施,避免給雙方造成不必要的經(jīng)濟(jì)損失。聯(lián)系電話:010-82306118;郵箱:aet@chinaaet.com。