Colin_Gu

导航

 

什么是函数?

  先提出一个小练习,不用内置方法,来求一个字符串的长度,比如求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

 

posted on 2018-08-15 16:03  Colin_Gu  阅读(189)  评论(1编辑  收藏  举报