有Java基礎的程式設計師,是如何看待Python這位少女的?
隨著人工智慧的火熱,Python作為這塊領域中的佼佼者,也得到了迅猛的發展。作為一門強型別的動態指令碼語言,Python與JavaScript非常相似,無論是語法思維上還是可用的基礎工具(內建API)上,對於寫慣了JavaScript的我們來說, Python非常的友好,友好在哪呢?我們一起來看看吧。
由於我們都是有JavaScript基礎了,所以學習Python的方式得做一些小改變,不需要去看文件學習API,那樣其實蠻累的,畢竟脫離了生產的學習API,就猶如聽著昏昏欲睡,毫無感情的色彩的四六級聽力,嚼著一段段生搬硬套硬湊生詞的閱讀理解,你很難真正的聽懂、讀懂它。(有幸在車站跟外國人交流過,他們說的話聽起來真的 很優美,很靈動,這跟一直是第一聲的四六級完全不同,好吧,扯遠了)
學Python,我的理解 —— 就像學JQuery,學會一個$(id class tag),理解它比原生JS對於DOM操作的簡化就夠了,其他的五花八門的API,你在生產環境下用上一遍,自然而然就會了。
這裡我們也是一樣,不學習它的API,我們用Python來解決問題,解著解著,你自然也就會了,而且可以讓你的頭髮少掉那麼幾根。= =
我們遇到的第一個問題是 —— 抽獎。
用JavaScript寫抽獎你肯定信手拈來,呼啦啦看著那個大轉盤咕嚕咕嚕就是一頓猛操作。這裡我們只取其中最重要的一部分,也就是搖出幸運者的邏輯。我們可以把它抽象成下面這樣:
1、抽獎箱裡的號碼為員工號碼,我們看成一個陣列,假設這時候的員工號碼為1~100號。
2、抽獎到的那位不能再繼續參與抽獎。
3、假設我們要抽取若干位幸運者(比如5位幸運者)
這時候我們想:先建一個陣列來裝幸運者,接著隨機一個從1-100號的數字,並且判定一下這個隨機出來的數字是否在幸運者陣列中,如果沒有就加進去,有就重新隨機。
我們先來看一下我們熟悉的JavaScript,基本上你可以發現有條不紊的按照我們的思路進行著。
const randomNums_0 = (a, b, n) => { // 建一個陣列 let res = []; // 生成 a~b 的隨機號碼 const createRandom = (a, b) => Math.floor(Math.random() * (b - a) + a); while(n) { let val = createRandom(a, b); if(res.indexOf(val) === -1) { // 如果這個隨機的號碼在幸運者的佇列中不存在 res.push(val); // 則將這個號碼新增進去 n --; // 這裡的n是幸運者的人數,當佇列中多了一個幸運者,n就減一 } // 否則重新生成隨機數 } return res; } console.log(randomNums_0(1, 100, 5));
這時做過了一遍之後,再返回來看看Python版。(這裡的Python是Python3.7,對於Python2的語法異同(語法不相容其實不少,最常見的比如Python2的print ***與Python3的 print(***)。這裡就不說了,只說Python3。)
# 簡單抽獎 —— 生成n個輸入範圍在a ~ b內的不同隨機整數。 # 難度 ★★ # 函式接收3個數字,分別為a, b, n。 def _20191020(): # the first solution def randomNums_0 (a, b, n): res = [] while n: num = math.floor(random.random() * (b - a) + a) if num not in res: res.append(num) n -= 1 return res print(randomNums_0(1, 100, 5))
基本的套路其實一模一樣,只不過稍微語法不同:
1、 JavaScript的函式定義是透過function,或者透過箭頭表示式。而Python則是透過def。def其實就是定義的意思,define嘛。
// JavaScript function fn () { ... } const fn = argus => { ... } # Python def fn ():
python的函式沒有大括號包裹,而是透過":"來做判定。
2、 我們的判斷陣列是否包含某個成員,我們的初步思路就是判斷它的索引是不是大於-1,這裡Python做得更好,它直接就是:
if num not in res:
你在其他語言上很難(除了SQL)看到如此語義化的程式碼,簡直就是一句赤裸裸的英文句子,這也是我向往的終極程式碼程式設計方式 —— 程式碼就是很直白的英文句子(當然也可以中文)。
3、 類似於陣列的push在python中是append,n - - 在python中沒有,python只能是n -= 1等這些小改動,對於我們來說其實都不能說是負擔。
4、 JavaScript最大的特點就是你幾乎開箱即用,很多功能都內建了,而Python其實也是,只不過沒有全部放在名稱空間裡(你可以理解成全域性作用域),比如數學的math,隨機數的random,正則的re。它們都是需要import進來的。比如下面這樣:
import math import numpy import re import random from functools import reduce
5、 你有沒發現這些import跟JavaScript非常相似,甚至關鍵詞都一樣的,是的,這裡你幾乎可以用JavaScript的模組化思想來類比,你可以很容易理解並掌握它。
好了,雖說僅僅只是簡單的一個問題解決過程,但你可以掌握不少這方面的語法與思想了吧。
這時候對於這一個問題的解決思路我抱著一絲疑惑,按照這樣的方式,是不是存在著新出的隨機號碼可能已經存在於幸運者佇列中了,假如這時候我要抽取的是50位呢?是不是無形中衝突的機率大大的增加?假如是抽99位(當然這時候就變成抽1位了),那是不是新出的隨機數一直迎面撞到陣列裡?然後就一直隨機一直撞,想一下都累。有木有新的方式來解決呢?這是肯定的。
這時候我們做的就是先生成一個全部參與者號碼組成的陣列,先隨機抽取出一位,這時候陣列就將這一位移除,接著繼續抽取下一位,值得指定人數的幸運者選出即停止。
看看下面的程式碼:
// the second solution —— 利用陣列機制 const randomNums = (a, b, n) => { let arrList = Array.from({length: b - a}, (item, index) => index + a), res = []; while(n --) { let i = Math.floor(Math.random() * arrList.length); res.push(arrList[i]); arrList.splice(i, 1); } return res; } return randomNums(1, 100, 5);
在看一下Python的程式碼:
# the second solution def randomNums(a, b, n): all = list(range(a, b)) res = [] while n: index = math.floor(random.random() * len(all)) res.append(all[index]) del all[index] n -= 1 return res return randomNums(1, 100, 5)
解決思路的話其實沒啥差別。只不過這裡你可以發現:
1、 我們陣列的刪除某些成員用的是splice,其實還不是那麼的直觀,看看Python
del all[index]
直接就是一句delete,刪除,看著就有種莫名的爽。
2、 Python生成list也非常簡單,比之JavaScript更為簡潔。
// JavaScript let arrList = Array.from({length: b - a}, (item, index) => index + a) # Python arrList = list(range(a, b))
接下來我們遇到的第二個問題是 —— Fizz Buzz。
來看一下問題的描述:
# Fizz Buzz # 難度 ★★ # 給定一個 數字 作為輸入值, 列印出從 1 到給定數字的所有整數。 # 但是,當整數可以被 2 整除時,列印出“Fizz”; 當它可以被3整除時,列印出“Buzz”; # 為了方便,可以將結果先合併成一個陣列一起輸出
這個採用JavaScript解決的話,我們幾乎可以不假思索的寫出:
const fizzBuzz = num => { let arr = Array.from({length: num}, (item, index) => index + 1); // 先生成一個從1至輸入值的陣列 return arr.map(item => item % 2 === 0 ? 'Fizz' : item % 3 === 0 ? 'Buzz' : item); // 做一次map對映 } console.log(fizzBuzz(20));
假如採用的是python呢?看看哈:
def _20191021(): def mapRes (item): return 'Fizz' if item % 2 == 0 else 'Buzz' if item % 3 == 0 else item def fizzBuzz(n): all = list(range(1, n + 1)) return list(map(mapRes, all)) return fizzBuzz(20)
看起來好像也很相似,也有map,也是將一個函式作為引數傳進map,是不是很cool?
1、 Python也有map,而且用法幾乎和我們JavaScript一模一樣,只不過它沒有JavaScript這樣的非常典型的鏈式呼叫。而且Python中的map對應的回撥函式中,也沒有index的值。另外就是map直接存在於名稱空間,無需引入任何的包。
// JavaScript let arr = [1,2,3,4] arr.map(item => item ** 2); # Python arr = [1,2,3,4] def fn (item): return item ** 2 map(fn, arr)
2、 看到上面的兩段程式碼,你是不是也發現了Python的註釋?Python裡的註釋跟很多的配置檔案(比如nginx)一樣用“#”作為註釋的關鍵詞,當然它還有" “、”’ '"這樣的註釋,可以自個去看看吧。
3、 看到上面的JavaScript程式碼好像用到了三元運算子,而Python中怎麼不寫呢?其實不是不想寫,是Python中的三元是這樣的,反正看起來不像三元運算。
res = a if fn else b # 就是說 res 如果滿足fn 那就是a,否則就是b
當然了,你完全可以(儘管你可能在程式碼評審時被各種爆錘)
res = a if fn1 else b if fn2 else c if fn3 else d if fn4 else e ....
4、 Python再怎樣,畢竟也是一門強型別的語言,對於型別檢查也是非常注重的哈,你沒辦法將一個數字型的與一個字串型的資料強行合併。
比如我們在JavaScript中很常見的:
let a = 1, b = 'dorsey'; console.log(a + b)
請相信我,你這在Python中是會報錯的。
所以假如你有這樣的需要,那麼你可以這樣:
a = 1 b = 'dorsey' print(str(a) + b)
其實就是做一步在強型別語言中非常常見的型別強制轉換。不過最好還是在定義時更規範更有前瞻性的去選擇型別。
學習JavaScript時,你是不是也會時不時的去瀏覽器將各大型別的內建物件(比如Object,Array,String…)列印一下,看看它們的原型,看看是否增加了什麼新東西?
而Python呢,其實相較於JavaScript那些方法或物件,要更加複雜,內建的模組池也更加的龐大。你可以看看:
光一個最外層的檔案目錄就有這麼多了,還得說可能有目錄套目錄等等,比如你看到__XXX__這樣的變數,基本就是一個內部的物件了。
當然了,正如開頭所說,這樣一個個API去試是很累的方式,但不代表我們不可以全部瀏覽一遍,對吧?
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69923331/viewspace-2661162/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 你是如何看待男程式設計師的?程式設計師
- 怪不得這位程式設計師有女朋友,原來是因為這個!程式設計師
- 程式設計入門,這763位老程式設計師有話講!程式設計師
- java程式設計師程式設計筆試基礎學習Java程式設計師筆試
- 好程式設計師Java培訓分享20個Java程式設計師基礎題程式設計師Java
- 《java程式設計基礎》java的基礎知識(三)Java程式設計
- 好程式設計師Java教程分享Java的4大核心基礎程式設計師Java
- 根據現象分析Java程式設計師三十歲這個問題究竟要如何看待Java程式設計師
- 好程式設計師分享如何看待CSS中BEM的命名方式?程式設計師CSS
- 零基礎如何學Java?擁有程式設計思想呢?Java程式設計
- python程式設計基礎Python程式設計
- Java 基礎02Java程式設計基礎Java程式設計
- 程式設計師擺攤!這大概是最有“錢”途的攤位了程式設計師
- 學Python程式設計有什麼用?Python基礎教程!Python程式設計
- 《java程式設計基礎》方法的過載Java程式設計
- 這十五本Python書籍!是每個程式設計師必備的!Python程式設計師
- 一、(基礎知識)一個前端程式設計師的java小白之路前端程式設計師Java
- python 程式設計基礎案例Python程式設計
- 程式設計師你是如何降低NPE的?程式設計師
- 如何突破Java程式設計師的分水嶺Java程式設計師
- 程式設計師必備基礎:改善Java程式的20個實用建議程式設計師Java
- 是程式設計師就用Python查12306的票程式設計師Python
- UI設計師基礎要求有哪些UI
- 百戰程式設計師Java基礎教學視訊程式設計師Java
- 女程式設計師是這樣被惡搞的程式設計師
- 菜雞程式設計師是如何寫程式碼的?程式設計師
- [趣圖]程式設計社群調查顯示,Java程式設計師最苦逼,C++程式設計師最年老,是這樣的麼?Java程式設計師C++
- 如果今天沒有API介面,今天的程式設計師如何程式設計?API程式設計師
- 好程式設計師Java培訓分享零基礎學Java能行嗎 有哪些難點程式設計師Java
- 為什麼沒有基礎學不好python程式設計?Python程式設計
- 有哪些錯是Java程式設計師在面試中最容易犯的呢?Java程式設計師面試
- 如何成為更好的Java程式設計師?- javarevisitedJava程式設計師
- Java併發程式設計基礎Java程式設計
- JAVA網路程式設計基礎Java程式設計
- Java 基礎程式設計筆記Java程式設計筆記
- Java程式設計基礎33——JDBCJava程式設計JDBC
- 如何以零基礎學習Python程式設計?Python程式設計
- 程式設計師只配加班?有錢有閒的程式設計師都在哪?程式設計師