一起來寫2048(160行python程式碼)
前言:
Life is short ,you need python.
--Bruce Eckel
我與2048的緣,不是緣於一個玩家,而是一次,一次,又一次的ACM比賽.四月份校賽初賽,第一次碰到2048,兩週後決賽再次遇到2048,後來五月份的廣東省賽,又出現了2048。在這三次比賽過程中,我一次2048都沒玩過..全靠隊友的解釋,直到昨天,我突然想起寫個2048吧,於是下了個2048玩了幾盤,之後就開始用python來寫了,心想就不寫介面了,為了簡潔。
我對python並不熟悉,但是我在之前的博文就提過我希望成為一個python的玩家,所以我選擇了python,同時,也希望大家也可以用非常簡單的程式碼取實現2048。
首先,如果你沒有玩過2048,沒關係,你只要隨便在網上或電子市場一搜索肯定會有各種版本,之後玩幾把就會了。
來到這裡,我假設大家都玩過2048了,於是我們先分析一下怎麼來寫一個簡單的2048?回想一下,遊戲的過程是很簡單的:
開始===>( 進行操作(上下左右)===>矩陣移動===>數字合併===>計分 )===>退出
括號內就是遊戲的進行過程了,我們退出大概就是兩個:1.出現2048,勝利退出 2.無法合併同時無法出現新數(是且的關係)
懂得這個執行過程後,我們就一步步來寫,整個過程也不會難,哪怕你跟我一樣基本是新手。
先看看簡略圖,看起來雖然真的很樸素,但是愛美的你,可以在看完我的程式後自己美化。
儲存結構:列表,其中包括二維矩陣列表,即所謂的mtr[4][4],以及棧,棧是用於退回,如果大家不想要這個功能可以直接忽略。
我們的變數定義:
declare = "←:a/h ↓: s/j ↑: w/k →: d/l ,q(uit),b(ack)"
illegal = "Illegal operation!"
noefficient = "This move has no efficient"
score = 0
step = 0
mtr = init() # init the matrix
mtr_stk = [] # use step for back
scr_stk = []
稍微解釋一下: declare是解釋操作提示,自己喜歡怎麼寫就怎麼寫~
illegal是我們輸入非正常操作提示,,可以省略
noefficient是我們往這個方向沒效果,也可以省略~
score是得分,step是走了多少步,
mtr是我們的二維方陣,
mtr_stk,scr_stk是儲存棧,用於後退功能,如果不要後退,還是可以省略~
演算法實現:
·「注:其實沒有演算法可言....更準確叫函式實現。」
(1).在我們這個沒有介面的2048中,我們只能用製表符啦,所以我們需要一個display函式。
這是一個非常簡單的事情,跟C語言的printf基本一致, 像如下程式碼,基本就能繪製出一個固定數字的表格了。
print "┌"+("─"*5+"┬")*3+"─"*5+"┐"
print "│%4d │%4d │%4d │%4d │"%(1,2048,25,4)
print "├"+("─"*5+"┼")*3+"─"*5+"┤"
print "│%4d │%4d │%4d │%4d │"%(1,2048,25,4)
print "├"+("─"*5+"┼")*3+"─"*5+"┤"
print "│%4d │%4d │%4d │%4d │"%(1,2048,25,4)
print "├"+("─"*5+"┼")*3+"─"*5+"┤"
print "│%4d │%4d │%4d │%4d │"%(1,2048,25,4)
print "└"+("─"*5+"┴")*3+"─"*5+"┘"
但是我們需要的是將固定的數字變成我們矩陣mtr的數字。
另外可以,注意到一點,數字輸出的形式是固定的,表格邊線,只有交叉點是不同,其他是0。而交叉點有五個,我們可以走迴圈(覺得麻煩可以直接忽略)
為了美觀,我們不將0輸出,所以我們輸出時候選擇的是字串即%s,這樣,我們遇到0,就可以輸出' ',其他直接輸出。
我們可以用python的三目運算子號
print "%4s " %(mtr[i][j] if mtr[i][j] else ' ')
所以我們的繪製表格寫成這樣子:最直接的方法!
def T(a):
return a if a else ' '
def display(mtr):
print "┌"+("─"*5+"┬")*3+"─"*5+"┐"
print "│%4s │%4s │%4s │%4s │"%(T(mtr[0][0]),T(mtr[0][1]),T(mtr[0][2]),T(mtr[0][3]))
print "├"+("─"*5+"┼")*3+"─"*5+"┤"
print "│%4s │%4s │%4s │%4s │"%(T(mtr[1][0]),T(mtr[1][1]),T(mtr[1][2]),T(mtr[1][3]))
print "├"+("─"*5+"┼")*3+"─"*5+"┤"
print "│%4s │%4s │%4s │%4s │"%(T(mtr[2][0]),T(mtr[2][1]),T(mtr[2][2]),T(mtr[2][3]))
print "├"+("─"*5+"┼")*3+"─"*5+"┤"
print "│%4s │%4s │%4s │%4s │"%(T(mtr[3][0]),T(mtr[3][1]),T(mtr[3][2]),T(mtr[3][3]))
print "└"+("─"*5+"┴")*3+"─"*5+"┘"
如果走迴圈可以這樣寫:就是列舉交叉點情況。
def display(mtrx): #output function
a = ("┌", "├", "├", "├", "└")
b = ("┬", "┼", "┼", "┼", "┴")
c = ("┐", "┤", "┤", "┤", "┘")
for i in range(4):
print a[i] + ("─" * 5 + b[i]) * 3 + ("─" * 5 + c[i])
for j in range(4):
print "│%4s" % (mtrx[i][j] if mtrx[i][j] else ' '),
print "│"
print a[4] + ("─" * 5 + b[4]) * 3 + ("─" * 5 + c[4])
(2)有了表格雛形,我們需要對矩陣進行初始化,then,我們就可以看到一個像模像樣的2048開始啦!
初始化矩陣是非常簡單的,我們在矩陣中選兩個不同位置,設定為2其他為0即可。
先設定為0(沒有memset,╮(╯▽╰)╭)
但是這樣就可以啦:(看不慣?沒關係,非常容易理解,慢慢習慣吧!)
mtr = [[0 for i in range(4)] for j in range(4)]
我們選的位置是採取隨機的,要保證不同,方法很多,但是我們python的random.sample就非常棒了!
我們用簡單的一句
ran_pos = random.sample(range(16), 2)
便可以得到一個由兩個不同組成的片段
之後我們通過 4*i+j 進行二維到一維的對映,同樣也用( num/4 ,num%4)進行一維到二維的對映
所以我們初始話的過程也是十分簡單。(要是偷懶,也可以直接忽略隨機過程,自己指定吧!哈哈)
def init(): #initial of matrix
mtr = [[0 for i in range(4)] for j in range(4)]
ran_pos = random.sample(range(16), 2)
mtr[ran_pos[0]/4][ran_pos[0]%4] = mtr[ran_pos[1]/4][ran_pos[1]%4] = 2
return mtr
怎麼樣?2048有2個2啦!!!O(∩_∩)O哈哈~(3)動起來!!讓我們的2048動起來!
老實說,這個過程是全個程式最核心的部分,也是最難過的~不過理解了也就不難了。
我們先看向左移動吧。
記得我們玩的時候,合併過的格子是不會再在這次合併的,比如 某一行為 2 2 2 2 最後移動到的結果是4 4 0 0 而不是 8 0 0 0。我們要理解這個過程:
我們對於每一行的操作是一樣的,即行間無關,所以我們現在要討論第i行,當我們向左動起來的時候,我們從最左開始確定,我們一開始合併前兩個,再合併前三個,再合併前4個。比如
2 2 4 4 => 4 0 4 4 => 4 4 0 4 =>4 4 4 0 => 4 8 0 0
注意兩點: 1.合併過的不再參與合併,所以我們需要一個visit列表,用到前面所講的對映
2.合併的情況=>相鄰的相等,移動的情況=>當前元素為0
python程式碼
visit=[]
score=0
for i in range(4):
for j in range(1, 4):
for k in range(j,0,-1):
if mtr[i][k - 1] == 0 :
mtr[i][k - 1] = mtr[i][k]
mtr[i][k] = 0
elif mtr[i][k - 1] == mtr[i][k] and 4 * i + k - 1 not in visit and 4 * i + k not in visit:
mtr[i][k - 1] *= 2
mtr[i][k] = 0
score += mtr[i][k - 1]
visit.append(4 * i + k)
visit.append(4 * i + k - 1)
當你想明白這個過程後,整個move過程就自然清晰起來了。這個是本文第一個,最後一個比較長的函數了!
def move(mtr, dirct):#the core code!move by the four direction
score = 0
visit = []
if dirct == 0: # left
for i in range(4):
for j in range(1, 4):
for k in range(j,0,-1):
if mtr[i][k - 1] == 0 :
mtr[i][k - 1] = mtr[i][k]
mtr[i][k] = 0
elif mtr[i][k - 1] == mtr[i][k] and 4 * i + k - 1 not in visit and 4 * i + k not in visit:
mtr[i][k - 1] *= 2
mtr[i][k] = 0
score += mtr[i][k - 1]
visit.append(4 * i + k)
visit.append(4 * i + k - 1)
elif dirct == 1: # down
for j in range(4):
for i in range(3, 0, -1):
for k in range(0,i):
if mtr[k+1][j] == 0:
mtr[k+1][j] = mtr[k][j]
mtr[k][j]=0
elif mtr[k+1][j]==mtr[k][j] and (4 *(k+1)+j) not in visit and (4*k+j) not in visit:
mtr[k+1][j]*=2
mtr[k][j]=0
score=mtr[k+1][j]
visit.append(4*(k)+j)
visit.append(4*(k+1)+j)
elif dirct == 2: # up
for j in range(4):
for i in range(1,4):
for k in range(i,0,-1):
if mtr[k-1][j]==0:
mtr[k-1][j]=mtr[k][j]
mtr[k][j]=0
elif mtr[k-1][j]==mtr[k][j] and (4 *(k-1)+j) not in visit and (4*k+j) not in visit:
mtr[k-1][j]*=2
mtr[k][j]=0
score += mtr[k-1][j]
visit.append(4*(k)+j)
visit.append(4*(k-1)+j)
elif dirct == 3: # right
for i in range(4):
for j in range(3, 0, -1):
for k in range(j):
if mtr[i][k+1] == 0:
mtr[i][k+1] = mtr[i][k]
mtr[i][k]=0
elif mtr[i][k] ==mtr[i][k+1] and 4 * i + k + 1 not in visit and 4 * i + k not in visit:
mtr[i][k+1]*=2
mtr[i][k]=0
score+=mtr[i][k+1]
visit.append(4*i+k+1)
visit.append(4*i+k)
return score
(4)當你來到這步,已經進入輕鬆的狀態了,讓控制檯讀入你的操作,短短兩行,其中一行是轉成小寫
dirct = raw_input("Step :%d Score :%d (%s):" % (step, score, declare))
dirct = dirct.lower()
(5)判斷讀入操作並處理
if dirct == "q":
break
elif dirct == "a" or dirct == "h":
dirct = 0
elif dirct == "s" or dirct == "j":
dirct = 1
elif dirct == "w" or dirct == "k":
dirct = 2
elif dirct == "d" or dirct == "l":
dirct = 3
elif dirct == "b":
if len(mtr_stk) == 1:
print "Can't Back.."
else:
mtr_stk.pop()
scr_stk.pop()
mtr = copy.deepcopy(mtr_stk[-1])
score = scr_stk[-1]
step -= 1
continue
else:
print illegal
continue
我是vim 的腦殘粉,所以還支援了hjkl,如果你沒有習慣vim什麼的,直接asdw就可以了。
上面最麻煩最值得注意的就是要用深複製.這個bug我調了很久啊親,用"="傷不起啊。
上面的處理意思就是: 對映方向,和b,q的處理(有continue是因為我們將巢狀於while中)。
(6)移動的處理
在上面處理後,篩選出移動的操作,之後我們呼叫移動函式,進行加分,和比較。
tmp = copy.deepcopy(mtr)
op_scr = move(mtr, dirct)
if tmp != mtr:
score = score + op_scr
update(mtr) #更新
display(mtr)
tmp = copy.deepcopy(mtr)
mtr_stk.append(tmp) # 插入後退佇列
scr_stk.append(int(score))
step = step + 1 # 步數加1
else:
print noefficient
注意:不能僅僅用加分來判斷!因為我們很多時候都是沒有碰撞合併,等待下一個2,4出現
我們用深複製,將老的矩陣放在tmp上,再移動,將老新矩陣比較,沒改變的時候就輸出 noefficient,否則就加分,插入新數字,並顯示,最後將矩陣壓入棧中,因為要後退!
(7)插入新數字
我們遍歷0-16,並對映後,將對應0的位置放入random列表,我們用random.choice選出一個,同理我們生成一個ran_num=[2,4],選取加分
之後對應位置加分咯!但是注意,當我們沒有空位時候不要插數字。
def update(mtr):
ran_pos=[]
ran_num=[2,4]
for i in range(4):
for j in range(4):
if mtr[i][j]==0:
ran_pos.append(4*i+j)
if len(ran_pos)>0:
k=random.choice(ran_pos)
n=random.choice(ran_num)
mtr[k/4][k%4]=n
(8)最後一個啦!!!遊戲的迴圈條件
這個還是很簡單的。遊戲進行,當前僅當:沒有2048且(有0或者可以合併)。
所以我們只需要判斷2048 in mtr,有就結束,沒有 == > 0 in mtr ?有就繼續,沒有==>可以合併?有繼續,沒有==》,就返回結束啦
def go_on(mtr, score):
if 2048 in mtr:
print "Great!You win!Your score is ", score
raw_input("Press any key to continue...")
exit()
if 0 in mtr:
return True
for i in range(4):
for j in range(4):
if i < 3 and mtr[i][j] == mtr[i + 1][j]:
return True
if j < 3 and mtr[i][j] == mtr[i][j + 1]:
return True
print "Gameover!"
return False
(9)一些其他的東西
注意一開始要畫出開始的畫面(迴圈外),一開始要將初始矩陣,初始分數,壓入棧。
最後來個最終版本的
#!/usr/bin/env python
# coding=utf-8
#********************************************************
# > OS : Linux 3.2.0-60-generic #91-Ubuntu
# > Author : yaolong
# > Mail : [email protected]
# > Time : 2014年06月01日 星期日 13:13:39
#********************************************************
import random
import copy
def T(a):
return a if a else ' '
def display(mtr):
print "┌"+("─"*5+"┬")*3+"─"*5+"┐"
print "│%4s │%4s │%4s │%4s │"%(T(mtr[0][0]),T(mtr[0][1]),T(mtr[0][2]),T(mtr[0][3]))
print "├"+("─"*5+"┼")*3+"─"*5+"┤"
print "│%4s │%4s │%4s │%4s │"%(T(mtr[1][0]),T(mtr[1][1]),T(mtr[1][2]),T(mtr[1][3]))
print "├"+("─"*5+"┼")*3+"─"*5+"┤"
print "│%4s │%4s │%4s │%4s │"%(T(mtr[2][0]),T(mtr[2][1]),T(mtr[2][2]),T(mtr[2][3]))
print "├"+("─"*5+"┼")*3+"─"*5+"┤"
print "│%4s │%4s │%4s │%4s │"%(T(mtr[3][0]),T(mtr[3][1]),T(mtr[3][2]),T(mtr[3][3]))
print "└"+("─"*5+"┴")*3+"─"*5+"┘"
def init():
mtr = [[0 for i in range(4)] for j in range(4)] # 小小蛋疼..
ran_pos = random.sample(range(16), 2)
mtr[ran_pos[0]/4][ran_pos[0]%4] = mtr[ran_pos[1]/4][ran_pos[1]%4] = 2
return mtr
def go_on(mtr, score):
if 2048 in mtr:
print "Great!You win!Your score is ", score
raw_input("Press any key to continue...")
exit()
if 0 in mtr:
return True
for i in range(4):
for j in range(4):
if i < 3 and mtr[i][j] == mtr[i + 1][j]:
return True
if j < 3 and mtr[i][j] == mtr[i][j + 1]:
return True
print "Gameover!"
return False
def move(mtr, dirct):
score = 0
visit = []
if dirct == 0: # left
for i in range(4):
for j in range(1, 4):
for k in range(j,0,-1):
if mtr[i][k - 1] == 0 :
mtr[i][k - 1] = mtr[i][k]
mtr[i][k] = 0
elif mtr[i][k - 1] == mtr[i][k] and 4 * i + k - 1 not in visit and 4 * i + k not in visit:
mtr[i][k - 1] *= 2
mtr[i][k] = 0
score += mtr[i][k - 1]
visit.append(4 * i + k)
visit.append(4 * i + k - 1)
# for i in range(4):
# for j in range(3):
elif dirct == 1: # down
for j in range(4):
for i in range(3, 0, -1):
for k in range(0,i):
if mtr[k+1][j] == 0:
mtr[k+1][j] = mtr[k][j]
mtr[k][j]=0
elif mtr[k+1][j]==mtr[k][j] and (4 *(k+1)+j) not in visit and (4*k+j) not in visit:
mtr[k+1][j]*=2
mtr[k][j]=0
score=mtr[k+1][j]
visit.append(4*(k)+j)
visit.append(4*(k+1)+j)
elif dirct == 2: # up
for j in range(4):
for i in range(1,4):
for k in range(i,0,-1):
if mtr[k-1][j]==0:
mtr[k-1][j]=mtr[k][j]
mtr[k][j]=0
elif mtr[k-1][j]==mtr[k][j] and (4 *(k-1)+j) not in visit and (4*k+j) not in visit:
mtr[k-1][j]*=2
mtr[k][j]=0
score += mtr[k-1][j]
visit.append(4*(k)+j)
visit.append(4*(k-1)+j)
elif dirct == 3: # right
for i in range(4):
for j in range(3, 0, -1):
for k in range(j):
if mtr[i][k+1] == 0:
mtr[i][k+1] = mtr[i][k]
mtr[i][k]=0
elif mtr[i][k] ==mtr[i][k+1] and 4 * i + k + 1 not in visit and 4 * i + k not in visit:
mtr[i][k+1]*=2
mtr[i][k]=0
score+=mtr[i][k+1]
visit.append(4*i+k+1)
visit.append(4*i+k)
return score
def update(mtr):
ran_pos=[]
ran_num=[2,4]
for i in range(4):
for j in range(4):
if mtr[i][j]==0:
ran_pos.append(4*i+j)
if len(ran_pos)>0:
k=random.choice(ran_pos)
n=random.choice(ran_num)
mtr[k/4][k%4]=n
# map 0 left,1 down,2 up ,3 right
# a,h=> left ,s,j=>down, w,k=>up, d,l=>right
declare = "←:a/h ↓: s/j ↑: w/k →: d/l ,q(uit),b(ack)"
illegal = "Illegal operation!"
noefficient = "This move has no efficient"
if __name__ == '__main__':
score = 0
step = 0
mtr = init()
mtr_stk = [] # for back
scr_stk = []
tmp = copy.deepcopy(mtr)
mtr_stk.append(tmp)
scr_stk.append(0)
display(mtr)
while go_on(mtr, score):
dirct = raw_input("Step :%d Score :%d (%s):" % (step, score, declare))
dirct = dirct.lower()
if dirct == "q":
break
elif dirct == "a" or dirct == "h":
dirct = 0
elif dirct == "s" or dirct == "j":
dirct = 1
elif dirct == "w" or dirct == "k":
dirct = 2
elif dirct == "d" or dirct == "l":
dirct = 3
elif dirct == "b":
if len(mtr_stk) == 1:
print "Can't Back.."
else:
mtr_stk.pop()
scr_stk.pop()
mtr = copy.deepcopy(mtr_stk[-1])
score = scr_stk[-1]
step -= 1
continue
else:
print illegal
continue
tmp = copy.deepcopy(mtr)
op_scr = move(mtr, dirct)
if tmp != mtr:
score = score + op_scr
update(mtr) #更新
display(mtr)
tmp = copy.deepcopy(mtr)
mtr_stk.append(tmp) # 插入後退佇列
scr_stk.append(int(score))
step = step + 1 # 步數加1
else:
print noefficient
還有我github的版本,大致一樣,點這裡
如果我的演算法有什麼不對,請提出,因為寫得匆忙,我未能很完整第測試,但是我自己玩了幾把還是OK了,沒玩到2048╮(╯▽╰)╭。。。
相關推薦
一起來寫2048(160行python程式碼)
前言: Life is short ,you need python. --Bruce Eckel 我與2048的緣,不是緣於一
70行python程式碼製作一款簡易的音樂播放器
今天整理了以前的python作業程式碼,發現了一些有趣的小東西,比如下面這個,大概70行程式碼製作一款簡易的音樂播放器。 install some packages pip install pygame pygame是跨平臺Python模組,專為電子遊戲設計,包含影象
70行python程式碼製作一款簡易的音樂播放器!
今天整理了以前的python作業程式碼,發現了一些有趣的小東西,比如下面這個,大概70行程式碼製作一款簡易的音樂播放器。 install some packages pip install pygame pygame是跨平臺Python模組,專為電子遊戲設計,包含影象、聲音。 我這裡
無聊,幾行python程式碼寫一個聊天機器人陪你聊天
程式碼 利用爬蟲功能實現。 import urllib.request import re while True: x = input("主人:") x = urllib.parse.quote(x) link = urllib.req
python 之路,200行Python程式碼寫了個打飛機遊戲!
早就知道pygame模組,就是沒怎麼深入研究過,恰逢這周未沒約到妹子,只能自己在家玩自己啦,一時興起,花了幾個小時寫了個打飛機程式。 很有意思,跟大家分享下。 先看一下專案結構 """ PlayPlane/ |-- bin/ | |-- main.py 程式執行主體程式
機器學習:用6行Python程式碼開始寫第一個機器學習程式
import sklearn from sklearn import tree # features = [[140, "smooth"],[130, "smooth"],[150, "bumpy"],[170, "bumpy"]] # labels = ["apple",
還在找遠控?來看我用十幾行python程式碼寫個簡易遠端控制
剛開始學習程式設計的同學可能經常會問:“我學了這個幹什麼用?買菜的時候掏出電腦來編個程式算算多少錢?”其實,這跟大家的知識面和入門選擇的語言有很大關係,大部分同學會選擇C語言來入門程式設計,C語言雖然簡潔,但是面向過程的程式設計方式總會讓人覺得枯燥無味,無所適從。那咱們現在做
Atom Teletype:我們一起來寫程式碼吧
在幾天前,確定是在2017年11月12號在舊金山舉辦的 QCon 大會上,著名的[交友網站]GitHub 釋出了一款Atom的外掛——Teletype,這款外掛的功能十分有趣:支援多名程式設計師同時攪基…阿不,支援多名程式設計師同時編輯程式碼。 其實多人同
Python新手教程:40行python程式碼寫一個桌面翻譯器
這是我做出來的粗略版本,後面的UI設計就看大家的藝術細胞了 我們進行製作軟體所需要的模板庫,首先要進行引用。 # json r
人臉檢測真的不難,50行Python程式碼就能實現人臉檢測
現在的人臉識別技術已經得到了非常廣泛的應用,支付領域、身份驗證、美顏相機裡都有它的應用。用iPhone的同學們應該對下面的功能比較熟悉 iPhone的照片中有一個“人物”的功能,能夠將照片裡的人臉識別出來並分類,背後的原理也是人臉識別技術。 這篇文章主要介紹怎樣用Python實現
手把手|100行Python程式碼自動搶火車票!(包教包會)
又到一年一度春運大會,2017年春運搶火車票還是那麼難,各大網際網路公司都推出搶票服務,只要加錢給服務費就可以增加搶到票的機率,有些代售火車票點,說給100元服務費,可以幫搶到,看來這水很深啊! 下面我們利用自己學的技術來自動搶票,本次指令碼基於Python3.6+splinter來實現:
利用itchat 10行python程式碼實現微信轟炸
''' 轉載:https://github.com/Gin79/WeChat-Bomb/blob/master/README.md ''' 說明 站在巨人的肩膀上 基於python,這個小程式是用python寫的 使用的是python第三方庫itchat,itc
用50行Python程式碼從零開始實現一個AI平衡小遊戲!
集智導讀: 本文會為大家展示機器學習專家 Mike Shi 如何用 50 行 Python 程式碼建立一個 AI,使用增強學習技術,玩耍一個保持杆子平衡的小遊戲。所用環境為標準的 OpenAI Gym,只使用 Numpy 來建立 agent。 學習Python中有不明白推薦加入交流群號
50行Python程式碼玩轉微信小遊戲"顏色王者"
50行Python程式碼玩轉微信小遊戲”顏色王者” 遊戲模式 在微信小程式裡搜尋“顏色王者”,即可找到該遊戲。 遊戲的目標比拼色彩敏感度。點選圖片中不一樣的色塊即可。 這遊戲前面20多級還是比較簡單的,到後面色塊實在太小,顏色越來越接近以至於到下圖的程度。 工具介
5 行 Python 程式碼呼叫電腦攝像頭
前提: 確保 python 中安裝了 opencv-python 模組。如果沒有安裝,可以參考:https://pypi.org/project/opencv-python/ 進行安裝。話不多少,直接上程式碼: import cv2 cap = cv2.Video
百度爬蟲工程師教你只用500行Python程式碼構建一個輕量級爬蟲框架
Features 簡單、易用; 易於定製的 Spider ; 多執行緒實現併發下載。 待改進 更多的測試程式碼; 新增更多的網站爬蟲示例; 完善爬蟲排程,支援 Request 優先順序排程。 xcrawler 介紹
100行Python程式碼,幫你分析國慶應該去哪裡玩才是最好的選擇
小編有自己的Python學習交流群:865597862 !進群免費獲取2018最新的Python學習資料!文件、視訊!安排!!!! 統計結果 此次的統計結果只是從側面反映景點爆滿的問題,未必是完全準確的,僅供參考。此次統計的景點共有 100 個: 有需要Python
入門|三行Python程式碼,讓資料預處理速度提高2到6倍 python入門
在 Python 中,我們可以找到原生的並行化運算指令。本文可以教你僅使用 3 行程式碼,大大加快資料預處理的速度。 入門|三行Python程式碼,讓資料預處理速度提高2到6倍 Python 是機器學習領域內的首選程式語言,它易於使用,也有很多出色的庫來幫助你更
三行Python程式碼,讓資料預處理速度提高2到6倍
小編有自己的Python學習交流群865597862 !進群可以免費領取2018Python最新的學習資料哦! Python 是機器學習領域內的首選程式語言,它易於使用,也有很多出色的庫來幫助你更快處理資料。但當我們面臨大量資料時,一些問題就會顯現…… 目前,大資料(
100 行 python 程式碼告訴你國慶哪些景點爆滿
前言 舉國歡慶的國慶節馬上就要到來了,你想好去哪裡看人山人海了嗎?還是窩在家裡充電學習呢?說起國慶,塞車與爆滿這兩個詞必不可少,去年國慶我在想要是我能提前知道哪些景點爆滿就好了,就不用去湊熱鬧了。於是我開始折騰,想用 python 抓取有關出行方面的資料,便有了這篇文章。如