函数的初阶

函数学习

如何定义一个函数:

定义一个函数有如下几个步骤:

  • 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号()。

  • 任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数。

  • 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。

  • 函数内容以冒号起始,并且缩进。

  • return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。

语法:

def 函数名(参数列表):
    函数体
    return 返回值

 

默认情况下,参数值和参数名称是按函数声明中定义的顺序匹配起来的。

【1】创建一个简单函数

"""
函数的定义和调用
    创建函数的目的是封装业务逻辑,实现代码的重用,那如何创建和调用函数:
    (1)创建函数的关键字:def
    (2)函数的参数
    (3)函数的返回值,关键字:return
"""
# 定义函数:关键字 def 函数名称 函数的参数
def test(name):
    print("参数:", name)

# 调用函数
test("帅帅")

【2】定义运算函数,实现加减乘除运算

# 定义运算函数
def operator(num1, num2, operator):
    if "+" == operator:
        return num1 + num2
    elif "-" == operator:
        return num1 - num2
    elif "*" == operator:
        return num1 * num2
    elif "/" == operator:
        return num1 / num2
    else:
        return -1


# 运算函数调用
print(operator(20, 10, "+"))    # 30
print(operator(20, 10, "-"))    # 10    
print(operator(20, 10, "*"))    # 200
print(operator(20, 10, "/"))    # 2.0

函数的参数

重点理解:

  • 传入的参数(实际参数)可以是任意类型
  • 函数:必须先定义函数,然后再调用函数!

python函数的参数具有灵活性,其定义的方法可以接受各种形式的参数,也可以简化函数调用方法的代码

  • 函数中的 pass 关键字 保持代码结构的完整性
  • 位置参数:在对函数进行调用时,有几个位置参数就需要传递几个参数,否则会触发异常;并且传入参数和函数参数列表是一一对应的;【和C语言的一样】
  • 默认参数
  • 可选参数
  • 可变参数与关键字参数

重点理解:传入的参数可以是任意类型; 函数:必须先定义函数,然后再调用函数

 

函数的简单使用:

# 定义购买商品的函数
def purchase(productName, quantity, price, amount): # 形式参数
    totalAmount = quantity * price
    if amount >= totalAmount:
        message = "{}购买的数量:{},计算总金额:{},所给的金额:{},可以购买成功!".format(productName, quantity, totalAmount, amount)
        print(message)
        return True
    else:
        message = "{}购买的数量:{},计算总金额:{},所给的金额:{},购买商品的钱不够!".format(productName, quantity, totalAmount, amount)
        print(message)
        return False

# 函数定义好之后,可以调用
result = purchase("方便面", 10, 3.5, 20)   # 实际参数
print(result)
result = purchase("火腿肠", 10, 2.5, 40)   # 实际参数
print(result)

# 【1】test函数目前还没有实现,可用 pass 关键字占位,确保代码不出错
def test():
    pass

test()

# 【2】位置参数:实际参数和形式参数列表是一一对应
def add(num1, num2, num3):
    return num1 + num2 + num3

# 若函数调用时,参数未一一对应,则调用时报错
result = add(10, 20, 30)
print("三个数的和:", result)  # 60

# 【3】参数也可以是列表,元组,字典,集合,Bool值,重点理解:传入的参数可以是任意类型
def printValue(argument):
    print(argument)

printValue([1, 2, 3, 4])  # [1, 2, 3, 4]
printValue((1, 2, 3, 4))  # (1, 2, 3, 4)
printValue({1, 2, 2, 4})  # {1, 2, 4}
printValue({"name": "帅帅", "age": 21})  # {'name': '帅帅', 'age': 21}
printValue(True)  # True

函数的参数类型不唯一:

"""
    1)函数的参数,包括实际参数,形式参数;
       形式参数:数据类型不唯一,可以包含:数字,字符串,字典,元祖,列表,集合
"""
def classGrade(count, avgScore, className, sexDict, ageTup, usernameLst, sexSet):
    print("学生的人数:", count)
    print("学生的平均分:", avgScore)
    print("班级名称:", className)
    print("学生性别对应的人数:", sexDict)
    print("年龄分布:", ageTup)
    print("姓名分布:", usernameLst)
    print("性别分布:", sexSet)

sexDict = {
    "": 2,
    "": 1
}
ageTup = (21, 22, 23)
usernameLst = ["帅帅", "超仔", "小微"]
sexSet = {"", ""}

# 函数调用
classGrade(3, 98.9, "大一一班", sexDict, ageTup, usernameLst, sexSet)

默认参数

默认参数:是指带有默认值的参数,在对函数进行调用时,可以不必显示传递给该函数,若不传值时,函数则使用默认值;

重点理解:不管你调用多少次,默认参数只会执行一次,这条规则在默认值为可变对象(列表,集合,字典)时非常重要;

【1】官方建议默认值参数尽量使用不可变对象,因为可变对象会存储,在后续调用中传递给它的参数!

【2】函数定义时,默认参数后面必须跟默认参数

【3】列表,集合,字典都是引用传递,函数的外面(和函数并列)和里面(函数体)值都是一样的

def fun(a, b = []):
    print("前期:", b)
    b.append(a)
    print("后期:", b)

fun(100)    # [100]
fun(200)    # 期待是 [100]  结果:[100, 200]
fun(300)    # 期待是 [100]  结果:[100, 200, 300]

# 函数的引用传递使用
def func(age, lst):
    lst.append(age)
    print(lst)
    print("==================================")

lst = []        # lst 列表 是可变的,列表作为参数的话,是引用传递,不是值传递
func(21, lst)
print(lst)
func(22, lst)
print(lst)
func(23, lst)
print(lst)
func(24, lst)
print(lst)

重点:可变对象会存储,在后续调用中传递给它的参数;默认值必须使用不可变对象!

def fun(a, b = None):
    print("前期:", b)
    # b 目前是不可变参数 None,所以每次都是默认值:None
    if b is None:
        b = []
    b.append(a)
    print("后期:", b)

fun(100)    # [100]
fun(200)    # [200]
fun(300)    # [300]

# 正常有实际参数调用
fun(300, [100, 200])    # 当传了列表时,就是使用实际的参数:[100, 200, 300]

函数定义时,默认参数后面必须跟默认参数,否则会报错!

关键字参数

定义:函数调用时,指定参数名称,称为关键字参数(别和默认参数混淆,这里是函数的调用)

重点理解:关键字参数的参数名需要和函数定义的形式参数名称保持一致;

注意:函数调用时,关键字参数必须在位置参数的后面!参数的顺序是可以互换的,顺序不确定

 

# 函数定义:a 和 c 是默认参数
def fun(num, a = 100, c = 200):
    print(a + c)

# 函数调用:a 和 c 是关键字参数【名称必须一致】
fun(100, a=100, c=200)

# 函数调用:a 和 c 是关键字参数【名称必须一致,但是可以改变顺序】
fun(100, c=200, a=100)


# 定义学习函数
def study(username, time = "08:00:00", transport = "坐地铁", hour = 1):
    message = "%s早起时间:%s,去学校选择的交通工具:%s,使用时间:%d" % (username, time, transport, hour)
    print(message)

# 函数的调用
study("帅帅")
# 函数的调用
study("帅帅", hour = 2, transport = "老爸开车", time = "08:30:00")

 

限定关键字形参

限定关键字形参(明明关键字参数)

  • 特点:必须使用关键字方式传递参数;
  • 重点理解:限定关键字参数,当然就是为了限制后面几个参数只能按关键字参数传递, 这往往因为后面几个形式参数名具有十分明显的含义,显示展示有利于可读性;

* 是占位符,那么 * 后面的形参,函数调用时必须使用关键字参数

 

def fun(arg, *, name, age, sex):
    print(arg)
    print("name = %s,age = %s,sex = %s" % (name, age, sex))

# 函数调用【* 后面的形参,函数调用时必须使用关键字参数】
fun(100, name="帅帅", age=21, sex="")

# * 后面的默认值参数,尾随的参数可以不是默认值参数,因为调用方需要传递关键字参数
def fun(arg, *, sex="", name, age):
    print(arg)
    print("name = %s,age = %s,sex = %s" % (name, age, sex))

# 函数调用【* 后面的形参,函数调用时必须使用关键字参数】
fun(100, name="帅帅", age=21, sex="")

 

可变参数

【1】*参数:最常见的变量名是 args,看到该变量名,一眼就知道变量 args 指向一个 tuple (元组) 对象;

  • 可变参数使用的过程当中,一定要确保取值的范围是正确的,否则会报错:IndexError: tuple index out of range
  • 可变参数的数据类型是:元祖 不可变 () 表示
# args 参数就是可变参数,可以接受多个参数
def fun(num, *args):
    print(num)              # 100
    print(args)             # (200, 300, 400, 500, 600)
    print(type(args))       # <class 'tuple'>
    for element in args:    # 是元组,那么就可以直接遍历输出
        print(element)

# 此时实际参数和形式参数可以不一一对应
fun(100, 200, 300, 400, 500, 600)

# 定义购买洗衣机的函数,包含了可变参数
def purchaseWash(username, amount, location, *args):
    print(args)
    if len(args) > 0:
        message = "%s去%s,使用%.2f购买了一台洗衣机,洗衣机的名称为:%s" % (username, location, amount, args[0])
        print(message)
    else:
        print("洗衣机参数值传递的数量不够!")

# 函数调用
purchaseWash("帅帅", 1000.098, "附近超市", "小天鹅", "美的", "海尔")
print("===============================")
purchaseWash("帅帅", 1000.098, "附近超市")

 【2】**参数:最常见的变量名是 kwargs,看到该变量名,一眼就知道变量 kwargs 指向一个 dict (字典) 对象;

  • ** 来表示可变参数,参数的类型为:dict()
  • 当传递的关键字参数中,函数定义里面有同名参数,不会放到可变参数里面,参数摆放的顺序无关
    # kwargs 指向的是一个空字典 {} 键值对的形式
    def fun(num, **kwargs):
        print(num)              # 100
        print(kwargs)           # {'name': '帅帅', 'age': 21, 'sex': '男'}
        print(type(kwargs))     # <class 'dict'>
        for item in kwargs.items(): # 字典类型,直接遍历键值对
            print(item[0], item[1])
    
    # 此时实际参数和形式参数可以不一一对象
    fun(100, name="帅帅", age=21, sex="")
    
    # 定义洗衣机描述的函数
    def wash(name, amount, desc, **kwagrs):
        message = "洗衣机名称:{},价格:{},描述:{}".format(name, amount, desc)
        print(message)
        print(kwagrs)
        print(type(kwagrs))
        print("洗衣机的字典类型可变参数为:")
        for item in kwagrs.items():
            print(item[0], item[1])
    
    wash("海尔洗衣机", 1000, length=80, width=60, height=100, desc="非常耐用实惠")
posted @ 2024-03-25 21:24  帅帅的编程之路  阅读(27)  评论(0)    收藏  举报