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

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

程序员文章站 2022-07-12 22:47:31
...

采用书籍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 生成器

暂略。

相关标签: Python 函数