文章目录
Python中,有函数式编程和面向对象编程,java和C#之类只能把函数写到类里,没有函数式编程,所以只有面向对象,但是在Python中有了选择,函数式编程是可以完成所有的功能的,但是某些时候面向对象更合适
python的高级特性
-
列表生成式=列表推导=列表解析→就是用来创造列表的, 👉传说中的一行代码
list(range(1, 11)) #[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] [x * x for x in range(1, 11)] # [1, 4, 9, 16, 25, 36, 49, 64, 81, 100] import os # 导入os模块,模块的概念后面讲到 [d for d in os.listdir('.')] # 列出当前目录下所有文件和目录名
-
如果用
if ... else
以下代码正常输出偶数:[x for x in range(1, 11) if x % 2 == 0] #[2, 4, 6, 8, 10]
但是,我们不能在最后的if加上else,会报错,因为跟在for后面的if是一个筛选条件,不能带else,否则如何筛选?
if写在for前面必须加else,否则报错,因为for前面的部分是一个表达式,它必须根据x计算出一个结果。因此,考察表达式:x if x % 2 == 0,它无法根据x计算出结果,因为缺少else,必须加上else
[x if x % 2 == 0 else -x for x in range(1, 11)] #[-1, 2, -3, 4, -5, 6, -7, 8, -9, 10]
-
-
生成器
上面演示了列表生成式生成列表,但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。在Python中,能够不必创建完整的list,从而节省大量的空间的这种一边循环一边计算的机制,称为生成器:
generator
。
要创建一个generator,有很多种方法。第一种方法很简单,只要把一个列表生成式的[]改成(),就创建了一个generator:g = (x * x for x in range(10))
但我们怎么打印出generator的每一个元素呢?→
next()
,一个个打出来-
但是正确的方法是使用for循环,因为generator也是可迭代对象
for n in g: print(n)
-
如果一个函数定义中包含
yield
关键字,那么这个函数就不再是一个普通函数,而是一个generatordef fib(max): n, a, b = 0, 0, 1 while n < max: yield b a, b = b, a + b n = n + 1 return 'done' f = fib(6) # <generator object fib at 0x104feaaa0>
⭐注意区分普通函数和generator函数,普通函数调用直接返回结果,generator函数的“调用”实际返回一个generator对象。
e.g. 杨辉三角,每个数是它左上方和右上方的数的和
def generate(self, numRows): """ :type numRows: int :rtype: List[List[int]] """ if numRows==0: return [] l1 = [[1]] n = 1 while n<numRows: l1.append(map(lambda x,y:x+y, [0]+l1[-1], l1[-1]+[0])) n += 1 return l1
-
-
迭代器
-
可迭代对象
Iterable
① 集合数据类型,如list、tuple、dict、set、str等,
② generator,包括生成器和带yield的generator function
可以使用isinstance()
判断一个对象是否是Iterable对象
其中,list、dict、str不是 Iterator,变成Iterator可以使用iter()
函数:>>> isinstance([], Iterable) True >>> isinstance([], Iterator) False isinstance(iter([]), Iterator) True
凡是可作用于for循环的对象都是Iterable类型;
凡是可作用于next()函数的对象都是Iterator类型
-
函数式编程
-
高阶函数 抽象能力强大,核心代码简洁
-
map(function,list)
函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回。
e.g. 函数f(x)=x2,要把这个函数作用在一个list [1, 2, 3, 4, 5, 6, 7, 8, 9]>>> def f(x): ... return x * x >>>r = map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9]) >>> list(r) [1, 4, 9
-