着手开始写的时候就一直有一个画面在脑子中出现:小猪佩奇第N级,猪爸爸拿出来一本《混凝土的故事》,打开书的时候说道:混凝土是由砂子、水、水泥组成的,结果其他人都睡着了。于是,我在想,要是给土木人讲:python万法皆对象,对象类型有:
是不是也有人睡着?相反,如果我直接说砂子、水泥、钢筋、混凝土,是不是觉得亲切?所以接下来将会从一砖一瓦的建筑材料说Python。
万法皆对象:在基建领域,你所看到的构筑物就是有以上提到的基础建材组成;在Python领域对象类型就可以看做基础建筑材料,然后由不同的施工工艺产生不同的单体模块或构造物。例如:一个函数(施工工艺)所包含的参数(基础建材),形成一个伪代码。
伪代码
#围墙条形基础开挖
变量类型:铲子、䦆头、羊角碾、块石、砖头、水泥、混凝土
#工艺流程:
#开挖条形基坑
#夯实基础
#抛填块片石
#混凝土填充找平
#砌砖
#如果基坑挖至设计标高,停止开挖;
#如果没有到设计标高,接着开挖。
情况一:
直到设计标高为止(while):
开挖不要停;
情况二:
持续开挖不要停(for):
直到设计标高(if)为止(break):
#本节讲述列表推导式的语法技巧,此法学会,就算入门了!
真代码
列表推导式
循环可以用来生成列表:
values = [10, 21, 4, 7, 12]
squares = []
for x in values:
squares.append(x**2)
print(squares)
[100, 441, 16, 49, 144]
列表推导式可以使用更简单的方法来创建这个列表:
values = [10, 21, 4, 7, 12]
squares = [x**2 for x in values]
print(squares)
[100, 441, 16, 49, 144]
还可以在列表推导式中加入条件进行筛选。
例如在上面的例子中,假如只想保留列表中不大于10
的数的平方:
values = [10, 21, 4, 7, 12]
squares = [x**2 for x in values if x <= 10]
print(squares)
[100, 16, 49]
也可以使用推导式生成集合和字典:
square_set = {x**2 for x in values if x <= 10}
print(square_set)
square_dict = {x: x**2 for x in values if x <= 10}
print(square_dict)
set([16, 49, 100])
{10: 100, 4: 16, 7: 49}
再如,计算上面例子中生成的列表中所有元素的和:
total = sum([x**2 for x in values if x <= 10])
print(total)
165
但是,Python会生成这个列表,然后在将它放到垃圾回收机制中(因为没有变量指向它),这毫无疑问是种浪费。
为了解决这种问题,与xrange()类似,Python使用产生式表达式来解决这个问题:
total = sum(x**2 for x in values if x <= 10)
print(total)
165
与上面相比,只是去掉了括号,但这里并不会一次性的生成这个列表。
比较一下两者的用时:
x = range(1000000)
%timeit total = sum([i**2 for i in x])
1 loops, best of 3: 3.86 s per loop
%timeit total = sum(i**2 for i in x)
1 loops, best of 3: 2.58 s per loop
土木狗的视角:前面讲述了Python对象的基本类型。终于到了语法章节,在工地上很简单,如果达到某标准或进度,就进行下一个工序,这个看起来更像是现场监理干的活。就如上面的伪代码显示的一样,在python里面没有C++的诸多语法,你只要会if判断和for循环就可以做很多事情了。for循环使用的频率是非常搞的,其与if嵌套使用,可以实现绝大部分的逻辑。这一节学完,算是入门了,哈哈!接下来,将打开函数的小门。
课后作业(可选)
按上一节运行自己的项目,新建一个*.ipynb文件,将上面代码敲入运行。