一、定义

"""
局部变量 : 在函数内部定义的变量(局部命名空间)
全局变量 : 在函数外部定义的或者使用global在函数内部定义(全局命名空间) 作用域: 作用的范围
局部变量作用域: 在函数的内部
全局变量作用域: 横跨整个文件 生命周期:
内置变量 > 全局变量 > 局部变量 """

1、局部变量

# 1.局部变量
def func():
# 定义局部变量
a = 5
# 获取局部变量
print(a)
# 修改局部变量
a = 10
print(a) func()
# print(a) error 不能再全局调用局部变量

2、全局变量

# 定义全局变量
b = 10
# 获取全局变量
print(b)
# 修改全局变量
b = 20 def func():
# 可以在函数内部获取全局变量
print(b)
func()

3、使用global在函数内部创建全局变量

def func():
global c
c = 200
func()
print(c)

4、使用global在函数内部修改全局变量

d = 300
def func():
global d
d = 400
func()
print(d)
"""
可以使用global 关键字在函数内部定义一个全局变量
也可以使用global关键字在函数内部修改一个全局变量
"""

二、函数名的使用

def func():
print("我是func函数")
return 1111 # 1.函数名是个特殊的变量,可以当做变量赋值
a = "你好"
print(a)
a = func
a() # 函数可以像变量一样销毁
del a
# a()

1、函数名可以作为容器类型数据的元素

def func1():
print("我是func1函数") def func2():
print("我是func2函数") def func3():
print("我是func3函数") lst = [func1,func2,func3]
for i in lst:
print(i)
i() # func1() func2() func3()

2、函数名可以作为函数的参数

def func4(f):
f() func4(func3)

3、函数名可作为函数的返回值

def func(f):
return f res = func(func2) # f <=> func2 => res = func2()
res() # ### __doc__ 或者 help查看文档 def eat_bigchang(something):
"""
功能: 大肠刺身
参数: 肠子名字
返回值: 吃的状态
""" print("先把{}洗一洗".format(something))
print("找出肠子头放嘴里")
print("嘬!!")
return "吃完了,满意的放下肠子,擦擦嘴" res = eat_bigchang("猪肠子")
print(res)
help(eat_bigchang)
res = eat_bigchang.__doc__
print(res)

三、函数的嵌套

"""
函数之间可以互相嵌套
外层的叫做外函数
内层的叫做内函数
"""
def outer():

    def inner():
print("我是inner函数")
inner() outer()

1、 LEGB 原则

"""
#找寻变量的调用顺序采用LEGB原则(即就近原则)
B —— Builtin(Python);Python内置模块的命名空间 (内建作用域)
G —— Global(module); 函数外部所在的命名空间 (全局作用域)
E —— Enclosing function locals;外部嵌套函数的作用域(嵌套作用域)
L —— Local(function);当前函数内的作用域 (局部作用域)
依据就近原则,从下往上 从里向外 依次寻找
"""

四、nonlocal 修改局部变量

"""
nonlocal遵循LEGB就近找变量原则
(1)找当前空间上一层的局部变量进行修改
(2)如果找不到,会继续向上寻找
(3)最后什么也没有,直接报错
"""

1、找当前空间上一层的局部变量进行修改

def outer():
a = 100
def inner():
nonlocal a
a = 200
print(a) inner()
print(a) outer()

2、如果找不到,会继续向上寻找

def outer():
a = 100
def inner(): def smaller():
nonlocal a
a = 400
print(a)
smaller()
print(a)
inner()
print(a)
outer()

注意点:nonlocal只能修改局部变量

"""
a = 100
def outer(): def inner():
def smaller():
nonlocal a
a = 400
print(a)
smaller()
print(a)
inner()
print(a)
outer()
"""

3、不使用nonlocal 修改局部变量

def func():
lst = [1,2,3,4]
def inner():
lst[-1] = 10
inner()
print(lst)
func()

五、locals 和 globals

