09 Python - 函数基础

函数基础

一.函数的作用

没有函数的问题:

​ 1.明明是同样的功能同样的代码需要多少次就要写多少遍 (冗余、重复)

​ 2.如果功能发生改变,所有使用过这个功能的位置都需要修改

解决办法: 使用函数

二.函数基础

1.什么是函数?

​ 1)概念:函数就是对实现某一特定功能的代码段的封装(机器)

​ 2)分类(谁定义的)

​ ① 系统函数 - 系统已经定义了,程序可以直接使用的函数;比如:print、input、type、ord、chr、bin、len、id等等。(别人造好的机器)

​ ②自定义函数 - 程序员自己定义使用的函数。(自己造的机器)

# 举个简单的例子 同样是计算阶乘,我们分别使用循环和函数解决
# 循环解决:
n = 10
sum1 = 1
for x in range(1, n+1):
    sum1 *= x
print(sum1)
# 计算10的阶乘
n = 20
sum1 = 1
for x in range(1,n+1)
	sun1 *= x
print(sum1)
# 计算20的阶乘
# 这里单是计算10的阶乘和20的阶乘我们就写了两遍循环的代码 (没有必要,冗余)

# 函数解决:
def jiecheng(n):
    sum1 = 1
    for x in range(1, n+1):
        sum1 *= x
    print(sum1)
jiecheng(10)
jiecheng(20)
jiecheng(5)
# 这里我们直接调用函数就可以计算阶乘,除了10和20 我们还可以计算其他想计算的值(简单,方便)

2.函数的定义(自己造机器)

语法:

def 函数名(形参列表):
    函数说明文档
    函数体
说明:
    def - python 定义函数的关键字.固定写法
    函数名 - 程序员自己命名:
        标识符,不是关键字(要求)
        所有的字母都小写,多个单词之间用下划线隔开;
        不能用系统提供的函数名、类名
        见名知义(看到函数名大概知道函数的功能是什么)
    ():  -  固定写法
		形参列表 - 格式: 变量名1, 变量名2, 变量名3, ...  (变量可以是没有定义过的变量)
		形参的作用是将函数外面的数据传递到函数里面
	函数说明文档  -def保持一个缩进的三个双引号引起来的注释 (说明书)
	函数体  -def保持一个缩进的一条或者多条语句;实现函数功能的一条或者多条语句 

注意:函数在定义的时候不会执行函数体

简单来说我们可以将定义函数分为以下几个步骤

第一步:确定函数的功能
第二步:根据函数的功能确定函数名
第三步:确定函数的参数(看实现函数的功能需不需要额外的数据,需要几个)
第四步:实现函数功能
(第五步: 确定函数返回值)
第六步:写函数说明文档

现在我们做两个简单的练习:

# 需求: 定义一个函数实现求任意两个数的和的功能
def get_sum(num1, num2):
    """
    求两个数的和(功能说明部分)
    :param num1: 第一个数
    :param num2: 第二个数
    :return: None(返回值说明)
    """
    print(num1 + num2)
# 需求:定义一个函数,打印指定字符串中大写字母的个数
def upper_count(string):
    """
    统计指定字符串中大写字母的个数
    :param string: 被统计的字符串
    :return: None
    """
    count = 0
    for x in string:
        if 'A' <= x <= 'Z':
            count += 1
    print(f'{string} 中大写字母的个数:{count}')

3.函数的调用(使用机器)

语法: 函数名(实参列表)
说明: 函数名 - 需要调用的函数的名字(函数名必须是已经定义过的函数的函数名)
	 ()     -  固定写法
	 实参列表 - 格式: 数据1, 数据2, 数据3, ...   (实参的个数和形参的个数保持一致)
		     - 作用:用来给形参赋值的。(真正传递到函数中使用的数据)
调用函数会执行函数的函数体
# 调用上面用到的函数
get_sum(20,30)  # 50
get_sum(7,10)   # 17
upper_count('hjAjj')  # 1
三.函数的参数

1.位置参数和关键字参数(实参分类)

① 位置参数

实参直接写(直接将多个数据用逗号隔开),让实参和形参从位置上一一对应

def func1(a, b, c):
    print(f'a:{a}, b:{b}, c:{c}')
# 单独使用位置参数传参
func1(20, 30, 40)

② 关键字参数

以: 形参名1 = 值1 , 形参名2 = 值2 ,… 的形式传参

注意:要保证每个参数都有值

def func1(a, b, c):
    print(f'a:{a}, b:{b}, c:{c}')
# 单独使用关键字参数传参
func1(a=20, b=30, c=40)
func1(b=30, c=40, a=20)

③位置参数和关键字参数混合

要求:位置参数必须在关键字参数的前面

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, z:30
func2(100)   # x:100, y:20, z:30
func2(y=200)  # x:10, y:200, z:30

def func3(y, x=10, z=30):
    print(f'x:{x}, y:{y}, z:{z}')

3.不定长参数(定义)

定义参数的时候参数个数不确定就可以使用不定长参数

① 在形参前加 *

带一个*的形参,本质就是一个元组,对应的实参会作为这个元组的元素。

这种不定长参数的函数只能用位置参数传参

②在形参前加 **

带两个*的形参,本质就是一个字典,对应的形参会作为这个字典的值

这种不定长参数的函数只能用关键字参数传参

# 例子:定义一个函数可以求多个数的和
def get_sum(*num):
    sum1 = 0
    for x in num:
        sum1 += x
    print(sum1)

get_sum(1)
get_sum(10, 20)
get_sum(1, 2, 3, 4, 5)

def get_sum2(**num):
    print(num)
get_sum(a=10,b=20)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值