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