Menu Close

python2 学习笔记之 函数

本章包括内容用

  1. 基本语法
  2. 函数式编程
  3. 回调
  4. 闭包和装饰器
  5. 递归
  6. 生成器和yield
  7. 作业

1. 基本语法

1.1 函数的基本语法

#定义函数的语法为def,args为形参,函数一般会返回一些数据,用return返回
def func(args):
    return x;
#使用函数名来调用一个函数
func(agrs)

1.2 函数的作用域 LEGB
L-Local(function);函数内的名字空间
E-Enclosing function locals;外部嵌套函数的名字空间(例如closure)
G-Global(module);函数定义所在模块(文件)的名字空间
B-Builtin(Python);Python内置模块的名字空间

2.函数例子

2.1 开平方

import math
#计算20的平方根
math.sqrt(20)

2.函数式编程

函数式编程:是一种编程方法。
一般我们之前的编程都是基于顺序结构执行。
函数式编程,是一切皆函数,操作的是一个一个函数,将函数当做变量去操作、组合。

  1. 直接赋值给变量
#sum是built-in函数
my_sum = sum
#输出2
sum(1+1)
#同上
my_sum(1+1)
#['__call__', '__class_......等等
dir(my_sum)
#输出函数名
my_sum.__name__
  1. 高阶函数 将一个函数以参数的形式赋值给另一个函数

2.1 自定义高阶函数

#此处的f是下面的另一个函数,称f1这个函数为高阶函数
func f1(f,g,h):
    pass
func f():
    pass

2.2 系统自带高阶函数 filter
过滤掉非字符串,filter接受两个参数,第一个是函数,第二个可以是字符串也可以是列表,列表(字符串)中的每一个元素和第一个函数进行运算,第一个函数返回的是一个布尔值,true则保留,false则略过

text = "i23!@!@l223o2323v223@@e2323p23@y@#@#t@#@#h&893o934872384*&(*^&%n"
#我们用到了str.isalpha这个函数,用户判断一个值是否为字符串
print filter(str.isalpha,text)
#输出的结果为 ilovepython

下面演示一下map高阶函数

#随机产生10个数的列表
l = [random.randint(0,100) for i in range(10)]
#定义一个函数,每个数
def sub50(x):
    return x-50
#每个l里的元素都会执行一遍sub50,然后将执行后的结果返回一个list
list1= map(sub50,l)

3匿名函数(lambda)

用法:

#lambda为关键字,x和y为参数,如果x<y则返回x,否则返回y
lower = (lambda x,y: x if x <y else y )
lower(2,3)

4回调函数

将函数作为参数

def func1(callback):
    print "func1 begin"
    callback()
    print "func1 end"
def func2():
    print "func2"
func1(func2)
#输出
#func1 begin
#func2
#func1 end

5闭包和装饰器

闭包:

绑定外部变量的函数

举例

#pow_x范围内部函数echo.
def pow_x(x):
    def echo(value):
        return value ** x
    return echo
lst = [pow_x(2),pow_x(3),pow_x(4)]
for p in lst:
    #打印p的平方、立方、四次方
    print p(2)

闭包三个特点

  1. 嵌套函数,一个外部函数包含一个内部函数
  2. 内部函数用到了外部变量
  3. 外部函数返回内部函数

装饰器:
将函数装饰一个,所以需要两个函数,一个充当装饰器,一个重装需要装饰的函数

#coding:utf-8
#装饰器
def decorator(f):
    print "before f() called"
    return f
@decorator
#被装饰的函数
def myfunc2():
    print "my func2() called"
myfunc2()
#打印结果
before f() called
my func2() called

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注