locals 获取当前作用域中所有变量

"""
locals 如果在全局,调用locals之后,获取的是打印之前的所有变量,返回字典,全局空间作用域
locals 如果在局部,调用locals之后,获取的是调用之前的所有变量,返回字典,局部空间作用域
"""

例1、打印res 之前的所有变量

"""
def func():
ff = 123
a = 1
b = 2
res = locals()
c = 3
print(res)
d = 4
""" # 'a': 1, 'b': 2, 'res': {...}, 'c': 3

例2、调用之前的所有变量

a1 = 10
def func():
a = 1
b = 2
res = locals()
c = 3
print(res)
d = 4
a2 = 20
func()
a3 = 30 # 'a1': 10, 'a2': 20

1、globals 只获取全局空间中所有变量

"""
globals 如果在全局,调用globals之后,获取的是打印之前的所有变量,返回字典,全局空间作用域
globals 如果在局部,调用globals之后,获取的是调用之前的所有变量,返回字典,全局空间作用域
"""

例1、

def func():
ff = 123
a = 1
b = 2
res = globals()
c = 3
print(res)
d = 4 # 'a': 1, 'b': 2, 'res': {...}, 'c': 3

例2、

a1 = 10
def func():
a = 1
b = 2
res = globals()
c = 3
print(res)
d = 4
a2 = 20
func() # globals
a3 = 30 # 'a1': 10, 'func': <function func at 0x00000289E7B9C1E0>, 'a2': 20

2、动态批量创建全局变量

2.1、用字符串定义全局变量

dic = globals()
print(dic) # 返回的是系统的字典
# 在全局的字典当中,通过添加键值对,自动创建全局变量
# 对应的键时变量名,对应的值是变量指向的值
dic["name"] = "致和" print(name)

2.2、批量定义全局变量

def func():
dic = globals()
# 通过在全局系统字典当中,添加键值对,批量创建变量
for i in range(1,6):
# "a%d" % (1) => "a1" "a%d" % (2) => "a2"
dic["a%d" % (i)] = i # 1~5 func()
"""
"a%d" % (1) => a1
"a%d" % (2) => a2
"a%d" % (3) => a3
"a%d" % (4) => a4
"a%d" % (5) => a5
"""

六、登录注册练习

写一个登陆注册小程序
登录:
# 1.账户密码会预先记录在文件中
# 2.输入账号密码:如果都正确,登录成功
# 3.如果用户登录时进行三次校验,都不对,记录黑名单文件中
# 4.如果是黑名单的用户,禁止下次再次登录 注册:
# 1.检测两次密码如果相同,确认注册成功
# 2.检测两次密码如果不同,提示两次密码不一致
# 3.用户名不能重复

# 注册:
# 1.检测两次密码如果相同,确认注册成功
# 2.检测两次密码如果不同,提示两次密码不一致
# 3.用户名不能重复 # accountlst存放所有账号
accountlst = []
sign = True
with open("user.txt",mode="a+",encoding="utf-8") as fp:
while sign:
# 输入用户名
username = input("请输入要注册的用户名:")
if username == "" or " " in username:
print("对不起,该名字含有非法字符")
else:
# 把数据从文件当中获取
fp.seek(0)
lst = fp.readlines()
for i in lst:
account = i.strip().split(":")[0]
accountlst.append(account) print(accountlst)
# 判断该名字是否已经存在
if username in accountlst:
print("抱歉,改名字已经使用~")
else:
# 检测密码
pwd = input("请输入您的密码")
while True:
pwd2 = input("请确认您的密码,按q退出~")
# 如果密码相同
if pwd == pwd2:
# 拼接字符串
strvar = username + ":" + pwd + "\n"
# 写入文件
fp.write(strvar)
# 终止循环
sign = False
# 打印信息
print("注册成功~")
break
elif pwd2.upper() == "Q":
# sign = False
break else:
print("对不起,两次密码不一致~")

