Py Characteristic
本文最后更新于 2237 天前,其中的信息可能已经有所发展或是发生改变。

匿名函数

lambda x: x * x
相当于
def f(x):
    return x*x

map

map(func, list)

map的第一个参数是一个已经定义好的函数(或是匿名函数),这个函数只需传入一个参数,第二个参数是一个列表,然后map 将列表中的元素逐一传给前面的那个函数,并将返回值填入一个元组中。可以使用list()函数将元组转换为列表

经典示例:
list(map(str, [1, 2, 3, 4, 5, 6, 7, 8, 9]))

filter

和map()类似,filter()也接收一个函数和一个序列。和map()不同的是,filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素。

def is_odd(n):
    return n % 2 == 1

list(filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15]))
# 结果: [1, 5, 9, 15]
#filter要求第一参数的函数能返回True或False

reduce

from functools import reduce
reduce(func, list)

reduce 要求第一个参数的函数需求两个参数,reduce可以把结果继续和序列的下一个元素做累积计算,它相当于

reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
经典案例
from functools import reduce
def fn(x, y):
    return x * 10 + y

reduce(fn, [1, 3, 5, 7, 9])
#连接列表中的数字,结果为13579

List Comprehensions

列表生成式就是在一个列表中直接写for 循环算法,前面写操作,后面写算法语句

[x * x for x in range(1, 11) if x % 2 == 0]#返回1至10偶数的平方

Generator

如果要生成0-10的平方数,可以将用列表生成式将所有的结果用一个列表保存起来,但当需求的数不断增多,列表的空间占用会无比地庞大。

#常规方法
Li = [x * x for x in range(1000)]
print(Li[0])
print(Li[999])

而生成器(generator)可以单独生成每一个项的值,即使是一个很大的数字,内存占用也会和第一项或第二项一样多。

#生成器方法
g = (x * x for x in range(10))
for n in g:
    print(n)

yield

只要一个函数包含yield,那么这个函数就可被称之为生成器

这个函数在执行到yield时,就会被冻结,然后将yield对应的语句的值返回,之后函数再从上次冻结的位置重新开始。

因此,yield可以认为是一个类似于return的语句,但和return不同的是,yield会在下次迭代时,从刚刚那个位置开始,内存占用始终为常数。

 

global关键字

加上global的变量,会成为全局变量,但这种全局变量仅限于读取。因为函数在尝试修改全局变量时,python会为了保护全局变量,在当前函数作用域创建一个新的同名变量

 

 

闭包

Python中万物皆对象,所以返回一个函数的返回值也可以是一个内嵌函数 。

 

 

上一篇
下一篇