9.27 总结
9.26作业回顾
# 5. 抓球问题,5个红球,8个⿊球,7个⽩球,随机取出10个,
# 且⽩球不少于2个黑球个数不大于3个,看一下这10个球中不同的颜色组合
# 穷举法
方法1:
count5 = 0
for red in range(1, 6):
for black in range(1, 9):
for white in range(1, 8):
if red + black + white == 10 and white >= 2 and black <= 3:
count5 += 1
print(red,black,white)
print(count5)
方法2:
for black in range(1, 4): # 黑球个数不大于3个 最多出现3个
for white in range(2, 8): # 白球个数不少于2个 最少是2个
red = 10 - black - white
if 1 <= red <= 5:
print('红球', red, '黑球', black, '白球', white)
注意:有时候代码一样,也会出现红色波浪线,
错误显示为:TabError: inconsistent use of tabs and spaces in indentation 缩进问题
例如:
这种情况多次缩进 red 带红色代码的位置也没有用,可能是上一行问题,重新查看上一行,用tab重新查看上一行即可
# 6.一个分子数列为2/1, 3/2, 5/3, 8/5, 13/8, 21/13.... 找寻规律,求出钱20项数据之和
# 分子
# 设置一个变量记录和
total = 0
# 前20项
for j in range(1,21):
# str把数据转换为字符串 # 此处为了方便理解才这么些
data = str(member) + '/' + str(denom)
total += member / denom
# 下一个数据
member,denom = member + denom,member
print('前20项数据之和是',total) # 前20项数据之和是 32.66026079864164
# 7.定义一个函数,判断某个数是否是水仙花数
# 水仙花数是一个三位数,每位上数字的立方之和等于数值本身,比如153=1^3+5^3+3^3
方式一:
def count(num):
if 100 <= num <= 999:
num71 = num % 10
num72 = num // 10 % 10
num73 = num // 100
if num71 ** 3 + num72 ** 3 + num73 ** 3 == num:
print('该数是水仙花数')
return '是水仙花数'
else:
return '不是水仙花数'
else:
print('该数不是水仙花数')
return '不是水仙花数'
# 调用:
print(count(153)) # 是水仙花数
print(count(153)) # 不是水仙花数
方式2:
def count(num):
if 100 <= num <= 999:
num71 = num % 10
num72 = num // 10 % 10
num73 = num // 100
if num71 ** 3 + num72 ** 3 + num73 ** 3 == num:
return True
else:
return False
else:
return False
# 需求 输入一个数值 如果是水仙花数 对其 开方的操作 否则进行平方的操作
value1 = int(input('请输入一个数值:'))
result = count(value1) # 此处返回布尔值
if result: # 由于此处返回布尔值,所以不用写成 if result == '是水仙花数'了
print(value1 ** (1/2))
else:
print(value1 ** 2)
# 8. 定义一个函数,判断某个数是否为完美数
# 完美数的定义是一个数的真因子之和等于数值本身,比如6的真因子为1/2/3, 6=1+2+3因此6是完美数
# 真因子包含本身
# 思路 : 获取这个数所以的因子,除了本身之外 一个数的最大因子是二分之一
# 获取1 到数据二分之一的位置 判断其是否是数据的因数
def c8(num):
total = 0 # 记录因子之和
for u in range(1, num // 2 + 1):
if num % u == 0:
total += u
# 将和与数据做判断
return total == num
res = c8(6)
print(res) # True
2.7函数
2.7.1函数定义
对一段功能独立并且重复使用的代码进行封装,当我们需要使用的时候,在进行调用,目的是为了减少代码的重复性,提高代码的复用率
语法格式:
def 函数名(形式参数名, 形式参数名1,...,形式参数名n):
函数功能体
return 返回值
解读:
-
def
关键字,用来定义函数的 -
函数名,根据功能自定义的名字,需要遵守标识符规则
-
() 存放函数的形式参数的,如果没有形式参数,()内为空
形式参数: 函数运算的时候 有些数据的未知[动态]的, 将这些未知的数据使用变量名来进行表示,这个变量名就是形式参数,简称形参。未知的数据有几个,就定义几个形式参数
-
return
,也是一个关键字,结束函数,并把结果返回到函数调用的位置如果功能需求中不需要返回值,可以写成
return None
或者省略注意:return和print不一样
- print把数据输出到程序外的控制台
- return把数据传递到函数调用的位置,数据还是在程序中运转的
定义函数的规则:
- 明确是否有未知项参与功能的运算 【用来定义形式参数有什么】
- 明确是否需要将结果返回到调用的位置 【决定return的情况】
函数的调用:
# 有返回值的函数调用
变量名 = 函数名(实际参数, 实际参数1, 实际参数2,..,实际参数n)
# 没有返回值的函数调用
函数名(实际参数, 实际参数1, 实际参数2,..,实际参数n)
"""
实际参数:实际参与函数功能运算的数据 称为实际参数,简称实参
实际参数的个数要和形式参数的个数一致,并且位置是一一对应的
定义函数的时候 函数内部的功能并未被执行,当调用的时候才会执行内部的功能
"""
2.7.2函数的参数
位置参数
def add(a, b) # 个数不可少传,也不可多传
这个的a和b就是位置参数,也称为必须参数,调用函数的时候必须给这些参数赋值,赋值的顺序和参数的顺序一致并且个数也要一致
默认参数
定义函数的时候,有些参数已经被赋予了数据值,这种参数就称为默认参数
特点: 不给它赋值,使用默认值参与运算,赋值的话使用新值参与运算
print 也是函数,系统环境中内置的函数
print(value,..., sep=' ', end='\n')
适合的场景:有些的参数的值确实是不确定的,但是大部分场景下的值是一样的【也就大部分场景调用的时候传递的值是同一个】,为了简便调用,可以定义的时候,给这个参数设置一个默认值[大众场景下使用的数据]
# 默认参数
# 定义一个函数,求x的y次方
def powser(x,y=2): # 默认参数 y=2
return x ** y
# 例如求3的平方
res = powser(3,2)
print(res)
# 考虑大部分场景都求的是平方
res = powser(9,2)
print(res)
# 有默认参数后:
res = powser(3) # 默认参数为2 求3的平方
print(res)
# 注意,默认参数位置不能反
def powser(y=2,x):
return x ** y # 会报错 默认参数必须在非默认参数后面才行
# SyntaxError: non-default argument follows default argument
# SyntaxError:非默认参数跟随默认参数
注意:默认参数定义的位置必须在位置参数之后
关键字参数
针对调用的时候,传递的实参格式可以写成 形参名=实参值
, 这种格式称为关键字参数
# 关键字参数
# 函数的功能是 获取某个月的天数
'''
未知的数据有几个? 2个 年和月 【年是因为特殊的2月份,平闰年问题】
返回值,返回的是天数
'''
def get_day(year,month):
if month not in range(1,13):
# 报错
raise ValueError('data value not in 1-12')
# 元组 使用()包含多个数据的容器
# in是成员运算符 如果月份是列出来数据中其中一个
if month in (1,3,5,7,8,9,10,12):
return 31
elif month in (4,6,9,11):
return 30
else:
if (year % 4 == 0 and year % 100 != 0) or (year % 400 == 0):
return 29
else:
return 28
print(get_day(2022,2))
# 如果传递数据有些多,可用关键字参数
print(get_day(year=2022,month=2))
# 顺序可反
print(get_day(month=4,year=2020))
# 但如果是位置参数格式传值 顺序不能发生变化 它是一一对应的
get_day(4,2022)
关键字参数在进行传值的时候,顺序可以发生变化【本质上再给变量名进行赋值,找到匹配的变量名进行相应的赋值】
可变参数
定义函数的时候,需要按照需求分析未知项的个数,来确定形参的个数,但是有些场景格式无法确定的,比如封装一个函数:求多个数据的和,像这种形式参数个数不能确定的使用可变参数,可变参数有两种格式:
-
*args
【args
就是一个变量,可以定义成其他名字】应用于多个位置参数的传值
# 可变参数 # 接触过可变参数了 在print # print(*args) 决定了print可以一次性打印多个数据 # 自己定义 def get_sum(*nums): # 当使用*来标记nums的时候 nums就变成了一个容器型数据 # 因为需要接受多个数据,索引接受的变量需要是一个容器类型的 print(nums, type(nums)) # (1, 2, 3) <class 'tuple'> 小括号包含着多个数据 类型元组类型的 total = 0 # 记录累加和 for ele in nums: total += ele return total # 调用函数 可传递一个或者多个,或者不传递 print(get_sum(1, 2, 3)) # 传递一个 # (1, 2, 3) <class 'tuple'> # 6 get_sum(1) # 传递多个 # (1,) <class 'tuple'> get_sum() # 不传递 # () <class 'tuple'>
-
**kwargs
【kwargs
也是一个变量,可以定义成其他名字】应用于多个关键字参数
形参名=数据值
的传值## **kwargs """ 注册的时候有必填项和选填项 必填项:用户名 密码 选填项:性别 出生日期 籍贯 流程: 在网站上注册的时候 填的信息 网站的服务器要对这些信息进行存储 网站要对用户的信息进行保存 必填项代表的是 必须传递的数据 【使用函数中的位置参数来表示】 选填项 可以填也可以不填 填1个 也可以填多个 个数就不确定了 【填的信息也不确定】 【使用可变参数来表示】 为了明确传递的是性别 还是出生日期 还是籍贯 使用关键字形式传值 进行标记 """ def register(username, password, **kwargs): # {} 代表的是字典类型的容器,对每个数据都有标记 数据格式是{key:value} # value就是数据值 key就是数据的标记 可以通过key标记获取到对应的数据值 print('填充的信息有', username, password, kwargs) # 如何根据标记名获取值 kwargs.get(key) # 在kwargs中获取key对应的数据值 【key是实际的标记名称】 # 如果有相应的信息 返回对应的数据,没有的话返回空值 print(kwargs.get('出生日期')) # 必填项:用位置参数 register('admin', '123456') # 关键字参数传值 格式 变量名=实参值 register('admin', '123456', 性别='女', 出生日期='2000-11-10') # 填充的信息有 admin 123456 {'性别': '女', '出生日期': '2000-11-10'} # 命名关键字参数 # 涉及到一个符号 * # 定义函数的时候,*后面的参数必须以关键字格式传值 def register1(*, username, password): print(username, password) # register1('admin', '123456') # TypeError: register1() takes 0 positional arguments but 2 were given # 以位置参数传的,应该用关键字参数传 # 关键字参数传: register1(username='admin', password='123456') # 调用工具库的时候会用 # pymysql.Connection # 调用工具库
er1(*, username, password):
print(username, password)
register1(‘admin’, ‘123456’)
TypeError: register1() takes 0 positional arguments but 2 were given
以位置参数传的,应该用关键字参数传
关键字参数传:
register1(username=‘admin’, password=‘123456’)
调用工具库的时候会用
pymysql.Connection # 调用工具库
![外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传](https://img-home.csdnimg.cn/images/20230724024159.png?origin_url=D%3A%5C%E8%AE%B2%E8%AF%BE%E6%96%87%E4%BB%B6%5Cpython%E6%AD%A3%E5%BC%8F%E5%BC%80%E8%AF%BE%5Cpython%E6%AD%A3%E5%BC%8F%E7%AC%AC%E5%85%AB%E8%8A%82%EF%BC%889.27%EF%BC%89%5Cday08_%E5%87%BD%E6%95%B0%5C%E7%AC%94%E8%AE%B0%5C43adcdba721e7bb2553c751101d261e.png&pos_id=img-MC3duML5-1725214089377)