python之基礎總結(飛機大戰)


 

  一、學習python有一段時間了,總體上手還是挺好的,但是有些東西還是和Java存在着一定的區別,這里主要是通過學習,然后自己去編寫一個案例。從中學習到的一些東西,這里分享出來,如果存在不正確的地方還請指出,因為剛學可能認識的還不夠清楚。這里主要是記錄一下自己在實際開發過程中遇到的一些問題,總結出來。

  二、和Java存在的區別的地方

  1)導包

  JAVA中的import,直接導入的是class,或者改包下的所有class 文件,最小單位就是class

  

  python的import

  a、如果需要從其他地方導包,需要在包里面加入__init__.py文件

  

  b、另外需要在__init__.py,加入需要外部引用的文件或者具體的class

  

  注意:這里導入的不是class,而是文件,至於里面存在幾個class,這個都是不定的

  c、文件中可以存在不同的東西,比如方法、公共屬性、class等等

  

  d、調用:所有的調用必須引入具體的東西,或者該文件下的所有東西(*)

  

  注意:是具體的class,不是文件(這里我踩過坑的,和Java存在的比較明顯的區別)。並且必須要在需要引入的包內的__init__.py加入導入,才可以使用

   2)路徑

  一般我們在使用文件調用的時候都使用相對路徑,因為python沒有classpath所以我安裝文件的相對路徑來寫,但是會出現錯誤

   

  如果開始運行的是main.py,而你在domain包下使用../images/**,這里就存在找不到文件的問題

  這里的路徑是以運行文件為基准路徑應該是:./images/**

  這里也是我菜過的坑

  3)變量

  python的局部變量,不用多解釋,和Java差不多,只是不需要聲明而已。

  全局變量:

  因為python的最小單位不是class了,所以我們在使用的使用可以存在幾種方式

  a、獨立變量(文件內,不在任何class,或者方法內)

  

  b、類全局變量(這里如果函數需要使用,必須要加global聲明,否者報錯)

  

  4)函數(方法):

  python中是沒有static的內置標志的,但是存在幾種注解

  a、@staticmethod,這種凡是基本和類方法是一樣的

  b、@classmethod,這一種其實最開始我也沒有理解到,不過在用的時候體會到了,@classmethod,有參數不是self,而是class本身

  5)變量/函數作用域

  a、__(兩個下划線)代表改變量/函數的變量私有,這里調用的時候沒有報錯,依然可以執行,但是存在一個問題,根本不能修改里面的屬性(這個坑主要是在使用線程退出的時候,發現的)。

   

  b、_(單下划線)不同通過發from ** import **導入

  c、__func__(左右下划線)內部方法

  6)線程和進程

  a、python和Java的區別

  這里簡單說一下,我理解的而不是很深。

  (1)python的多線程不是真正意義上的多線程,因為它只能單核執行,Java可以

  (2)python的線程池不是為了避免線程頻繁創建而生的,而是多任務執行而生的,Java不是全是。

  (3)python存在multiprocessing(多進程庫),python可以通過多進程的方式來達到多核的調用,Java,實際沒有多進程這一說,但是可以通過Runtime.getRuntime().exec(...)來實現(不建議)。

  總結:

  有這樣一種說法: CPU 密集型,建議使用多進程。而多線程就更適合應用於 I/O 密集型程序。意思就是計算多采用多進程,讀寫多使用多線程。

   7)鎖(這里簡單介紹)

  聲明:lock = threading.Lock()

  鎖定:lock.acquire([timeout])

  解鎖:lock.release()

  鎖的使用,這里不介紹。但是python中要注意死鎖的情況

  8)多進程的使用

  p = multiprocessing.Process(target = func, args = (*,*))
  p.start()
  target:函數
  args:為傳入函數的參數,使用元祖的方式傳入

  多進程池:

  # 聲明長度
  pool = multiprocessing.Pool(processes=4)
  # 非阻塞
  pool.apply_async(func, (*, *))
  # 阻塞
  pool.apply(func, (*, *))
  pool.close()
  pool.join()

  9)多線程的使用

thread.start_new_thread ( function, args[, kwargs] )
threading.Thread( function, args[, kwargs] )
  • threading.currentThread(): 返回當前的線程變量。
  • threading.enumerate(): 返回一個包含正在運行的線程的list。正在運行指線程啟動后、結束前,不包括啟動前和終止后的線程。
  • threading.activeCount(): 返回正在運行的線程數量,與len(threading.enumerate())有相同的結果。

除了使用方法外,線程模塊同樣提供了Thread類來處理線程,Thread類提供了以下方法:

  • run(): 用以表示線程活動的方法。
  • start():啟動線程活動。
  • join([time]): 等待至線程中止。這阻塞調用線程直至線程的join() 方法被調用中止-正常退出或者拋出未處理的異常-或者是可選的超時發生。
  • isAlive(): 返回線程是否活動的。
  • getName(): 返回線程名。
  • setName(): 設置線程名。

  多線程池:

pool = threadpool.ThreadPool([size]) # [size]表示線程池同時容納的線程數
requests = threadpool.makeRequests(some_callable, list_of_args, callback)  # some_callable表示調用函數名, list_of_args表示傳遞參數列表, callback表示回調函數
[pool.putRequest(req) for req in requests]  # 表示將請求隊列中的元素全部放進線程池統一管理
pool.wait()  # 表示所有請求結束后,結束進程

  三、實戰總結

  這里就是學習基礎,然后實戰開發做的一個簡單的東西(飛機大戰)

  目錄:

  

  效果:

   

  源碼:https://github.com/lilin409546297/python_planeWar

  本源碼並不完善,有需要可以自己改進。自己的編寫,采用了Java的一些編寫思路,有不足的地方請指出!!!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM