9.27 总结

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)
方法2for 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))  # 不是水仙花数
 
 方式2def 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 返回值

解读:

  1. def 关键字,用来定义函数的

  2. 函数名,根据功能自定义的名字,需要遵守标识符规则

  3. () 存放函数的形式参数的,如果没有形式参数,()内为空

    形式参数: 函数运算的时候 有些数据的未知[动态]的, 将这些未知的数据使用变量名来进行表示,这个变量名就是形式参数,简称形参。未知的数据有几个,就定义几个形式参数

  4. return,也是一个关键字,结束函数,并把结果返回到函数调用的位置

    如果功能需求中不需要返回值,可以写成return None或者省略

    注意:return和print不一样

    1. print把数据输出到程序外的控制台
    2. return把数据传递到函数调用的位置,数据还是在程序中运转的

定义函数的规则:

  1. 明确是否有未知项参与功能的运算 【用来定义形式参数有什么】
  2. 明确是否需要将结果返回到调用的位置 【决定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)

关键字参数在进行传值的时候,顺序可以发生变化【本质上再给变量名进行赋值,找到匹配的变量名进行相应的赋值】

可变参数

定义函数的时候,需要按照需求分析未知项的个数,来确定形参的个数,但是有些场景格式无法确定的,比如封装一个函数:求多个数据的和,像这种形式参数个数不能确定的使用可变参数,可变参数有两种格式:

  1. *argsargs就是一个变量,可以定义成其他名字】

    应用于多个位置参数的传值

    # 可变参数
    # 接触过可变参数了  在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'>
    
  2. **kwargskwargs也是一个变量,可以定义成其他名字】

    应用于多个关键字参数形参名=数据值的传值

    ## **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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值