PYTHON-函数特性

来源:互联网 发布:矩阵计算 第4版 pdf 编辑:程序博客网 时间:2024/04/29 13:48

函数:

在Python中,定义一个函数要使用 def 语句,依次写出函数名、括号、括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用 return 语句返回。

  • 递归函数,自身调用自身就是递归函数

定义默认参数
定义函数的时候,还可以有默认参数。
由于函数的参数按从左到右的顺序匹配,所以默认参数只能定义在必需参数的后面:
默认参数必须指向不可变对象
如:

# OK:def fn1(a, b=1, c=2):    pass# Error:def fn2(a=1, b):    pass

1. 高级特性:

  • 切片:
    list: L[A:B:C]
    A,表起始。B表结尾。C表隔几个去一次,不填则为默认参数
    tuple: 也可以切片,但是取出后仍是tuple类型

  • 迭代:
    普通迭代:for … in .. :
    没有索引的,只要是可以迭代的对象(字符串也可以迭代),都可以。

例如:dict默认迭代的是key值。for value in d.itervalues()   # 迭代for k, v in d.iteritems()
  • 判断对象是否可以迭代:
通过collections模块的Iterable类型判断:from collections import Iterableisinstance('abc', Iterable) # str是否可迭代
  • 如果一个对象说自己可迭代,那我们就直接用 for 循环去迭代它,可见,迭代是一种抽象的数据操作,它不对迭代对象内部的数据有任何要求。
    for 循环可作用的迭代对象远不止 list,tuple,str,unicode,dict等
    for x, y in [(1, 1), (2, 4), (3, 9)]: #for里同时可以引用两个变量

  • Python内置的enumerate函数可以把一个list变成索引-元素对,这样就可以在for循环中同时迭代索引和元素本身:

 for i, value in enumerate(['A', 'B', 'C']): enumerate()把list返回一个包含索引-value值得形式。
  • 列表生成式L:
体会快速生成列表的方法 [x * x for x in range(1, 11) if x % 2 == 0] [m + n for m in 'ABC' for n in 'XYZ'] [x * x for x in range(1, 11)]
  • 生成器G:
    列表元素按照某种算法推算出来,一边循环一边计算推算出后来的元素,可以节约大量空间

    创建L和g的区别仅在于最外层的[]和(),L是一个list,而g是一个generator。
    generator是可迭代对象,直接用for可以遍历

    另外一种定义的方法:如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator

 def fib(max):    n, a, b = 0, 0, 1    while n < max:        yield b        a, b = b, a + b        n = n + 1

跟函数不同的一点:变成generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行

2.函数式编程

函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数!

  • 高阶函数:
    函数本身也可以赋值给变量,即:变量可以指向函数一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数

  • map/reduce
    map()函数接收两个参数,先是函数,后是序列,map将传入的函数依次作用到序列的每个元素,并把结果作为新的list返回

  • reduce把一个函数作用在一个序列[x1, x2, x3…]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算

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

  • sorted()
    接受两个参数,第一个是序列,默认参数从大到小,第二个参数是比较函数参数
    sorted([‘bob’, ‘about’, ‘Zoo’, ‘Credit’], cmp_ignore_case)

  • 返回函数
    高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回。
    返回闭包时牢记的一点就是:返回函数不要引用任何循环变量,或者后续会发生变化的变量

  • 匿名函数
    不需要显式地定义函数,直接传入匿名函数更方便 关键字lambda表示匿名函数,冒号前面的x表示函数参数。

map(lambda x: x * x, [1, 2, 3, 4, 5, 6, 7, 8, 9])lambda x: x * x  就是def f(x):    return x * x
  • 装饰器
    在面向对象(OOP)的设计模式中,decorator被称为装饰模式。OOP的装饰模式需要通过继承和组合来实现,而Python除了能支持OOP的decorator外,直接从语法层次支持decorator。Python的decorator可以用函数实现,也可以用类实现。
    decorator可以增强函数的功能,定义起来虽然有点复杂,但使用起来非常灵活和方便。

  • 偏函数
    简单总结functools.partial的作用就是,把一个函数的某些参数给固定住(也就是设置默认值),返回一个新的函数,调用这个新函数会更简单

0 0
原创粉丝点击