Python核心编程笔记(第11章 函数)
程序员文章站
2022-07-12 22:47:31
...
采用书籍Python核心编程(第二版),人民邮电出版社,2008年7月第1版。本书以Python2.5为主,但笔记主要以Python3.6为主。
第11章 函数和函数式编程
11.1 函数
- 函数是对程序逻辑进行结构化或过程化的一种编程方法,易于管理
- 一般来说,过程和函数类似。过程是没有返回值的,函数有返回值。但是,在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 调用函数
- 函数操作符:小括号()。函数名后跟着()表示调用,表示该函数是可调用的或可执行的。Python中一切皆对象,函数名也是对象;如果一个对象后可以加上小括号执行,表示该对象是可执行的(callable)
- 位置参数:普通形式的参数,没有默认值。调用时可以按参数顺序传入数据,也可以按关键字形式传入(x=123,按关键字传入可以不按顺序)。如果混合使用,需把关键字参数至于最后
- 默认参数:声明了默认值的参数,调用时可以不传入参数
- 可变参数、关键字参数和命名关键字参数。Python教程 - 函数的参数 - 廖雪峰的官方网站
11.3 创建函数
- 创建函数:def function_name(args): …
- Python中函数声明和定义视为一体。变量声明和定义也是一体。
- 和其他高级语言类似,Python不允许在函数未声明之前,对其进行引用和调用。
- 函数拥有属性,用句点属性(.)表示进行访问。可以把函数看作一个命名空间(namespace),在该空间里包含了函数的属性。
- 内部函数。除非对内部函数有外部引用,否则只能在外部函数内进行调用
- 装饰器: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 传递函数
- 函数也是对象,可以被引用,通过引用来传递
- 函数对象的引用——foo,函数对象的调用——foo()
def foo():
print('foo')
print(foo) # 打印foo引用的函数对象
foo() # 调用foo引用的函数
bar = foo # 通过赋值引用相同的函数对象
bar()
11.5 函数参数
Python函数参数
Python教程 - 函数的参数 - 廖雪峰的官方网站
11.6 函数式编程
- 匿名函数与lambda:创建匿名函数lambda args: expression
- 内建函数:过滤函数filter()、映射函数map()、叠加计算函数reduce()
- 偏函数:把其他函数的部分参数默认化,便于使用
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 变量作用域
- 标识符的作用域定义为其声明在程序里的可应用范围,也就是我们所说的变量可见性
- 全局变量与局部变量:当搜索一个变量名的时候,Python解释器先从局部作用域开始搜索;如果在局部作用域内没有找到改变量名,就会在全局域搜索这个变量名;如果在全局域也找不到则抛出 NameError 异常。
- global语句:如果将全局变量在一个函数内声明,那么全局变量会被局部变量给覆盖。由于Python动态性,要在局部明确引用一个已命名的全局变量,必须使用global var1, var2, …
- 闭包(closure):如果在一个内部函数里,对外部作用域(但不是全局作用域)的变量进行引用,那么内部函数就被认为是闭包。
11.8 生成器
暂略。
上一篇: JLDAP/TLS