Python的tile
『壹』 求python大神給個200行左右的代碼,多點注釋,做期末大作業
#-*-coding:utf-8-*-
importcurses#引入curses模塊,curses是一個在Linux/Unix下廣泛應用的圖形函數庫.,作用是可以繪制在DOS下的用戶界面和漂亮的圖形。
fromrandomimportrandrange,choice#從random模塊引入randrange,choice這兩個類
#從collections引入defaultdict這個類
letter_codes=[ord(ch)forchin'WASDRQwasdrq']#ord函數是把字元轉換成對應的數字
actions=['Up','Left','Down','Right','Restart','Exit']#上,左,下,右,重啟,退出
actions_dict=dict(zip(letter_codes,actions*2))#把字母與動作對應起來。zip是把元組中的值對應起來。
#############################
WUp
ALeft
SDown
DRight
RRestart
QExit
wUp
aLeft
sDown
dRight
rRestart
QExit
##############################################
defget_user_action(keyboard):
char="N"#char的初始值為Nwhilecharnotinactions_dict:
char=keyboard.getch()returnactions_dict[char]#阻塞+循環,直到獲得用戶有效輸入才返回對應行為deftranspose(field):return[list(row)forrowinzip(*field)]#zip函數里邊加*號,是把行變列,列變行。所以這句代碼是行列轉置definvert(field):return[row[::-1]forrowinfield]#這句代碼是把列表前後顛倒classGameField(object):#創建一個叫做GameField的類,用來創建棋盤def__init__(self,height=4,width=4,win=2048):這個類三個參數self.height=height#高self.width=width#寬self.win_value=win#過關分數self.score=0#當前分數self.highscore=0#最高分self.reset()#重置棋盤defreset(self):#定義一個reset函數ifself.score>self.highscore:#如果當前分數大於最高分,那麼把當前分數賦值給最高分self.highscore=self.scoreself.score=0#當前分數恢復到0分self.field=[[0foriinrange(self.width)]forjinrange(self.height)]#橫縱坐標恢復到(0,0)self.spawn()#調用spawn這個函數self.spawn()defmove(self,direction):#定義move函數defmove_row_left(row):#向左移deftighten(row):#squeesenon-zeroelementstogether把零散的非零單元擠到一塊
new_row=[iforiinrowifi!=0]#如果i不等於零,把他們賦值到new_row這個元組中
new_row+=[0foriinrange(len(row)-len(new_row))]#其餘位置用0補充returnnew_row#返回這個元組defmerge(row):#定義merge函數,用來合並單元
pair=False#pair初始值為假
new_row=[]#new_row初始值為空foriinrange(len(row)):#讓i在格子里循環ifpair:如果pair為真
new_row.append(2*row[i])#那麼把把row【i】的值乘以2,追加到new_row後邊self.score+=2*row[i]#並且得分為row【i】的值乘以2
pair=False#pair重新賦值為假else:如果pair為真ifi+1<len(row)androw[i]==row[i+1]:#如果i+1還沒到邊界,並且此時的row【i】=row【i+1】
pair=True#那麼pair為真
new_row.append(0)#new_row後追加零else:
new_row.append(row[i])#否則追加row【i】
assertlen(new_row)==len(row)#提醒兩者長度一致returnnew_rowreturntighten(merge(tighten(row)))#反復合並,知道不能合並為止
moves={}
moves['Left']=lambdafield:
[move_row_left(row)forrowinfield]#做移動
moves['Right']=lambdafield:
invert(moves['Left'](invert(field)))#invert是逆轉
moves['Up']=lambdafield:
transpose(moves['Left'](transpose(field)))#transpose是轉置
moves['Down']=lambdafield:
transpose(moves['Right'](transpose(field)))ifdirectioninmoves:ifself.move_is_possible(direction):#如果移動方向在四個方向上,self.field=moves[direction](self.field)那麼調用moves函數self.spawn()#產生隨機數returnTrueelse:returnFalsedefis_win(self):returnany(any(i>=self.win_valueforiinrow)forrowinself.field)defis_gameover(self):returnnotany(self.move_is_possible(move)formoveinactions)defdraw(self,screen):
help_string1='(W)Up(S)Down(A)Left(D)Right'
help_string2='(R)Restart(Q)Exit'
gameover_string='GAMEOVER'
win_string='YOUWIN!'defcast(string):
screen.addstr(string+' ')defdraw_hor_separator():
line='+'+('+------'*self.width+'+')[1:]
separator=defaultdict(lambda:line)ifnothasattr(draw_hor_separator,"counter"):
draw_hor_separator.counter=0
cast(separator[draw_hor_separator.counter])
draw_hor_separator.counter+=1defdraw_row(row):
cast(''.join('|{:^5}'.format(num)ifnum>0else'|'fornuminrow)+'|')
screen.clear()
cast('SCORE:'+str(self.score))if0!=self.highscore:
cast('HGHSCORE:'+str(self.highscore))forrowinself.field:
draw_hor_separator()
draw_row(row)
draw_hor_separator()ifself.is_win():
cast(win_string)else:ifself.is_gameover():
cast(gameover_string)else:
cast(help_string1)
cast(help_string2)defspawn(self):
new_element=4ifrandrange(100)>89else2
(i,j)=choice([(i,j)foriinrange(self.width)forjinrange(self.height)ifself.field[i][j]==0])self.field[i][j]=new_elementdefmove_is_possible(self,direction):defrow_is_left_movable(row):
defchange(i):#trueifthere'llbechangeini-thtileifrow[i]==0androw[i+1]!=0:#MovereturnTrueifrow[i]!=0androw[i+1]==row[i]:#(change(i)foriinrange(len(row)-1))
check={}
check['Left']=lambdafield:
any(row_is_left_movable(row)forrowinfield)
check['Right']=lambdafield:
check['Left'](invert(field))
check['Up']=lambdafield:
check['Left'](transpose(field))
check['Down']=lambdafield:
check['Right'](transpose(field))ifdirectionincheck:returncheck[direction](self.field)else:returnFalsedefmain(stdscr):definit():#重置游戲棋盤
game_field.reset()return'Game'defnot_game(state):#畫出GameOver或者Win的界面
game_field.draw(stdscr)#讀取用戶輸入得到action,判斷是重啟游戲還是結束游戲
action=get_user_action(stdscr)
responses=defaultdict(lambda:state)#默認是當前狀態,沒有行為就會一直在當前界面循環
responses['Restart'],responses['Exit']='Init','Exit'#對應不同的行為轉換到不同的狀態returnresponses[action]defgame():#畫出當前棋盤狀態
game_field.draw(stdscr)#讀取用戶輸入得到action
action=get_user_action(stdscr)ifaction=='Restart':return'Init'ifaction=='Exit':return'Exit'ifgame_field.move(action):#movesuccessfulifgame_field.is_win():return'Win'ifgame_field.is_gameover():return'Gameover'return'Game'
state_actions={'Init':init,'Win':lambda:not_game('Win'),'Gameover':lambda:not_game('Gameover'),'Game':game
}
curses.use_default_colors()
game_field=GameField(win=32)
state='Init'#狀態機開始循環whilestate!='Exit':
state=state_actions[state]()
curses.wrapper(main)
『貳』 python中稀疏矩陣的怎麼用numpy處理
NumPy是一個關於矩陣運算的庫,熟悉Matlab的都應該清楚,這個庫就是讓python能夠進行矩陣話的操作,而不用去寫循環操作。
下面對numpy中的操作進行總結。
numpy包含兩種基本的數據類型:數組和矩陣。
數組(Arrays)
>>> from numpy import *>>> a1=array([1,1,1]) #定義一個數組>>> a2=array([2,2,2])>>> a1+a2 #對於元素相加array([3, 3, 3])>>> a1*2 #乘一個數array([2, 2, 2])##>>> a1=array([1,2,3])>>> a1
array([1, 2, 3])>>> a1**3 #表示對數組中的每個數做平方array([ 1, 8, 27])##取值,注意的是它是以0為開始坐標,不matlab不同>>> a1[1]2##定義多維數組>>> a3=array([[1,2,3],[4,5,6]])>>> a3
array([[1, 2, 3],
[4, 5, 6]])>>> a3[0] #取出第一行的數據array([1, 2, 3])>>> a3[0,0] #第一行第一個數據1>>> a3[0][0] #也可用這種方式1##數組點乘,相當於matlab點乘操作>>> a1=array([1,2,3])>>> a2=array([4,5,6])>>> a1*a2
array([ 4, 10, 18])
Numpy有許多的創建數組的函數:
import numpy as np
a = np.zeros((2,2)) # Create an array of all zerosprint a # Prints "[[ 0. 0.]
# [ 0. 0.]]"b = np.ones((1,2)) # Create an array of all onesprint b # Prints "[[ 1. 1.]]"c = np.full((2,2), 7) # Create a constant arrayprint c # Prints "[[ 7. 7.]
# [ 7. 7.]]"d = np.eye(2) # Create a 2x2 identity matrixprint d # Prints "[[ 1. 0.]
# [ 0. 1.]]"e = np.random.random((2,2)) # Create an array filled with random valuesprint e # Might print "[[ 0.91940167 0.08143941]
# [ 0.68744134 0.87236687]]"
數組索引(Array indexing)
矩陣
矩陣的操作與Matlab語言有很多的相關性。
#創建矩陣
>>> m=mat([1,2,3])
>>> m
matrix([[1, 2, 3]])
#取值
>>> m[0] #取一行
matrix([[1, 2, 3]])
>>> m[0,1] #第一行,第2個數據2>>> m[0][1] #注意不能像數組那樣取值了
Traceback (most recent call last):
File "<stdin>", line 1, in <mole>
File "/usr/lib64/python2.7/site-packages/numpy/matrixlib/defmatrix.py", line 305, in __getitem__
out = N.ndarray.__getitem__(self, index)
IndexError: index 1 is out of bounds for axis 0 with size 1#將Python的列表轉換成NumPy的矩陣
>>> list=[1,2,3]
>>> mat(list)
matrix([[1, 2, 3]])
#矩陣相乘
>>> m1=mat([1,2,3]) #1行3列
>>> m2=mat([4,5,6])
>>> m1*m2.T #注意左列與右行相等 m2.T為轉置操作
matrix([[32]])
>>> multiply(m1,m2) #執行點乘操作,要使用函數,特別注意
matrix([[ 4, 10, 18]])
#排序
>>> m=mat([[2,5,1],[4,6,2]]) #創建2行3列矩陣
>>> m
matrix([[2, 5, 1],
[4, 6, 2]])
>>> m.sort() #對每一行進行排序
>>> m
matrix([[1, 2, 5],
[2, 4, 6]])
>>> m.shape #獲得矩陣的行列數
(2, 3)
>>> m.shape[0] #獲得矩陣的行數2>>> m.shape[1] #獲得矩陣的列數3#索引取值
>>> m[1,:] #取得第一行的所有元素
matrix([[2, 4, 6]])
>>> m[1,0:1] #第一行第0個元素,注意左閉右開
matrix([[2]])
>>> m[1,0:3]
matrix([[2, 4, 6]])
>>> m[1,0:2]
matrix([[2, 4]])35363738394
擴展矩陣函數tile()
例如,要計算[0,0,0]到一個多維矩陣中每個點的距離,則要將[0,0,0]進行擴展。
tile(inX, (i,j)) ;i是擴展個數,j是擴展長度
實例如下:
>>>x=mat([0,0,0])
>>> x
matrix([[0, 0, 0]])
>>> tile(x,(3,1)) #即將x擴展3個,j=1,表示其列數不變
matrix([[0, 0, 0],
[0, 0, 0],
[0, 0, 0]])
>>> tile(x,(2,2)) #x擴展2次,j=2,橫向擴展
matrix([[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0]])1234567891011121314
『叄』 python用sendmessage函數向其他程序的編輯框(當前激活窗口,並且在活動游標處)內發送
這就是個windows SDk的編程問題
#coding:utf-8
fromctypesimport*
WM_SETTEXT = 0x000C
defChangeActiveWindowTtile():
hwnd=windll.user32.FindWindowW(u"Notepad",u"無標題-記事本")
if(windll.user32.IsWindow(hwnd)):
windll.user32.SendMessageW(hwnd,WM_SETTEXT,None,u"我是標題")
ChangeActiveWindowTtile()
『肆』 python3.7 輸出2001到2100間所有的閏年月份 每十個一行 這個程序怎麼寫 要用到for in
j=1
foriinrange(2001,2101):
ifnoti%4andi%100:
ifj<10:
print('{1}'.format(j,i),end='')
else:
print('{1}'.format(j,i))
j=0
j+=1
elifnoti%100andnoti%400:
ifj<10:
print('{1}'.format(j,i),end='')
else:
print('{1}'.format(j,i))
j=0
j+=1