Python 核心编程[第十一章]
0x00函数
过程常常指没有返回值的可被调用的实体,然而函数则与之不同,常常指有返回类型的可调用实体。在 Python 中,说有的函数都有返回值,即使它没有明确的指出返回值,此时它会返回 None。不过 Python 也可以返回一个或多个对象,当返回多个对象时,实质上也是返回了一个对象,该对象是返回的多个对象组成的一个元组。
0x01函数定义
一、函数创建
1.def 语句
def xxx():
"xxxxxx"
print()
#"关键字" 函数名 函数操作符(参数集合):
#文档字符串
#函数体 属性以及函数语句
2.传递函数
函数可以被当作一个对象赋值给一个变量,并且也可以把函数名赋值给另一个变量达到给该函数取别名的效果,函数也可以被当作其他函数的参数进行传递。
二、参数
1.位置参数
在函数调用进行参数传递时,必须严格按照函定义中的参数的位置以及个数进行相应的传递,否则则会出现错误。位置参数必须放置在关键字参数之前。
2.默认参数
默认参数是声明了默认值的参数。并且在函数调用时,也可以不向该参数传值。
# 例:
def A(a = 111,b):
print(a+b)
3.关键字参数
关键字参数概念只针对函数的调用,用给函数参数赋值的方式进行函数调用。
#例:
def A(a,b):
print(a+b)
A(a=1,b=2)
A(b=1,a=2) #这样写也不会出错
4.参数组
Python 允许执行一个没有显示定义参数的函数,相应的方法是通过一个把元组或字典作为参数组传递给函数。在函数声明中使用 * 和 ** 符号来指定元组和字典的元素作为非关键字以及关键字参数的方法。
# 这里只是给出了声明形式,这样写在调用 print 时可能出现错误,请自行修改
# 可变长的参数元组必须在位置参数和默认参数之后
# 元组类型
def A(arg1 ,arg2 ,*arg):
print(arg1,arg2,arg)
# 字典类型 ** 必须在 * 后边定义
def B(arg1, **arg):
print(arg1,arg.key,arg[arg.key])
def C(arg, *arga, **argb):
pass
C(1,*(1,2),**{1,'A',2,'B'})
a = (1,2)
b = {1,'A',2,'B'}
C(1,*a,**b)
三、内嵌函数
在函数体内创建另一个函数是合法的,这种函数叫做内嵌函数。
def A():
def B():
print('xxxxx')
B()
0x02函数式编程
Python 提供的以四种内建函数和 lambada 表达式的形式出现。
一、匿名函数与 lambda
lambda [arg1[,rag2, ... argN]]:expression
Python 允许用 lambda 关键词创造匿名函数。匿名是因为不需要以标准的方式来声明,比如使用 def 语句。作为函数,它们也有参数。一个完整的 lambda “语句”代表了一个表达式,这个表达式的定义体必须和声明放在同一行。
def true():return True <=> lambda :True
匿名函数的使用:
xxx = lambda:True
def add(x,y):return x+y <=>lambda x,y:x+y
二、内建函数 apply()、filter()、map()、reduce()
这些函数提供了在 Python 中可以找到的函数式编程的特征。lambda 函数可以很好的和使用了致谢函数的应用程序结合起来,因为它们都带了一个可执行的函数对象,lambda表达式提供了迅速创造这些函数的机制。
1.filter()
filter(fun,seq)
对给定的一个序列通过指定函数进行筛选,并返回符合指定函数条件的一个新的序列(满足该条件的原序列中的元素组成的新的序列)。
# 例:选出偶数
from random import randint
Nums = []
for Num in range(9):
Nums.append(randint(1,99))
print(filter(lambda n:n%2,Nums))
# 由于列表解析特别方便所以也可以写成下列形式
from random import randint as r
print([n for n in[r(1,99) for i in range(9) if n%2]])
2.map()
map(func,seq1[,seq2...])
对给定的一个序列通过指定函数进行改变,并返回通过指定函数改变后的新序列。当 func 为 None 时,seq 为单个时,返回的时原序列。当 func 为多个时,返回的是多个序列对应元素组成的元组形成的新序列。
zip(a,b) <=> map(None,a,b)
3.reduce()
A = [a,b,c,d]
def func(): xxx
reduce(func,A)
<=>
func(func(func(a,b),c),d)
0x03变量作用域
一、全局变量与局部变量
1.全局变量
全局变量的一个特征是除非被删除掉,否则它们存活到脚本运行结束,且对于所有的函数,它们的数值都是可以被访问的。
2.局部变量
局部变量就像暂存在栈中,只是暂时存在,仅仅依赖于它们的函数现阶段是否处于活动。当一个函数调用出现时,其局部变量就进入声明它们的作用域。即,在被调用的那一时刻局部变量被创建,调用完成,局部变量离开作用域。
二、globa语句
如果将全局变量的名字声明在一个函数体内的时候,全局变量的名字能被局部变量给覆盖掉。即、在函数内部想要更改全局的变量时,在函数内部定义一个相同变量名的变量,对函数内部定义的变量进行修改不会对全局变量造成影响。
所以,在函数内部想要对全局变量进行修改时可以在函数内部如下定义:
A = 123
def a():
folba A
A = A +1
# 这样定义便会对 A 进行改变。
三、lambda 作用域
lambda 匿名函数中的变量作用域同普通函数中的变量的作用域是相同的。