Python小白学习笔记五 函数 1
函数 function
pycharm快捷键
Ctrl + P 参数信息(在方法中调用参数)
Ctrl + Q 快速查看文档
Ctrl + Alt + M 提取方法
定义
1.用于封装一个特定的功能,表示一个功能或者行为。
2.函数是可以重复执行的语句块, 可以重复调用。
3.函数代码块以 def 关键词开头,后接函数标识符名称和圆括号()。
4.任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数。
5.函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
6.函数内容以冒号起始,并且缩进。
7.return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。
作用
提高代码的可重用性和可维护性(代码层次结构更清晰)。
定义函数
语法:
def 函数名(形式参数):
函数体
例如:
1 def repeated_attack(count): 2 """ 3 重复攻击 4 :param count:int类型,攻击次数 5 """ 6 for __ in range(count): 7 print("正蹬") 8 print("直拳") 9 print("摆拳") 10 print("勾拳") 11 # 数据 12 # 实际参数 13 repeated_attack(2) 14 repeated_attack(3)
- 说明:
def 关键字:全称是define,意为”定义”。
函数名:对函数体中语句的描述,规则与变量名相同。
形式参数:方法定义者要求调用者提供的信息。
函数体:完成该功能的语句。
- 函数的第一行语句建议使用文档字符串描述函数的功能与参数。
- 语法:函数名(实际参数)
- 说明:根据形参传递内容。
- 函数的第一行语句建议使用文档字符串描述函数的功能与参数。
调用函数
返回值
方法定义者告诉调用者的结果。
- 语法:
return 数据
说明:
return后没有语句,相当于返回 None。
函数体没有return,相当于返回None。
例如:
1 # 创建美元转换为人民币的函数 2 def usd_to_cny(usd): 3 """ 4 美元转换为人民币 5 :param usd: 美元 6 :return:人民币 7 """ 8 # 2. 逻辑处理 - 美元 * 6.99 9 cny = usd * 6.99 10 return cny # 给 11 12 13 # 收 14 result = usd_to_cny(5) 15 print(result)
1 """ 2 返回值 - 语法 3 """ 4 # 1. python中函数默认返回None 5 def func01(): 6 print("func01执行了") 7 # return None 8 9 esult = func01() 10 print(result) # None 11 12 # 2.python中return后面没有数据,默认为None 13 def func02(): 14 print("func02执行了") 15 return 16 17 result = func02() 18 print(result) # None 19 20 # 3. return可以退出函数(无论多少层循环嵌套,都可以) 21 def func03(): 22 print("func03执行了") 23 return 24 print("func03又执行了") 25 26 func03()
可更改(mutable)与不可更改(immutable)对象
在 python 中,strings, tuples, 和 numbers 是不可更改的对象,而 list,dict 等则是可以修改的对象。
-
-
不可变类型:变量赋值 a=5 后再赋值 a=10,这里实际是新生成一个 int 值对象 10,再让 a 指向它,而 5 被丢弃,不是改变a的值,相当于新生成了a。
-
可变类型:变量赋值 la=[1,2,3,4] 后再赋值 la[2]=5 则是将 list la 的第三个元素值更改,本身la没有动,只是其内部的一部分值被修改了。
-
python 函数的参数传递:
-
-
不可变类型:类似 c++ 的值传递,如 整数、字符串、元组。如fun(a),传递的只是a的值,没有影响a对象本身。比如在 fun(a)内部修改 a 的值,只是修改另一个复制的对象,不会影响 a 本身。
-
可变类型:类似 c++ 的引用传递,如 列表,字典。如 fun(la),则是将 la 真正的传过去,修改后fun外部的la也会受影响
-
python 中一切都是对象,严格意义我们不能说值传递还是引用传递,我们应该说传不可变对象和传可变对象。
可变/不可变类型在传参时的区别
1.不可变类型参数有:
数值型(整数,浮点数)
布尔值bool
None 空值
字符串str
元组tuple
2.可变类型参数有:
列表 list
字典 dict
集合 set
1 """ 2 作用域 3 变量起作用的范围 4 全局变量:大范围(多个函数)需要操作的数据 5 局部变量:小范围(一个函数)需要操作的数据 6 """ 7 8 # -------全局变量-------- 9 # 全局作用域:文件内部 10 # 全局变量能在整个文件中使用(函数内部可以读取) 11 b = 20 12 13 # -------创建函数-------- 14 def func01(): 15 # 局部作用域:函数内部 16 # 局部变量只能在函数内部使用 17 a = 10 18 print(b) 19 20 # -------调用函数-------- 21 func01()
例如:
1 """ 2 全局变量与局部变量 3 """ 4 a = 10 5 6 def func01(): 7 # 在函数内部,只能读取全局变量 8 a = 20 # 创建局部变量,没有修改全局变量 9 print(a) # 20 10 11 func01() 12 print(a) # 10 13 14 def func02(): 15 global a # 如果在局部变量修改全局变量,必须通过global声明 16 a = 20 17 print(a) 18 19 func02() 20 print(a) 21 # 注意: 22 c = [10] 23 def func03(): 24 c[0] = 20 # 没有修改全局变量c(修改的的是列表的元素) 25 print(c) # [20] 26 27 func03() 28 print(c) # [10]
传参说明:
不可变类型的数据传参时,函数内部不会改变原数据的值。
可变类型的数据传参时,函数内部可以改变原数据。
相关练习:
练1:
1 def calculate_weight(sum_liang): 2 """ 3 两换算为xx斤零xx两 4 :param sum_liang: 输入初始值 5 :return: 返回xx斤零xx两 6 """ 7 jin = sum_liang //16 8 liang = sum_liang %16 9 return jin,liang 10 sum_liang = int(input("请输入两:")) 11 jin,liang = calculate_weight(sum_liang) 12 print("%d两是%s斤零%s两" % (sum_liang,jin,liang))
练2:
1 def calculate_area(top,down,hight): 2 calculate_area = (top + down) * hight / 2 3 return calculate_area 4 top = int(input("请输入上低:")) 5 down = int(input("请输入下低:")) 6 hight = int(input("请输入高:")) 7 calculate_area = calculate_area(top,down,hight) 8 print("梯形的面积为%d" % (calculate_area))
练3:
1 def iq_grade(age_of_mind,age_of_real): 2 iq_grade = age_of_mind / age_of_real * 100 3 if iq_grade >= 140: 4 return "天才" 5 if iq_grade >= 120: #如果上一个条件满足,return执行后,退出函数 6 return "超常" 7 if iq_grade >= 110: 8 return "聪慧" 9 if iq_grade >= 90: 10 return "正常" 11 if iq_grade >= 80: 12 return "迟钝" 13 return "低能" 14 15 age_of_mind = int(input("请输入心理年龄:")) 16 age_of_real = int(input("请输入实际年龄:")) 17 iq_grade = iq_grade(age_of_mind,age_of_real) 18 print(iq_grade)
练4(较难理解,可参考文字注释):
1 # 员工列表(员工编号 部门编号 姓名 工资) 2 dict_employees = { 3 1001: {"did": 9002, "name": "师父", "money": 60000}, 4 1002: {"did": 9001, "name": "孙悟空", "money": 50000}, 5 1003: {"did": 9002, "name": "猪八戒", "money": 20000}, 6 1004: {"did": 9001, "name": "沙僧", "money": 30000}, 7 1005: {"did": 9001, "name": "小白龙", "money": 15000}, 8 } 9 10 # 部门列表(部门编号,部门名称) 11 list_departments = [ 12 {"did": 9001, "title": "教学部"}, 13 {"did": 9002, "title": "销售部"}, 14 {"did": 9003, "title": "品保部"}, 15 ] 16 #通过函数解决以下问题 17 # 1.打印所有员工信息, 18 def print_all_employees(): 19 """ 20 :return: 输出dict_employees 的所有信息 21 """ 22 for cid, info in dict_employees.items():#遍历dict_employees的所有信息 23 print_single_employee(cid, info) # 输出dict_employees 的所有信息 24 def print_single_employee(cid, info): 25 print(f"{info['name']}的员工编号是{cid},部门编号是{info['did']},月薪{info['money']}元.") 26 27 # 2. 打印所有月薪大于2w的员工信息, 28 def print_gt_2w_employees(): #根据题目信息命名函数名 29 for key, value in dict_employees.items(): #遍历,比较大小,输出符合要求的员工信息 30 if value['money'] > 20000: 31 print_single_employee(key, value) 32 33 # 3. 在部门列表中查找编号最小的部门 34 def get_min_by_did(): #根据题目信息命名函数名 35 min_value = list_departments[0] #将list_departments中的第一个值设定为最小值 36 for i in range(1, len(list_departments)): 37 if min_value["did"] > list_departments[i]["did"]: #将list_departments中剩余的值域最小值 38 # 进行比较大小,并将结果重新赋值给min_value 39 min_value = list_departments[i] 40 return min_value 41 42 # 4. 根据部门编号对部门列表升序排列 43 def order_by_did(): 44 # (1)取 45 for r in range(len(list_departments) - 1): 46 # (2)比 47 for c in range(r + 1, len(list_departments)): 48 # (3) 发现更小 49 if list_departments[r]["did"] > list_departments[c]["did"]: 50 # (4) 交换 51 list_departments[r], list_departments[c] = list_departments[c], list_departments[r] 52 return list_departments 53 54 # 测试 55 print_all_employees() # 1. 56 print_gt_2w_employees() #2. 57 result = get_min_by_did() 58 print(result) #3. 59 result = order_by_did() 60 print(result) #4
浙公网安备 33010602011771号