Skip to main content

3 posts tagged with "Python"

View All Tags

· One min read

連結: https://pythonspeed.com/articles/stop-using-python-3.6/

本部落格是一個基於 Python & Container 的系列介紹文,而本篇文章是其中一篇探討容器化 Python 要注意的事項。 標題非常簡單:「是時候停止使用 python 3.6了」 Python 3.6 的 EOL 時間就剛好是 2021/12,這也意味到 2022 年後 python 3.6 就不再享受官方的任何維護與更新。 文章中提到建議趕快升級,同時也要注意不要每次都拖到最後一刻才升級相關軟體,應該要把升級軟體的流程給整合到日常流程中,定期掃描定期更新, 否則只會不停的被不同版本的 EOL 追趕而已。

· 3 min read

pack & unpack

根據特定的格式來讀取或封裝資料。

格式部份分成兩個部份

byte-order: 這邊可以決定採用big-endian 或是 little endian, 如果沒有給的話,預設是採用系統的方式去做,那這邊比較要注意到的是 以前再寫C語言的時候,都會有所謂的htons...類的轉換,在這邊可以使用'!' 這個符號來解決這個問題,他會自己使用network的Byte order rule去解讀資料,所以有在用網路連線傳資料的話,一定要用! 避免資料解讀錯誤的問題。

format-characters:

常用的有

  • x:pad byte,就忽略他
  • h:short,2 Byte
  • s:char[], 代表字串,使用時前面要加上數字
  • i:long int, 4Byte
  • B:unsigned char, 1 Byte

詳細的格式資訊請參考官網 Python struct

這邊來個簡單範例 假設今天我們撰寫屬於自己的網路遊戲 然後我們玩家每次上線時,SERVER都會傳送一份玩家的資料給Client

這份資料包含了

  • 遊戲版本
  • 玩家ID
  • 玩家的座標(XY)
  • 玩家當前的財產
  • 玩家的職業
  • 玩家的等級
  • 玩家的經驗值

每個資料所需要的型態跟大小如下敘述

Myheader(){
uint8:version
uint8:playerID
uint16:x
uint16:y
uint32:momey
char10:profession
uint8:level
uint32:experience
}

所以傳送資料過來的時候,我們必須要謹慎的按照這個規格去放置我們的資料。

Example

假設

  • version = 1
  • playerID = 56
  • x = 123
  • y = 2341
  • momey = 5566217
  • profession = "warrior"
  • level = 128
  • experience = 2147383611
data = pack('2B2HI10sBI',version,playerID,x,y,momey,profession,level,experience)
//'\x018{\x00%\t\x00\x00\t\xefT\x00warrior\x00\x00\x00\x80\x00\xdb\xff\xff\x7f'
unpack('2B2HI10sBI',data)
(1, 56, 123, 2341, 5566217, 'warrior\x00\x00\x00', 128, 2147483611)

· 3 min read

Python中有個很強大的字串轉換工具 maketrans 跟 translate

str.translate(table[, deletechars]);
Parameters
table -- You can use the maketrans() helper function in the string module to create a translation table.

deletechars -- The list of characters to be removed from the source string.

字串中只要有符合deletechars中的字元都會被刪除,然後剩下的字元就會依照table裡面的mapping來做轉換。

這個mapping的就要利用string.maketrans()來幫忙產生囉,

str.maketrans(intab, outtab]);
Parameters
intab -- This is the string having actual characters.

outtab -- This is the string having corresponding mapping character.

intab跟outtab兩者的長度必須要一樣,會把intab中每一個字元與outtab中相同位置的字元做mapping。

舉例來說

    intab = "aeiou"
outtab = "12345"
trantab = maketrans(intab, outtab)

就會產生一個mapping,把aeiou分別轉換成12345。

    input="abcdefgh"
input = input.translate(trantab)

input就會變成 "1bcd2fgh"

那如果改成

    input="abcdefgh"
input = input.translate(trantab,"fgh")

input就會變成 "1bcd2"

再來個簡單範例,希望能夠把所有的小寫轉成大寫,並把非英文字母外的所有字元都給刪除掉。

import string

#取得所有英文大小寫的集合

    lower = ''.join(map(chr,range(97,123)))
upper = lower.upper()

#創立一個對照表,可以把所有小寫轉成大寫

    ltu = string.maketrans(lower,upper)

#接下來要利用捕集的方式取得非英文字母以外的所有字元,因此就用所有字元-英文字母 #創立一個代表所有字元的字元表

    allchars = string.maketrans('','')

#利用translate的方式,取得所有非英文字母的集合

    delete = allchars.translate(allchars,lower+upper)

#定義一個對應的function,傳入的字串利用ltu跟delete,就能夠把所有非英文字母都刪除,並且小寫轉大寫了。

    def makefilter(input):
print input.translate(ltu,delete)