什么是函数?
先提出一个小练习,不用内置方法,来求一个字符串的长度,比如求s = 'djskdflsdjfslkjgls',我们可以用多种方法求取,比如:
1 count = 0 2 s = 'djskdflsdjfslkjgls' 3 for i in s: 4 count += 1 5 print(count)
通过上面的for循环,我们可以很方便的计算出结果。
若我们用python的内置函数len(),则只使用一个指令即可求出结果。如果我们用如下方法做时:
1 def my_len(): 2 l = [1, 2, 3, 4, 5, 6, 7, 8] 3 count = 0 4 for i in l: 5 count += 1 6 print(count) 7 my_len()
当我们直接使用调用我们定义的my_len()方法时,其结果也可以直接获取。
这里,我们将my_len()称为执行函数,其组成是由 :函数名()。
通过上面分析,我们知道函数有很多优点,总结起来可分为两点:
1. 函数可以减少代码的重复性
2. 函数可以增强代码的阅读性
函数到底是什么?其主要目的是什么?接下来我们做一个详解。
函数其主要的目的就是为了将用户的需求用代码表示出来,然后将其封装,提供一个函数接口,供用户后续直接调用。
1 def func(): 2 print('111') 3 print('222') 4 func(
上述函数中,函数执行的功能只是将需要显示的内容打印出来。但是通常执行函数后,希望将执行结果给输出,这样,我们就要引进函数的返回值:return。
return 有什么功能呢?
1. 函数中如果遇到return,则直接结束函数
2. 给函数中的执行者(函数名():整体是函数的执行者)返回值
3. return 返回单个值,即原封不动的返回(是什么类型,就返回什么类型值)
4. return 返回多个值,即返回一个元组,所有值都是元组的一个元素
注:在工作中,通常函数尽量不要使用print。
对以上return分别举例:
1. 函数中如果遇到return,则直接结束函数
1 def func(): 2 print('111') 3 print('222') 4 return 5 print('333') 6 func()
函数执行的结果为:111,222。函数执行后,当遇到return,直接结束函数,后面语句不再执行。
2 return 返回单个值
1 def func_1(): 2 a = 1 3 b = 2 4 c = a + b 5 d = [1,2,3] 6 e = (4,5,6,7) 7 f = 'olin' 8 g = ' beault' 9 h = f + g 10 return h 11 print(func_1())
3 return多个值,返回的是一个元组
1 def func_1(): 2 a = 1 3 b = 2 4 d = [1,2,3] 5 e = (4,5,6,7) 6 f = 'Colin' 7 return a,d,e,f 8 print(func_1())
上面的代码执行结果为:(1, [1, 2, 3], (4, 5, 6, 7), 'Colin') ,多个值返回的是一个元组,每个值是元组的一个元素。
函数的传参
函数的参数分为:函数实参与函数形参。
实参:函数执行者(实参)实际的参数
形参:定义函数时,括号里面的参数
实参
对于实参,通常有三种表示方式:
1. 位置参数
2. 关键字参数
3. 混合参数
位置参数:要求:按照顺序,一一对应
1 def func1(x, y): 2 print(x, y ) 3 func1(1,2)
1 def add(x, y): 2 c = x +y 3 return c 4 print('x + y =', add(1, 2))
1 def max(x, y): 2 if x > y: 3 c = x 4 else: 5 c = y 6 return c 7 print('较大的值为:', max(32, 45))
关键字参数:要求:可以不按照顺序,但是必须一一对应
1 def func1(x, y): 2 return x + y 3 print(func1(y = 100, x = 32))
混合参数:要求:关键字参数一定要在位置参数之后
1 def func1(a, b, x, y): 2 return a + b + x + y 3 print(func1(100, 56, y = 100, x = 32)) 4 5 def func1(a, b, name, x, y): 6 return a + b + x + y 7 name = 'Colin' 8 print(func1(100, 56, name, y = 100, x = 32)) # name 是位置参数
形参
从形参角度去分析,形参主要分为位置参数与默认参数两种。
位置参数:按照顺序一一对应
1 def func(x, y ,z): 2 print(x, y,z) 3 func(1,2,3)
默认参数:给其传值,将原默认参数覆盖,不传值时不报错,使用默认值。
1 def func1(x, y, a = 666): 2 print(x, y, a) 3 func1(1, 2) 4 func1(1, 2, 256)
应用场合 :不经常改变的参数,但是一直再用。
下面提供一个要求,需要不断输入个人信息,如姓名与性别。并将信息写入文件中。
方法1:不使用函数功能
1 while 1: 2 name, sex = input('请输入姓名与性别,中间用逗号分隔:').strip().replace(',',',').split(',') 3 if name.upper() == 'Q': 4 break 5 with open('a1.txt',encoding='utf-8',mode= 'a') as f1: 6 f1.write('{}|{}\n'.format(name, sex))
方法2:使用函数功能
1 def namelist(name, sex = '男'): 2 with open('a1.txt', encoding='utf-8', mode='a') as f1: 3 f1.write('{}|{}\n'.format(name, sex)) 4 while 1: 5 name, sex = input('请输入姓名,性别').strip().replace(',', ',').split(',') 6 if name.upper() == 'Q': break 7 if sex.strip(): 8 namelist(name, sex) 9 else: 10 namelist(name) 11 namelist(name, sex)
默认参数的陷阱
默认参数若是可变数据类型(如:list),但他始终使用的是一个,即默认参数共用一个内存地址。
1 def func1(x, l1 = []): 2 l1.append(x) 3 return l1 4 ret = func1(1) 5 print(ret,id(ret)) # [1] 1835140980104 6 ret2 = func1(100) 7 print(ret2,id(ret2)) # [1, 100] 1835140980104