在开始记录Flask具体内容前,整理一波Python中的一些高级函数的使用。
- Lambda表达式
Lambda表达式其实就是匿名函数,这种用法在Python和Java中都存在,不过个人感觉还是Python的更加的干练。
其格式为lambda 参数列表: 函数体
举了栗子,定义一个简单的加法函数
def add(x,y):
return x+y
print(add(3,5)) #输出8
换做我们的lambda表达式就是:
add = lamda x,y : x+y
add(3,5) #同样可以返回8
- map函数
map函数的参数有两个,一个是func
,另一个是*iterables
然后输出map object。意思就是第一参数是一个function,后面传入的是可迭代对象。
举个栗子:
arr = [1,2,3,4,5]
r = map(lambda x:x**2,arr)
print(list(r)) #输出:[1, 4, 9, 16, 25]
从上面的例子可以看到,map函数的作用就是将第二个参数里的可迭代的元素都做function的处理。 要注意的是,上面之所以是 print(list(r))
是因为,map函数返回的是一个map对象,我们需要将其做转换才能获取到其内容。
- filter函数
filter函数从名字上可以看出,它的作用是一个过滤器的作用,它传入的参数和map差不多。不多bb,直接上菜。
def is_not_none(word):
return word and len(word.strip())>0 #判断该单词是否为空
arr = [" ","你好","啊","!"]
print(list(filter(is_not_none,arr))) #返回 ['你好', '啊', '!']
可以看出,filter只返回符合条件的结果,不符合条件的会被自动过滤。这个比我们写一个循环一个个判断会简单很多。
- reduce函数
reduce函数的输入输出比前两个稍微的复杂一丢丢,他的输入第一个依然是一个函数,第二个是可迭代对象,它可以设置一个初始值。初始值是做什么的呢? 这个就谈到了reduce的功能,reduce是将所有的可迭代对象进行函数操作,然后变成一个元素。
上菜!
from functools import reduce #使用reduce需要import一下
arr = [1,2,3,4,5]
reduce(lambda x,y:x+y,arr) #返回15
reduce会在arr中进行两两取值,1+2 = 3 ,得的3会和下一个元素3组成一组成为新的 参数传进函数中继续计算。下面我加一个初始值,
from functools import reduce #使用reduce需要import一下
arr = [1,2,3,4,5]
reduce(lambda x,y:x+y,arr,10) #返回25
初始值就使得reduce函数在这个基础上进行操作。
- 三大推导式
(1)List推导式:
这个在刷题的时候经常用到,尤其是在做动态规划的时候,我们需要定义一个固定大小的列表去存储我们的结果。List推导式其实就是在外面套上一个[ ]
使得里面的内容变成一个列表,上菜!list1 = [i for i in range(0,10,2)] print(list1) #输出 [0, 2, 4, 6, 8]
(2)集合推导式:
和列表推导式一个形式,在外面套个壳子 { }
就成了我们的集合推导式
set1 = {i for i in range(0,10,2)}
print(set1) #输出 {0, 2, 4, 6, 8}
(3)字典推导式
这个在平时也是经常用到,直接上菜展示:
dict1 = {k:v**2 for k,v in enumerate(range(10))}
print(dict1) #返回{0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}
用上这个:
,推导式就会自动的将我们的key,value生成,我们也可以通过推导式将我们的key-value对换一下
print({v:k for k,v in dict1.items()}) #输出 {0: 0, 1: 1, 4: 2, 9: 3, 16: 4, 25: 5, 36: 6, 49: 7, 64: 8, 81: 9}
6.Python的三目运算符
这个就很简单了,举个我经常使用的一个例子,在pytorch中定义设备的类型
device = "cuda" if torch.cuda.is_available() else "cpu"
意思就是当if
后面的成立时则执行前的赋值,否则就是执行后面的,这个和Java中的? :
功能是类似的。平时能一行写完的判断尽可能一行,因为Python是解释性语言,你写的越短,解释越快。
- 装饰器
这个应该算是一个重点了,因为在Flask中,装饰器到处可见,我们的路由设置也是装饰器的一个应用。装饰器的格式是@函数
,意思就是使用一个函数去装饰另一个函数,内部的执行步骤是,将被装饰的函数B,作为参数传入装饰函数 A(我们的@函数
),将函数B替换成上面那一步的返回值。直接上菜展示:
def funA(fn):
print("A")
fn()
return "func"
@funA
def funB():
print("B")
print(funB)
返回结果是A B func
。值得注意的是为什么是funB而不是funB(),因为在funA执行完后我们的funB就不在是函数了,而是被替换成了一个字符串。
以上都是个人在自己的学习过程中觉得比较有用的一下编程内容,仅供参考,例子比较简单,更复杂的应用可以再做深入了解。奥利给!