• 函数的概念:函数是一个对象,它是组织好的、可重复使用的,用来实现单一或相关联功能的代码段
  • 函数的作用:提高应用的模块性代码的复用性

    自定义函数

  • 定义规则

    • 函数代码块以def 关键词开头,后接函数标识符名称圆括号()
    • 圆括号中间可以放入参数
    • 函数内容以冒号起始,并且缩进
  • 语法

    1. def 函数名([形参1,形参2,形参3...]):
    2. 代码块

    特点

  • 函数用来保存一些可执行的代码,并且可以在需要时,对这些语句进行调用

  • 函数保存的代码不会立即被执行,而是在需要调用函数的时候才会被执行{通过def 函数名([形参1,形参2,形参3…])来调用}

    函数的参数

    形参与实参

  • 形参(形式参数)是函数定义的参数,没有实际的值,通过赋值后才有意义,相当于变量

  • 实参(实际参数)是实际存在的参数,当指定了形参,在调用时会将形参传递给实参,实参会赋值给相应的形参,即有几个形参对应几个实参

image.png

  1. # 定义一个函数求任意两个数的乘积
  2. def func(a,b): #a,b是形参(形式上的参数),如果定义了形参,那么在调用的时候就必须传递实参
  3. print(a*b)
  4. func(6,8) #48 6,8是实参
  5. # func是函数对象 func()是调用函数

函数的传递方式

  • 可变类型参数和不可变类型参数
    • 不可变类型参数在函数体内对变量重新赋值,相当于重新开辟了一块内存来保存值
    • 可变类型参数在函数体内可以改变原有的值。
  • 在定义了形参后,可以为形参指定默认值。指定了默认值以后,如果⽤户传递了参数则默认值不会⽣效。如果⽤户没有传递,则默认值就会⽣效
  • 默认值参数:形参处进行赋值,所以当调用时不传该参数就默认使用形参处的值。当调用时传了该参数,则覆盖掉默认参数
  • 位置参数:位置参数就是将对应位置的实参赋值给对应位置的形参 ```python

    位置传参

    def func1(a,b,c = 8): print(a) print(b) print(c)

fun(1,2) #1,2,8

fun(1,6,4) #1,6,4

总结:参数可以在设置形参的时候,直接给他设置一个默认值,如果实参没有传递参数,那么直接使用默认值,如果实参传递了,那么就用实参

  1. - 关键字参数:关键字参数可以不按照形参定义的顺序去传递,而根据参数名进行传递实参
  2. ```python
  3. def fun2(a,b,c):
  4. print(a)
  5. print(b)
  6. print(c)
  7. fun2(b=3,c=6,a=2)
  • 混合参数:混合使⽤位置参数和关键字参数的时候,位置参数必须写到关键字参数前面去

否则会报错:SynataxError:position argument follows keyword argument

def fun3(a,b,c):
    print(a)
    print(b)
    print(c)

fun(9,c=3,b=2)

不定长参数

  • 在定义函数时,在形参前面加*,这样这个形参就能获取到所有的实参,它会将所有的实参保存到一个元组中
  • 带*号的形参只能有一个,它可以和其他参数配合使用
  • 形参只能接受位置参数不能接受关键字参数,且**args 接收时会转为元组数据类型**
  • python3.0以后,*args参数后面智能跟关键字参数
  • 形参可以接收其他的关键字参数,它会将这些参数统⼀保存到字典当中,一般用**kwargs表示。字典的key就是参数的名字,字典的value就是参数的值**
  • *形参只有⼀个,并且必须写在所有参数的后⾯ ```python def fn1(b,a): r=0 print(a) #(2,3,4) for i in a:
      r+=i
    
    print(r) #9

fn1(1,2,3,4)

这里b=1 a=(2,3,4)

将第一行改成fn1(b,*a,c) 此时a=(2,3) r=5<br />第一行改成def fn(b,c,*a)    第八行改成fn(1,2,3,4,c=5)    会报错,原因是不定长参数必须放到位置参数的后面放到关键字参数的前面
```python
def fn2(**f):
    print(a)    #{'a':1,'b':2,'c':3,'d':4,'e':5}


fn2(a=1,b=2,c=3,d=4,e=5)
#将第一行改成 fn2(y,a,**f)、第四行改成fn2(1,a=2,b=4,c=9,d=8,e=15),此时形参中y=1,a=2,f={'b':4,'c':9,'d':8,'e':15}

参数的传递类型

函数中任何数据类型的参数都是可以传递的

def fun1(a):    #a=b=1
    a=10
    print(a)    #a=10


b=1
fun1(b)
print(b)        #b=1
#最后的结果是a=10 b=1
def fun2(a):
    a[2]=10
    print(a)    # a=[1,2,10]

b=[1,2,3]
fun2(b)
print(b)        # b=[1,2,10]
#最后的结果是a=b=[1,2,10]

参数的解包

  • 传递实参时,也可以在序列类型的参数前添加星号,这样它会⾃动的将序列中元素依次作为参数传递
  • 要求序列中的元素的个数必须和形参的个数⼀致 ```python def fun(a, b, c): print(a) print(b) print(c)

t = (4,5,6)

fun(t[0],t[1],t[2]) #4 5 6

第六行改成t = {‘小胖’:牛仔裤,’发糕’:嘚瑟,’小猴’:撸哥}

fun(t) #小胖 发糕 小猴 fun(**t) #牛仔裤 嘚瑟 撸哥 上面args和**kwargs在解包字典时获取的内容要注意!!!

<a name="N9DoK"></a>
# 练习

1. 打印名片程序:输入姓名、电话号码、性别,最后打印出来名片。要求:
   - 控制姓名长度为6-20
   - 电话号码长度11
   - 性别只能允许输入男或女
   - 每一样信息不允许为空
```python
def id_card(name, tel, sex):
    print('姓名:', name)
    print('电话:', tel)
    print('性别:', sex)


name = input('请输入姓名:')
if len(name) < 6 or len(name) > 20:
    print('你的输入有误,请重新输入!')
    name = input('请输入姓名:')

tel = input('请输入电话号码:')
s = (len(tel) == 11) and (tel.isdigit())
if s == False:
    print('你的输入有误,请重新输入!')
    tel = input('请输入电话号码:')

sex = input('请输入性别:男/女')
if sex != '男' and sex != '女':
    print('你的输入有误,请重新输入!')
    sex = input('请输入性别:男/女')


id_card(name, tel, sex)

image.png

  1. 使用函数求前20个斐波那契数列,斐波那契数列:1,1,2,3,5,8,13,21…即:起始两项均为1,此后的项分别为前两项之和

image.png

  1. 编写一段代码,定义一个函数并求1-100之间所有整数的和,并调用该函数打印出结果 ```python

    方法一:

    def func(s): for i in range(101):
     s += i
    
    print(s)

func(0)

方法二:

def fun(s): print(s)

s = 0 i = 0 while i<100: i += 1 s += i fun(s) ```