注册(register.py)

# ### 登录
# 1.账户密码会预先记录在文件中
# 2.输入账号密码:如果都正确,登录成功
# 3.如果用户登录时进行三次校验,都不对,记录黑名单文件中
# 4.如果是黑名单的用户,禁止下次再次登录 # 存账户
accountlst = []
# 存密码
pwdlst = []
# 存黑名单
blacklst = [] sign = True
while sign:
username = input("请输入您的用户名:")
# 获取文件当中的账号和密码
with open("user.txt",mode="a+",encoding="utf-8") as fp:
fp.seek(0)
lst = fp.readlines()
for i in lst:
user,pwd = i.strip().split(":")
# print(username,password)
accountlst.append(user)
pwdlst.append(pwd) # print(accountlst)
# print(pwdlst)
# 判断该用户是否存在
if username in accountlst:
# 判断当前用户是否是黑名单中的用户
with open("black.txt",mode="a+",encoding="utf-8") as fp:
fp.seek(0)
lst = fp.readlines()
for i in lst:
blacklst.append(i.strip()) # print(blacklst)
# print(username)
if username in blacklst:
print("抱歉,该用户已经被冻结了")
else:
# 如何找到该账户对应的密码呢?
num = accountlst.index(username)
pwd = pwdlst[num]
# print(num,pwd)
""""""
# 判断用户输入的密码是否正确
times = 1
while times <= 3:
pwd2 = input("请输入您的密码")
# 输入成功情况下,终止循环,程序结束
if pwd == pwd2:
print("登录成功")
sign = False
break
else:
# 剩余的次数 = 总次数 - 使用次数
print("你还剩下%s次机会" % (3 - times)) # 如果用掉了所有的次数,直接加入黑名单,防止下次登录
if times == 3:
with open("black.txt",mode="a+",encoding="utf-8") as fp:
strvar = username + "\n"
fp.write(strvar)
print("抱歉,您的账户已经被冻结~")
times += 1
else:
print("该用户不存在~")

登录(login.py)

ceshi1
ceshi2
ceshi3
ceshi4

黑名单(black.txt)

ceshi1:111
ceshi2:222
ceshi3:333
ceshi4:444
ceshi5:555

用户(user.txt)

day11.函数的全局变量和局部变量的更多相关文章

  1. JavaScript 引入方式 语言规范 语言基础 数据类型 常用方法 数组 if_else 比较运算符 for while 函数 函数的全局变量和局部变量 {Javascript学习}

    Javascript学习 JavaScript概述 ECMAScript和JavaScript的关系 1996年11月,JavaScript的创造者--Netscape公司,决定将JavaScript ...

  2. JS函数 -- 功能,语法,返回值,匿名函数,自调用匿名函数,全局变量与局部变量,arguments的使用

    “JavaScript设计得最出色的就是它的函数的实现.” -- <JavaScript语言精粹> 函数包含一组语句,它们是JS的基础模块单元,用于指定对象的行为.一般来说,所谓编程,就是 ...

  3. python3--函数(函数,全局变量和局部变量,递归函数)

    1.1函数 1.1.1什么是函数 函数就是程序实现模块化的基本单元,一般实现某一功能的集合.函数名:就相当于是程序代码集合的名称参数:就是函数运算时需要参与运算的值被称作为参数函数体:程序的某个功能, ...

  4. python_06 函数、全局变量与局部变量、函数递归

    函数 1.函数的定义: def 函数名(参数): #解释函数的功能 代码块 返回值 函数的定义主要有如下要点: def:表示函数的关键字 函数名:函数的名称,日后根据函数名调用函数 函数体:函数中进行 ...

  5. python函数的 全局变量与局部变量

    一.函数的全局变量 1.什么是全局变量 顶着头开始写,没有任何缩进,在py文件的任何位置都能调用 #!/usr/bin/env python # _*_ coding:utf8 _*_ name=&q ...

  6. Python学习日记(五)——初识函数(set、深浅拷贝、三目运算、函数、全局变量和局部变量)

    基本数据类型补充 set set集合,是一个无序且不重复的元素集合 #创建 s = {11,22,33,44}#类似字典 s = set() #转换 l = (11,22,33,44) s1 = se ...

  7. python1-集合、函数(全局变量与局部变量)

    集合(set) # s=set('hello')# print(s)## s=set(['alex','alex','sb'])# print(s) # s={1,2,3,4,5,6} #添加# s. ...

  8. Python学习(六)—— 函数、全局变量与局部变量

    函数 函数的定义 def test(x): "The function definition" x += 1 return x def:定义函数的关键字 test:函数名 ():内 ...

  9. python基础五(函数、全局变量和局部变量)

    一.全局变量和局部变量 全局变量,即可以在当前文件所有地方都可使用的变量,一次修改,整个文件都影响.如果函数体内部使用全局变量,要先声明global 局部变量,只能在函数体内部使用,除了函数体就不可使 ...

