1、函数
在 Python 中,函数是一种基本类型的对象,这意味着
· 可以将函数作为参数传给另一个函数
· 将函数作为字典的值储存
· 将函数作为另一个函数的返回值
· Python 中的函数传递方式是 call by reference 即引用传递,例如,对于这样的用法:
· x = [10, 11, 12]
· f(x)
· 传递给函数 f 的是一个指向 x 所包含内容的引用,如果我们修改了这个引用所指向内容的值(例如 x[0]=999),那么外面的 x 的值也会被改变。不过如果我们在函数中赋给 x 一个新的值(例如另一个列表),那么在函数外面的 x 的值不会改变:
2、map、reduce、filter
map(f, sq) 函数将 f 作用到 sq 的每个元素上去,并返回结果组成的列表,相当于:
[f(s) for s in sq]
filter(f, sq) 函数的作用相当于,对于 sq 的每个元素 s,返回所有 f(s) 为 True 的 s 组成的列表,相当于:
[s for s in sq if f(s)]
3、迭代器、生成器
迭代器对象可以在 for 循环中使用:
其好处是不需要对下标进行迭代,但是有些情况下,我们既希望获得下标,也希望获得对应的值,那么可以将迭代器传给 enumerate 函数,这样每次迭代都会返回一组 (index, value) 组成的元组:
生成器使用 yield 关键字将值输出,而迭代器则通过 next 的 return 将值返回;与迭代器不同的是,生成器会自动记录当前的状态,而迭代器则需要进行额外的操作来记录当前的状态。实际上,迭代器也是一种生成器。
4、with语句和上下文管理
5、修饰符是这样的一种函数,它接受一个函数作为输入,通常输出也是一个函数:
Python 使用 @ 符号来将某个函数替换为修饰符之后的函数:
在 Python 标准库中,有很多自带的修饰符,例如 classmethod 将一个对象方法转换了类方法:@classmethod 修饰符
@property 修饰符
有时候,我们希望像 Java 一样支持 getters 和 setters 的方法,这时候就可以使用 property 修饰符:
numpy 的 vectorize 函数讲一个函数转换为 ufunc,事实上它也是一个修饰符:
6、排列、组合
标准编程语言
对于 C 语言,代码一般要先编译,再执行。
.c -> .exe
解释器语言
shell 脚本
.sh -> interpreter
Byte Code 编译
Python, Java 等语言先将代码编译为 byte code(不是机器码),然后再处理:
.py -> .pyc -> interpreter
eval(statement, glob, local)
使用 eval 函数动态执行代码,返回执行的值: