函数的初阶
函数学习
-
函数代码块以 def 关键词开头,后接函数标识符名称和圆括号()。
-
任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数。
-
函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
-
函数内容以冒号起始,并且缩进。
-
语法:
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】函数定义时,默认参数后面必须跟默认参数
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="男")
- 可变参数使用的过程当中,一定要确保取值的范围是正确的,否则会报错: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="非常耐用实惠")

浙公网安备 33010602011771号