目录:https://www.jianshu.com/p/863c446364a8
函数
函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。函数能提高应用的模块性,和代码的重复利用率。
一、定义函数
规则:
1、函数代码块由def关键字开头,后接函数名和圆括号;
2、任何传入参数和自变量必须放在圆括号内。圆括号内也可以用于定义参数。
3、函数内容以冒号起始,并且函数体缩进。
4、return [表达式]结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。
语法:
def 函数名(参数列表):
函数体
实例1(不带参数函数):
def zoo():
'''
这里可以用来说明函数作用,参数类型,返回值类型
'''
print("欢迎来到动物园")zoo() #使用函数名+(),可以直接调用函数
运行结果为:
欢迎来到动物园
实例2(带参数函数):
def zoo(name):
print("welcome to zoo ",name)
def zoo1(name):
return "welcome to zoo "+name #return将结果返回主函数, 即zoo1("LIMing")
zoo("Lisa") #因为函数定义中有参数,所以我们要把 ‘Lisa’ 传入函数中
print(zoo1("LiMing"))
#return有返回值,他会将结果返回给函数;print没有返回值,会直接输出结果。
运行结果为:
welcome to zoo Lisa
welcome to zoo LiMing
函数调用
我们调用函数只需要使用函数名()就可以完成函数的调用,例如实例1中我们调用zoo()这个函数,直接使用zoo()就完成了调用;当然如果我们调用的函数是有参数的,那么我们在调用函数时也要声明我们需要传入的参数,比如我们的实例2,调用了zoo(name)这个函数,我们就需要使用 zoo("lisa")传入一个参数。
二、带参函数
带参函数的参数类型分为必需参数、关键字参数、默认参数、不定长参数四种。
(1) 必要参数函数
必要参数是最基础的函数调用,要求严格,须以正确的顺序传入函数。调用时的数量必须和声明时的一样。
语法:
def 函数名(必要参数1,必要参数2,...,必要参数N):
函数体
实例:
def zoo(name1,name2,name3):
print("今天%s,%s和%s一起去了动物园"%(name1,name2,name3))zoo("Lisa","LiMing","siri")
运行结果为:
今天Lisa,LiMing和siri一起去了动物园
(2)关键字参数函数
关键字传参可以不遵守参数列表的顺序进行传参。
语法:
def 函数名(参数1,参数2,...,参数N):
函数体
函数名(参数2=标识符1,参数1=标识符2)
实例:
def zoo(name1,name2,name3):
print("今天%s,%s和%s一起去了动物园"%(name1,name2,name3))
zoo(name2="Lisa",name3="LiMing",name1="siri")
运行结果为:
今天siri,Lisa和LiMing一起去了动物园 #因为我们指定了参数传递的位置,这次输出的
结果和上个例子有些差别。
(3)默认参数函数
默认参数函数是在函数定义时,给参数附上默认值的定义方式。这样在调用函数时,这个参数可以不传参。
语法:
def 函数名(参数1,参数2=默认值):
函数体
函数名(参数1=标识符)
实例:
def zoo(name1,name2="siri"):
print("今天%s和%s一起去了动物园"%(name1,name2))
zoo(name1="Lisa") #我们并没有传入siri这个参数,但是在函数内还是使用了siri参
数,而她使用的这个siri是我们定义函数时设置好的默认值 。
运行结果为:
今天Lisa和siri一起去了动物园
(4)不定长参数函数
不定长参数有一个*和两个*两种模式,前者表示会将自身接收的所有参数转换为一个元组,后者必须接收关键字参数传参,他会将接收的参数转换为一个字典。key是关键字参数的参数名称,value是其对应的标识符。
语法:
def 函数名(*args,**kwargs):
函数体函数名(1,2,a=3,b=4)
#*args会接收前两个参数,并把它聚合为(1,2),**kwargs会接受后边两个参数,并把它聚合为{"a":3,"b":4}
实例:
def zoo(*args,**kwargs):
print(args)
print(kwargs)
zoo("Lisa","Siri","LiMing",BZ="XiaoMing",DY="Wanglaoshi")
运行结果:
('Lisa', 'Siri', 'LiMing')
{'BZ': 'XiaoMing', 'DY': 'Wanglaoshi'}
‘*’标识符
*标识符更像是一个分隔符,*标识符后的参数必须以关键字参数传入
def zoo(name1,name2,name3):
print("今天%s,%s和%s一起去了动物园"%(name1,name2,name3))
zoo("Lisa","LiMing",name3="siri")
运行结果为:
今天Lisa,LiMing和siri一起去了动物园
参数传递
在Python中,不可变数据类型传入函数体内,在函数体内发生任何变化时不会影响到变量本身,相当于复制了一个变量。
实例1(传入不可变数据类型):
def zoo(a):
a=10
print(a)
b=2
zoo(b)
print(b) #因为b为不可变类型,此时的b不会因为函数体内的操作而变化
运行结果为:
10
2
变量b为2,传入函数zoo中并把值赋给了a,这是在函数体内被操作的是a,变量a可以理解为变量b的拷贝,无论变量a发生什么变化,都不会影响变量b的值。
实例2(传入可变数据类型):
def zoo(a)
a.append([6,7,8,9])
print(a)
b=[1,2,3,4,5]
zoo(b)
print(b) #因为此时的b为列表,是可变数据类型,当把b的值传入函数zoo中,对a进行的操作相当于对b本身进行修改。
运行结果为:
[1, 2, 3, 4, 5, [6, 7, 8, 9]][1, 2, 3, 4, 5, [6, 7, 8, 9]]
可变数据类型变量传入后,在函数内发生变化会影响到主函数中的变量数据,可以理解为把自己本身传了进去。
三、匿名函数
关键字lambda表示匿名函数,冒号前面的n表示函数参数,可以有多个参数。
匿名函数有个限制,就是只能有一个表达式,不用写return,返回值就是该表达式的结果。
用匿名函数有个好处,因为函数没有名字,不必担心函数名冲突。
此外,匿名函数也是一个函数对象,也可以把匿名函数赋值给一个变量,再利用变量来调用该函数: 有些函数在代码中只用一次,而且函数体比较简单,使用匿名函数可以减少代码量,看起来比较"优雅“
语法:
lambda[arg1[,arg2,.....argn]]:expression
例子
sum=lambda arg1,arg2:arg1+arg2
# 调用sum函数
print("相加后的值为 :",sum(10,20))
print("相加后的值为 :",sum(20,20))
运行结果为:
相加后的值为 : 30
相加后的值为 : 40
四、return 语句
return [表达式] 语句用于退出函数,向调用方返回一个表达式(返回值)。不带参数值的return语句返回None。
def sum(arg1,arg2):# 返回2个参数的和."
total=arg1+arg2
print("函数内 :",total)
return total
# 调用sum函数
total=sum(10,20)
print("函数外 :",total)
运行结果为:
函数内 : 30
函数外 : 30