• 函数的动态参数、函数的注释、函数的名称空间、函数的嵌套、global(修改全局的)、nonlocal(修改局部的)、函数名的第一类对象及使用


    1、动态参数的作用:

    能够接收不固定长度参数

    位置参数过多时可以使用动态参数

    * args是程序员之间约定俗称(可以更换但是不建议更换)

    * args获取的是一个元组

    ** kwargs获取的是一个字典

    * args只接受多余的位置参数

    ** kwargs只接受多余的动态关键字参数/可变关键字参数

    def func(*args):    #形参位置上的*是聚合
    print(*args) #函数体中的*就是打散
    print(args)
    func(1,2,3)
    结果:1 2 3
      (1,2,3)
    函数的参数优先级:位置参数 > 动态位置参数(可变位置参数) > 默认参数 > 动态关键字参数(可变关键字参数)
    def func(a,b,m = 8,*args,**kwargs):
    print(a,b,m,args,kwargs)
    func(1,2,5,c=10)
    结果:1 2 5 () {'c': 10}
    万能参数:
    def func(*args,**kwargs):
    print(args,kwargs)
    func(12,2,121,12,321,3,a = 1,b = 4)
    结果:(12, 2, 121, 12, 321, 3) {'a': 1, 'b': 4}
    打散 and 聚合 and 打散:
    lst = [1,2,3,4,6,7]
    def func(*args): #形参位置上加*是聚合
    print(*args) #函数体中加*是打散
    func(*lst) #调用函数中加*是打散
    结果:1 2 3 4 6 7
    2、josn 数据和字典长得一模一样
    3、函数的注释:给别人看的、三个双引号敲回车:
    注释写法一:
    def add(a,b):
    """
    数字的加法运算
    :param a: int
    :param b: int
    :return: int
    """
    return a + b
    print(add(1,2))
    结果:3
    注释写法二:
    def add(a:int,b:int):   #提示的int没有做到约束
    """
    加法
    :param a:
    :param b:
    :return:
    """
    return a + b
    print(add("a","b"))
    结果:ab
    4、查看函数的注释:print(add.__doc__)
    结果:
      加法
      :param a:
      :param a:
      :return :
    5、查看函数的名字:print(add.__name__)
    结果:add
    6、名称空间:
    内置空间:存放python自带一些函数
    全局空间:当前py文件顶格编写的代码开辟的空间
    局部空间:函数开辟的空间
    程序加载顺序:内置空间 > 全局空间 > 局部空间
    程序取值顺序:局部空间 > 全局空间 > 内置空间
    7、查找图解:

    8、作用域:
    全局作用域:内置 + 全局  globals按位置查看全局作用域下开辟的空间、结果是字典形式。
    局部作用域:局部      locals查看当前作用域(建议查看局部)
    a = 10
    def func():
    b = 5
    print(locals())
    print(globals())
    9、函数名的第一类对象:
    函数名可以当做值、赋值给一个变量
    def func():
    print(1)
    a = func
    a()
    print(func) #查看函数的信息
    函数名可以当做另一个函数的参数来使用:
    def func():
    print(1)
    def foo(a):
    print(a) #func这个函数的内存地址
    foo(func)
    函数名可以当做另一个函数的返回值:
    不管在什么位置、只要是看到函数名+()就是调用函数
    def func():
    print(1)
    def foo(a): #a = func
    return a #return func函数的内存地址
    cc = foo(func)
    print(cc)
    结果:<function func at 0x00000000003F2EA0>
    函数名可以当做元素存储在容器中:
    def login():
    print("注册")
    def register():
    print("登录")
    def shopping():
    print("逛")
    def add_shopping_car():
    print("加")
    def buy_goods():
    print("买")
    msg = """
    1.注册
    2.登录
    3.逛
    4.加
    5.买
    请输入您要选择的序号:
    """
    func_dic = {
    "1":login,
    "2":register,
    "3":shopping,
    "4":add_shopping_car,
    "5":buy_goods,
    }
    while True:
    choose = input(msg)
    if choose in func_dic:
    func_dic[choose]()
    else:
    print("滚")
    10、函数嵌套:
    交叉嵌套

    结果:2

       1

       3

    结果:    3

        1

        "我太难了"

        2

        4

    结果:4 7 

          None

    11、global:

    在局部空间中可以使用全局中的变量、但是不能修改、如果要强制修改需要添加global

    当变量在全局存在时global就是申明我要修改全局的变量、并且会在局部开辟这个变量

    当变量在全局中不存在时global就是申明要在全局创建一个变量、并且会在局部开辟这个变量

    a = 10
    def func():
    global a
    a = a + 1
    func()
    print(a)
    结果:11

    字典是可变数据类型、在局部使用全局进行修改不用使用global

    a = {"name":"zd"}
    def func():
    a["name"] = "lisi"
    func()
    print(a)
    # 结果:{'name': 'lisi'}
    12、nonlocal:
    只修改局部空间中的变量、最外层的一个函数
    只修改离nonlocal最近的一层、如果这一层没有就往上一层查找、只能在局部
    def func():
    a = 10
    def foo():
    a = 5
    def f():
    nonlocal a
    a = a + 1
    print(a)
    f()
    foo()
    func()
    结果:6
    作业题:
    # 1、用代码模拟博客园系统
    # 首先程序启动,显示下面内容供用户选择:
    # 1.请登录
    # 2.请注册
    # 3.进入文章页面
    # 4.进入评论页面
    # 5.进入日记页面
    # 6.进入收藏页面
    # 7.注销账号
    # 8.退出整个程序
    # 必须实现的功能:
    # 1.注册功能要求:
    # a.用户名、密码要记录在文件中。
    # b.用户名要求:不能有特殊字符并且确保用户名唯一。
    # c.密码要求:长度要在6~14个字符之间。
    # 2.登录功能要求:
    # a.用户输入用户名、密码进行登录验证。
    # b.登录成功之后,才可以访问3 - 7选项,如果没有登录或者登录不成功时访问3 - 7选项,不允许访问,提示用户进行登录!
    # c.超过三次登录还未成功,则退出整个程序。
    # 进入文章页面要求:
    # 提示欢迎xx进入文章页面。(xx是当前登录的用户名
    # 进入评论页面要求:
    # 提示欢迎xx进入评论页面
    # 进入日记页面要求:
    # 提示欢迎xx进入日记页面。
    # 进入收藏页面要求:
    # 提示欢迎xx进入收藏页面。
    # 注销账号要求:
    # 不是退出整个程序,而是将已经登录的状态变成未登录状态(在次访问3~7选项时需要重新登录)
    # 退出整个程序要求:
    # 退出整个程序要求:
    # 用代码实现三次用户登录及锁定(选做题,这是一个单独的程序)
    # 首先程序启动,显示下面内容供用户选择:
    # 注册
    # 登录
    # 用户选择登录的时候,首先判断用户名在userinfo.txt表中存在不在,存在就不能进行注册
    # 当注册的用户名不存在的时候将用户名和密码写入到userinfo.txt文件中
    # 用户选择登录的时候,判断用户输入的账号和密码是否userinfo.txt存储的一致
    # 用户名和密码一致就终止循环,并提示用户登录成功!
    # 用户名和密码不一致,只有三次登录机会,三次过后提示用户名被锁定,请联系管理员!并终止循环
    # 当用户名错误三次,再次运行程序.登录锁定的账号继续提示用户名被锁定,请联系管理员!
    login_dic = {
    "username":None,
    "flag":False, #登录成功是true、登录不成功是false
    "count":3
    }
    def login(func=None):
    """
    登录
    :return:
    """
    while login_dic["count"]:
    user = input("username:")
    pwd = input("password:")
    with open("userinfo","a+",encoding="utf-8") as f:
    f.seek(0)
    for i in f:
    file_user,file_pwd = i.strip().split(":")
    if file_user == user and file_pwd == pwd:
    login_dic["count"] = 3
    login_dic["username"] = user
    login_dic["flag"] = True
    print("登录成功")
    if func:
    func()
    return
    else:
    login_dic["count"] -= 1
    print("账号或密码错误")
    if login_dic["count"] == 0:
    exit()
    def register():
    """
    注册
    :return:
    """
    user = input("username:")
    pwd = input("password:")
    with open("userinfo","a+",encoding="utf-8") as f:
    f.seek(0)
    if user.isalpha() and 14 > len(pwd) > 6:
    for i in f:
    file_user,file_pwd = i.strip().split(":")
    if file_user == user:
    print("用户名已存在!")
    return
    else:
    f.write(f"{user}:{pwd} ")
    print("注册成功!")
    else:
    print("注册失败")
    def comment():
    print(f"欢迎{login_dic['username']}登录评论区")
    def log():
    print(f"欢迎{login_dic['username']}登录日志区")
    def article():
    print(f"欢迎{login_dic['username']}登录文章区")
    def collect():
    print(f"欢迎{login_dic['username']}登录收藏区")
    def log_out():
    login_dic['username'] = None
    login_dic['flag'] = False
    print("注销成功")
    func_dict = {
    "1":login,
    "2":register,
    "3":comment,
    "4":log,
    "5":article,
    "6":collect,
    "7":log_out,
    "8":exit
    }
    msg = """
    1.请登录
    2.请注册
    3.进入文章页面
    4.进入评论页面
    5.进入日记页面
    6.进入收藏页面
    7.注销账号
    8.退出整个程序
    请输入序号:
    """
    while True:
    choose = input(msg)
    if choose in func_dict:
    if choose == "1" or choose == "2" or choose == "8":
    func_dict[choose]()
    elif login_dic['flag']:
    func_dict[choose]()
    else:
    login(func_dict[choose])
    else:
    print("请重新输入")
  • 相关阅读:
    CodeForces 58C Trees
    【转】二分匹配题集
    HDU2604 Queuing
    HDU1281 棋盘游戏
    HDU3360 National Treasures
    HDU2444 The Accomodation of Students
    HDU1498 50 years, 50 colors
    HDU1068 Girls and Boys
    【转】常用的latex宏包
    【转】网络流题集
  • 原文地址:https://www.cnblogs.com/zhang-da/p/11622867.html
Copyright © 2020-2023  润新知