欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Python语言的高级特性

程序员文章站 2022-07-02 21:20:24
...

Python语言的高级特性


函数式编程(FunctionalProgramming)

理解:

  • 基于λ演算的一种编程方式
    1. 程序中只有函数
    2. 函数可以作为参数,同样也可以作为返回值
    3. 纯函数式的编程语言: 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表达式的用法
  1. 以lambda开头
  2. 紧跟一定的参数(如果有的话)
  3. 参数后用冒号和表达式主题隔开
  4. 只是一个表达式,所以,没有return

filter函数

  • 作用:对一组数据进行过滤,符合条件的数据将会重新生成一个列表并返回一个布尔值
  • 跟map函数比较:
    • 相同:都对列表中的每一个元素进行操作
    • 不同:
      1. map是映射
      2. 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语法