一、函数基础
1.什么是函数
1)概念
函数就是对实现某一特定功能的代码段的封装(机器)
2)分类
系统函数 - 系统已将定义了,程序员可以直接使用的函数,比如:print, input, type, ord, chr, bin, len, id等(别人造好的机器)
自定义函数 - 程序员自己定义使用的函数(自己造机器)
2.函数的定义
语法:
def 函数名(形参列表):
函数说明文档
函数体
说明:
def - python定义函数的关键字,固定写法
函数名 - 程序员自己命名
标识符,不能是关键字(要求)
所有字母都小写,多个单词用下划线隔开
不能用系统提供的函数名,类名
见名知义(看到函数名大概知道函数的功能是什么)
(): - 固定写法
形参列表 - 格式:变量名1, 变量名2, 变量名3, …(变量可以是没有定义过的变量)
形参的作用是将函数外面的数据传递到函数里面
函数说明文档 - 和def保持一个缩进的三个双引号引起来的注释(说明书)
函数体 - 和def保持一个缩进的一条或者多条语句,实现函数功能的一条或者多条语句
注意:函数在定义的时候不会执行函数体
初学者定义函数的步骤
第一步:确定函数的功能
第二步:根据函数的功能确定函数名
第三步:确定函数的参数(看实现函数的功能需不需要额外的数据,需要几个)
第四步:实现函数功能
(第五步:确定函数返回值)
第六步:写函数说明文档
需求:定义一个函数实现求任意两个数的和的功能·
def num_sum(num1, num2):
求两个数的和(功能说明部分)
:param num1:第一个数
:param num2:第二个数
:return:None(返回值说明)
print(num1 + num2)
练习1:定义一个函数,打印指定字符串中大写字母的个数
def str_count (string):
统计指定字符串中大写字母的个数
:param str1: 被统计的字符串
:return: None
count1 = 0
for x in string:
if 'A' <= x <= 'Z':
count1 += 1
print(f'{string}中大写字母的个数:{count1}')
3.函数的调用(使用机器)
语法:
函数名(实参列表)
说明:
函数名 - 需要调用的函数的名字(函数名必须是已经定义过的函数的函数名)
() - 固定写法
实参列表 - 格式:数据1, 数据2, 数据3, … (实参的个数和形参的个数保持一致)
作用:用来给形参赋值的(真正传递到函数中使用的数据)
调用函数会执行函数的函数体
str_count('asdFGHsdDf') # asdFGHsdDf中大写字母的个数:4
二、函数参数
1.位置参数和关键字参数(实参分类)
1)位置参数
实参直接写(直接),让实参和形参从位置上一一对应
def func1(a, b, c):
print(f'a:{a}, b:{b}, c:{c}')
2)关键字参数
以:形参名1=值1, 形参名2=值2, …的形式传参
注意:要保证每个参数都有值
单独使用关键字参数传参
func1(a=10, b=20, c=30) # a:10, b:20, c:30
func1(a=10, c=30, b=20) # a:10, b:20, c:30
3)位置参数和关键字参数混合使用
要求:位置参数必须在关键字参数的前面
func1(10, c=30, b=20) # a:10, b:20, c:30
func1(10, 20, c=30) # a:10, b:20, c:30
func1(a=10, 20, 30) # SyntaxError: positional argument follows keyword argument
2.参数默认值(形参)
定义函数的时候可以以:形参名=值 的形式给参数赋默认值,调用函数的时候有默认值的可以不用传参
注意:没有默认值的参数必须放在有默认值参数的前面
所有的参数都有默认值
def func2 (x=10, y=20, z=30):
print(f'x:{x}, y:{y}, z:{z}')
func2() # x:10, y:20, x:30
func2(100) # x:100, y:20, x:30
func2(y=200) # x:10, y:200, z:30
def func2 (y, x=10, z=30):
print(f'x:{x}, y:{y}, z:{z}')
3.不定长参数(定义)
定义函数的时候参数个数不确定就可以使用不定长参数
1)在形参前面加 *
带一个 * 的形参,本质就是一个元组,对应的实参会作为这个元组的元素
这种不定长参数的函数只能用位置参数传参
2)在形参前面加 **
带一个 ** 的形参,本质就是一个字典,对应的实参会作为这个字典的值
这种不定长参数的函数只能用关键字参数传参
def num_sum1(*num):
print(num)
num_sum1(1, 2, 3, 4, 5) # (1, 2, 3, 4, 5)
定义一个函数,可以求多个数的和
def num_sum(*num):
sum1 = 0
for x in num:
sum1 += x
print(sum1)
num_sum(1)
num_sum(10, 20)
num_sum(1, 2, 3, 4, 5)
def num_sum2(**num):
print(num)
num_sum2(a=10, b=20) # {'a': 10, 'b': 20}