函数
定义
组织好的、可重复使用、实现独立功能
目的:提高代码重用率
注意:
1、函数名称必须遵循标识符规则:数字、字母、下划线。并且不能以数字开头,不能使用关键字
2、先定义后调用
3、函数不调用是不执行的
4、函数可以调用多次
def prt(): # 定义函数
print('1楼、鞋类商品')
print('2楼、女性服饰')
print('3楼、男装')
print('4楼、运动装')
floor = int(input('请输入楼层:'))
if floor == 1:
print('西单大悦城1层欢迎您')
prt() # 调用函数
print('您现在在一层')
elif floor == 2:
print('西单大悦城2层欢迎您')
prt()
print('您现在在二层')
elif floor == 3:
print('西单大悦城3层欢迎您')
prt()
print('您现在在三层')
elif floor == 4:
print('西单大悦城4层欢迎您')
prt()
print('您现在在四层')
函数的参数
1、调用的时候,这个函数定义时,有几个参数,就需要传递几个参数
参数值和参数名称是按照函数声明中定义的顺序匹配起来的
2、定义时小括号中的参数,用来接收参数用的,称为“形参”
调用时小括号中的参数,用来传递给函数用的,称为“实参”
在python中函数参数的定义方式有以下4种:
1、位置参数
2、关键字参数
3、默认参数
4、可变参数(*args,**kwargs)
(一)位置参数
在传参的时候,实参传递的顺序按照形参定义的顺序进行传递的传参方式
def qiuhe(a, b, d):
c = a + b + d
print(c)
qiuhe(2, 3, 4)
qiuhe(5, 6, 7)
(二)关键字参数
在传参的时候,以形参等于实参的形式忽略形参定义的顺序进行传参的传参方法。
def dengji(name, age):
print('我叫', name)
print('年龄', age)
dengji(age=20, name='张惠妹')
(三)默认参数
定义参数时,给形参一个默认值,在调用函数时,如果不给有默认值的形参传参,会自动采用默认值
(当某个值变化小的时候,我们就可以使用默认值)
def dengji(name, age, sex='男'):
print(name, age, sex)
dengji('张三', 19)
dengji('李四', 20, '男')
dengji('王五', 21, '女')
(四)可变参数
处理比声明时更多地参数,将传入的参数变成元组(*args)或者字典(**kwargs)
1、元祖参数 *args
通过给形参前面添加*使参数变成一个元组,所有传递的参数变成元组的元素
(注意:args参数名称可以任意命名)
def func(*args):
print(args)
print(args[0], args[1])
func(1, 2, 3, 4)
*具有打散序列的功能
a = [1, 2, 3]
print(*a)
b = (1, 2, 3)
print(*b) # 无论列表还是元组,*都可以打散
c, *d = a
print(c, d)
c, *d = b
print(c, d) # 输出都是列表形式
2、字典参数 **kwargs
通过给形参前面添加**使参数变成一个字典,所有传递的参数变成字典的键值对。
**kwargs结果类型是字典,传递值是以key = value方式传入
字典参数 **kwargs
def kb(**kwargs):
print(kwargs, type(kwargs))
# 传递值是以key = value方式传入
kb(name = '张三', age = 18)
kb(name = '李四', age = 18, sex = '男')
kb()
一起定义元组参数和字典参数时,元组参数要放在字典参数后。
函数参数总结:
定义函数时参数的顺序:位置参数,元组参数,默认参数,字典参数
(五)函数的返回值
返回值,其实就是返回一个tuple,在语法上返回一个tuple可以省略括号
**
注意:
1、如果函数不写返回值,默认返回None
2、return关键字有两个作用,一个作用是返回内容,另一个作用是结束此方法
(return后面的代码不会执行,因此一般不建议在return后面写代码)
**
def area(r):
s1 = 3.14 * r ** 2
c = 2 * 3.14 * r
return s1, c
ret = area(3)
print(ret)
(六)递归函数
一个函数在内部调用自身本身,这个函数就是递归函数
使用递归函数的条件:
必须留出口;自己调用自己
def jiecheng(n):
if n == 1: # 递归边界
return 1
else:
return n * jiecheng(n - 1)
x = jiecheng(6)
print(x)
斐波那契数列
方法1:
def tuzi(n):
if n == 1 or n == 2:
return 1
else:
return tuzi(n-1) + tuzi(n-2)
n = int(input('请输入月份:'))
# print(n, '月的兔子数是',tuzi(n))
for i in range(1, n+1):
print('第', i, '个月的兔子为:', tuzi(i))
n = int(input("请输入月份:"))
a, b = 1, 1
for i in range(1, n+1):
if i == 1 or i == 2:
print('第', i, '个月的兔子为:', 1)
else:
a, b = b, a + b
print('第', i, '个月的兔子为:', b)
生兔子问题
def zbcz(a, start, end, key):
if start >= end:
return -1
middle = (start + end) // 2
if key > a[middle]:
return zbcz(a, middle+1, end, key)
elif key < a[middle]:
return zbcz(a, start, middle-1, key)
else:
return middle
a = [11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
k = int(input('请输入要查找的数:'))
x = zbcz(a, 0, 9, k)
if x == -1:
print('没有')
else:
print(k, '的位置是:', x)