Python-13-函数<下>_desktop



函数的默认参数Python-13-函数<下>_desktop_02



当我们不想对参数的常用值进行高频传递的时候,我们可以使用默认参数,这样的好处就是可以再调用函数的时候不传递这个参数,但是函数会使用这个参数的默认参数。


比如大多数人都是好人:

def PersonInfo(name,age,is_good=True):  # 传入默认参数is_good=False
if is_good:
tag = 'good people'
else:
tag = 'bad people'
print('welcome ',name,', you are',age,' years old...','[',tag,']')


# 调用,不传is_good参数
PersonInfo(age=18,name='phyger')

# 输出
C:\Users\Administrator\Desktop\document>D:/Python37/python.exe c:/Users/Administrator/Desktop/document/test.py
welcome phyger , you are 18 years old... [ good people ]


# 传入is_good参数
PersonInfo(age=18,name='phyger',is_good=False)


# 输出
C:\Users\Administrator\Desktop\document>D:/Python37/python.exe c:/Users/Administrator/Desktop/document/test.py
welcome phyger , you are 18 years old... [ bad people ]



函数的不定参数Python-13-函数<下>_desktop_02



当我们不确定参数的数量和关键字,或者参数太多不想一一列举时,我们可以用到不定位置参数:*args

例:第一个参数是班级,后面的每个人名都是一个参数,我们想要遍历人名。

def StuInfo(clas_num,*name):    # 不定位置参数*name
for stu in name:
print(clas_num,':',stu)


# 调用,2位班级数字,其余的参数均被*name接收
StuInfo(2,"phyger","shanxi","it")


# 输出
C:\Users\Administrator\Desktop\document>D:/Python37/python.exe c:/Users/Administrator/Desktop/document/test.py
2 : phyger
2 : shanxi
2 : it


你会发现上面的不定参数是按照位置的顺序排的,当我们变换了顺序后会怎么样呢?

def StuInfo(clas_num,*name):
print(clas_num,':','job:',name[0],'home:',name[1],'work:',name[2])


# 调用
StuInfo(2,"phyger","shanxi","it")


# 输出
C:\Users\Administrator\Desktop\document>D:/Python37/python.exe c:/Users/Administrator/Desktop/document/test.py
2 : job: phyger home: shanxi work: it


# 变换顺序调用
StuInfo(2,"phyger","it","shanxi")


# 输出
C:\Users\Administrator\Desktop\document>D:/Python37/python.exe c:/Users/Administrator/Desktop/document/test.py
2 : job: phyger home: it work: shanxi


我们发现变换了不定参数的位置后,参数也会因为位置而发生错乱,怎么解决这个问题呢?请继续往下看。


不定关键字参数:**kwargs

def StuInfo(clas_num,**name):    # 不定关键字参数 **name
print(clas_num,':','job:',name['nam'],'home:',name['home'],'work:',name['work'])


# 调用使用k=格式
StuInfo(2,nam="phyger",work="it",home="shanxi")


# 输出
C:\Users\Administrator\Desktop\document>D:/Python37/python.exe c:/Users/Administrator/Desktop/document/test.py
2 : job: phyger home: shanxi work: it

你会发现,问题已经解决。


总结一下:


*args表示任何多个无名参数,它本质是一个tuple; **kwargs表示关键字参数,它本质上是一个dict;





函数的返回值Python-13-函数<下>_desktop_02



前面我们都是在函数中对计算的结果进行打印,但是如果我们想要将函数中计算的值保存起来,怎么办呢?这个时候就需要用到函数的返回值。

返回值使用return语句:

def calc_sum(*num):
sum = 0 # 定义sum
for i in num:
sum = sum +int(i) # 计算sum
return sum # 返回sum
res = calc_sum(1,2,3,4) # 定义res接收sum
print(res) # 打印sum


# 输出
C:\Users\Administrator\Desktop\document>D:/Python37/python.exe c:/Users/Administrator/Desktop/document/test.py
10



函数变量作用域Python-13-函数<下>_desktop_02



函数内部的变量仅供函数内部使用,为局部变量

函数外部的变量可供本项目的所有对象使用,为全局变量

year=2020
def say_hi():
name = 'phyger'
print('hello',name)
say_hi()
print(year)
print(name)


# 输出
C:\Users\Administrator\Desktop\document>D:/Python37/python.exe c:/Users/Administrator/Desktop/document/test.py
hello phyger
2020
Traceback (most recent call last):
File "c:/Users/Administrator/Desktop/document/test.py", line 45, in <module>
print(name)
NameError: name 'name' is not defined



匿名函数Python-13-函数<下>_desktop_02



Python有一个很棒的匿名函数lambda



lambda只是一个表达式,函数体比def简单很多。lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。lambda函数拥有自己的命名空间,且不能访问自有参数列表之外或全局命名空间里的参数。虽然lambda函数看起来只能写一行,却不等同于C或C++的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率。



表达式:

lambda arg1 arg2 arg*:arg1+arg2+...+arg*


例:计算两数之和

# 普通写法
def sum2(a,b):
print(a+b)


# 调用
sum2(1,2)


# lambda写法
sum2_new = lambda x,y: x+y


res = sum2_new(1,2)
print(res)


# 输出
C:\Users\Administrator\Desktop\document>D:/Python37/python.exe c:/Users/Administrator/Desktop/document/test.py
3
3


你会发现lambda很简洁,一行代码就实现了一个函数,但是传统写法更易理解,如果使用lambda写复杂的函数将会特别长,所以不推荐在工作中使用lambda。



Python-13-函数<下>_默认参数_07