Python是个啥-第五章 函数(1)
第五章 函数
函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。
函数能提高应用的模块性,和代码的重复利用率。你已经知道Python提供了许多内建函数,比如print()。但你也可以自己创建函数,这被叫做用户自定义函数。
5.1 函数介绍
5.1.1 函数特征
将N行代码拿到别处并命名,通过代码调用的方式执行。
5.1.2 使用场景
- 代码重复执行。
- 代码量特别多(超过一屏),可用函数分割。
5.2函数的基本结构
5.2.1函数定义
def 函数名 (): #函数名的命名规则和变量一致
#函数描述
pass
函数名() #函数执行
def check():
#check函数测试
print('111')
check() #函数调用,如果函数不被调用,则函数代码永远不会执行
5.2.2 函数的返回值
return() #返回值,如果没有定义返回值,返回值默认返回Null。
print和return的区别:print 仅仅是打印在控制台,而 return 则是将 return 后面的部分作为返回值作为函数的输出,可以用变量接走,继续使用该返回值操作。
函数在执行过程中如果遇到了return,则后面的代码不再继续执行。
#输入一个字符串计算X的个数
def lences(arg):
data = input(">>")
if len(data) == 0:
return False
else:
count=data.count(arg)
return True
print(lences('X'))
5.2.3 函数作用域
作用域即作用的区域,也可以理解为全局参数局部参数。全局作用域作用域全局,一般放在页面的头部,局域作用域作用域区域内部,例如函数作用域,即函数内部的参数,只作用域函数内部。
作用域查找规则,有限自己的作用域查找,如果没有就去父作用域超找,如果还是没有就想再上级的作用域超找,直至根作用域(全局变量)。
python中一个函数是一个作用域.
定义规范:全局变量改成全大写
x=1
def list1():
print('x=%s'%x)
def list2():
# print(x) #这样会报错,如果函数内部没有定义全局参数则可以直接调用,如果函数内部有对全局参数重新定义则需要先定义之后再调用,所以变量需要定义在函数的起始位置
x=0
print('x=%s'%x)
list1() #x=1
list2() #x=0
print('x=%s'%x) #x=1
5.2.4 强制作用域 (强力建议不要这样用)
函数内部定义的变量强制作用域全局输入global 变量名,定义变量。
x=1
def list1():
global x
x=0
print('x=%s'%x)
list1() x=0
print(x) x=0
nonlocal 作用于父域,应用于函数嵌套
5.3 函数的参数
5.3.1 函数参数介绍
函数参数包含形参和实参两种,可以是任意数,任意类型。
-
形式参数(形参)
-
实际参数(实参)
def check(msg): #msg形参 #check函数测试 print(msg) check('实参') #函数调用,如果函数不被调用,则函数代码永远不会执行
5.3.2 位置参数
-
关键字穿参,
def func(name,age): print(name,age) func(age=99,name='playon',) #关键字传参,参数位置可以不按照顺序
-
位置传参,位置一一对应
def func(name,age) print(name,age) func('playon','99') #位置传参必须以一对应
-
混合传参
位置参数必须在关键字传参前面,否则会报错。def func(name,age): print(name,age) func('allen',age=99) #位置参数必须在关键字传参前面,否则会报错。 #func(age=99,'allen',) #错误 #func(name='allen',19) #错误
-
默认参数
默认参数可以传入实参也可以不传入实参,不传入的时候按照默认值执行。def func(name,age=23): print(name,age) func('allen') #按照默认执行age=23 func('allen','21') #实参传入age=21 func('allen',age=22) #关键字传参,实参传入age=22
-
万能参数( * 和 ** )
*args(一般规范):可以接受任意一个数的参数,并将参数转换成元组,并且只能用位置传参.**kwargs (一般规范):可以接受任意个数的关键字参数,并将其转换为字典。
def func(*args): print(args) func(1,2,3,4,5,['age','sex',1],'allen') func(*(1,2,3,4,5,['age','sex',1],'allen',) #(1, 2, 3, 4, 5, ['age', 'sex', 1], 'allen'),多值以元组传入函数 def func(a1,*args,a4): print(args) print(a4) func(1,2,3,4,3,a4=55) #a1=1,args=(2,3,4,3),a4=55
def func(**kwargs): print(kwargs) func(**{'k1':'1','k2':2}) # kwargs = {'k1': '1', 'k2': 2} func(k1='1',k2=2) #kwargs = {'k1': '1', 'k2': 2}
-
综合应用
def func(*args,k2=0,**kwargs): print(args) print(k2) print(kwargs) func(k1='1',k2=2,k3='val') #args=(),k2=2,kwargs={'k1': '1', 'k3': 'val'} def func(*args,k2=0,**kwargs): print(args) print(k2) print(kwargs) func(1,2,3,4,5,k1='1',k2=2,k3='val') #args=(1,2,3,4,5),k2=2,kwargs={'k1': '1', 'k3': 'val'} func(*[1,2,3,4,5],k1='1',k2=2,k3='val') #args=(1,2,3,4,5),k2=2,kwargs={'k1': '1', 'k3': 'val'}
-
注意事项
函数的默认参数不要写成可变类型,否则会有陷阱。
def func(a,b=[]): #默认参数包含可变内容 b.append(a) return b v1=func(2) v2=func(2,[11,12]) v3=func(22) print('v1=',v1) #[2] 原则上应该是[2] print('v2=',v2) #[11, 12, 2] 原则上应该是[11,12,2] print('v3=',v3) #[2, 22] 原则上应该是[22] print('v1=',v1) #[2, 22] 原则上应该是[2]
-
递归限制
python默认递归限制1000次
#递归示例 def func(): print(1) func() func()