Python入门-函数
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.函数的本质
#获取函数调用的结果 print(abs(-10)) #10 #获取求绝对值的函数 print(abs) #<built-in内置/內建 function abs> x = abs(-18) print(x) f = abs print(f) print(f(-20)) #结论:函数本身可以赋值给变量,如果一个变量指向一个函数,则可以通过该变量调用指定的函数
#给函数名重新赋值 print(abs(-36)) abs = 10 print(abs(-36)) """ list,tuple,dict,set不要被使用为变量名 结论:函数名就是一个变量名,只不过该变量指向一个可以实现某种功能的函数,同时也可以给该变量进行重新赋值 注意:如果给函数名重新赋值,则再次调用函数无法使用,注意:定义变量的时候,尽量避开系统函数或者模块的命名 """
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 #结论:一个函数可以作为另外一个函数的参数使用,传参的时候,只需要传递函数名即可