Python核心编程笔记(第11章 函数)

采用书籍Python核心编程(第二版),人民邮电出版社,2008年7月第1版。本书以Python2.5为主,但笔记主要以Python3.6为主。

第11章 函数和函数式编程

11.1 函数

  1. 函数是对程序逻辑进行结构化或过程化的一种编程方法,易于管理
  2. 一般来说,过程和函数类似。过程是没有返回值的,函数有返回值。但是,在Python中,过程就是函数,因为解释器会隐式地返回None
# 1.隐式返回None
def hello():
    print('hello')
res = hello()
print(res) # None
# 2.可以返回一个值或对象
def foo():
    return 123
def foo():
    return (123, 'ben') # 等价于return 123,'ben'
# 3.许多静态类型的语言主张一个函数的类型就是其返回值的类型,而Python是动态地确定类型而且函数能返回不同类型的值。

11.2 调用函数

  1. 函数操作符:小括号()。函数名后跟着()表示调用,表示该函数是可调用的或可执行的。Python中一切皆对象,函数名也是对象;如果一个对象后可以加上小括号执行,表示该对象是可执行的(callable)
  2. 位置参数:普通形式的参数,没有默认值。调用时可以按参数顺序传入数据,也可以按关键字形式传入(x=123,按关键字传入可以不按顺序)。如果混合使用,需把关键字参数至于最后
  3. 默认参数:声明了默认值的参数,调用时可以不传入参数
  4. 可变参数、关键字参数和命名关键字参数。Python教程 - 函数的参数 - 廖雪峰的官方网站

11.3 创建函数

  1. 创建函数:def function_name(args): …
  2. Python中函数声明和定义视为一体。变量声明和定义也是一体。
  3. 和其他高级语言类似,Python不允许在函数未声明之前,对其进行引用和调用。
  4. 函数拥有属性,用句点属性(.)表示进行访问。可以把函数看作一个命名空间(namespace),在该空间里包含了函数的属性。
  5. 内部函数。除非对内部函数有外部引用,否则只能在外部函数内进行调用
  6. 装饰器:Python装饰器
def function_name(arguments):
    '''function doc'''
    pass

def foo():
    '''foo function'''  # 隐式地在函数命名空间操作
    __doc__ =  '''foo function''' # 这不是在函数命名空间操作,而是在函数内定义了一个临时变量
foo.__version__ = '1.0' # 显式地在函数命名空间操作,定义了一个版本变量
print(foo.__doc__)
print(foo.__version__)

11.4 传递函数

  1. 函数也是对象,可以被引用,通过引用来传递
  2. 函数对象的引用——foo,函数对象的调用——foo()
def foo():
    print('foo')
print(foo) # 打印foo引用的函数对象
foo() # 调用foo引用的函数
bar = foo # 通过赋值引用相同的函数对象
bar()

11.5 函数参数

Python函数参数
Python教程 - 函数的参数 - 廖雪峰的官方网站

11.6 函数式编程

  1. 匿名函数与lambda:创建匿名函数lambda args: expression
  2. 内建函数:过滤函数filter()、映射函数map()、叠加计算函数reduce()
  3. 偏函数:把其他函数的部分参数默认化,便于使用
myadd = lambda x,y: x+y
print(myadd)
res = myadd(1, 2)
print(res)

def odd(n):
    return n % 2
res = list(filter(odd, list(range(10))))
print(res)

res = list(map(lambda x: x**2, [0, 1, 2, 3, 4, 5]))
print(res)
res = list(map(lambda x,y: x+y, [1,3,5], [2,4,6]))
print(res)

from functools import reduce 
l1=[0, 1, 2, 3, 4, 5, 6]
def add(x,y):
    return x + y
print(reduce(add, l1))

from functools import partial
from operator import add
add1 = partial(add, 1)
add1(10)
add1(100)

11.7 变量作用域

  1. 标识符的作用域定义为其声明在程序里的可应用范围,也就是我们所说的变量可见性
  2. 全局变量与局部变量:当搜索一个变量名的时候,Python解释器先从局部作用域开始搜索;如果在局部作用域内没有找到改变量名,就会在全局域搜索这个变量名;如果在全局域也找不到则抛出 NameError 异常。
  3. global语句:如果将全局变量在一个函数内声明,那么全局变量会被局部变量给覆盖。由于Python动态性,要在局部明确引用一个已命名的全局变量,必须使用global var1, var2, …
  4. 闭包(closure):如果在一个内部函数里,对外部作用域(但不是全局作用域)的变量进行引用,那么内部函数就被认为是闭包。

11.8 生成器

暂略。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值