一直忙于工作,似乎忘记了抽时间学习新知识,最近难得空闲,花了两天时间看了一下Python语法。作为工作中经常使用C/C++的人,学习Python的过程中最大的感受就是“似曾相识”。
说到学习一门新语言,我并没有像其他人那样,二话不说,经典书籍买起来,然后每天睡前强睁着眼睛翻两页。那样的话,肯定早就从入门到放弃了。
对于有些编程基础的人来说,我觉得最好的学习方式是差量学习。著名的版本管理软件Git是个很好的例子,他的基本思想是这样,我只关注和保存你当前工作区和最新版本之间的差异,每个指定版本的代码都是在基础提交上叠加该版本之前的所有patch合成的。这样,整个代码仓库需要保存的代码量就非常的少(跟另一个版本管理软件SVN相比)。在学习一门新语言的时候,你已有的语言知识就是初始提交版本,你只需要关注新语言跟已有语言之间的差异就好了。这会大大的提高你的学习速度。并且减少因为学的太杂而混到一起的风险。
寻找两个事物之间的差异,可以通过先寻找两个事物之间的相似性和联系来实现。请记住,“相似性是差异性的基石”,比如,让你去比较一头牛和一个苹果之间的差异。
你应该先去找到他们之间的相似性。
(1)首先,牛和苹果都是生物。都会生长发育。
(2)他们都会繁殖,都会死去。
(3)他们的肉都可以吃。(强行套近乎,手动滑稽 :))
然后再去找他们的不同点。
(1)牛是动物,他会运动,苹果自己不会动。
(2)牛分公母,苹果树雌雄同株,繁殖方式不同。
(3)牛生长过程中消耗氧气,释放二氧化碳,苹果树生长过程中吸收二氧化碳,释放氧气。
(4).。。。。。。。。。。。。。。。
额,跑题了,抱歉。
强行拉回来,继续说Python与C++有什么共性。
其实,找Python与C++之间的共性不如找所有高级语言之间的共性。一句话,
“所有高级语言的语法都是对人类分析和处理问题的逻辑的描述”。
怎么理解那?
(1)所有高级语言都有变量(广义的变量,包括变量和常量),变量相当于人类的记忆,描述某一时刻各事物的现状。其中的常量是描述那些不随时间变化的事物。
(2)所有高级语言都有条件语句,循环语句,和运算语句。
<1>条件语句是人们根据已有知识做出判断的过程。
<2>循环语句是对人们处理问题的过程的描述。
<3> 运算语句就不说了,反正就是想办法怎么把数学公式转换成代码实现。
说完了?
(3)面向对象。
都有面向对象的特性,有类,有继承。
(4)函数
都有函数,函数也是对代码的一种封装和复用。
那说完相似性,再说说差异性。
(1)C++ 属于静态语言,广义变量包括字符型,整型,浮点型,指针,引用,常量。使用之前必须先定义,明确指定变量类型。Python属于动态语言,变量包括 Numbers(数字)、String(字符串)、List(列表)、Tuple(元组)、Dictionary(字典),使用前无需先定义,无需指定变量类型(系统会自己推导)。
(2)Python语句也是一行一句,但是语句结束不需要加分号, 只有条件语句,循环语句之后要加个冒号。
(3)Python语句可以不像C++那样,一定要加个程序入口(main)。python属于解释性语言,边解释边执行,随便写一行代码就可以直接执行,这一点很shell脚本非常的相似。
(4)python函数可以返回多个值,这是对C++函数只能返回单一值的优化。
(5)Python属于解释性语言,程序边解释边执行。C++需要先编译成可执行文件。
(6).。。。。。。
这里, 我并不打算给你完整的列举他们之间的相似性和差异性,只是告诉你一种学习的方式,你可以自己在笔记本上写写看。最后我们会发现,所有高级语言底层思想都是非常相似的,只是描述方式略有差异而已。从宏观上讲,所有机器语言都是图灵等价的,一种语言能实现的功能,其他所有语言也都能实现,只是因为抽象层次不同,实现复杂度不同而已。Python语言经过不断的迭代,语法简洁,以及大量第三方库的加持,能够更容易的实现某些功能,所以成为了目前非常热门的语言。
那有没有必要买经典书籍阅读那?答案当然是,非常有必要。但是要看时机,我不建议一开始就抱着一本厚厚的圣经在那慢慢啃。工程中一种流行的开发方式叫做敏捷开发,主要思想就一句话,"快速出原型,立马上线,持续迭代”,这也适合语言学习,比如,今天讨论的是如何学习Python,那么就直接设定个简单的目标,去实现他,不管用什么方式。哪里不会搜哪里。当你完成之后,就会对该语言有了一个大概的了解。然后不断的去优化,去重写。当遇到瓶颈,百度也找不到答案的时候,你就可以去书里找答案了(注意,这里也不是让你去通读全书,而是去细看你用到,不熟悉的章节)。
下面就是我刚开始为了熟悉Python而写的一个小游戏。
免责声明:其中所使用的所有图片和声音素材均来自于网络,如有侵犯你的权利,请联系作者删除,多谢。
演示视频如下:(Python游戏 疯狂乒乓球)https://www.zhihu.com/video/1171873227315363840
完整代码如下:
#!/usr/bin/python
# -*- coding:UTF-8 -*-
import pygame as pg
import time
import sys
window_width = 800
window_height = 600
window_color = (255, 255, 255)
ball_color = (171, 171, 171)
ball_radius = 50
ball_len = 50
ball_x = ball_radius
ball_y = ball_radius
racket_w = 200
racket_h = 30
racket_x = 0
racket_y = window_height - racket_h
racket_color = (171, 171, 171)
move = 'none'
dx = 20
dy = 20
dz = 40
score = 0
stop = False
pg.init()
game_windows = pg.display.set_mode((window_width,window_height))
pg.display.set_caption("Magic Ball")
bg = pg.image.load("bg.jpg")
ball = pg.image.load("ball.png")
racket = pg.image.load("racket.png")
gameover = pg.image.load("gameover.png")
pg.mixer.init()
pg.mixer.music.load("bgm.mp3")
pg.mixer.music.set_volume(0.4)
pg.mixer.music.play(-1, 0)
pingpang = pg.mixer.Sound("pingpang.wav");
pingpang.set_volume(0.8);
font = pg.font.SysFont('楷体', 64, True)
while True:
for event in pg.event.get():
if event.type == pg.QUIT:
sys.quit
elif event.type == pg.KEYDOWN:
if event.key == pg.K_LEFT:
move = 'left'
elif event.key == pg.K_RIGHT:
move = 'right';
else:
move = 'none';
elif event.type == pg.KEYUP:
if event.key == pg.K_LEFT or event.key == pg.K_RIGHT:
move = 'none'
if move == 'left':
if racket_x - dz <= 0:
racket_x = 0
else:
racket_x -= dz
elif move == 'right':
if racket_x + dz + racket_w >= window_width:
racket_x = window_width - racket_w
else:
racket_x += dz
if ball_y >= window_height - ball_radius:
print "game over!!!"
stop = True
if ball_x + ball_len + dx >= window_width:
ball_x = window_width - ball_len
dx = -dx
pingpang.play()
elif ball_x + dx <= 0:
ball_x = 0
dx = -dx
pingpang.play()
else:
ball_x += dx
if ball_y + ball_len + dy >= window_height - racket_h:
if ball_x + 0.5*ball_len >= racket_x and ball_x + 0.5*ball_len <= racket_x + racket_w:
dy = -dy
ball_y = window_height - ball_len - racket_h
score = score + 1
pingpang.play()
else:
ball_y += dy
elif ball_y + dy <= 0:
dy = -dy
ball_y = 0
pingpang.play()
else:
ball_y += dy
ball_new = pg.transform.rotate(ball, ball_y)
game_windows.blit(bg, (0,0))
game_windows.blit(ball_new, (ball_x,ball_y))
game_windows.blit(racket, (racket_x,racket_y))
game_windows.blit(font.render('Score:%04d' % score, True, [119,148,3]), [20,20])
if stop == True:
game_windows.blit(gameover, (200, 200))
pg.display.update()
time.sleep(0.03)
while stop == True:
for event in pg.event.get():
if event.type == pg.KEYUP and event.key == pg.K_SPACE:
stop = False
score = 0
ball_x = 0
ball_y = 0
racket_x = 0
racket_y = window_height - racket_h
elif event.type == pg.QUIT:
sys.quit()
time.sleep(0.1)