b站达内python课学习笔记
P85 Python基础-8.1 课程内容回顾
一、day07复习
"""day07 复习能力提升for for# 结论:外层循环执行一次,内层循环执行多次。外层控制行,内层控制列.for r in range(2):# 0 1for c in range(3):#012 012pass函数定义:功能,使用一个名称,包装多个语句。语法:做def 名字(形参):函数体用名字(实参)
"""
P86 Python基础-8.2 练习解析
一、练习1
"""
3. 定义在控制台中打印二维列表的函数
[[1,2,3,44],[4,5,5,5,65,6,87],[7,5]
]1 2 3 44
4 5 5 5 65 6 87
7 5
"""
def print_double_list(double_list):"""打印二维列表:param double_list: 需要打印的二维列表"""for line in double_list:for item in line:print(item, end=" ")print()list01 = [[1, 2, 3, 44],[4, 5, 5, 5, 65, 6, 87],[7, 5]
]
print_double_list(list01)
二、练习2
"""
4. (扩展)方阵转置.(不用做成函数)提示:详见图片.
"""
list01 = [[1, 2, 3, 4],[5, 6, 7, 8],[9, 10, 11, 12],[13, 14, 15, 16],
]# 分析过程
"""
#list01[1][0] <->list01[0][1]
#list01[2][0] <->list01[0][2]
#list01[3][0] <->list01[0][3]for r in range(1,4):#list01[r][0]<->list01[0][r]pass
#list01[2][1] <->list01[1][2]
#list01[3][1] <->list01[1][3]
for r in range(2,4):#2 3# list01[r][1] <->list01[1][r]pass
#list01[3][2] <->list01[2][3]
for r in range(3,4):# list01[r][2] <->list01[2][r]passfor c in range(1,4):#1 2 3for r in range(c,4):list01[r][c-1],list01[c-1][r]=list01[c-1][r],list01[r][c-1]"""for c in range(1, len(list01)): # 1 2 3for r in range(c, len(list01)):list01[r][c - 1], list01[c - 1][r] = list01[c - 1][r], list01[r][c - 1]print(list01)
自己的代码:只考虑下三角的元素坐标
list3 = [[1,2,3,4,0],[4,6,7,8,5],[9,10,11,12,8],[13,14,15,16,9],[79,50,55,67,788]
]
def trans_list(list2):for i in range(1,len(list2)):for j in range(len(list2[1])-1):list2[i][j], list2[j][i] = list2[j][i],list2[i][j]
trans_list(list3)
print(list3)
P87 Python基础-8.3 函数返回值
一、定义:
方法定义者告诉调用者的结果。
二、语法:
return 数据
三、说明:
return后没有语句,相当于返回 None。
函数体没有return,相当于返回None。
四、示例代码:return语句,调试键F7和F8
"""函数返回值 语法
"""
# 参数:调用者传递给定义者的信息
# 返回值:定义者传递给调用者的结果
def fun01(a):print("fun01执行喽")# 作用:1. 返回结果 2.退出方法return 20print("fun01又执行喽")# F8 逐过程 (调试时跳过方法)
# F7 逐语句 (调试时进入方法)
re = fun01(10)
print(re)# 无返回值函数
def fun02(a):print("fun01执行喽")# return Nonere = fun02(100)
print(re)
五、示例代码2:return语句应用。函数设计思想:单干一件事
# 设计思想:分而治之
# 干一件事# 需求:定义两个数字相加的函数
# def add():
# 1. 获取数据
# number01 = int(input("请输入第一个数字:"))
# number02 = int(input("请输入第二个数字:"))
# 2. 逻辑计算
# result = number01 + number02
# 3. 显示结果
# print(result)
#
# add()def add(number01, number02):# 逻辑处理return number01 + number02# 调用者提供数据
number01 = int(input("请输入第一个数字:"))
number02 = int(input("请输入第二个数字:"))
result = add(number01, number02)
# 调用者负责显示结果
print("结果是:" + str(result))
P88 Python基础-8.4 函数练习01
一、练习1
"""练习1:定义计算四位整数,每位相加和的函数.测试:"1234" "5428"
"""
def each_unit_sum(number):"""计算整数的每位相加和:param number: 四位整数:return: 相加的结果"""result = number % 10result += number // 10 % 10result += number // 100 % 10result += number // 1000return result# 测试
re01 = each_unit_sum(1234)
print(re01)
re01 = each_unit_sum(4875)
print(re01)
二、练习2
'''
# 练习2:定义根据两,计算几斤零几两的函数
# weight_liang = int(input("请输入两:"))
# jin = weight_liang // 16
# liang = weight_liang % 16
# print(str(jin) + "斤零" + str(liang) + "两")
'''
def get_weight_for_jin(liang_weight):"""根据两,计算几斤零几两.:param liang_weight:需要计算的两:return: 元组 (斤,两)"""jin = liang_weight // 16liang = liang_weight % 16return (jin,liang)
re = get_weight_for_jin(100)
print(str(re[0]) + "斤零" + str(re[1]) + "两")
三、pycharm函数相关快捷键
- “代码自动完成”时间延时设置
File -> Settings -> Editor -> General -> Code Completion -> Autopopup in (ms):0 - 快捷键:
Ctrl + P 参数信息(在方法中调用参数)
Ctrl + Q 快速查看文档
Ctrl + Alt + M 提取方法
P89 Python基础-8.5 函数练习02
一、练习1:利用函数的return语句简化原有功能的逻辑:由if elif else变为只用if
'''
# 练习:定义 根据成绩计算等级 的函数
# score = int(input("请输入成绩:"))
# if score > 100 or score < 0:
# print("输入有误")
# elif 90 <= score:
# print("优秀")
# elif 80 <= score:
# print("良好")
# elif 60 <= score:
# print("及格")
# else:
# print("不及格")# def get_score_level(score):
# if score > 100 or score < 0:
# return "输入有误"
# elif 90 <= score:
# return "优秀"
# elif 80 <= score:
# return "良好"
# elif 60 <= score:
# return "及格"
# else:
# return "不及格"
'''
def get_score_level(score):if score > 100 or score < 0:return "输入有误"if 90 <= score:return "优秀"if 80 <= score:return "良好"if 60 <= score:return "及格"return "不及格"print(get_score_level(80))
二、练习2:利用函数的return语句简化原有功能的逻辑:一个return退出函数 VS 多个break退出函数内的多个循环;返回值可能两个情况,选用bool来返回
'''
# 练习:定义 判断列表中是否存在相同元素的 函数
# list01 = [3, 81, 3, 5, 81, 5]
# result = False
# for r in range(0, len(list01) - 1):
# for c in range(r + 1, len(list01)):
# if list01[r] == list01[c]:
# print("具有相同项")
# result = True
# break # 退出循环
# if result:
# break
# if result == False:
# print("没有相同项")# def is_repeating(list_target):
# for r in range(0, len(list_target) - 1):
# for c in range(r + 1, len(list_target)):
# if list_target[r] == list_target[c]:
# return "具有相同项"
# return "没有相同项"
'''
def is_repeating(list_target):for r in range(0, len(list_target) - 1):for c in range(r + 1, len(list_target)):if list_target[r] == list_target[c]:return True # 有重复return False # 没有重复print(is_repeating([3, 8, 23, 5, 81, 1]))
三、练习3:一步步优化确定某年某月天数的函数代码
1、初代代码
定义函数,根据年月,计算有多少天。考虑闰年29天,平年28天
month = int(input("请输入月份:"))
if month < 1 or month > 12:print("输入有误")
elif month == 2:print("28天")
elif month in (4,6,9,11):print("30天")
else:print("31天")
2、优化1:改为函数,加入闰年判断,用return简化if else结构
def get_day_by_month(year, month):if month < 1 or month > 12:return "输入有误"if month == 2:if year % 4 == 0 and year % 100 != 0 or year % 400 == 0:return "29天"else:return "28天"if month in (4, 6, 9, 11):return "30天"return "31天"
3、优化2:将返回值修改为整数,且统一
# 不建议方法的返回值类型可能是多种
bool int
def get_day_by_month(year, month):if month < 1 or month > 12:return Falseif month == 2:if year % 4 == 0 and year % 100 != 0 or year % 400 == 0:return 29else:return 28if month in (4, 6, 9, 11):return 30return 31
4、优化3:遵循函数干一件事的原则,将判断年份的部分独立为一个函数
且由于 if的判断 和 返回类型 可以统一为bool型,进一步优化为 直接return原来的if判断
def is_leap_year(year):# if year % 4 == 0 and year % 100 != 0 or year % 400 == 0:# return True# else:# return Falsereturn year % 4 == 0 and year % 100 != 0 or year % 400 == 0
5、优化4:将函数内部的 if语句 简化为 if表达式
def is_leap_year(year):return year % 4 == 0 and year % 100 != 0 or year % 400 == 0
def get_day_by_month(year, month):if month < 1 or month > 12:return 0'''if month == 2:if is_leap_year(year):return 29else:return 28'''if month == 2:return 29 if is_leap_year(year) else 28if month in (4, 6, 9, 11):return 30return 31
P90 Python基础-8.6 函数内存图
一、案例1
# 在方法区中存储函数代码,不执行函数体
def fun01(a):a = 100num01 = 1
# 因为调用函数,所以开辟一块内存空间,叫做栈帧
# 用于存储在函数内部定义的变量(包含参数).
fun01(num01)
# 函数执行完毕后,栈帧立即释放(其中定义的变量也会销毁).
print(num01)#1
内存图
二、案例2
def fun02(a):# 改变的是传入的可变对象a[0] = 100list01 = [1]
fun02(list01)
print(list01[0])# 100
内存图
三、可变/不可变类型在传参时的区别
- 不可变类型参数有:
数值型(整数,浮点数,复数)
布尔值bool
None 空值
字符串str
元组tuple
固定集合frozenset - 可变类型参数有:
列表 list
字典 dict
集合 set - 传参说明:
不可变类型的数据传参时,函数内部不会改变原数据的值。
可变类型的数据传参时,函数内部可以改变原数据。
四、案例3
def fun03(a):# 改变的是fun03栈帧中变量a的指向a = 100list01 = [1]
fun03(list01)
print(list01[0])# 1
内存图
五、案例4
def fun04(a):a[1] = [200]list01 = [1,[2,3]]
fun04(list01)
print(list01[1])# [200]
内存图
P91 Python基础-8.7 练习解析及练习
一、练习1:列表排序函数(可变对象,无需return)
# 定义列表升序排列的函数
# list01= [43,4,5,6,7]
# for r in range(len(list01) - 1):
# for c in range(r + 1, len(list01)):
# if list01[r] > list01[c]:
# list01[r], list01[c] = list01[c], list01[r]
#
# print(list01)def sort(list_target):# 满足以下两个条件,就无需通过返回值传递结果。# 1.传入的是可变对象# 2.函数体修改的是传入的对象for r in range(len(list_target) - 1):for c in range(r + 1, len(list_target)):if list_target[r] > list_target[c]:list_target[r], list_target[c] = list_target[c], list_target[r]
list01 = [43, 4, 5, 6, 7]
sort(list01)
print(list01)
二、练习2:转置方阵函数(可变对象,无需return)
# 练习:定义方阵转置函数
# list01 = [
# [1, 2, 3, 4],
# [5, 6, 7, 8],
# [9, 10, 11, 12],
# [13, 14, 15, 16],
# ]
# for c in range(1, len(list01)): # 1 2 3
# for r in range(c, len(list01)):
# list01[r][c - 1], list01[c - 1][r] = list01[c - 1][r], list01[r][c - 1]
# print(list01)def square_matrix_transpose(sqr_matrix):"""方阵转置:param sqr_matrix: 二维列表类型的方阵"""for c in range(1, len(sqr_matrix)):for r in range(c, len(sqr_matrix)):sqr_matrix[r][c - 1], sqr_matrix[c - 1][r] = sqr_matrix[c - 1][r], sqr_matrix[r][c - 1]list01 = [[1, 2, 3, 4],[5, 6, 7, 8],[9, 10, 11, 12],[13, 14, 15, 16],
]
# 矩阵转置的转置等于原矩阵
square_matrix_transpose(list01)
print(list01)
square_matrix_transpose(list01)
print(list01)
P92 Python基础-8.8 作用域
一、作用域
- 作用域:变量起作用的范围。
- Local局部作用域:函数内部。
- Enclosing 外部嵌套作用域 :函数嵌套。
- Global全局作用域:模块(.py文件)内部。
- Builtin内置模块作用域:builtins.py文件。
变量名的查找规则
- 由内到外:L -> E -> G -> B
- 在访问变量时,先查找本地变量,然后是包裹此函数外部的函数内部的变量,之后是全局变量,最后是内置变量。
局部变量
- 定义在函数内部的变量(形参也是局部变量)
- 只能在函数内部使用
- 调用函数时才被创建,函数结束后自动销毁
全局变量
- 定义在函数外部,模块内部的变量。
- 在整个模块(py文件)范围内访问(但函数内不能将其直接赋值)。
global 语句
- 作用:
在函数内部修改全局变量。
在函数内部定义全局变量(全局声明)。 - 语法:
global 变量1, 变量2, … - 说明
在函数内直接为全局变量赋值,视为创建新的局部变量。
不能先声明局部的变量,再用global声明为全局变量。
二、示例代码
# 全局变量
g01 = "ok"# print(l01)
def fun01():# 局部变量:在函数内部定义的变量l01 = 100
# print(l01)print(l01)# 在函数内部可以读取全局变量# print(g01)# 创建了一个局部变量g01,而不是修改全局变量# g01 = "no"# 定义全局变量g01global g01# 此时修改的是全局变量g01 = "no"print(g01)# 定义全局变量g02global g02g02 = 250fun01()print(g01) # ?print(g02)
内存图
P93 Python基础-8.9 练习解析及函数传参01
一、练习1
'''
# 练习:记录一个函数fun01的执行次数.
# 画出内存图# def fun01():
# pass
#
# fun01()
# fun01()
# fun01()
# fun01()
# fun01()
# print("调用?次")
'''
count = 0def fun01():global countcount += 1fun01()
fun01()
fun01()
fun01()
fun01()
print("调用" + str(count) + "次")
二、函数传参1:实参传递方式argument
位置传参
定义:实参与形参的位置依次对应。
序列传参
定义:实参用*将序列拆解后与形参的位置依次对应。
关键字传参
定义:实参根据形参的名字进行对应。
字典关键字传参
- 定义:实参用**将字典拆解后与形参的名字进行对应。
- 作用:配合形参的缺省参数,可以使调用者随意传参。
示例代码
def fun01(a, b, c, d):print(a)print(b)print(c)print(d)# 位置实参:实参与形参根据位置进行依次对应.
fun01(1, 2, 3, 4)# 关键字实参:实参与形参根据名称进行对应
fun01(b=1, d=2, c=3, a=4)# 序列实参:星号将序列拆分后按位置与形参进行对应
# 如果参数很多,可以存储在序列(字符串/列表/元组)中,
# 再通过*拆分,直接传入函数.
list01 = ["a","b","c","d"]
fun01(*list01)# 字典实参:双星号将字典拆分后按名称与形参进行对应
# 如果参数很多,可以存储在字典中,
# 再通过**拆分,传入函数.
dict01 = {"a": 1, "c": 3, "d": 4, "b": 2}
fun01(**dict01)
P94~95 Python基础-8.10&11 函数传参02&03
一、函数传参2:形参定义方式parameter
缺省参数
- 语法:
def 函数名(形参名1=默认实参1, 形参名2=默认实参2, …):
函数体 - 说明:
缺省参数必须自右至左依次存在,如果一个参数有缺省参数,则其右侧的所有参数都必须有缺省参数。
缺省参数可以有0个或多个,甚至全部都有缺省参数。
位置形参
语法:
def 函数名(形参名1, 形参名2, …):
函数体
星号元组形参
- 语法:
def 函数名(*元组形参名):
函数体 - 作用:
收集多余的位置传参。 - 说明:
一般命名为’args’
形参列表中最多只能有一个
命名关键字形参
- 语法:
def 函数名(*, 命名关键字形参1, 命名关键字形参2, …):
函数体
def 函数名(*args, 命名关键字形参1, 命名关键字形参2, …):
函数体 - 作用:
强制实参使用关键字传参
双星号字典形参
- 语法:
def 函数名(**字典形参名):
函数体 - 作用:
收集多余的关键字传参 - 说明:
一般命名为’kwargs’
形参列表中最多只能有一个
二、示例代码
# 1. 缺省(默认)形参:如果实参不提供,可以使用默认值.
def fun01(a=None, b=0, c=0, d=0):print(a)print(b)print(c)print(d)# 关键字实参 + 缺省形参:调用者可以随意传递参数.
# fun01(b=2, c=3)# 2. 位置形参
def fun02(a, b, c, d):print(a)print(b)print(c)print(d)# 3.星号元组形参: * 将所有实参合并为一个元组
# 作用:让实参个数无限
def fun03(*args):print(args)# fun03()# ()
# fun03(1)# (1,)
# fun03(1,"2")# (1, '2')# 4.命名关键字形参:在星号元组形参以后的位置形参
# 目的:要求实参必须使用关键字实参.
def fun04(a, *args, b):print(a)print(args)print(b)fun04(1, b=2)
fun04(1, 2, 3, 4, b=2)def fun05(*, a, b):print(a)print(b)fun05(a=1, b=2)# 5. 双星号字典形参:**目的是将实参合并为字典.
# 实参可以传递数量无限的关键字实参.
def fun06(**kwargs):print(kwargs)fun06(a=1, b=2)
三、练习1:关键字实参 + 缺省形参:调用者可以随意传递参数
# 练习:定义函数,根据小时,分钟,秒,计算总秒数.
# 要求:可以只计算小时-->秒
# 可以只计算分钟-->秒
# 可以只计算小时+分钟-->秒
# 可以只计算小时+秒-->秒
def get_total_second(hour=0, minute=0, second=0):return hour * 3600 + minute * 60 + second# 小时,分钟,秒,
print(get_total_second(1, 1, 1))
# 小时,分钟
print(get_total_second(2, 3))
# 分钟,秒,
print(get_total_second(minute=2, second=3))
# 小时,
print(get_total_second(2))
# 分钟,
print(get_total_second(minute=2))
四、练习2:星号元组形参: *
# 练习:定义函数,数值相加的函数.
def adds(*args):# result = 0# for item in args:# result += item# return resultreturn sum(args)print(adds(1, 22, 3, 3, 4, 5, 6))
print(adds(1, 4, 5, 6))
五、参数自左至右的顺序
位置形参 --> 星号元组形参 --> 命名关键字形参 --> 双星号字典形参
# 作业:调用fun07。
def fun07(a, b, *args, c, d, **kwargs):pass