函数的动态参数、函数的注释、函数的名称空间、函数的嵌套、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、查找图解:
函数的动态参数、函数的注释、函数的名称空间、函数的嵌套、global(修改全局的)、nonlocal(修改局部的)、函数名的第一类对象及使用
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、函数嵌套:
交叉嵌套

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

结果:2

   1

   3

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

结果:    3

    1

    "我太难了"

    2

    4

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

结果: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("请重新输入")