• 0628 Python 中函数的内置函数学习:位置参数、关键字参数、默认参数、可变参数、return


    一、函数

    1.含义

    • 具有独立功能的代码块组织为一个小模块,在需要的时候调用
    • 两个步骤:
      • 定义函数 一 封装独立的功能  
      • 调用函数 — 享受封装的成果  
    • 提高编写的效率、代码的重用
    • 让程序更小、模块化

    2.小知识

    • F7 和 F8:在调试时, F7(断点会进入函数体内)和F8(断点不会进入函数体内部, 会一口气执行完)
    • pass:相当于空行,用来站位
    • Ctrl +q 查看函数的注释信息
      • 函数调用用,鼠标在函数名处是:按Ctrl +q 查看函数的注释信息 
    • Ctrl + P   print(item)  查看括号当中数据的参数    

    二、内置函数的学习

    1.函数的定义

    案例1:将字符串的左右两侧的空格清除

    def str_to_strip(a_str):    # 形式参数: 形参
        """
        将字符串的左右两侧的空格清除
        :param a_str:形式参数: 形参
        :return:
        """
        print(a_str.strip())
    
    
    # 调用函数
    str_to_strip("     Wanting       ")  # 实际参数: 实参
    
    # 函数只能在定义了之后,才能使用

    示例2:计算两个数相乘

    • 当函数执行结束之后, 会返回到函数调用处
    • 函数的调用, 没有传参数, 实参
    • 在调试时, F7(断点会进入函数体内)和F8(断点不会进入函数体内部, 会一口气执行完)
    def multi_two_num2(first_num, second_num):    # 定义函数, 没有参数, 形参
        """
        计算两个数相乘
        :return:
        """
        result = first_num * second_num
        print("{} * {} = {}".format(first_num, second_num, result))
    
    
    # 当函数执行结束之后, 会返回到函数调用处
    multi_two_num2(42, 2)     # 函数的调用, 没有传参数, 实参
    # 在调试时, F7(断点会进入函数体内)和F8(断点不会进入函数体内部, 会一口气执行完)
    print("程序会继续往下执行!")

    位置参数:位置参数, 实参与形参是一一对应的, 并且个数保持一致

    def fn_hello_1(greeting, name):
        """
        greeting for somebody function
        :param greeting: 问候语
        :param name: 问候的人
        :return:
        """
        print("{}, {}!".format(greeting, name))
    
    
    fn_hello_1("Hello", "三高")   # 位置参数:实参与形参是一一对应的, 并且个数保持一致

    关键字参数

    • name="三高":关键字参数, 不需要一一对应,按照参数名来赋值。个数要与形式参数保持一致,
    • 实参才有关键字参数这种说法
    • "Hello":位置参数要放在关键字参数的前面,不能放到后面
    def fn_hello_2(greeting, name, age, sex, score, height, weight):    # 7个形参
        """
        greeting for somebody function
        :param greeting: 问候语
        :param name: 问候的人
        :return:
        """
        print("{}, {}!
    age: {}".format(greeting, name, age))
    
    
    fn_hello_2("Hello", name="三高", sex="不详", age=80, score=30, weight=200, height=130)   # 关键字参数

    默认参数

    • 如果在函数调用时, 没有传参数, 那么会使用默认参数
    • 如果在函数调用时, 有传参数, 那么不会使用默认参数
    • 在函数定义是, 默认参数要放在非默认参数的后面
    def fn_hello_4(name, greeting="吃了吗?", punctuation="!"):     # 在函数定义是, 默认参数要放在非默认参数的后面
        """
        greeting for somebody in function4
        :param greeting: 问候语
        :param name: 问候后人
        :param punctuation: 标点
        :return:
        """
        print("{} {}{}".format(greeting, name, punctuation))
    
    
    fn_hello_4("小明")                   # 如果在函数调用时, 没有传参数, 那么会使用默认参数
    fn_hello_4("小明", "good morning!")   # 如果在函数调用时, 有传参数, 那么不会使用默认参数
    fn_hello_4("小明", greeting="good morning!")     # 位置参数要放在关键字参数的前面,不能放到后面

    可变参数 ==  不定长参数、动态参数

    • 在函数定义的时候, 才有可变参数的概念
    • 1个* 为可变参数,只接收位置参数, 会保存到一个元祖当中:"杨哲"
    • 2个* 也是可变参数,只接收关键字参数, 保存到一个字典当中:time=10
    • *args 在前,**kwargs 在后
    def print_param_2(*args, **kwargs,):
        """
        print parameter function
        :param args: 1个* 为可变参数,将形参接收到的所有位置参数, 会保存到一个元祖中:"杨哲"
        :param kwargs: 2个* 也是可变参数,把所有的关键字参数, 保存到字典当中:time=10
        :return:
        """
        print("params值为: {}
    类型为: {}".format(args, type(args)))
        print("kwargs值为: {}
    类型为: {}".format(kwargs, type(kwargs)))
    
    
    print_param_2("杨哲", "幻景", "阿登", None, True, [100, 200], time=10, name="可优", age=20)
    
    执行结果:
    params值为: ('杨哲', '幻景', '阿登', None, True, [100, 200])
    类型为: <class 'tuple'>
    kwargs值为: {'time': 10, 'name': '可优', 'age': 20}
    类型为: <class 'dict'>

    return:

    一个函数return之后, 那么函数体中 return 后面所有语句都不会被执行,当遇到 return,程序就会跳出函数

    一个函数如果不使用return关键字来指定返回到函数调用处的值, 那么默认返回None

    示例:计算任意个数的整数和

    def sum_count_1(*args, **kwargs):
        """
        计算任意个数的整数和
        :param args: 接受位置参数, 保存为元祖
        :param kwargs: 接受关键字参数,保存为字典
        :return:
        """
        result = 0
        for i in args:
            result += i
    
        for i in kwargs.values():
            result += i
    
        return result   # 一个函数return之后, 那么函数体中return后面所有语句都不会被执行, 当遇到return, 程序就会跳出函数
        one_var = 10    # 不会执行
    
    
    # 一个函数如果不使用return关键字来指定返回到函数调用处的值, 那么默认返回None
    one_result = sum_count_1(1, 2, 3, 4, 5, 6, num1=7, num2=8, num3=9)
    print(one_result)

    练习题:

    1.什么是函数?函数的有什么作用?

    什么是函数:

      • 具有独立功能的代码块 组织为一个小模块,在需要的时候调用

    函数的作用:

      • 提高编写的效率、代码的重用;
      • 让程序更小、模块化

    2.函数有哪几种参数类型,分别有什么特点?

    位置参数

      • 形参与实参一一对应

    关键字参数

      • 为参数指定名称

    默认参数

      • 为参数指定默认值
      • 将常见的值设置为参数的缺省值,从而简化函数的调用

    可变参数

      • 一个函数能够处理的参数个数 是不确定的
      • 参数名前增加 一个 * 可以接收 元组
      • 参数名前增加 两个 * 可以接收 字典

    3.在函数调用时,位置参数和关键字参数的顺序

    • 位置参数在前,关键字参数在后

    4.函数的可变参数是什么?有哪几种?为什么要使用可变参数?

    • 一个函数能够处理的参数个数,是不确定的
    • 参数名前增加一个 * (*args)可以接受 元祖
    • 参数名前增加 两个 * (**kwargs)可以接受 字典

    5.将两个变量的值进行交换(a= 100, b = 200)

    a.交换之后,a = 200,b= 100

    b.使用你能想到的所有方法来实现

    a, b = 100, 200
    
    # 方法一:重点
    a, b = b, a
    
    # 方法二:重点
    temp = a
    a = b
    b = temp
    
    # 方法三:重点
    a = a + b  # a=100+200
    b = a - b  # b=100+200一200
    a = a - b  # a=100+200- 100
    
    # 方法四:
    a = a * b  # a=100*200
    b = a // b  # b=100*200//200
    a = a // b  # a=100*200//100
    
    # 方法五:
    a = a ^ b
    b = a ^ b
    a = a ^ b
    
    # 方法六:
    a ^= b
    b ^= b
    a ^= b

    6.编写如下程序,输入键盘数字键(0~9),返回数字键上方字符

    • a.定义如下字典:num_str_dic = {'1': '!', '2': '@', '3': '#', '4': '$','5': '%', '6': '^', '7': '&', '8': '*', '9': '(', '0': ')'}
    • b.例如:键盘输入5,程序输出%
    • c.键盘输入0~9之间的数字,程序正常输出字符之后,退出程序
    • d.如果输入的内容不在0~9之间,则继续提示输入
    num_str_dic = {'1': '!', '2': '@', '3': '#', '4': '$','5': '%', '6': '^', '7': '&', '8': '*', '9': '(', '0': ')'}
    
    # 方法一:
    while True:     # 判断用户输入的是否为真
        user_input = input("请输入要转换的数字键(0~9): ")     # 接受为int类型
        if user_input in num_str_dic:       # 判断输入的内容是否在字典中0-9
            str_values = num_str_dic[user_input]        # 输入的是0-9之间的数,输入的值为key 去字典内获取值
            print("{} 上方的符号为 {}".format(user_input, str_values))        # 获取值后打印出来
            break
        else:       # 用户输入的为假,则提示,然后重新出入
            print("你输入的{},不在0~9范围内!".format(user_input))
    
    
    # 方法二:
    user_input = input("请输入要转换的数字键(0~9): ")
    while not num_str_dic.get(user_input):      # get 输入的值如果不存在返回None,not None 为真 继续执行向下执行
        # 继续执行,提示用户输入错误,重新输入
        print("你输入的{},不在0~9范围内!".format(user_input))
        user_input = input("请输入要转换的数字键(0~9): ")
    print("{} 上方的符号为 {}".format(user_input, num_str_dic[user_input]))

    7.编写如下程序,从键盘输入一个用户名和密码,判断是否正确,如果正确则打印登录系统成功,否则显示用户名或密码错误。

    • a.定义一个函数,接收用户输入的用户名和密码作为参数
    • b.正确的账号,用户名为 lemon,密码为 best
    # 方式一:简单
    def login(name, pwd):
        """
        用户登录
        :param name: 用户名
        :param pwd: 密码
        :return: 
        """
        if name == "lemon" and pwd == "best":
            print("恭喜你,登录成功")
        else:
            print("用户名或尼玛不正确!")
    
    
    username = input("请输入你的用户名:")
    password = input("请输入你的密码:")
    login(username, password)
    
    # 方式二:
    def login():
        """
        用户登录
        """
        while True:
            username = input("请输入你的用户名:")
            password = input("请输入你的密码:")
            if username == "root" and password == "1234":
                print("恭喜你,登录成功!")
            else:
                print("用户名或密码不正确!")
            option = input('y代表继续,n代表退出:')
            if option == 'y':
                continue
            elif option == 'n':
                break
    
    
    login()

    8.编写如下程序,将用户输入的所有数字相乘之后对20取余数

    • a.用户输入的数字个数不确定
    • b.用户输入的每个数字之间以逗号分隔,例如:10,1,2,13,20
    • b.请使用函数来实现
    def num_count(*args):
        """
        将用户输入的所有数字相乘之后对20取余数
        :param args:接收后为元祖
        :return:
        """
        num = 1
        for value in args:  # for 循环遍历
            num *= value
        print("计算结果为:{}".format(num % 20))
    
    
    # 方法一:
    str_num = input("请输入需要计算的数字(以逗号分隔):")
    list_num = str_num.split(",")  # 为列表,将用户输入的所有数字使用逗号进行分割
    new_list_num = []
    for item in list_num:
        new_list_num.append(int(item))      # 需要转化为int类型
    
    num_count(*new_list_num)  # 调用函数,*将列表拆包,拆成位置参数的形式
    
    # 方法二:
    str_num = input("请输入需要计算的数字(以逗号分隔): ")
    list_num = str_num.split(",")  # 将用户输入的所有数字使用逗号进行分割
    new_list_num = []
    for item in list_num:
        item = item.strip()
        if item.replace(",", "", 1).isdigit():      # 判断是否是int类型
            new_list_num.append(float(item))
        else:
            print("输入的{}参数有误,忽略此参数的计算!".format(item))
    
    num_count(*new_list_num)  # 调用函数,将列表拆包

    9.编写如下程序,求圆的面积

    • a.传入一个圆的半径,将其面积返回
    • b.函数中的Π,可以导入import math,通过math.pi来获取(也可以直接使用3.14)
    import math
    
    
    def circle_area(r):
        """
        计算圆的面积
        :param r:
        :return:
        """
        area = math.pi * (r ** 2)  # 计算圆的面积
        area = round(area, 3)  # 四舍五入,保留三位小数
        print("半径为{}的圆,面积为{}".format(r, area))
    
    
    circle_radius_str = input("请输入圆的半径:")
    circle_radius_flt = float(circle_radius_str)  # 将字符串转化为浮点类型
    circle_area(circle_radius_flt)

    10.继续完成剪刀石头布游戏

    • a.提示用户输入要出的拳 —— 石头(1)/剪刀(2)/布(3)
    • b.电脑随机出拳
    • c.比较胜负,显示用户胜、负还是平局
    • d.使用函数来封装
    import random
    
    
    def game(user_player, computer_player):
        """
        定义随机出拳
        :param user_player: 用户出拳
        :param computer_player: 电脑出拳
        :return: 
        """
        # 用户胜的情况:
        # 用户出石头(1),电脑出剪刀(2)
        # 用户出剪刀(2),电脑出布(3)
        # 用户出布(3),电脑出石头(1)
        if (user_player == 1 and computer_player == 2) or 
                (user_player == 2 and computer_player == 3) or 
                (user_player == 3 and computer_player == 1):
            print("欧耶!电脑弱爆了!!!")
        elif computer_player == user_player:
            # 用户平局的情况:
            #  用户出石头(1),电脑出石头(1)
            # 用户出剪刀(2),电脑出剪刀(2)
            # 用户出布(3),电脑出布(3)
            print("心有灵犀,要不咋再来一盘!")
        else:
            print("不行,我要和你决战到天亮!")
    
    
    computer = random.randint(1, 3)  # 电脑随机出拳
    user = int(input("请输入你要出的拳:
    石头(1)/剪刀(2)/布(3) "))
    game(user, computer)
    
    
    # 方法二: 
    
    
    def game(user_player, computer_player):
        # 用户胜的情况: 
        # 用户出石头(1),电脑出剪刀(2) 
        # 用户出剪刀(2),电脑出布(3) 
        # 用户出布(3),电脑出石头(1) 
        user_win_tup = ((1, 2), (2, 3), (3, 1))
        if (user_player, computer_player) in user_win_tup:
            print("欧耶!电脑弱爆了!!!")
        elif computer_player == user_player:
            print("心有灵犀,要不咋再来一盘!")
        else:
            print("不行,我要和你决战到天亮!")
    
    
    computer = random.randint(1, 3)
    user = int(input("请输入你要出的拳:
    石头(1)/剪刀(2)/布(3) "))
    game(user, computer)

    11.将用户输入的所有数字相乘之后对20取余数

    • a.用户输入的数字个数不确定
    • b.用户可能使用关键字参数的形式输入相乘的数字,例如:10,1,2,13,20,num1=21,num2=45等等
    • c.请使用函数来实现
    def num_count(*args, **kwargs):
        """
        将用户输入的所有数字相乘之后对20取余数
        :param args:
        :return:
        """
        num = 1
        for value in args:
            num *= value
        for dict_val in kwargs.values():
            num *= dict_val
    
        print("计算结果为:{}".format(num % 20))
    
    
    def is_int_or_float(num_str):
        """
        判断是否为整数或浮点类型
        :param num_str:
        :return:
        """
        if num_str.replace(".", "", 1).isdigit():
            return True
        else:
            return False
    
    
    str_num = input("请输入需要计算的数字(以逗号分隔): ")
    list_num = str_num.split(",")  # 将用户输入的所有数字使用逗号进行分割
    new_list_num = []  # 定义一个空列表用于添加位置参数
    new_dict_num = {}  # 定义一个空字典用于添加关键字参数
    for item in list_num:
        item = item.strip()  # 清除左右空格
        if is_int_or_float(item):  # 判断是否为数字类型
            new_list_num.append(float(item))
        elif "=" in item:
            item_list = item.split("=")  # 以等号进行分割
            dict_key, dict_value = item_list  # 分开key、value
            dict_key = dict_key.strip()
            dict_value = dict_value.strip()
            if is_int_or_float(dict_value):
                new_dict_num[dict_key] = float(dict_value)
            else:
                print("输入的{}={}参数有误,忽略此参数的计 算!".format(dict_key, dict_value))
        else:
            print("输入的{}参数有误,忽略此参数的计算!".format(item))
    
    num_count(*new_list_num, **new_dict_num)  # 调用函数,将列表拆包

    *******请大家尊重原创,如要转载,请注明出处:转载自:https://www.cnblogs.com/shouhu/,谢谢!!******* 

  • 相关阅读:
    C指针
    redis五种基本数据类型
    mongoDB MapReduce
    JSON传参
    mongodb查询实练
    逻辑数据结构和存储数据结构
    线性表的顺序存储和链式存储
    数据结构和算法关系
    UIActivityIndicatorView使用
    Swift中格式化日期
  • 原文地址:https://www.cnblogs.com/shouhu/p/12659856.html
Copyright © 2020-2023  润新知