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(修改局部的)、函数名的第一类对象及使用、作业题。的更多相关文章

  1. 百万年薪python之路 -- 函数的动态参数练习

    1.继续整理函数相关知识点. 2.写函数,接收n个数字,求这些参数数字的和.(动态传参) def func(*args,**kwargs): num_sum = 0 num_dic = [] num ...

  2. 百万年薪python之路 -- 函数的动态参数

    1.函数的动态参数 1.1 动态接收位置参数 在参数位置用*表示接受任意参数 def eat(*args): print('我想吃',args) eat('蒸羊羔','蒸熊掌','蒸鹿尾儿','烧花鸭 ...

  3. Python函数02/函数的动态参数/函数的注释/名称空间/函数的嵌套/global以及nolocal的用法

    Python函数02/函数的动态参数/函数的注释/名称空间/函数的嵌套/global以及nolocal的用法 目录 Python函数02/函数的动态参数/函数的注释/名称空间/函数的嵌套/global ...

  4. Python函数03/函数名的第一类对象及使用/f 格式化/迭代器/递归

    Python函数03/函数名的第一类对象及使用/f 格式化/迭代器/递归 目录 Python函数03/函数名的第一类对象及使用/f 格式化/迭代器/递归 内容纲要 1.函数名的第一类对象及使用 2.f ...

  5. 函数的动态参数与命名空间 day10

    一.动态参数(不定长参数)def func(*args): 形参: 3种 动态参数 args元组,他包含了你所有的位置参数. *args 动态参数,不定长参数 **kwargs 他包含了关键字动态参数 ...

  6. python 函数的动态参数 命名空间,作用域以及函数嵌套,global和nonlocal (重点)

    *** 坚持坚持,即使你不太强*** 1.函数的动态传参 2.函数的命名空间及作用域 3.函数嵌套 4.global和nonlocal关键字 一.函数的动态传参 1. *args: 位置参数动态传参, ...

  7. 函数补充:动态参数,函数嵌套,global与nonlocal关键

    一丶动态参数 1.*args 位置参数,动态传参 def func(*food): print(food) print(func("米饭","馒头"," ...

  8. 自学python day 10 函数的动态参数、命名空间、作用域

    作业提升: s为字符串 s.isalnum() 所有字符都是字母或者数字 s.isalpha() 所有字符都是字母 s.isdigit() 所有字符否是数字 2. for i in range(1,1 ...

  9. 函数动态参数和Python中的三种空间

    动态参数 : *args 实参角度: 定义一个函数时, * 将所有的位置参数聚合到一个元祖中 顺序 : 位置参数 > * args > 默认参数 > **kwargs 接受所有参数 ...

随机推荐

  1. [PHP] 阿里云 Composer 全量镜像

    阿里云 Composer 全量镜像 镜像地址:https://mirrors.aliyun.com/composer/

  2. 微信小程序跳转页面时参数过长导致参数丢失

    问题描述: 微信小程序:跳转页面时传参,参数过长导致参数丢失 跳转到文章详情页时,使用的文章链接e.currentTarget.dataset.id过长导致参数丢失 handleClickArticl ...

  3. IL 语法分析

    Managed Heap: GC auto manage. One process, One heap. Call Stack: Runtime auto manage, every time whe ...

  4. IDEA 日常小技巧

    原文首发于 studyidea.cn点击查看更多技巧 适用于 IDEA 2019.2 之前版本 ,2019.2 版本以下功能默认开启. Surround a selection with a quot ...

  5. Netty中的ChannelPipeline源码分析

    ChannelPipeline在Netty中是用来处理请求的责任链,默认实现是DefaultChannelPipeline,其构造方法如下: private final Channel channel ...

  6. 接口interface实现与显示实现

    接口实现: interface IMath { void Add(int x, int y); } public class MathClass : IMath { public void Add(i ...

  7. C#工具类SqlServerHelper,基于System.Data.SqlClient封装

    源码: using System; using System.Collections.Generic; using System.Data; using System.Linq; using Syst ...

  8. Retrofit的优点

    Retrofit的优点 可以配置不同HTTP client来实现网络请求,如okhttp.httpclient等 将接口的定义与使用分离开来,实现结构. 支持多种返回数据解析的Converter可以快 ...

  9. VMware——虚拟机的安装

    VMware——虚拟机的安装 摘要:本文主要记录了虚拟机的安装过程. 下载 可以去官网或者其他可靠站点下载虚拟机的安装包. 这次用的版本是:VMware-workstation-full-14.1.7 ...

  10. Python【day 12】生成器和推导式

    一.生成器和生成器函数1.生成器和生成器函数的概念 1.生成器的本质是迭代器 2.函数中包含yield,就是生成器函数 2.生成器函数的写法 def func(): a =10 yield 20 ge ...