函数
一、函数的定义
函数的定义:
函数是组织好的,可重复使用的,用来实现独立功能的代码段。
函数可以提高程序代码的重用率
我认为函数就是一段封装好的代码,用于使用频率较高的代码来提高代码
的利用率,同时在自己构造一个函数的过程也是一个锻炼的过程,可以提
高我们的逻辑思维。(以上只是我目前对于函数的理解)
注意:
(1).函数名称必须遵循 标识符 规则 数字,字母,下划线,并且不能以数字开头
不能使用关键字。
(2).函数先定义后调用。
(3).函数不调用是不执行的。
(4).函数可以调用多次
二、 函数的格式
函数的格式有三种,无参数无返回值函数,有参数没有返回值的函数,
有参数有返回值的函数。
1、无参数无返回值函数:
例如我们定义一个没有参数求圆面积的函数:
def area():
s = 3.14 * 3 ** 2
print(s)
下面是调用此函数的方法
# 调用函数
area()
这种函数的缺点很明显,只能计算固定的值,但是优点在于可以用于设计一些
固定的,简单的demo。
2、有参数没有返回值的函数
1、现在我们定义一个可以传入参数的计算圆的面积的函数:
def area(r): # 定义函数时,小括号内参数为形参
s1 = 3.14 * r ** 2
print(s1)
与无参数无返回的函数的区别在于,有参数的函数可以解决无参数函数的只能计算
固定的值
area(2) # 调用函数时,小括号内采纳数是实参
area(3)
area(4)
3、有参数有返回值的函数
1、单返回值的函数
def area(r):
s1 = 3.14 * r ** 2
return s1
调用:
# 第一种
print(area(2))
# 第二种
h = area(2)
print(h)
# 输出结果都是12.56
当函数有返回值的时候,调用函数的时候,就会返回函数内的计算结果
2、多返回值的函数
多返回值的函数可以返回多个值
def area(r):
s1 = 3.14 * r ** 2
c = 2 * 3.14 * r
return s1, c
调用:
ret = area(3)
print(ret)
三、函数参数
1、位置参数
位置参数顾名思义即传入实参的时候按照定义形参的顺序出入参数
# 位置参数
def sum_2_num(num1, num2):
total = num1 + num2
print(total)
sum_2_num(20, 32)
2、关键字参数
关键字参数是以形参等于实参的形式忽略形参定义的顺序进行传参的传参方式。
(关键 字参数必须在位置参数的后面)
# 关键字参数 (关键字参数必须要在位置参数后面)
def sum_2_num(num1, num2):
total = num1 + num2
print(total)
sum_2_num(num2=20, num1=32)
sum_2_num(20, num2=10)
3、默认参数
当我们定义函数时,有一个小变动的参数(例如:性别)我们可以在定义形参的
时候设置一个默认值,如果在传入参数的时候没有传入该参数的值,系统会自动
采纳默认值。
栗子:
# 默认参数
def user_info(name, age, gender="男"):
return print(f'姓名:{name},年龄:{age},性别:{gender} ')
user_info('张三', 20)
user_info(gender='女', age=20, name="xy")
输出结果:
姓名:张三,年龄:20,性别:男
姓名:xy,年龄:20,性别:女
4、默认参数
1、元组参数
通过给形参前面添加*使参数变成一个元组,所有传递的参数变成元组的元素
注意: args参数名称可以任意命名,但是一般我们叫他 args。
并且它有着打散序列的功能。
栗子:
# 元组参数
def func(*args):
print(args)
print(args[0], args[1])
func(1, 2, 3, 4)
def func(a, b, c):
print(a, b, c)
print('------------')
tup = ('1', '2', 3)
func(*tup)
# 具有打散序列的功能,用于元组,列表,字符串,字典,集合
tup = (1, 2, 3, 4)
print(*tup)
lst = [1, 2, 3, 4]
print(*lst)
s1 = 'hello'
print(*s1)
dic = {'a': 11, 'b': 12}
print(*dic)
set = {1, 2, 3}
print(*set)
输出结果
(1, 2, 3, 4)
1 2
1 2 3
1 2 3 4
1 2 3 4
h e l l o
a b
1 2 3
2、字典参数
通过给形参前面添加**使参数变成一个字典,所有传递的参数变成字典的键值对,
这里传参要求键等于值的形式。
**kwargs结果类型是字典,传递值是以key=value方式传入
# 字典参数 **kwargs
def func(**kwargs):
print(kwargs)
print(kwargs['name'], kwargs['age'], kwargs['gender'])
func(name='zs', age='10', gender='男')
def func(name='zs', age=10):
print(name, age)
dic = {'name': '阳桑', 'age': 10}
func(**dic)
def func(*args, **kwargs):
print(args[0], kwargs['name'])
func(10, name='zd')
def say_hello():
'''打招呼'''
print('hello python1')
print('hello python2')
print('hello python3')
say_hello()
def add(num1, num2):
print(num1 + num2)
输出结果:
{'name': 'zs', 'age': '10', 'gender': '男'}
zs 10 男
向阳 10
10 zd
hello python1
hello python2
hello python3
aaa
bbb
123
3423
四、递归函数
递归函数主要有二个条件:
1,必须自己给自己留出口
2,需要自己调自己
栗子:
def print_num(num):
print(num)
if num == 3:
return
num = num - 1
print("*******************")
print(id(num))
print_num(num)
print('----------->')
print_num(12)
输出结果:
12
*******************
140720120518624
11
*******************
140720120518592
10
*******************
140720120518560
9
*******************
140720120518528
8
*******************
140720120518496
7
*******************
140720120518464
6
*******************
140720120518432
5
*******************
140720120518400
4
*******************
140720120518368
3
----------->
----------->
----------->
----------->
----------->
----------->
----------->
----------->
----------->
当函数参数 num 等于3时,参数自动跳出,由输出结果课看出,递归函数运用了栈储存,开始将元素放入栈中,最后在从栈中一个个取出来。