函数 function
定义:函数是可以重复执行的语句块,可以重复使用。
作用:1.用于封装语句块,提高代码的重用性
2.定义用户级别的函数
函数定义(创建)语句def语句的语法:
def 函数名(形参列表):
语句块
说明:1.函数的名字就是语句块的名称
2.函数名的命名规则与变量名相同(函数名必须为标识符)
3.函数有自己的名字空间,在函数外部不可以访问函数内部的变量,在函数内部可以访问函数外部的变量,通常让函数处理外部数据需要用参数传入一些数据
4.函数的参数列表可以为空
5.语句块部分不能为空,如果为空需要填充pass语句
函数的调用
函数名(实际调用传递参数列表)
注: 实际调用传递参数以后称为实参
说明:
函数调用是一个表达式
如果没有return语句,次函数执行完毕后会返回None对象
如果函数需要返回其它的对象需要用到return语句
return语句
语法:return[表达式]
作用:用于函数中,结束当前函数的执行,返回到调用该函数的地方,同时返回一个对象的引用关系
说明:
1.return语句后跟的表达式可以省略,省略后相当于return None
2.如果函数没有return语句,则函数执行完最后一条语句后返回None(相当于在最后加了一条return None语句)
3.函数调用一定会返回一个对象的引用
python函数的参数传递
传递方式 : 位置传递 序列传参
关键字传参 字典关键字传参
函数的实参
位置传参:
实际参数(实参)的对应关系与形式参数(形参)的对应关系是按位置来依次对应的。
示例:
def myfun(a,b,c):
pass
myfun(1,2,3)
说明: 实际参数和形式参数通过位置进行传递的匹配
实参个数与形参个数相同
序列传参:
序列传参是指在函数调用过程中,用 * 将序列拆解后按位置传参的方式进行参数传递
示例:
def myfun(a,b,c):
pass
s = [1, 2, 3]
myfun( *s ) # * 表示把s拆开
s2 = “ABC”
myfun( *s2)
关键字传参:
关键字传参是指传参时,按着形参的名称给形参赋值
实参和形参按名称进行匹配
示例:
def myfun(a, b, c):
pass
myfun(b = 22, c= 33, a = 11) #等同于myfun(11,22,33)
myfun(c = 3,b = 2, a = 1)
说明: 实参和形参可以不按位置匹配
字典关键字传参:
是指实参为字典,将字典用 ** 拆解后进行拆解后进行关键字传参
示例:
def myfun(a, b, c):
pass
d = { ‘c’ : 33 , ‘b’ : 22 , ‘a’ : 11 }
myfun( **d ) # 拆解字典后再传参
说明: 字典的键名和形参名必须一致
字典键名必须为字符串
字典的键名要在形参中存在
函数的综合传参(传参时先位置传参,后关键字传参)
函数传参方式,在能确定形参能唯一匹配到相应实参的情况下可以任意组合
示例:
def myfun(a, b, c)
pass
myfun(100, *[200, 300) ) # 正确
myfun(b = 2, c = 3, 1) # 错误,不能确定1 给谁
函数的形参(如何接受实参)
函数的缺省参数
语法: def 函数名(形参名1 = 默认实参1,形参名2 = 默认实参2, ………):
………
示例:
def info(name,age = 1,address = ‘未填写’):
print(name,’今年’,age,’岁,家庭住址是:’, adress)
info(‘xiaowang’,15)
info(‘小魏’, 28, ‘北京市朝阳区’)
info(’小李’)
说明: 1.缺省参数必须自右至左依次存在,如果一个参数有缺省参数,则其右侧的所有参数都必须有缺省参数
2.缺省参数可以有0个或多个,甚至全部都有缺省参数
如:
def test(a,b = 10,c): # --- 是错的
pass
函数的形参定义形式:
位置形参
星号元组形参
命名关键词形参
双星号字典形参
位置形参:
语法: def 函数名(形参名1,形参名2,…….)
语句块
星号元组形参:
语法: def 函数名(*元组形参名)
语句
作用: 收集多余的位置传参
说明: 元组形参名通常用:’args’ 以元组的形式接收所有的位置传参
命名关键字形参
语法:
def 函数名(,命名关键字形参)
语句
或: def 函数名(args,命名关键字形参)
语句
作用:所有的参数都必须用关键字传参或字典关键字传参传递
双星号字典形参:
语法: def 函数名(**字典形参名):
语句
作用: 收集多余的关键字传参
说明: 通常字典形参名定为:”kwargs” 以字典的形式接收所有的关键字传参,保存在kwargs中。
函数的参数说明:
缺省参数,位置形参,星号元组形参,命名关键字形参和双星号字典形参可以混合使用。
函数参数从左至右的顺序为:
位置形象
星号元组形参
命名关键字形参
双星号关键字形参
综合示例:
def f1(a,b,*args,c,**kwargs):
pass
f1(1,2,3,4,d = 6,c = 5,e = 7)
函数的不定长参数:
def fn( *args , **kwargs) : #可以接收任意的位置传参和关键字传参
pass
全局变量和局部变量
局部变量:定义在函数内部的变量成为局部变量(函数的形参也是局部变量)
局部变量只能在函数内部使用
局部变量在函数调用时才能够被创建,在函数调用之后会自动销毁
全局变量:定义在函数外部,模块内部的变量称为全局变量
全局变量,所有的函数都可以直接访问(但函数内部不能将其直接赋值)
局部变量说明:
1.在函数内首次对变量赋值是创建局部变量,再次为变量赋值是修改变量的绑定关系
2.在函数内部的赋值语句不会对全局变量造成影响
3.局部变量只能在其被声明的函数内部访问,而全局变量可以在整个模块范围内被访问
globals和locals函数
globals()返回当前全部作用域内变量的字典
locals()返回当前局部作用域内变量的字典
函数变量
函数名是变量,它在创建函数时绑定一个函数
一个函数可以作为另一个函数的参数传递
函数可以返回另一个函数(即:另一个函数可以返回一个函数)
函数的嵌套定义:
函数的嵌套定义是指一个函数里用def语句来创建其他的函数
Python作用域
作用域也叫名字空间,是访问变量时,查找变量名的范围空间
四个作用域:
局部作用域 local function L
外部嵌套函数作用域 Enclosing function locals E
函数定义所在模块(文件)的定义域 Global (Mudule) G
python内置模块的作用域 Builtin(python) B
变量名的查找规则:
L E G B
在默认情况下,对变量名赋值会创建或改变本作用域内的变量
global语句
作用:1.告诉解释器,global语句声明的一个或多个变量,这些变量的作用域为模块级的作用域,也成全局变量
2.全局声明(global)将赋值变量映身到模块文内部的作用域
语法: global 变量1 ,变量2
global说明
1.全局变量如果要在函数内部被赋值,则必须经过全局声明(否则会被认为是局部变量)
2.全局变量在函数内部不经过声明就可以直接访问
3.不能先声明局部的变量,再用global声明为全局变量,此做法不符合规则
4.global变量列表里的变量不能出现在此作用域内的形参列表里
nonlocal语句
作用:告诉解释器,nonlocal声明的变量不是局部变量,也不是全局变量,而是外部嵌套函数内的变量
语法: nonlocal 变量名1, 变量名2 …….
nonlocal说明
1.nonlocal 语句只能在被嵌套的函数内部使用
2.访问 nonlocal 变量将对外部嵌套函数的作用域的变量进行操作
3.当有两层或两层以上的函数嵌套时,访问 nonlocal 变量只对最近一层的变量进行操作
4. nonlocal 语句的变量列表里的变量名,不能出现在此函数的参数列表中
lambda表达式(又称匿名函数)
作用: 创建一个匿名函数对象 同def类似,但不提供函数名
语法: lambda [参数1,参数2,……]: 表达式 [ ]的内容可以省略
示例: def myadd(x, y):
return x + y
可以改写为: myadd = lambda x , y : x + y
语法说明:
1.lambda只是一个表达式,它用来创建一个函数对象
2.当lambda表达式被调用时,先执行冒号后(:)的表达式,并返回表达式的结果的引用
3.lambda 表达式创建的函数只能包含一条“表达式”
4.lambda比函数简单,且可以随时创建和销毁,有利于减少程序的耦合度
eval()和exec()函数
eval()函数
格式: eval(source,global=None,local=None) source表示字符串
作用:把一个字符串当成一个表达式来执行,返回表达式执行后的结果,如果该字符串不是表达式,则会报错。
exec()函数
格式:exec(source,global=None,local=None)
作用:把一个字符串当成程序来执行。
eval 和~的两个参数 globals 和 locals
此两个参数是用来设置‘表达式’或‘程序’运行的全局变量和局部变量
第二个参数和第三个参数必须是一个字典
函数式编程:
函数式编程是指用一系列函数决定问题
函数是一等公民:
函数本身可以赋值给变量,赋值后变量绑定函数
允许将函数本身作为一个参数传入另一个函数
允许返回一个函数
函数的可重入性:
可重入是指一个函数传的参数一定,则结果必须一定
要求:def定义的函数不要访问局部变量以外的变量
高阶函数 High Order Function
什么是高阶函数: 满足下列条件中的任一个的函数
1.函数接受一个或函数作为参数传入
2.函数返回一个函数
Python中内建的高阶函数: map filter sorted
map函数;
map(func,iterables)用函数和可迭代对象中的每一个元素作为参数计算出新的可迭代对象,当最短的一个可迭代对象不再提供数据时,此可迭代对象生成结束。(可迭代对象可以用多个m*iterable
表示星号元组形参)
filter函数
格式: filter(func,iterable)
作用:帅选可迭代对象iterable中的数据,返回一个可迭代对象,此可迭代对象将对iterable
进行筛选。
说明:函数 func 将对每个元素进行求值,返回False则将此数据丢弃,返回True则保留此数据。
示例:
def isodd(x): # 此函数判断会是否为奇数
return x%2 == 1
for in x filter(isodd,range(10)):
print(x)
even = [ x for x in filter ( lambda x : x % 2 = 0, range ( 1, 10 ) ) ] #返回偶数列表
sorted函数:
作用: 将原可迭代对象的数据进行排序,生成排序后的列表
格式:sorted(iterable,key = None,reverse = False)
说明:key函数是用来提供一个参考值,这个值将作为排序的依据
reverse 标志用来设置是否降序排序
递归函数 recursion
函数直接或间接的调用自身
递归说明:递归一定要控制递归的层数,当符合某一条件时要终止递归,几乎所有的递归都能用while循环来代替。递归函数一定是从哪开始运行到最后然后原路返回。
递归的优缺点
优点:递归可以把问题简单化,让思路更为清晰,代码更简洁
缺点:递归因系统环境影响大,当递归深度太大时,可能会得到不可预知的结果。
递归函数的实现方法:先假设函数已经实现。
闭包 closure
将内嵌函数的语句和这些语句的执行环境打包在一起时,得到的对象称为闭包(closure)
闭包必须满足三个条件:
1.必须有一个内嵌函数
2.内嵌函数必须引用外部函数中的变量
3.外部哈数返回值必须是内嵌函数
def make_power(y):
def fx(arg):
return arg ** y
return fx
装饰器 decorators(专业提高篇)
函数装饰器是指装饰的是一个函数,传入的是一个函数,返回的也是一个函数的函数。
函数装饰器的语法:
def 装饰器函数名(参数):
语句块
return 函数对象
被装饰函数的语法
@装饰器函数名
def 函数名(形参列表):
语句块
示例:
def mydeco(fn):
def fx():
print(‘++++++++’)
fn( )
print( ‘---------------’ )
return fx
函数的文档字符串
函数内部,第一个没有赋值给任何变量的字符串为文档字符串。
语法:
def 函数名(形参列表):
‘’’ 函数的文档字符串 ‘’’
函数语句块
函数的__doc__属性
__属性__用于绑定该函数的文档字符串
示例:
def fx(a,b):
'''这是函数的文档字符串
这是第二行.......
'''
pass
print(fx . __doc__)
函数的__name__属性:
__name__属性用于绑定函数名的字符串
函数定义语句(def语句的语法)
[@装饰器名1]
[@装饰器名2]
…
def 函数名([ 位置形参 ] , [*[元组形参名]], [ 命名关键字形参 ] , [ **字典形参 ] ):
‘’’文档字符串’’’
语句块
[ ] 里的代表可以省略
#默认参数(缺省参数)绑定在函数对象内部,其随函数的生命一起存在。
解决办法 先将默认参数(缺省参数)定义一个None值,然后再用一个if语句来进行判断,如果传递的值仍为None,则令默认参数(缺省参数)接受原来想要赋予的值或者列表