飞机大战Python总结 python飞机大战心得体会 |
您所在的位置:网站首页 › 飞机大战游戏总结与体会 › 飞机大战Python总结 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的一些编写思路,有不足的地方请指出!!!
|
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |