一、函数:16-20章
1、语法
def times(x,y): return x*y
2、多态:昨天内容,Python是动态变量,所以天生支持多态,这点也是要注意的。一个专门处理数字的函数,传入了字符串,函数仍然会执行,还不会报错。3、变量的作用域:
global -- 上级变量 nonlocal -- 嵌套def 的变量
变量搜索 LEGB法则:本地作用域(L),上层结构中def或lambda的本地作用域(E),全局作用域(G),内置作用域(B)
4、参数:
5、原则:列表、字典之类可变变量作为参数,在函数内是能直接修改的,所以要尽量避免可变参数的修改。
参数匹配模式:P483 -- 可以对传入的参数进行一定的限定和说明
注意: *和**的用法;
对于输入使用参数并且对于输出使用return
只有在真正必要的情况下使用全局变量
不要改变可变类型的参数,除非调用者希望这样做
每一个函数都应该有一个单一的、统一的目标
每一个函数应该相对较小
避免直接改变在另一个模块文件中的变量
6、函数是对象:函数是一个对象,所以它可以用来赋值、插入数据结构等等,这带来很大的灵活性。比如把预制的函数和参数都放到一个字典里,然后...
7、lambda:似乎没有什么比较特殊的地方
8、map、filter 和 reduce :都是处理序列的工具,配合 lambda 使用威力巨大 ......
9、列表解析:[(x+y) for x in range(5) if x%2 == 0 for y in range(5) if y%2 ==1] 解析明显比lambda好看,比循环好用。------
10、生成器函数:不返回值,而是使用 yield 挂起。普通的函数 return 后,函数就被释放了。带有 yield 的函数则实现了迭代器(昨天学过,可以通过 _next_迭代)处理时间序列的时候这种函数非常有用,因为它保留了函数状态。不用在上层放置状态变量,而且不用反复的实例化。
11、生成器函数的 send :和 next 差不多,但是它发送一个值给 yield 并返回。P539 讲述了迭代器和列表解析,很精彩。
>>> def timesfour(S): for c in S: yield c*4 >>> G = timesfour('span') >>> next(G) 'ssss' >>> next(G) 'pppp' >>> list(G) ['aaaa', 'nnnn'] >>> [x*4 for x in 'span'] ['ssss', 'pppp', 'aaaa', 'nnnn'] >>>
上面的代码很清楚,先定义了一个函数 timesfour(S) ,这个函数把传入的字符串中的每个字符 打印4次输出。生成器是单次的:两次next(G)以后,list(G)就从 ‘aaaa’开始了;
最下面采用了列表解析,也许,在Python底层,列表解析就是用生成器实现的。
函数部分内容不是很多,但是要思考的东西比较多。一上午也只看了这么多了,下午开始看模块。