python学习基础篇Day08(P85~~95)

news/2025/1/15 21:51:11/

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函数相关快捷键

  1. “代码自动完成”时间延时设置
    File -> Settings -> Editor -> General -> Code Completion -> Autopopup in (ms):0
  2. 快捷键:
    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

内存图

在这里插入图片描述

三、可变/不可变类型在传参时的区别

  1. 不可变类型参数有:
    数值型(整数,浮点数,复数)
    布尔值bool
    None 空值
    字符串str
    元组tuple
    固定集合frozenset
  2. 可变类型参数有:
    列表 list
    字典 dict
    集合 set
  3. 传参说明:
    不可变类型的数据传参时,函数内部不会改变原数据的值。
    可变类型的数据传参时,函数内部可以改变原数据。

四、案例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 作用域

一、作用域

  1. 作用域:变量起作用的范围。
  2. Local局部作用域:函数内部。
  3. Enclosing 外部嵌套作用域 :函数嵌套。
  4. Global全局作用域:模块(.py文件)内部。
  5. Builtin内置模块作用域:builtins.py文件。

变量名的查找规则

  1. 由内到外:L -> E -> G -> B
  2. 在访问变量时,先查找本地变量,然后是包裹此函数外部的函数内部的变量,之后是全局变量,最后是内置变量。

局部变量

  1. 定义在函数内部的变量(形参也是局部变量)
  2. 只能在函数内部使用
  3. 调用函数时才被创建,函数结束后自动销毁

全局变量

  1. 定义在函数外部,模块内部的变量。
  2. 在整个模块(py文件)范围内访问(但函数内不能将其直接赋值)。

global 语句

  1. 作用:
    在函数内部修改全局变量。
    在函数内部定义全局变量(全局声明)。
  2. 语法:
    global 变量1, 变量2, …
  3. 说明
    在函数内直接为全局变量赋值,视为创建新的局部变量。
    不能先声明局部的变量,再用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

位置传参

定义:实参与形参的位置依次对应。

序列传参

定义:实参用*将序列拆解后与形参的位置依次对应。

关键字传参

定义:实参根据形参的名字进行对应。

字典关键字传参

  1. 定义:实参用**将字典拆解后与形参的名字进行对应。
  2. 作用:配合形参的缺省参数,可以使调用者随意传参。

示例代码

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

缺省参数

  1. 语法:
    def 函数名(形参名1=默认实参1, 形参名2=默认实参2, …):
    函数体
  2. 说明:
    缺省参数必须自右至左依次存在,如果一个参数有缺省参数,则其右侧的所有参数都必须有缺省参数。
    缺省参数可以有0个或多个,甚至全部都有缺省参数。

位置形参

语法:
def 函数名(形参名1, 形参名2, …):
函数体

星号元组形参

  1. 语法:
    def 函数名(*元组形参名):
    函数体
  2. 作用:
    收集多余的位置传参。
  3. 说明:
    一般命名为’args’
    形参列表中最多只能有一个

命名关键字形参

  1. 语法:
    def 函数名(*, 命名关键字形参1, 命名关键字形参2, …):
    函数体
    def 函数名(*args, 命名关键字形参1, 命名关键字形参2, …):
    函数体
  2. 作用:
    强制实参使用关键字传参

双星号字典形参

  1. 语法:
    def 函数名(**字典形参名):
    函数体
  2. 作用:
    收集多余的关键字传参
  3. 说明:
    一般命名为’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

http://www.ppmy.cn/news/405922.html

相关文章

文本编辑程序(第四章 P85)

文本编辑程序 一个 3 行文本存储结构示例&#xff1a; typedef int Status; /* Status是函数的类型,其值是函数结果状态代码&#xff0c;如OK等 */ typedef int Boolean; /* Boolean是布尔类型,其值是TRUE或FALSE */#include<malloc.h> /* malloc()等 */ #include<std…

《推荐系统实战》阅读笔记 第三章 推荐系统冷启动问题

第三章 推荐系统冷启动问题 3.1 冷启动问题简介 冷启动问题类别冷启动问题描述用户冷启动当新用户加入时候&#xff0c;没有他的相关数据&#xff0c;那么如何给他做推荐物品冷启动主要解决如何将新的物品推荐给可能对它感兴趣的用户这一问题系统冷启动主要解决如何在一个新开…

计算机英语2008影印版,(计算机英语2008影印版课后单词翻译.doc

(计算机英语2008影印版课后单词翻译 P21.KEY TERMS application software 应用软件 basic application 基本应用软件 communication device通信设备 compact disc (CD) 光盘 computer competency计算机能力 connectivity连通性 data数据 database file数据库文件 desktop compu…

严蔚敏数据结构第二版(p85,3)

#include <iostream> #include <string> #include <vector> #define MAXSIZE 100 /*习题3 */ using namespace std; typedef struct {int *base;int *top;int size; }SqStack; //初始化 int init(SqStack &S) {S.base new int[MAXSIZE];if(!S.base){…

计算机网络 认证支撑点,计算机网络术及应用参考答案整理版本.doc

计算机网络技术及应用参考答案 (第一章) 填空题 1、(通过传输媒体进行信息传递)、(有线电报)、(互联网)。 2、(模拟通信系统)、(数字通信系统)、(单工通信)、(半双工通信)、(全双工通信)、(串行传输)、(并行传输)。 3、(在两个峰值之间来回振荡的、连续变化的信号)、(周期和频率…

书P85 例5-3 冒泡算法问题

例5-3 编写程序&#xff0c;用起泡法对10个数排序&#xff08;按由小到大顺序&#xff09;。 起泡法的思路&#xff1a;将相邻两个数比较&#xff0c;将小的调到前面。然后进行第2趟比较&#xff0c;对 余下的数按上法进行比较。 可以推知&#xff0c;如果有n个数&#xff0…

计算机网络技术及应用章节答案,计算机网络技术及应用参考答案整理版本..doc...

计算机网络技术及应用参考答案 (第一章) 填空题 1、(通过传输媒体进行信息传递)、(有线电报)、(互联网)。 2、(模拟通信系统)、(数字通信系统)、(单工通信)、(半双工通信)、(全双工通信)、(串行传输)、(并行传输)。 3、(在两个峰值之间来回振荡的、连续变化的信号)、(周期和频率…

计算机网络基础第三版第93页答案,计算机网络技术及应用参考答案整理版本.doc...

计算机网络技术及应用参考答案整理版本.doc 计算机网络技术及应用参考答案 (第一章) 填空题 1、(通过传输媒体进行信息传递)、(有线电报)、(互联网)。 2、(模拟通信系统)、(数字通信系统)、(单工通信)、(半双工通信)、(全双工通信)、(串行传输)、(并行传输)。 3、(在两个峰值之…