python中的函数
2021-03-13 13:29
标签:值类型 oat %s 没有 方式 架构 dex 初始 结果 * ** python中的函数 标签:值类型 oat %s 没有 方式 架构 dex 初始 结果 原文地址:https://www.cnblogs.com/syy1757528181/p/14059468.html函数
#什么函数
函数就是有某个具体功能的工具
函数必须先定义,后面才能调用,并且在任意位置调用
#为什么要用函数
减少某一特定功能的代码冗余
使函数的调用更加方便,提高开发效率
提高程序的扩展性
#定义函数
#使用关键字 def
#函数名与变量名类似,命名规则相同
#该过程不会执行代码,只会检测语法
def func(x,y):
"""
函数的作用
:param x: 对形参x的解释
:param y: 对形参y的解释
:return: 对函数的返回值类型的解释
"""
函数体代码
res = func()
print(res) #None
print(help(func)) #查看函数体内的注释
空函数,可用于构建项目架构
def func():
pass
def func():
...
#调用函数,执行函数体代码
test()
#变量,可以通过变量名找到变量对应的值
#函数,可以通过函数名+括号,找到函数体所对应的代码,并执行
#注意调用函数的时候,到底要不要加括号
#递归深度
def index():
print(‘index‘)
index()
index() #RecursionError:
自定义函数与内置函数
#自定义函数
l = [1,2,3,4,5]
def my_len():
n = 0
for i in l:
n+=1
print(n)
my_len() #5
a = my_len()
print(a) #None
#内置函数
l = [1,2,3,4,5]
print(len(l)) #5
a = len(l)
print(a) #5
#区别:
1.没有返回值,只能固定的执行打印操作
2.只能固定的统计某一个容器类型的长度
函数的返回值
#函数内想要返回给调用者值,必须使用关键字 return
#函数内的print()打印出来的结果,不是函数的返回值,而是函数体代码执行的结果
def func():
print(‘from func‘)
res = func()
print(res)
print(func())
from func
None
from func
None
def func():
return ‘from func‘
res = func()
print(res)
print(func())
from func
from func
def func():
print(func)
def index():
return func
res1 = func()
print(res1)
res = index()
print(res)
函数参数的两大类型
#自定义函数
l = [1,2,3]
def my_len():
n = 0
for i in l:
n+=1
return n
a = my_len()
print(a)
#参数
def my_len(args): #args 为形参,在函数的定义阶段,括号写的‘变量名‘
print(args)
a = my_len(123) #123 为实参,在函数的调用阶段,括号内实际传入的‘值‘
print(a)
#形参与实参的关系;
形参相当于变量名,而实参就相当于变量的值,形参 = 实参
形参与实参的‘绑定关系‘只在函数的‘调用阶段‘有效,函数运行结束,该关系自动解除(只在函数体内部有效,函数外部无任何影响)
#优化自定义函数
l = [1,2,3]
def my_len(args):
n = 0
for i in args:
n+=1
return n
a = my_len(‘hahaha‘)
print(a) #6
位置参数
#函数定义阶段,按照位置从左向右,依次列出的变量名,叫做函数的位置参数(形参)
#在函数的调用阶段,位置参数少一个不行,多一个也不行(实参)
def my_max(x,y):
if x > y:
return x
else:
return y
res = my_max(2,3) #按位置传参
print(res)
def my_max(x,y):
return x,y
res = my_max(y=1,x=3) #指名道姓的传参(关键字参数)
print(res)
def my_max(x,y):
return x,y
res = my_max(1,y=3) #混用的方式传参(位置参数必须在关键字参数前面,且不能重复赋值)
print(res)
默认值参数
#在函数的定义阶段,形参(变量名)就已经被赋值了
#在函数的调用阶段,可以不给该形参赋值,默认使用该函数在定义阶段就已经绑定的值
#在函数的调用阶段,也可以给该形参赋值,如果赋值就是用新的赋值
#位置参数的格式
def my_max(x,y=100):
if x > y:
return x
else:
return y
res = my_max(10)
print(res)
-------------------------------------------------------------------------
#位置参数的实际使用
def register(username,age,gender):
print(username,age,gender)
register(‘syy‘,18,‘male‘)
register(‘kk‘,28,‘male‘)
register(‘ee‘,58,‘male‘)
register(‘xiaohou‘,17,‘female‘)
代码优化,减少代码冗余
def register(username,age,gender=‘male‘):
print(username,age,gender)
register(‘syy‘,18)
register(‘kk‘,28)
register(‘ee‘,58)
register(‘xx‘,17,‘female‘)
-------------------------------------------------------------------------
def info(username,hobby,l=[]):
l.append(hobby)
print(‘%s的爱好是: %s‘%(username,l))
info(‘syy‘,‘run‘)
info(‘ee‘,‘女教练‘)
info(‘hh‘,‘逗比‘)
代码优化1
def info(username,hobby,l=[]):
l.append(hobby)
print(‘%s的爱好是: %s‘%(username,l))
info(‘syy‘,‘run‘,[])
info(‘ee‘,‘女教练‘,[])
info(‘hh‘,‘逗比‘,[])
代码优化2
def info(username,hobby,l):
if l == None:
l = []
l.append(hobby)
print(‘%s的爱好是: %s‘%(username,l))
info(‘syy‘,‘run‘,[])
info(‘ee‘,‘女教练‘,[])
info(‘hh‘,‘逗比‘,[])
-------------------------------------------------------------------------
#函数在定义阶段,内部所有使用的变量都已经初始化完毕了,不会因为调用的位置的变化,而影响到内部的值
#函数无论在什么位置被调用,都会到函数定义阶段去执行代码,形参中用到的值都是从函数定义阶段向上找
m = 999
def my_max(x,y=m):
if x > y:
print(x)
else:
print(y)
m = 888
my_max(10) #999
可变长参数(动态参数)
#在形参中,可以使用*来接收多余的位置参数
#形参中的*,会将多余的实参,统一用元组的形式处理,传递给*后面的形参
def func(x,y,*z):
print(x,y,z)
func(1,2,3,4,5) #1 2 (3, 4, 5)
def func(x,y,*z):
print(x,y,z)
func(1,2,z=3) #TypeError:
#在实参中,*会将列表打散成实参中的位置参数
#*相当于是一个 for循环
def func(x,y,z):
print(x,y,z)
func(1,2,3) #1 2 3
def func(x,y,z):
print(x,y,z)
func(*[1,2,3]) #1 2 3
def func(x,y,z):
print(x,y,z)
func(*{‘name‘:‘syy‘,‘age‘:18,‘hobby‘:‘run‘}) #name age hobby
#在形参中,**会接收多有多余的关键字参数,并将关键字参数转换成字典的形式
#变量名就是字典中的key,变量值就是字典中的value,再将字典复制给**后面的变量名
def func(x,y,**z):
print(x,y,z)
func(1,2,z=1,a=2,b=3) #1 2 {‘z‘: 1, ‘a‘: 2, ‘b‘: 3}
#在实参中,**会将字典拆分成 key=value的形式
def func(x,y,z):
print(x,y,z)
func(1,2,3)
func(x=1,y=2,z=3)
func(**{‘x‘:1,‘y‘:2,‘z‘:3})
*和**的总结
#*和**的总结
1.*在形参中,能接收多余的‘位置参数‘,组织成一个‘元组‘,赋值给*后面的变量名
2.**在形参中,能接收多余的‘关键字参数‘,阻止成一个‘字典‘.赋值给**后面的变量名
3.*在实参中,能将‘字符串、 列表、元组、集合‘打散成实参中的位置参数(*相当于for循环)
4.**在实参中,能将‘字典‘打散成 ‘key=value‘ 的形式
def func(*args,**kwargs):
print(args,kwargs)
func(1,2,3,x=1,y=2,z=3) #(1, 2, 3) {‘x‘: 1, ‘y‘: 2, ‘z‘: 3}
命名关键字参数
#在函数定义阶段,写在可变长参数*与**之间的形参
#只能使用关键字参数给命名关键字参数传值
#下面的z=3,m 不是默认参数、位置参数,而是命名关键字参数
def func(x,y,*args,z=3,m,**kwargs):
print(x,y) #1 2
print(args) #(1, 2, 3, 4, 5)
print(z,m) #333 444
print(kwargs) #{‘k‘: 111, ‘v‘: 222}
func(1,2,1,2,3,4,5,z=333,m=444,k=111,v=222)