随机推荐

  1. Docker镜像-列出镜像

    列出镜像 镜像体积 虚悬镜像 中间层镜像 列出部分镜像 要想列出已经下载下来的镜像,可以使用docker images 或者 docker image ls 命令. $ docker image ls ...

  2. mysql--数据插入覆盖和时间戳的问题

    1.数据插入问题 当我们insert数据时,插入datetime类型,此类型的字段,存储数据格式为:  YYYY-MM-DD,它支持的范围为'1000-01-01'到'9999-12-31',并且允许 ...

  3. 一篇文章教会你如何将DOM转换为virtual DOM

    [一.Virtual DOM简介] Virtual DOM是虚拟节点,它通过Javascript的Object对象模拟DOM中的节点,然后通过特定的render方法将其渲染成真实的DOM节点. 浏览器 ...

  4. JS基础知识点(一)

    原始类型 null undefined boolean number string symbol 注意 原始类型存储的都是值,是没有函数可以调用的,但实际上除null和undefined外,其他类型使 ...

  5. 数据可视化之powerBI技巧(十二)学会这几个度量值,轻松获取前N名

    数据中的明细项一般都有很多,可是我们关注的往往只是前几名,所以在报表中只展示关注的部分,就十分常用. 有了上篇(这几个示例,帮你深入理解RANKX排名)关于排名的铺垫,仅显示前N名就简单多了. 依然以 ...

  6. 数据可视化之分析篇(六)使用Power BI进行流失客户分析

    https://zhuanlan.zhihu.com/p/73358029 为了提升销量,在不断吸引新客户的同时,还要防止老客户离你而去,但每一个顾客不可能永远是你的客户,不可避免的都会经历新客户.活 ...

  7. JS 判断是否为数字 数字型特殊值

    JS 数字型三个特殊值 Infinity ,代表无穷大,大于任何数值 -Infinity ,代表无穷小,小于任何数值 NaN ,Not a number,代表一个非数值  isNaN的使用: isNa ...

  8. CSS文本溢出,显示省略号(...)

    方式1:这种方式就是必须要跟width搭配使用,当你使用的display:flex; 的时候可能会影响样式 width: 200px; overflow: hidden; /*超出部分隐藏*/ tex ...

  9. 面试京东T5,被按在地上摩擦,鬼知道我经历了什么?

    一转眼间,光阴飞快,各大企业都开始招人,各大学校也开始准备陆续入学. 金三银四已经快结束了,有的朋友发来喜报,面试上了一线大厂,也有没有面试上的朋友跑来跟我说,被虐惨了,几天给大家分享下我一个面试京东 ...

  10. 痞子衡嵌入式:SNVS Master Key仅在i.MXRT10xx Hab关闭时才能用于DCP加解密

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT系列中数据协处理器DCP使用SNVS Master Key加解密的注意事项. i.MXRT不仅仅是处理性能超强的MCU,也是 ...