Python语言的高级特性
Python语言的高级特性
函数式编程(FunctionalProgramming)
理解:
-
基于λ演算的一种编程方式:
- 程序中只有函数
- 函数可以作为参数,同样也可以作为返回值
- 纯函数式的编程语言: LISP , Haskell
-
Python 函数式编程只是借鉴函数式编程,需要了解:
- 高阶函数
- 返回函数
- 匿名函数
- 装饰器
- 偏函数
λ表达式
- 个人理解:
- lambda表达式中,在pep8中不建议以下情况:
```python
//建议使用def代替
stm = lambda x : x*100
stm(10)
```
但是在reduce中发现推荐用法为:
```python
import functools
reduce(lambda x, y : x+y,[1,2,3,4,5])
```
顺应要求中的lambda表达式应该简短,此处可避免定义函数,减少了函数的跳转
- lambda表达式的用法:
- 以lambda开头
- 紧跟一定的参数(如果有的话)
- 参数后用冒号和表达式主题隔开
- 只是一个表达式,所以,没有return
filter函数
- 作用:对一组数据进行过滤,符合条件的数据将会重新生成一个列表并返回一个布尔值
- 跟map函数比较:
- 相同:都对列表中的每一个元素进行操作
- 不同:
- map是映射
- filter是按照条件过滤数据
// A code block
class filter(object)
filter(function or None, iterable) //--> filter object
// Return an iterator yielding those items of iterable for which function(item)
闭包(需修改,解释的很差):
闭包:能够读取其他函数内部变量的函数。例如在javascript中,只有函数内部的子函数才能读取局部变量,所以闭包可以理解成“定义在一个函数内部的函数“。在本质上,闭包是将函数内部和函数外部连接起来的桥梁。
闭包注意事项:
(1)由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。
(2)闭包会在父函数外部,改变父函数内部变量的值。所以,如果把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值。
当一个函数在内部定义函数,并且内部的函数应用外部函数的参数或者局部变量,当内部函数被当做返回值的时候,相关参数和变量保存在返回的函数中,这种结果,叫闭包
闭包实例
// A code block
def myF4( *args):
def myF5(): #函数在内部被定义
rst = 0
for n in args: #内部函数应用外部函数的参数 args
rst += n
return rst
return myF5 #函数被当作返回值
闭包误区:
// A code block
def count():
# 定义列表,列表里存放的是定义的函数
fs = []
for i in range(1,4):
# 定义了一个函数f
# f是一个闭包结构
def f():
return i*i #使用了局部参量
fs.append(f)
return fs #可理解为{"f1":i*i,"f2":i*i,"f3":i*i}
f1,f2,f3 = count()
print(f1())
print(f2())
print(f3())
函数输出结果为
9
9
9
此函数初学理解错误内容:
f1,f2,f3 = count()
个人理解为创建了count()函数的三个赋值,此处为接受返回值,其中个返回的为一个list,但是由于给定三个参数时,此处将列表值每隔返回给了f1,f2,f3,(f(s)是一个保存了三个函数地址的列表)但是此处并非直接返回函数值,而是返回了函数(ii的表达式,)所以f1被执行了 将直接为33
正常情况下i为局部变量,该块执行完毕时应该会被销毁,但是i此时被当作返回值,仍然被占用,回收系统无法回收该局部变量,便保留在内存之中。在执行完成返回的函数后,i变量的内存才被销毁。
使用闭包会导致内存泄漏
个人理解的原因为:返回的函数一致未被执行,导致系统无法回收该内存
修改后:
def count2():
def f(j):
def g():
return j*j
return g
fs = []
for i in range(1,4):
fs.append(f(i))
return fs
f1, f2, f3 = count2()
print(f1())
print(f2())
print(f3())
输出结果:
1
4
9
装饰器(decorator)
- 在不改动函数代码的基础上无限制扩展函数功能的一种机制,本质上讲,装饰器是一个返回函数的高阶函数
- 装饰器的使用: 使用@语法, 即在每次要扩展到函数定义前使用@+函数名
示例1:
//任务:
//并不改变现有函数的代码
//扩展一个函数的功能:在hello world中打印时间
def printHello():
print("hello world")
printHello()
调整后的代码:
import time
'''定义装饰器'''
def printTime(f):
def wrapper(*args, **kwargs): #*args, **kwargs接受任意参数和关键字
print("Time: ", time.ctime())
return f(*args, **kwargs)
return wrapper
@printTime
def printHello():
print("hello world")
printHello()
示例2
偏函数
- 参数固定的函数,相当于一个由特定参数的函数体
- functools.partial的作用是,把一个函数某些函数固定,返回一个新函数
import functools
int16 = functools.partial(int, base=16)
int16("12345")
上一篇: Python语法day2
下一篇: Python字符串操作之字符串分割与组合