python27期day10:函数的动态参数、函数的注释、函数的名称空间、函数的嵌套、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}\n")
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("请重新输入")
python27期day10:函数的动态参数、函数的注释、函数的名称空间、函数的嵌套、global(修改全局的)、nonlocal(修改局部的)、函数名的第一类对象及使用、作业题。的更多相关文章
- 百万年薪python之路 -- 函数的动态参数练习
1.继续整理函数相关知识点. 2.写函数,接收n个数字,求这些参数数字的和.(动态传参) def func(*args,**kwargs): num_sum = 0 num_dic = [] num ...
- 百万年薪python之路 -- 函数的动态参数
1.函数的动态参数 1.1 动态接收位置参数 在参数位置用*表示接受任意参数 def eat(*args): print('我想吃',args) eat('蒸羊羔','蒸熊掌','蒸鹿尾儿','烧花鸭 ...
- Python函数02/函数的动态参数/函数的注释/名称空间/函数的嵌套/global以及nolocal的用法
Python函数02/函数的动态参数/函数的注释/名称空间/函数的嵌套/global以及nolocal的用法 目录 Python函数02/函数的动态参数/函数的注释/名称空间/函数的嵌套/global ...
- Python函数03/函数名的第一类对象及使用/f 格式化/迭代器/递归
Python函数03/函数名的第一类对象及使用/f 格式化/迭代器/递归 目录 Python函数03/函数名的第一类对象及使用/f 格式化/迭代器/递归 内容纲要 1.函数名的第一类对象及使用 2.f ...
- 函数的动态参数与命名空间 day10
一.动态参数(不定长参数)def func(*args): 形参: 3种 动态参数 args元组,他包含了你所有的位置参数. *args 动态参数,不定长参数 **kwargs 他包含了关键字动态参数 ...
- python 函数的动态参数 命名空间,作用域以及函数嵌套,global和nonlocal (重点)
*** 坚持坚持,即使你不太强*** 1.函数的动态传参 2.函数的命名空间及作用域 3.函数嵌套 4.global和nonlocal关键字 一.函数的动态传参 1. *args: 位置参数动态传参, ...
- 函数补充:动态参数,函数嵌套,global与nonlocal关键
一丶动态参数 1.*args 位置参数,动态传参 def func(*food): print(food) print(func("米饭","馒头"," ...
- 自学python day 10 函数的动态参数、命名空间、作用域
作业提升: s为字符串 s.isalnum() 所有字符都是字母或者数字 s.isalpha() 所有字符都是字母 s.isdigit() 所有字符否是数字 2. for i in range(1,1 ...
- 函数动态参数和Python中的三种空间
动态参数 : *args 实参角度: 定义一个函数时, * 将所有的位置参数聚合到一个元祖中 顺序 : 位置参数 > * args > 默认参数 > **kwargs 接受所有参数 ...
随机推荐
- CentOS单机安装FastDFS&整合Nginx
单机安装 一 准备工作 准备linux服务器或虚拟机,这里是虚拟机,操作系统CentOS 6.4 Tracker 和 Storage 安装在一台机器上 FastDFS 5.08版本 1,准备软件 软件 ...
- 快速傅立叶变换(FFT)
多项式 系数表示法 设\(f(x)\)为一个\(n-1\)次多项式,则 \(f(x)=\sum\limits_{i=0}^{n-1}a_i*x_i\) 其中\(a_i\)为\(f(x)\)的系数,用这 ...
- Unity Glossary
https://docs.unity3d.com/2018.4/Documentation/Manual/Glossary.html 2D terms 2D Physics terms AI term ...
- BDFramework.Core 学习
x哥(懂的都懂)的框架, 拿点代码过来做注释. 想了解详情可以去他的github https://github.com/yimengfan/BDFramework.Core # Object file ...
- Zuul中聚合Swagger的坑
每个服务都有自己的接口,通过Swagger来管理接口文档.在服务较多的时候我们希望有一个统一的入口来进行文档的查看,这个时候可以在zuul中进行文档的聚合显示. 下面来看下具体的整合步骤以及采坑记录. ...
- JavaScript 数据结构与算法之美 - 非线性表中的树、堆是干嘛用的 ?其数据结构是怎样的 ?
1. 前言 想学好前端,先练好内功,内功不行,就算招式练的再花哨,终究成不了高手. 非线性表(树.堆),可以说是前端程序员的内功,要知其然,知其所以然. 笔者写的 JavaScript 数据结构与算法 ...
- 06Shell并发控制
并发控制 文件描述 文件句柄 File Descriptors (FD,文件描述符)或 文件句柄: 进程使用文件描述符来管理打开的文件 注意 1.如何通过exec打开一个文件 exec 数字<& ...
- 【VSFTP服务】vsftpd文件传输协议
vsftpd文件传输协议 系统环境:CentOS Linux release 7.6.1810 (Core) 一.简介 FTP(文件传输协议)全称是:Very Secure FTP Server. ...
- vue前端post请求之坑
最近用的vue请求数据,坑死,还是对前端vue框架不熟. 与后端通信有问题,要么是json加入到url有问题.要么是json解析有问题. 解决方法: 1.请求参数一个用url传 var json=[{ ...
- 明解C语言 入门篇 第十一章答案
练习11-1 /* 用指针实现的字符串的改写 */ #include <stdio.h> int main(void) { "; printf("p = \" ...
