- 函数的概念:函数是一个对象,它是组织好的、可重复使用的,用来实现单一或相关联功能的代码段
-
自定义函数
定义规则
- 函数代码块以def 关键词开头,后接函数标识符名称和圆括号()
- 圆括号中间可以放入参数
- 函数内容以冒号起始,并且缩进
语法
def 函数名([形参1,形参2,形参3...]):
代码块
特点
函数用来保存一些可执行的代码,并且可以在需要时,对这些语句进行调用
函数保存的代码不会立即被执行,而是在需要调用函数的时候才会被执行{通过def 函数名([形参1,形参2,形参3…])来调用}
函数的参数
形参与实参
形参(形式参数)是函数定义的参数,没有实际的值,通过赋值后才有意义,相当于变量
- 实参(实际参数)是实际存在的参数,当指定了形参,在调用时会将形参传递给实参,实参会赋值给相应的形参,即有几个形参对应几个实参
# 定义一个函数求任意两个数的乘积
def func(a,b): #a,b是形参(形式上的参数),如果定义了形参,那么在调用的时候就必须传递实参
print(a*b)
func(6,8) #48 6,8是实参
# 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
总结:参数可以在设置形参的时候,直接给他设置一个默认值,如果实参没有传递参数,那么直接使用默认值,如果实参传递了,那么就用实参
- 关键字参数:关键字参数可以不按照形参定义的顺序去传递,而根据参数名进行传递实参
```python
def fun2(a,b,c):
print(a)
print(b)
print(c)
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:
print(r) #9r+=i
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)
- 使用函数求前20个斐波那契数列,斐波那契数列:1,1,2,3,5,8,13,21…即:起始两项均为1,此后的项分别为前两项之和
- 编写一段代码,定义一个函数并求1-100之间所有整数的和,并调用该函数打印出结果
```python
方法一:
def func(s): for i in range(101):
print(s)s += i
func(0)
方法二:
def fun(s): print(s)
s = 0 i = 0 while i<100: i += 1 s += i fun(s) ```