1.函数是啥
"""
函数是封装一段代码,用于方便重复调用该功能
每一个函数都是一个功能
"""
#假如需要求圆的面积
r1 = 2
s1 = 3.14 * r1 ** 2
r2 = 4
s1 = 3.14 * r2 ** 2
是否有更简单的求圆的面积的方法??--函数
def s(r):
area = 3.14 * r**2
print(area)
s(2)
s(4)
2.函数格式定义
def func_name(args): # def关键字+函数名+冒号
"""
写函数说明 #写函数说明,是为了方便日后维护,以及方便使用
"""
body # 函数体内容,和分支结构一样,强制缩进
return XXX # 函数最后返回结果,return会结束函数,后面的代码都不会执行
3.使用函数
def info():
"""
这是一个函数说明
"""
print("hello word")
return True
print("函数return后面的代码,不会执行")
info() # 使用函数名字+括号,就可以调用函数
"""
hello word
True
"""
4.函数参数
"""
1.函数是代码的封装,可以实现某个功能,那么在代码中的参数可以提取出来,作为参数传递给函数,这样更有利于函数的使用。
2.python中的函数参数有:关键字参数、默认参数、非关键字可变长参数(元组)、关键字可变长参数(字典)
3.参数传递有两种方式:
按照先后位置传递参数【简单易读】
赋值方式传递参数【传递方式灵活,准确】
4.如果函数指定参数,调用函数必须传递参数,不传值会直接报错,或者函数功能不可用
"""
关键字参数
# 调用函数时,根据参数的个数和位置给参数传值# 前面学到的,字符串.format()方式传值,就基本实现了参数传递功能。
def hello(name, age):
print("我叫{},我今年{}岁".format(name, age))
hello("tom",33)
hello(age=55, name="jack")
hello("alise", 44)
"""
我叫tom,我今年33岁
我叫jack,我今年55岁
我叫alise,我今年44岁
"""
默认参数
# 默认参数,指的是,在函数开始的时候,默认给定参数,防止使用者忘记给参数
# 当使用者不给参数时,默认参数生效
# 当使用者给定参数时,给定参数覆盖默认参数
def hello(name="hello", age=99):
print("我叫{},我今年{}岁".format(name, age))
hello("tom",33)
hello(name="jack",age=66)
hello()
"""
我叫tom,我今年33岁
我叫jack,我今年66岁
我叫hello,我今年99岁
"""
非关键字可变长参数(元组)
# 非关键字:直接给参数就行,不需要赋值传入
#可变长:可传入多个参数
#python会将这些多出来的参数放入一个元组中。例:
def match(cmd, *args): # 最后一个,带*的参数
print(type(args),len(args))
sum = 0
if cmd == "+":
for i in args: # 一般采用for循环获得参数
sum += i
elif cmd == "-":
for i in args:
sum -= i
return sum
match("+",1,2,3,4,5,6) #21
关键字可变长参数(字典)
# 关键字:格式为关键字参数,name="tom"的赋值形式
# 可变长:可传入多个
#python会将,全部的参数放入一个字典中。需要注意的是,关键字变量参数应该为,函数定义的【最后一个】参数,【带**】。例:
def hello(name, **kwargs): # 最后一个,带**的参数
"""
可变参数
"""
print(name)
for i in kwargs.items(): # 关键字可变长参数,一般可采用for循环取得
print(i)
hello("tom",wz = "www.baidu.com",gg = "www.google.com"
"""
tom
('wz', 'www.baidu.com')
('gg', 'www.google.com')
"""
5.实际开发中的参数使用注意
#参数使用推荐================================
a.在实际开发中,常用必需参数
b.关键字参数和默认参数在系统函数中使用较多
c.不定长参数不推荐使用,会让使用者陷入混乱
d.参数*args,**kwargs中的,args和 kwargs 只是一个标识符,可以是任意的
#传参的注意事项==============================
#1.值传递:实参是不可变的数据类型,如number,string,tuple,bool
def func1(num1):
print("修改前num1:%d" % (id(num1)))
num1 = 20
print("修改后num1:%d" % (id(num1)))
temp = 10
print("temp:%d" % (id(temp)))
func1(temp) #num1 = temp
print(temp)
#2.引用传递:实参是可变的数据类型,如:list,dict,set
def func1(list1):
print("修改前num1:%d" % (id(list1)))
list1[0] = 20
print("修改后num1:%d" % (id(list1)))
temp = [1,2,3]
print("temp:%d" % (id(temp)))
func1(temp)
print(temp)
"""
值传递,如果形参发生改变,实参不受影响
引用传递,如果形参发生改变,实参也会随着被修改
"""
6.返回值return
#1.如果一个函数没有返回值,则默认返回None
def show1():
print("show")
print(show1())
#2.如果一个函数中使用return语句,但是没有任何数据,则默认返回None
#return的作用:用于结束函数,一旦遇到returan语句,后面的语句将没有执行的机会
def show2():
print("show")
return
print("hello")
print(show2())
#3.如果一个函数中使用return语句,并且后面添加了返回值,则结束函数的同时将指定的数据返回【在哪里调用该函数,则返回到哪里】
def show3():
print("show")
return "hello"
s3 = show3() #s3 = "hello"
print(s3)
#4.return 返回值的意义:在函数内部运算的结果,如果想要在函数外部访问,则只能通过返回值的形式进行间接的访问
def show4():
#局部变量:仅仅能在当前函数中被访问
num1 = 10
print("函数内部:",num1)
return num1
num2 = show4() #num2 = num1 = 10
#print(num1) #NameError: name 'num1' is not defined
"""
封装函数的必要条件:
a.形式参数【如果有未知项参与运算,将未知项设置为参数】
b.返回值【如果在函数的外部需要访问函数内部的数据,设置返回值】
"""
#5.特殊情况一:return后面可以跟多个值,在函数外面获取得到的结果为一个元组
def show5():
print("show")
return 10,"abc",True
s5 = show5()
print(s5) #(10, 'abc', True)
#6.特殊情况二:函数的多分支中也可以使用return,可以返回不同类型的数据
def show6(num):
if num > 0:
return "正数"
elif num < 0:
return -1
else:
print("等于0")
print(show6(7))
print(show6(-7))
print(show6(0))
#7.特殊情况三:break和return的作用
#break只是跳出当前的循环,return直接结束函数,不管return处于多少层循环之中
def show71():
for i in range(4):
for j in range(3):
print("%d=%d" % (i,j))
if j == 1:
return
show71()
print("*"*20)
def show72():
for i in range(4):
for j in range(3):
print("%d=%d" % (i,j))
if j == 1:
break
show72()
"""
0=0
0=1
********************
0=0
0=1
1=0
1=1
2=0
2=1
3=0
3=1
"""
#注意:在某些情况下,在函数中,可以使用return代替break
7.函数的本质
1.变量可以指向函数
#获取函数调用的结果
print(abs(-10)) #10
#获取求绝对值的函数
print(abs) #<built-in内置/內建 function abs>
x = abs(-18)
print(x)
f = abs
print(f)
print(f(-20))
#结论:函数本身可以赋值给变量,如果一个变量指向一个函数,则可以通过该变量调用指定的函数
2.函数名是一个变量名
#给函数名重新赋值
print(abs(-36))
abs = 10
print(abs(-36))
"""
list,tuple,dict,set不要被使用为变量名
结论:函数名就是一个变量名,只不过该变量指向一个可以实现某种功能的函数,同时也可以给该变量进行重新赋值
注意:如果给函数名重新赋值,则再次调用函数无法使用,注意:定义变量的时候,尽量避开系统函数或者模块的命名
"""
3.函数可以作为参数
def add(x,y,f):
return f(x,y) + f(x,y) #test(3,4) + test(3,4)
def test(a,b):
return a + b
print(add(3,4,test)) #f = test
#结论:一个函数可以作为另外一个函数的参数使用,传参的时候,只需要传递函数名即可