0x03:写作目的
赚钱呗,呵呵。赚钱当然是目的之一,但热爱是成功的因素,不能把赚钱当成唯一目的 。
我觉得,作者在前言里提到的:“这本书不是一本完备的Python手册,而是会强调Python作为编程语言独有的特性。”
这一句话应该是作者背后的目的之一。
此外,向人们介绍如何写出高效的代码,如何利用好现有的工具而不是什么都自己造轮子,这些也是目的之一。
0x04:精彩之处
我是新手,只通读了一遍,还没有全看完。这里结合自己看到的内容,列几处个人觉得精彩的地方:
1、列表推导和生成器表达式(2.2节)
同样的功能,代码的长度不一样。
#方法1 传统的循环加赋值语句
symbols = '$¢£¥€¤'
codes = []
for symbol in symbols:
codes.append(ord(symbol))
print (codes)
#方法2 列表推导
newcodes = [ord(symbol) for symbol in symbols]
print(newcodes)
生成器表达式存在的理由之一,是它并不是一次生成所有的列表,而是在需要时才生成,就不用占用很多的空间。不过有时候,你得取得“时间和空间”的平衡。(第14章中会有更多介绍)
colors = ['black', 'white']
sizes = ['S', 'M', 'L']
for tshirt in ('%s %s' % (c, s) for c in colors for s in sizes):
print(tshirt)
2、元组拆包
所谓元组拆包,就是把元组对应的元素分解。
平行赋值
>>> lax_coordinates = (33.9425, -118.408056)
>>> latitude, longitude = lax_coordinates # 元组拆包
>>> latitude
33.9425
>>> longitude
-118.408056
交换变量
>>> b, a = a, b
【元组拆包可以应用到任何可迭代对象上,唯一的硬性要求是,被可迭代对象中的元素数量必须要跟接受这些元素的元组的空档数一致。除非我们用* 来表示忽略多余的元素,在“用* 来处理多余的元素”一节里,我会讲到它的具体用法。Python 爱好者们很喜欢用元组拆包这个说法 ,但是可迭代元素拆包这个表达也慢慢流行了起来,比如“ PEP 3132—Extended Iterable Unpacking”(https://www.python.org/dev/peps/pep-3132/)的标题就是这么用的。】
3、一等函数(第5.1节):
这个例子中把函数作为返回值传回。作者书中是以IDLE运行写的代码。这里你可以将下面代码存为py程序尝试一下。
def factorial(n):
'''returns n!'''
return 1 if n < 2 else n * factorial(n-1)
print(factorial(9))
你可以尝试自己编写一段(阶乘)的函数。看看如果运行条件发生变化,两段程序运行时间有没有差异。
4、高阶函数(第5.2节)
这一节中作者举了一个按照结尾字符来排序的例子。
fruits = ['strawberry', 'fig', 'apple', 'cherry', 'raspberry', 'banana']
a = sorted(fruits, key=len)
print(a)
def reverse(word):
return word[::-1]
b = sorted(fruits, key=reverse)
print(b)
5、变量及函数命名(第8.1节)
这一节阐述了一个重要的观念变化。“变量是标注,而不是盒子。如果你不知道引用式变量是什么,可以像这样对别人解释别名。”
在左图中,人们认为a和b是两个盒子。而在引用式变量中,我们认为a和b的值相等,a也是b。下面的代码你可以看到alex虽然值和charle相等。
但是“alex is not charles”返回了真值(True)。
>>> charles = {'name': 'Charles L. Dodgson', 'born': 1832}
>>> lewis = charles .
>>> lewis is charles
True
>>> id(charles), id(lewis) .
(4300473992, 4300473992)
>>> lewis['balance'] = 950 .
>>> charles
{'name': 'Charles L. Dodgson', 'balance': 950, 'born': 1832}
>>> charles = {'name': 'Charles L. Dodgson', 'born': 1832}
>>> lewis = charles
>>> alex = {'name': 'Charles L. Dodgson', 'born': 1832, 'balance': 950} .
>>> alex == charles .
True
>>> alex is not charles .
True
6、装饰器(第7.1节、第21.2节)
书中是这样定义装饰器的。“装饰器的一大特性是,能把被装饰的函数替换成其他函数。第二个特性是,装饰器在加载模块时立即执行。”
这个概念还是不很明白,但是通过书中的例子感觉更明白了一些。在需要提前导入时运行的内容,就可以提前导入了。例如GUI开发时。
导入时和运行时是有区别的。
此外,变量是有作用域的,Python 不要求声明变量,但是假定在函数定义体中赋值的变量是局部变量。
registry = []
def register(func):
print('running register(%s)' % func)
registry.append(func)
return func
@register
def f1():
print('running f1()')
@register
def f2():
print('running f2()')
def f3():
print('running f3()')
def main():
print('running main()')
print('registry ->', registry)
f1()
f2()
f3()
if __name__=='__main__':
main()
#猜一猜结果会是什么?b的值能正确输出吗?能的话是几?
b = 6
def f2(a):
print(a)
print(b)
b = 9
f2(3)
#如果你想要让b输出为6,那么就要global声明
b = 6
def f3(a):
global b
print(a)
print(b)
b = 9
f3(3)
#如果下一行再来一个f3(3),输出会是多少?
# f3(3)
7、和硬件打交道
你了解的Python都能干什么呢?科学计算、爬虫、做web站点?在书里面搜索一下“from dis import dis”、“pingo.io”。
看看吧,python还可以和汇编、Raspberry Pi硬件进行交互。
8、观察python内部执行的网站
有的时候是不是不知道python内部到底是如何赋值的,你可以将代码输入下面网站,就可以看到了。
0x05:给新手的建议
我也是个新手,这些建议记录在这里:多在Github找一些代码,不只是复制粘贴,要自己敲一遍,在python shell中执行试试。
将代码中不懂的地方自行搜索,通过加注释深入了解,然后找机会用一用。
多看看作者在前言、小结里面提到的网站。
最后结合自己的兴趣和工作实际,找个项目做一做。