一、认识函数
1.什么是函数?
定义:对实现某一特定功能的代码段的封装
使用函数就是使用这个函数里面的代码段
2.函数的分类
系统函数:系统已经定义好的函数,我们直接调用函数使用函数的功能
自定义函数:需要程序员自己定义的函数
3.函数的定义 (好比是制造机器)
a.语法
def 函数名(参数列表):
函数体
b.说明:
def:声明函数的关键字
函数名:标识符,不能是关键字
pep8命名规范,见名知义(看到函数名大概知道函数功能)
():固定格式
参数列表:参数1,参数2,参数3...;这里参数叫做形参,定义时形参就是变量
作用:将函数外面的数据从外面传递到函数里面
::固定格式
完整函数体:
1.函数说明文档
2.实现函数功能的代码段
3.函数返回值
c.初学者申明函数的步骤
第一步:确定函数的功能
第二步:根据功能确定函数名
第三步:确定形参(确定参数是否需要和几个),实行函数的功能需不需要从外面传值进来,以及需要传几个
第四步:实现函数的功能
第五步:确定函数返回值
(重点!!!)注意:函数声明时,并不会执行函数体!
只有在调用的时候才会执行
4.函数的调用 (好比是使用机器)
a.语法:
函数名(实参列表)
b.说明:
函数名 - 已经声明过的函数
():固定写法
实参列表:实参是来给形参赋值(用实参给形参赋值的过程加传参),实参和形参要一一对应
c.调用过程(重点!!!)
第一步:回到函数声明的位置
第二步:用实参给形参赋值(传参)
第三步:执行函数体
第四步:执行完函数体,就确定并返回返回值
第五步:回到函数调用的位置,接着执行后面的其他代码
示例:
# 求两个数的和
def sum_two(num1, num2):
"""
求两个数的和(函数功能进行说明)
:param num1:(第一个数进行说明)
:param num2:(第二个数进行说明)
:return:无(返回值进行说明)
"""
print(num1 + num2)
# 调用函数
sum_two(10, 20) # 30
猜数字游戏
# 练习3:声明一个函数,函数功能是猜数字游戏:随机产生一个0-100的数字,用户不断输入数字,
#直到输入的数字和产生的数字一样游戏就结束,当猜错了,可以给出'大了/小了'这样的提示
# 导入random模块
"""
randint(m,n) - 产生一个m到n的随机整数
"""
# num = random.randint(0, 100)
# print(num)
def guess_num():
import random
num = random.randint(0, 100)
count = 0
while True:
n = int(input('请输入数字:'))
count += 1
if n > num:
print('真遗憾,大了,在小一点')
continue
elif n < num:
print('真遗憾,小了,在大一点')
continue
else:
print('猜对了!!!')
if count > 10:
print('正常人')
# 结束游戏
break
guess_num()
二、参数类型
1.位置参数和关键字参数(根据实参的传递方式分类)
a.位置参数:实参的位置和形参保持一致,按形参先后顺序一一赋值
b.关键字参数:调用函数的时候以 形参=实参的方式来传参,
这个时候顺序无所谓
def func1(a, b, c):
print(a, b, c)
# 通过位置参数给形参赋值
func1(10, 20, 49)
# 通过关键字参数给形参赋值
func1(a=10, b=20, c=49)
# 通过位置参数和关键字参数结合传参
# (关键字参数必须在位置参数后面),不然会报错
func1(10, 20, c=20)
2.参数默认值
说明:
声明函数时,可以给参数赋默认值。
如果一个形参有默认值,调用函数时,可以不用传参
注意:
a.如果有的形参有默认值,有的没有,那么有默认值的形参要放在没有默认值的形参的后面
b.调用函数要保证每个参数都有值!
# 参数c有默认值,调用函数c可以不用传参
def func2(a, b, c=0):
print(a, b, c)
func2(10, 20, 400) # 10 20 400
func2(100, 32) # 100 32 0
3.参数的类型
说明:类型说明只有提示功能,没有约束功能
a.给参数设置默认值,默认值的类型就是参数值的类型
b.形参后面加:类型名,来说明参数类型。这种方式调用必须传参
c.函数声明的时候在()后面加 —>类型名,来说明函数返回值的类型
类型说明的好处:
a.对实参的类型进行说明指导
b.实现函数功能的时候,有类型相关的语法提示
def list_item(list1: list, index=0)->int: # int对返回值类型进行说明
print(list1[index])
return 10
list_item([2, 23])
def func4(a: list, b: str):
a.append(b)
4.不定长参数
说明:函数参数个数不确定
a.声明函数的时候,在参数名前加 *,可以同时用来获取多个实参的值
实质:将带*号的参数变成元祖,将多个实参的值作为元祖的元素
b.在参数名前加两个,必须是关键字传参,会将这个参数变成一个字典*来获取关键字参数的值,其他关键字作为KEY,实参作为value
注意:a.如果函数中既有不定长参数,又有普通参数,那么不定长参数必须放在普通参数后面
b.两颗*的要放在一颗*的后边
# 写一个函数,计算多个数的和(位置参数,关键字参数皆可)
def sum_num(*args, **kwargs):
sum1 = 0
# 遍历元祖
for num in args:
sum1 += num
# 遍历字典
for num1 in kwargs:
sum1 += kwargs[num1]
print(sum1)
sum_num(11, 23, a=111)
三、函数返回值
1.什么是返回值:函数里面的数据传递到函数外面
定义:函数调用表达式的值,就是return关键字后面的表达式的值
注意:每个函数都有返回值,默认是None
函数调用表达式:调用函数的语句
return:关键字,只能写在函数体中
功能:
1.确定函数的返回值
2.结束函数
注意:执行函数时,如遇到return,函数直接结束,并且将后面的值作为函数的返回值
def func1():
print('****')
return 100
print('=====')
result = func1() # func1()就是函数调用表达式
print(result)
2.多个返回值
return 值1, 值2, 值3... <==> (值1, 值2, 值3...)
def func3():
return 1, 2, 3
print(func3()) # (1, 2, 3)
x, y, z = func3()
print(x, y, z) # 1 2 3
3.怎么确定函数是否需要返回值
函数执行完后是否会产生新的数据,如果会产生新的数据,就需要返回值,并用return返回
# 声明一个函数,打印指定的n!
def factorial_1(n):
"""
求指定数的阶乘
:param n:
:return:
"""
num = 1
for x in range(1, n+1):
num *= x
return num
factorial_1(3) # 6
# 一个函数可以用多次
factorial_1(4) # 24